Hello and welcome, everybody. So the topic of this talk originally started with the long-winded title, where it was something about leveraging wasm to improve quality. And then as it was building out the presentation, it became clear that we were actually super-charging our APIs and decided to go with the punchier title. So you can take a pic for whichever title you want for this session. So my name is Rohan Deshpande. I'm a managing director at the senior engineer at Goldman Sachs, been at Goldman for three years. And some of the areas that me and my teams we run are on platforms. So we own an operator mobile platform that's used by multiple mobile applications at Goldman Sachs. Our focus is really on developer productivity. So anything to do with improving engineering efficiency, being able to write code faster, being able to reduce your build cycles, all part of the charter of my teams. And along with that, also playing around with generative AI, like I think everyone else is. And I think it's a very promising technology. And also want to operate an API platform for Goldman Sachs. And that is going to be, I think, the focus of this talk and the crux of the discussion here. So the Goldman Sachs' API platform has been around for quite a few years, actually. And it's actually the foundation of Goldman being an API-first organization. So anytime someone's building a service at the firm, they think in terms of what would it look like if you put an API in front of it and they start with an API construct. And generally, we offer these services either externally, either internally. If they're available externally, they're available through our developer portal at developer.js.com. So if you wanted to leverage functionality like doing money transfers or getting various data feeds that are financial-related, you can take advantage of external offerings, external services, integrate with them, and you can build your own application on top of it. So my team provides the infrastructure that powers these API-based services at Goldman Sachs. And we serve millions of requests per day. So it's pretty significant in scale. And just in terms of reliability and requirements for each of these APIs, they have different requirements. So it's a multi-tenant, fairly complex piece of infrastructure. API platform has been around for quite a few years. So we have the dreaded legacy that we have to support. So we support multiple runtimes as part of this gateway infrastructure. And if you look at a runtime, typically, when an API request comes in, it's a fairly, if you just step all the way back to the 10,000-foot level, it's a fairly sequential flow. You have a request coming in. It'll go through a series of steps. You can call them plugins or filters or whatever it might be. That's the logic that you would use to perform some action on that request. Goes to your actual business logic, does some work over there, sends back a response, and will follow a similar path back out to your caller. So these steps, filters, plugins, we actually have three different categories of plugins that we have to support here. The first one are what the vendors provide.  Generally, the vendor or the project itself will provide a bunch of them. They all do all the testing. You can validate them as you need to. But generally, they come back as a package in a box. They could be implemented using C++ or a scripting language like Lua or something similar. I think the more interesting is the custom plugins that we own and operate. So we have two categories there, too. There's a bunch of plugins that my teams build and operate on behalf of the firm. This could be something that's shared functionality that's applicable to everyone. For example, let's say you wanna have open ID, or you might wanna do some kind of metering on your APIs. That would be a common plugin that my team would own and operate and provide. But then we also have plugins that are customer teams, internal teams that use our platform, we call them customers, and so they would build their own plugins as well, primarily because they might have functionality that's unique to just their use case. And they might wanna implement something and it doesn't make sense to make it into a whole firm by offering. So it becomes something that the team would own and operate and then they would plug into this multi-tendent system that we have. Or the other option is they might choose, they might not wanna build it, but they'll come to my team and be like, hey, we need to build this plugin for us. And then we'll go back to be like, you know what, we're so backlogged, it's gonna be 18 months before we're gonna take a look at our request. And that doesn't scale, because everything needs to be done at the speed of business, aka yesterday. So in that case, what we would love to do is enable each of these teams to build this functionality themselves and provide it as a plugin that we can then run within this shared infrastructure. So the challenge with building these plugins, especially as they're running in this environment, first one is the choice of language, right? Typically, like I said, these runtimes, they're the support like C++ or scripting language like Lua, but that's not really the most common skill set. Like, you know, generally developers, they're more familiar with higher level languages like Go or Java or JavaScript TypeScript. And they would prefer to write these plugins using, they would prefer to write code using any one of these languages. We have a fairly mature SDLC, a software development lifecycle. So we wanna be able to take advantage of our investments in CICD in best practices like code reviews and IP scans and dependency management. These are things that are getting more and more important as you, as secure SDLCs become a thing. And so ideally you wanna go with these mainstream languages because they have support, they're used by thousands of engineers at the firm and they have support from a tooling perspective across the board as well. Running in a multi-tenant environment, you want security, you want some kind of isolation both from a runtime perspective as well as from an operational perspective because you don't want one plugin causing issues to every other plugin running in that flow. And then from a compilation and build system perspective, you wanna leverage everything that we already have. And finally, a bonus would be if you could reuse code because we have multiple engines and instead of writing the same business logic multiple times that is specific to the engine, ideally we could write it once as a library and then integrate it into each of these plugins.  We went around looking for was there something that could help us solve these use cases and very quickly we came across WebAssembly. I think primarily it started because on why it was supporting WebAssembly. And so we started looking at it, we looked at some of the technologies, we decided that WebAssembly seemed the most promising of all the options out there. One is the binary format gives the efficient execution semantics. It runs in a sandbox. It's portable so whether you're running on different flavors of Linux, you're still using the same WebAssembly module. You can use multiple languages that can target compilation to WebAssembly. And then it's a very extensible system as well. So a lot of these, there's quite a few other benefits but these were the ones that stood out to us as hey, you know what, let's take a look at WebAssembly. And so when we were like, hey, let's take a look at WebAssembly, how do we know it actually works, right? Because there's a bunch of material out there, WebAssembly, the ecosystem is moving pretty quickly. Is this something that we could actually leverage and end up with a fairly safe but also reliable plugin model for the API gateway system that we have. So we decided to do a proof of concept. We had an existing plugin that was doing account number reduction. Account numbers are fairly standard, well-defined structures. It's a nine character format, nine character string format. And so we decided to do a little bit of an AB test and also try into a proof of concept where we could build a plugin using WebAssembly, plug it into our runtimes and see how it worked from a reduction perspective. So the requirements were pretty straightforward. Identify the nine character account number coming back in the response and then redact the first five characters with asterisks. So just get back to the last four. And then we wanted to try a few more things. We were like, hey, let's try and implement the season go as the language. And can we try and get to at least 70% test coverage? Because the test coverage was, I think abysmal is giving it too much credit for these plugins probably in the 10, 15% range. And of course, that never really covered like all the use cases you would like this. So we were trying to get to like a much higher number here. And they wanted to take advantage of all the build and deploy tooling that we had and all the investments we're making from a SDLC and CSED perspective. As a bonus, we wanted to try if we could share this code across multiple runtimes. The multiple engines, but then really we were trying to see if we could share the code between on-one and nginx. And how much of that code could we share? So to get started, if you build a plugin, where does it fit in that typical API architecture? You can see the redaction plugin would sit on the response side. We have fairly simple plugin. It takes in some input and sends you back and continues the JSON response back with the redactor to count number. So in order to build this, the development workflow would basically be, hey, let's write some code, let's compile it into a WebAssembly module and then let's integrate it into each of these runtimes. From a code perspective, the code is actually fairly straightforward goal. I'm not sure if you can see it, but there's a masking function here. It takes a string input, blah, blah, blah. Nothing magic over there. And then there's a response handler for the response itself. You can see we're actually using proxy wasm. The proxy wasm go SDK in order to interface with the proxy itself to grab the request and then manipulate it and then swap the response on the stream. But again, if you look at the code, there's nothing unusual about it. It just looks just like any other goal code you would typically write, which is very different than if you were using a scripting language or something in order to implement these plugins. And then the benefit, the nice thing that we got along with it was the ability to write unit tests, again, using these high level languages. So for Go, for example, we were able to write fairly comprehensive unit tests. And in fact, we got to about 80 plus percent test coverage just out of the box, writing a whole bunch of not just positive tests, but also a bunch of negative tests here to ensure that the plugin was working as expected.  So once we had these unit tests, we had the code in the unit tests. Next up was let's compile this to WebAssembly, right? And so the question was, how do we do it? Like you can use a bunch of standard compilers, but the one we ended up going with was using TinyGo. So TinyGo is a compiler which has WebAssembly as a target. And it creates small efficient modules. It's actually intended for embedded systems, but we were able to leverage it and use it to build these plugins that we could then run on the server itself as part of our API pipeline. Again, the command itself, it took a little bit of figuring things out, but again, it's all documented, so there wasn't much there. There were a couple of situations around it too for some of the other plugins as we were moving forward around like garbage collection specifically. So there might be a few other parameters you might need to tweak depending on the capability of building here. By the way, again, it's pretty straightforward. Like take TinyGo, for example, and you can take a go code and turn it into a WebAssembly module. Once we had the module, next step was how do we integrate into the runtimes? This is actually, I think, the most difficult part because once we have a WebAssembly module, trying to integrate it into an existing web engine like Envoy or Nginx, there is documentation, but the documentation and the systems are moving so fast that it did take a little bit of research here. But ultimately it came down to an integration file, right?  So once we had that, then we were able to leverage a CI-CD pipeline as well. Pipeline has, amongst the many other steps, I think these are the most important ones that we were able to take advantage of. We could do dependency scanning on the plugin itself to ensure we were using the correct dependencies, nothing that had a CVE or something associated with it. We were able to run a unit test and then ensure that we had code coverage. So we set a threshold of 78%, which was greater than zero, which we had, which was the previous threshold. So we were able to get proper code coverage here and actually treat this as a proper software artifact. We run IP scans as part of all our code that gets checked in and built. And then the script you saw basically formed the core of this compilation step where it took the go code, compiled it into WebAssembly module, and then the follow up to that is we build it into an image, and it gets uploaded to our container repository and then consumers can pull from the container repository and then deploy these runtimes as they want to. So again, the point is what we ended up with was taking advantage of all our investments in our CI, CD, and ISDLC by using a high level language here. One little issue we ran into with the compilation step turned out it was much slower than just standard go code. We haven't figured that out yet, but then what we ended up doing was just sharding the compilation steps. So for every five plugins, we would do the build process and a separate host as part of the compilation step, just paralyzing it. So we ended up with getting similar total end to end times on our pipeline here. So as part of this process, building this one off plugin as a proof of concept, lessons we learned. Yes, we are able to develop using a familiar well supported language, like Go, which has proper support within our ecosystem as well as outside. With this language, we were able to take advantage of all our form-wide tooling. You know, anything about code scanning, package management, dependency management, containers, whatever we had, we were just able to plug right into it and build out a proper get-we-solution that had the right plugins baked in, which were built with custom code. We actually achieved 83% code coverage, and again, this is straightforward. We can probably go higher here, but at this point, I think about 83%, we started seeing diminishing returns. But generally, again, this is no different than any kind of Go code, right? So you could take advantage of it and go as high as you want it to over here. One nice benefit was, again, out of the box, we were able to share about 35% of the code we wrote between the various runtimes that we had, and this is again with zero effort, with minimal design changes, just taking the core logic, that masking function logic itself, along with some other decoration rounded for error-handling and whatnot, that just became the core of the plugin itself, and we were able to use this across the board. I'm pretty sure we can actually get to higher than 50% with a little more investment in structuring the code itself, but that's a challenge for another day. The downside, so there are lots of positives, the downside is there was some performance impact. What we saw was about 14% give or take reduction in throughput per host with this gateway. Again, we were expecting some reduction in throughput, just given how the WebAssembly, the runtime itself operates within these engines. 14% was actually well within the bounds of what we were expecting. So again, this was just out of the box with basically no performance tuning, no tweaking, anything at all. Because we do handle hundreds of millions of requests a day, it is in our interest to try and reduce that hit as much as possible. So we'll keep investing in the performance side of things and try and reduce that hit to single digits, at least if we can. So we'll be able to prove here, is like, hey, you can write a plugin and you can actually use WebAssembly and it works almost as well as a plugin written with C++ or Lua that's running within one of these runtimes. And so lots of very positive benefits here. So outcomes, right? So we do have a ton of plugins that either first party we've implemented them or different teams have implemented them. So because of the experiments we ran, by the way, that was about a nine month process from start to finish to get to the point where we were like, hey, this evaluation works, like this is great, we should actually proceed with it. So we had a decision to proceed, we've been converting our plugins into this WebAssembly based model, leveraging Go as a language of choice implementation. So we've converted 55% of our plugins so far. We will be converting them as we, through the rest of the year. Our first plugin that's based on WebAssembly is actually going into production in Q4. So we're obviously being cautious and careful because it's new technology to run in production. But we're looking to do like a blue green rollout or a little bit of like an AB rollout where we do, we'll have like requests going through different pipelines and then we can have traffic going through one versus the other, we can do a comparison and as we start scaling up traffic going through the WebAssembly based system. So we'll actually looking forward, I think we'll see a lot of benefits overall. Now, if you're planning to do this, if you're planning to go to WebAssembly route here, a few things to keep in mind. The biggest debate we had was around trading runtime performance versus development convenience. So as a developer, yes, you can write using Go or whatever language you might choose, but downside is, are you willing to accept that performance here? And I think that's the biggest debate in the trade-off you need to go into. You need to make that decision very consciously. If you're trying to reuse code across different runtimes, it's actually fairly essential to carefully design that core of your plugin versus the wrapper code, the shim code that you need to write in order to integrate with any of these runtimes. As we've been converting these plugins, we've been learning more and more lessons about the right design, whatever design principles we might need to follow, what goes inside the body, what stays out. Keeping the context clear and then converting the context into something that's a reusable entity, those are some of the patterns that we're learning and figuring out. And as we learn more, we'll probably start publishing them on a developer blog as well. One of the learning, definitely invest in integration tests. Unit tests are great. Integration tests are even better because you can actually test the end-to-end functionality. And that will help you figure out edge cases, especially the integration cases with the runtimes. And there'll be quite a few of them because things like memory usage or any kind of ABI incompatibilities that you might run into. Those are things you might discover at runtime, not at build time. So it's actually essential to write a good suit of integration tests and run them consistently. And then the last thing is the ecosystem is very active. WebAssembly, the spec is still evolving, the implementations are evolving, the tools are evolving. And so it's a very active ecosystem and it's really important to stay on top of all these changes. Something that works today may not work two weeks from now. And so staying on top of things, having a big advantage of CI CD and continuous builds and the tooling around it actually becomes super, super essential. And so I guess automation is the key here. Okay, so that I will wrap up. I think we've been at the, we've had a very fun journey. We've been at it since the start of the year. We're seeing a lot of benefits and we're looking forward to rolling out WebAssembly in production. And feel free to check out the developer site, the GS developer site, check out our blog. And I'm happy to take some questions if there's anything. Yeah, so just repeat your questions. The question is how are we doing telemetry from within the plugins overall? Yeah, so we have, so depending on the environment we run in, like we do track things like, you know, 400s, 500s, latencies, those are the three key metrics we'll track. And so the things we, what we wanted to measure, especially with plugins, especially more than WebAssembly was the, you know, it's called the dwell time within the plugin itself, right? For requests that's coming through your pipeline, how much time is it spending inside the plugin itself? And how much time is it spending from just about, I guess the interface from the runtime itself into the plugin? So we wanted to get both those metrics. So we are capturing both those latencies, those dwell times, I guess, to get a sense for how much faster or slower is it compared to what a native plugin might look like. So we have those metrics. We have existing tools that we use to publish these metrics to, you know, the standard ones you can assume, right? So these all end up in the same metrics stream and then they have dashboards for it. Yeah, so the question is how, like what is the deployment infrastructure look, right? We are pretty big about containers, like it's a Kubernetes implementation. So as part of the build process, what we do is we end up with a container and then we deploy that container to whichever Kubernetes controller that we want to deploy it to. So that's really what it is, right? So the complexity here is because we're rolling out a new tech, we don't want to do an all or nothing kind of deployment. So we're doing a variation of blue-green over here where we have the old stuff running, we have new stuff running, we have a load balancer routing, some proportion of requests to either fleet A or fleet B, and then we keep an eye on metrics, we have alarms and whatnot going on it. So fairly standard deployment methodology, I would guess, and then we keep an eye on traffic if things are working as well as we expect over a period of time, then we'll start ramping up traffic. Hi. Yeah, so why do we see performance degradation? The Web as in the runtime is actually an auto process call. So what's happening is a request is in your runtime, but then it's making an auto process call to the runtime. Of course, it's a cold start problem pretty much the first time, right? So given a large number of requests and over time it will average out, but if you don't have sufficient traffic, you will see the cold start fairly frequently. Again, it's an optimization we have to make, we just haven't got to it yet. Again, I'm fairly certain, like the assumption we made initially was we would see about a 25% hit, so we were ready to take that hit. Actually, pleasantly surprised to see was in the tens, I think we can get it to single digits. I think with 5%-ish, 5% to 8% will be pretty happy in that range. Yeah, because it was all running in process, right? Lua runs in process, it was pretty straight. Or C++ runs in process over here. We're just building it as a monolith. The proxies we have, there's a question, what are the proxies? So we have some of our stuff running with variation of Nginx. Some of it is Apache, some of it is Envoy. You probably name it, it's there. So benefit of running a system that's been in production for decades, I would guess. So not all of them. So we only picked a couple of them that are capable of doing it. Any more questions? All right, thank you for coming this afternoon. It was good seeing everyone. And go WebAssembly, I guess.


Let's talk about target presentation Hello everyone Dylan Schumacher Citadel Defense and we're here today to talk about target Presentation or at least that's the term. I'm gonna use. I don't know if that's a real term or not But I'm gonna roll with it. So I do some dry fire from time to time because I try to be Responsible, I'm trying to be better all the time dry fire. I do it in a mirror Because it gives me something to aim at right so I'm dry firing on myself In a mirror and I've done that. I don't know on and off for a couple months Whatever, you know, I mean not all the time I'm doing dry fire just sometimes when the kids are going to bed or whatever and I have a couple extra minutes and I'm able to dry fire in the mirror a little bit and one of the things that I've thought about as I've been dry firing in the mirror on myself is Target presentation often right we do dry fire We're doing it against, you know, maybe you have like a piece of paper or you have just like a plain piece of paper Or you have maybe like an ipsick target in your house or Whatever the light switch right you're using some kind of object or thing as an aiming point because you're really working on the mechanics To get in the gun out or you know presenting the rifle or whatever like that's that's what you're doing, right? So when you dry fire on yourself though One of the things that you notice is target presentation and we're used to shooting targets on the range and stuff Sorry if I screwed up the mic We're used to shooting targets on the range that you know are just standing there, right? They're just standing here. They're giving you a full frontal presentation, right? And other people have talked about this before right? That's not always how it is in real life and all that stuff But one of the things I've thought about is when someone's pointing a gun at you like this What Target do you really have here?  Now again, that's a full full frontal shot You know basically if you look at this one more time, right? you've got kind of the left side of my head a little bit and Maybe here's the mag just below that you're looking at this is kind of my diaphragm right here So you're really looking at an intestine kind of gut shot deal, right? And my pelvis is open can't see that because it's not on camera so When someone's presenting their rifle to shoot you Same thing with a pistol, right if you're if you're out with a pistol that's covering the same thing, right? I mean my arms and the gun are again covering most of that box Again, you're gonna have kind of the tops half top third of my head Maybe some some side shots around my cheek there but really the top half of my head kind of from Eyeline to the top of my head and then again you get a little bit more you probably get above the diaphragm a little bit I think that's worth considering now I think there are two kind of schools of thought here one is okay, you know and that rifles up and it's presented Right, you got to take that shot. Well, you're basically looking at like this portion of the head, right? That's always going to be available the heads always can be available because they have to see you to be able to shoot you right, so if the rifle is up That's basically what you're looking at as far as Available target space the other school of thought is Just send a bunch of bullets over there and it'll work itself out and honestly as I've thought about it on and off for a couple of weeks, that's kind of where I've landed In the sense that okay if the rifle is up and I'm shooting right and this I'm the bad guy You're shooting me and I start to get hit in the arm and everything the target is going to change, right? When I get shot in the arm either because of a pain reaction or a physical can't change it reaction, right? Those bullets are going to hurt my arm. My arm is going to move one way or another Either again because a bone breaks and I have to move it It can't support the rifle anymore or because how that hurts and I need to move right so things are going to things are going to change and the targets going to Modify itself according to your ballistic behavior, so Those are kind of the two schools of thought and I think that the defining line in general I think I'm in the send a bunch of bullets over there and it'll work itself out target presentation doesn't matter So just delete this video The other thing though, I think is depending on how critical that shot is in the moment. You might not have the Luxury of being able to send a bunch of bullets over there and just let it work itself out, right? You might have to go for that headshot and those of course are reasons that we practice Shooting little tiny objects quickly and stuff like that, right? There are reasons we do that and this would be one of them now Do I think I'm gonna pull up every time on that headshot? No, probably not because I don't want to be fishing around for it when I could just start sending bullets, right?  So I hope this again this video is helpful just gets you thinking okay Target presentation and and we should keep dry-firing. We should keep shooting targets that are full presentation targets, right? There's nothing wrong with that per se the point is thinking about okay Knowing that real life is different than practice and that's always gonna be the case There's only so much you can replicate in that right you could do a sims course, right? Like a sim munitions course We're gonna have someone actively moving and shooting on you that would be that would be good It's probably as close as we'll be able to get and you'll start to see that target presentation more But for those of us who don't have time or money or availability to go take a course like that especially since the ATF just outlawed Sim rounds that only sold like police and military units now because screw you that's why So not all of us will have the ability to do all those things So I think as you think about targets right and as you think they make targets that that are presenting, right? They make target for the bad guy like this or he's standing here with his rifle or whatever But even on those targets, you know what they do they draw the same ipsick zone and it's right over Where where all the arms and stuff are and and that's what I don't like about those targets typically, right? Or they like have a guy here, and he's like holding his gun over here like this, you know, so that it's still open Again, this is just food for thought to think about target presentation Someone's pulling up on me with a rifle or a pistol or whatever And they're giving me that full frontal intent because they're trying to shoot me like I'm trying to shoot them and How what are my available targets and then how am I then going to navigate that right available targets? Like we talked about kind of the side of the head How am I going to navigate that? Well, maybe I'm going to take that precise shot because for whatever reason that that situation dictates That's what's available to me, and that's what I need to do or Maybe I'm just going to send bullets over there and figure it out And you know what I call the me and with all method which again, I think I'm partial to so I hope that's help We'll hope that gives you something to think about do brave deeds and endure


For today's video, we are going to be using the Urban Decay on the Rhone palette. This is part of the collection that they had and this is the teal one. You've seen my videos before that you've already seen that we have done the purple one, which I loved. Also, I should mention that if you see my background moving, it's because it's not a background. It's actually a dog. That's Rocco, sitting in the background. If you see him moving, I apologize. Anyway, let's get started with today's video. So what we're going to do is we're going to use the top row to start with. So we're going to take the lighter shade shade number one off the grid and we're just going to apply this all over the lid using a blending brush. So from the lid up to the brows. We're then going to skip over to escape, which is the third shade and just apply this back and forth in the crease of the eye and very slowly build this up with your blending brush. Because we already have off the grid on the lid, it should blend really easily for you, but just in case you want to really softly build this up. We're then going to take detour, which is the last shade in that top row. We're just going to apply this on the outer edge using little circular motions. And then you can very softly blend this up into the crease. Just make sure that escape is always higher than detour. So keep detour nice and low in the crease. Then to save us using any more brushes, I took dash and I tapped this over the inner two thirds of the lid using my ring finger. But I also went in with my blending brush and just removed any of that shimmer that might have touched the crease because we want to keep the crease nice and matte. And underneath the eye, I took a little bit of detour and I just rubbed this underneath using my pinky. Finish off with lots of mascara. And I'm always asked about what mascara I use and it's this one. This is the one that my friend recommended. I will link in the description box all about it. And I'm also using lashes from Penny's. But that is just a nice, simple, natural look. Now we're going to use the first four downwards. So we're going to start off with off the grid again and work this all over the lid. We're then going to take Confidential and we're going to apply this on the lid, but also very softly blending it up into the crease when there's not too much product on the brush. So I want to really limit how much product we're using and how many brushes. So we're just going to apply this on the lid and then as it kind of disperses, you can blend upwards. Using my ring finger again, I'm going to take 16th Street and tap this over the lid. This is going over the top of Confidential. But you do want to go back over with your blending brush just to soften out any harsh lines because using your fingertips doesn't give the same sort of finish. So just very lightly tap over the top. And then I took a little bit of Dash and I applied this on the inner corner. But I used my ring finger that I applied 16th Street with, just a very softly blend it out. Just so it's not too much of a contrast and we're going to get a nice fade. And again, using my pinky, I took Confidential and applied this underneath the lashes on that lower lash line. Finish off with liner and lashes and Rocco really liked this one because he's actually made him wake up and come and give me kisses. For the final look, we're going to be using the green shade. So we're going to strut off with a scape all over the lid and also blending this into the crease. We're then going to take Detour and we're going to apply this all over the lid and this is going to work as a base for the greens that we're going to be applying. So for the greens, what I did is I took the darker of the two greens and I applied this with my ring finger along the lash line. Now if you have a brush, use a brush, but I really want to make these beginner videos super easy. So I'm just going to push this along the lash line using the curve of my eye. And then what I'm going to do is to blend it upwards at a like a wedge shape using a clean finger just to smudge that out. So it's basically like a wedge of a shoe from the center of the lid blending upwards and this will lift the eye shape as well. And this is the kind of look that you're aiming for at the end. And then I just finished off with a little bit of that teal color underneath as well. And then to use the last shade, we have Switchback which is a gorgeous highlighter. It's really sheer but it catches the lightness beautiful green color and just apply that on the inner corner to bring the entire look together. And there you go, a cool way to add a little bit of green, keep it nice and neutral and still wearable. Hope you guys enjoyed this one. If there's any other palette you'd like me to try out, definitely let me know in that comment section. Hit that subscribe button, hit that like button. Check out the videos on the screen and I'll see you in the next one.


Hi and welcome to the session. I am Shrishi and I am going to help you with the following question. Question says show that the line through points 4, 7, 8, 2, 3, 4 is parallel to the line through the points minus 1, minus 2, 1 and 1, 2, 5. First of all let us understand the direction cosines of a line joining two points p having coordinates x1, y1, z1 and point q having coordinates x2, y2, z2 are x2 minus x1 upon pq, y2 minus y1 upon pq, z2 minus z1 upon pq where pq is equal to square root of x2 minus x1 whole square plus y2 minus y1 whole square plus z2 minus z1 whole square. Also if l1, m1, n1 and l2, m2, n2 are the direction cosines of two lines and theta is the acute angle between the two lines then cos theta is equal to absolute value of l1, l2 plus m1, m2 plus n1, n2. Now we will use this discussion as our key idea to solve the given question. Let us now start with the solution. First of all let us assume that a and b represent the points having coordinates 4, 7, 8 and 2, 3, 4. So we can write that a and b represent points having coordinates 4, 7, 8 and 2, 3, 4. Using key idea we know ab is equal to square root of x2 minus x1 that is 2 minus 4 whole square plus y2 minus y1 whole square that is 3 minus 7 whole square plus 4 minus 8 whole square that is z2 minus z1 whole square. Now simplifying further we get ab is equal to square root of 4 plus 16 plus 16. This further implies ab is equal to square root of 36 which is further equal to 6. We know ab cannot be negative so we have neglected negative value that is minus 6 and we get ab is equal to 6.   Now let us assume that p and q represent points having coordinates minus 1 minus 2, 1 and 1 to 5. Now pq is equal to square root of x2 minus x1 whole square that is 1 plus 1 whole square.  Now simplifying further we get pq is equal to square root of 4 plus 16 plus 16. This further implies pq is equal to square root of 36 which is further equal to 6. Now we will find out direction cosines of line pq. So we can write direction cosines of line pq are x2 minus x1 upon pq that is 1 plus 1 upon 6 y2 minus y1 upon 6 that is 2 plus 2 upon 6 z2 minus z1 upon 6 that is 5 minus 1 upon 6 or we can simply write direction cosines of line pq are 1 upon 3, 2 upon 3, 2 upon 3.  From key idea we know cos theta is equal to l1 l2 plus m1 m2 plus n1 n2 where l1 m1 n1 and l2 m2 n2 are direction cosines of two lines and theta is the angle between the two lines.  Now if theta is 0 degrees this implies that angle between AB and pq is 0 degrees or we can say the given two lines are parallel we know if the angle between the two lines is 0 degrees they are parallel to each other so we can write thus the given two lines are parallel hence proved this completes the session hope you understood the solution take care and have a nice day


Welcome to virtual university. Today I am going to recap what you have been doing in the past. Reading is the most important skill that you will need for success in your studies. Poor reading may be a problem for many of you, but it is not a hopeless one. And we have been teaching you ways in which you can improve your reading comprehension. Now remember, this is just an introduction. You must continue to read and practice on your own. And it is only by reading that you learn to read. And our main concern here is with improving your comprehension. There is a relationship between reading speed and reading comprehension. You may think that if you read rapidly, your comprehension will suffer. This is a false assumption. As you push yourself to read faster, you may find that you comprehend less. However, continued practice will improve your comprehension as well as your speed. Instead of responding to every individual word, you will be responding to meaningful chunks of words, to units of ideas. And good readers adjust their speed to the material they are reading and the kind of comprehension that they desire. You do not, I am sure, read a newspaper and your science textbook in the same way. You adopt different ways of reading a newspaper and you read your textbook in a different way. Now, there is one major cause of slow reading and that is vocalization. Which is forming the sounds of each word even though you may not say them aloud. You sort of say them under your breath. You just form the sound of the word. Now, vocalization is very common among our students. It is a sure sign that the reader is a poor reader. So, learn to read with your eyes and mind and not with your lips. In simple words, learn to read silently. A good reader reads silently. If you learn to recognize and understand the principles and methods of writing, because reading and writing go together, after all somebody has written what you are reading. And this is called rhetoric. It will improve your reading. If you learn to recognize and understand the principles and methods of writing, if you understand how the writer has written what you are reading, it will help you improve your reading. If you learn to understand why a piece of text or writing was written, what it says, both in overall statement and major sub points, and how the author or writer has made those major statements and the minor parts fit in, it will help to improve your understanding of the reading text. You may remember this is exactly what we have been doing so far. All successful writers work along these lines. The way they write will provide answers to three questions. Why is he writing? What has he written? And how? How has he gone about writing? An important part of reading is realizing that everything you read has an author or writer who has something to say. And he says it in a particular way, in a particular manner. Now you as a successful reader must apply the same technique that the writer has used. You must apply you as the reader, must apply the same questions. Why? What? How? And decode what the writer has written. I hope you have got my point. Here is something that the writer has written and here is, here are you. The reader. You have to interact with what the writer has written. He has used certain techniques which you can decode by following those three questions. Why? What and how? Now to answer the first question, why? Remember the author is a person who has a reason for writing a given piece of text and who works from a personal point of view. You as a skilled reader, you must fully understand and evaluate what you read. Remember the writer, the author has a purpose in writing and you must recognize that purpose. Now with purpose there are two other things and those are attitude and tone. When a writer writes, he has a purpose and he has an attitude and he develops a tone while writing which are in simple words the expression of the writer's feelings. There are three common purposes of communication, of writing. One is to inform, the other is to persuade and the third one is to entertain. When the writer's purpose is to inform, he gives information on facts about the topic or subject he is writing about. And when the purpose is to persuade, the aim is to convince the reader to agree with the writer's point of view. Here also, writers may give facts but their main goal is to promote an opinion for the third purpose which is to entertain. The author appeals to the reader's senses and imagination with the aim of amusing and to cause delight. Related with purpose, as I said earlier, is the matter of attitude. What is the writer's attitude toward his subject? Or towards you, the reader, even if he is arguing, he can be arguing coolly and logically or he could be arguing angrily and heatedly. He can see something funny in the situation or something frightening. Similarly, he can approach his audience that is the readers, his readers as friends, as enemies, as equals or he can talk down to them from a position of authority. Now that is attitude. Attitude then is the author's approach, the position, the stance that he adopts towards the material that he is presenting. And the audience, that is you, the reader and the situation in which he is writing. Now, a good clue to the author's attitude and approach to the subject is his tone.  And it is through the author's tone that we sense his wit, his humor, sadness, indignation, friendliness, etc. Just as a speaker's voice can project a range of feeling in the same way, a writer's words and phrases can project one or more tones of feelings. And understanding tone is an important part of understanding what the writer has written. Sometimes tone is evident from the first line, from the first paragraph. Sometimes the tone and purpose and attitude will not be evident, will not be clear to you until all of the piece or text has been read. Now, authors and their works are complex. Authors are human beings, they are complex and what they write is also complex. And author uses many different types of writing to put forward his views. He may choose to narrate, he may choose to describe, he may choose to explain or he may choose to argue. He can put forward his views in any of these styles of writing. Now, not all writing fits neatly into one of these categories. You may find a writer combines all these types in one piece of writing. Description and narration are often used to help develop a further purpose. The writer can use description and narration either to put forward an argument or exposition. Thus, you may find, he may even use exposition to develop an argument. Thus, you may find combinations of purpose involved in what you read. The same purpose, the same approach can apply to humour and to entertainment. If you, the reader can find out what is the underlying purpose and intention of the author and what technique or strategy he is employing, then you are a successful reader. And as I have said earlier, that you will not develop this overnight. You will not develop this in one or two or maybe a month's reading. Continuous reading, sustained reading will develop this, the skill in you. Now, all this, the things that I have mentioned, purpose, tone, etc., etc. All this might not be evident in your first reading. So this means that you will have to re-read. At least this might be necessary until you are a practiced reader. Now, you cannot always rely on your first reading to bring you the comprehension, the analytical understanding that is required. But there are clues that your first reading will supply. And these will be of great value. They will be valuable in your second reading or in your re-reading of the text. Now, that was the first technique. The second technique that the writer uses, the one that answers the question, what the writer says, what he has said in his piece of writing, what he has said in the overall statement and the major sub-points of the text. This leads us to the author's basic statement, his thesis statement about his subject. For you, the reader, the thesis also indicates what the writer is not saying. It shows you the limitations the writer has set for himself, how much of the general subject he is going to deal with. A good reader makes sure that he reads within the boundaries of those limitations. To help readers understand their main points, their main points, the authors try to present supporting details in a clearly organized way. Details might be arranged in any of several common patterns. Sometimes authors may build a paragraph or longer passage exclusively on one pattern. Very often the patterns are mixed. And by recognizing the patterns, you, the reader, will be better able to understand and remember what you read. The most commonly used pattern of organization are subdivisions such as time order, sequences, list of items, comparisons and contrast, cause and effect, definition and example. These subdivisions complete the pattern of the writer's basic statement. His thesis is been thought. He uses these subdivisions to present to you bit by bit what he has to say. And the reader's recognition and understanding of these subdivisions are a part of answering the question how? The third important technique used by the writer. Recognition of the main subdivisions is recognition of the techniques and devices of organization. Paragraphs and particularly the topic sentences of paragraphs are important clues. The topics of the individual paragraphs are the core statements in explaining the writer's thesis. Each paragraph will make some kind of core statement and then develop it with some concrete details. Now in short pieces of writing, each paragraph may be a separate subdivision. In longer pieces, a number of paragraphs may form a subdivision each contributing to the total understanding. Relationships between the different parts of a text are conveyed throughout by use of transitions. If you remember, we've done these transitions in the earlier lessons. A recognition of these transitions, the movement from one connection between from one part of the text to the next leads to a general improvement of your reading. In other words, it means noticing important words and phrases which connect the parts. These may be function words or content words. Now function words, as you know, are an important part of writing and reading and I use no matter what the subject of the text. These are those small words such as as, in, at, and, but. Those small prepositions, those conjunctions, the modifiers, etc. that help to establish emphasis and relationship between the parts. They are the chief clues to the organization of a piece of writing. All writing depends on these function words. Now, content words are those that are central to the development of the subject of any particular piece of writing. They are often words that are most fully defined. But it is also possible that the author assumes that you know their definitions. In either case, you, the reader, have to be sure you understand these key words. Also, you need to notice how the author modifies key words, key content words at different parts. Sometimes, he substitutes a word for the key word that he has used earlier, the content word that he has used earlier. Sometimes, later on in the passage, he might use another word for it, a substitute. He may use synonyms. That is, other words with similar meanings. Or he may even use antonyms that are in contrast to the key content word or words. And the successful reader learns to recognize and understand the clues that the writer gives. And this can only happen through practiced reading. Now, I have repeated what you have been doing in the past lessons. Now, there is, I am going to talk about an approach to comprehension. You have probably realized by now that everything you learn in this course is geared towards the end of writing and understanding English. And nothing is merely an exercise learnt for examination purposes. Now, what we call comprehension exercises that you have done earlier and you are going to do again in the future. They are in fact a test of your understanding. Now, up till now, you have been dealing with computer related passages. The reading passages that you had up till now were entirely based or related with computers. Now, we will shift gear and make you look at other kinds of reading materials. The pieces of writing we will use are going to be of two types. Imaginative and factual, imaginative and practical.  They could be extracts from a novel or a short story. They would be dealing with a fictional situation and we could even have a poem. Now, in answering comprehension questions you should know that you can understand what the writer is talking about but just not on the surface. But you also need to know the subtleties, the implications, the underlying meaning and you will need to know something about how the writer is getting to his points. The way he uses words, images and sentences to create particular effects. In other words, you will be looking into matters of style and appropriateness of style to the content. This will be when dealing with imaginative passages or creative passages. In the practical passages, you will deal mainly with facts. It may be a report, an account or someone expressing his opinions on a particular matter, a series of instructions or a set of statistics which you will be asked to interpret. The emphasis here will be on making sure that you can understand the line of argument or the logical step-by-step statement of the facts. You may be asked to summarize the points made in the passage about a particular aspect of the matter being discussed. Now, keep in mind that the computer text we did in the earlier lessons were factual text. Now, the kind of questions you should be prepared for. The kind of questions on reading passages that you are likely to deal with shall be, they shall deal with, number one, meaning. You may be asked to explain the meaning of the words or phrases as used in the passage. For example, you may see the word execute. And you might immediately think of its meaning as inflict capital punishment. But this would not be appropriate. It wouldn't be an appropriate meaning in a context like to execute the plans for redevelopment of the town, will call for the support of all citizens. Now, here in this sentence, execute doesn't mean killing someone. But it would mean carry into effect. That is, bring it about, how to bring about the plans. You will deal number one with meanings. Number two, you will deal with facts. You may be asked to answer questions about what the passage is actually saying. Just to make sure that you understand. For instance, if in the piece of writing, if the piece of writing you are reading is about a character, a character digging his allotment, you may be asked, what is the character doing? And here you would be dealing with facts, as they are stated in the text. The third thing you would be asked would be reading between the lines. Now writers, especially creative writers, writers of fiction, do not always state their facts directly. They imply, they imply emotions and attitudes and suggest points of view. And they depend on the reader being perspective enough to be able to form a total impression. They expect the reader to understand the total meaning, the total impression, which is greater than the bare words of the passage. For instance, the author may not state directly that he dislikes a particular character he is writing about. But the words he uses to describe that character and the situations he presents him in may convey the author's attitudes towards the character and that attitude is passed on to the reader. The words are not chosen accidentally, but with a purpose. And you, the reader, must be able to get beyond the surface meaning of the words and see what the implications of such words are. For example, the same soldiers could be called terrorists, freedom fighters. According to the, you know, soldiers could be called terrorists. They could be called freedom fighters depending on the writer's attitudes towards them. In describing someone eating, a writer may use the words like he gulped, he slobbered, he guzzled, he wolfed down. And these words may be merely a statement of effect. But if they are about an adult, if he uses these words, the words slobbered or guzzled, if he is talking about a baby, they would have a different meaning. But if he used them to describe an adult eating, the writer may well be suggesting distaste, dislike towards the character he is describing. The writer can also use metaphorical language. For instance, you might be asked to explain what is exactly that a writer has in mind when he makes a comparison or uses a metaphor, a metaphorical expression. In a story, the author may say, my uncle blew and bugled whenever he won at cards. This is from a story by Dylan Thomas. The writer says, my uncle blew and bugled whenever he won. He was at playing cards.  But the word bugled is being used in a metaphorical way. The writer is making a comparison between the noises uncle made and the sound of a bugle. His uncle didn't have a bugle in his hand. But the sound that he was producing was very much like that of a bugle. The writer here is trying to make more vivid to our imaginations the kind of noise his uncle made. Now the word bugled suggests things like high pitched, strident, sudden and loud, perhaps even triumphant. Now these are ideas, these ideas which this metaphorical use of the word conveys. They convey a lot more than literal words would convey. Now when we are dealing with imaginative texts, you have to look at style. Just as people as individuals are different, so the people who write, they write in various ways. They have different styles of writing. A particular writer may write in different ways depending on what effect he is trying to achieve. He may use very flowery language if he is trying to create an atmosphere. He may write very simply if he is just concerned with getting important facts over to you. Or he may write with his tongue in his cheek. Now you may be asked to comment on the style of the passage you are studying, you are reading. And you may have to justify the appropriateness and the effectiveness or otherwise of the style to the content of the passage that you are reading. That is what the writer is saying. Now the kinds of points you would have to be aware of. The variety of sentences used, the kinds of words chosen, the particular devices, the literary devices he is using. These are the things that you will become familiar with and you must become aware of. These are very important aspects of understanding writing. And we shall be discussing them in greater detail in the units to come. Now so far we have looked at five types of questions that you will get in your reading after you have done your reading. The sixth type of question will be the summary. You may be asked to pick out certain facts in a passage which are relevant to a particular point. Example, you may be asked what do we learn about X? What do we learn about Mr. X physical appearance? And you will have to search through the piece of writing, through the text to find out all the details that the writer gives you about this. You may be asked to summarize the main points of the passage that you have read. Now the seventh type of question that you can be asked is to give your own opinion. Now this is a higher level scale where you as a reader will be asked to comment, give your response, your personal opinion. You may be asked to comment on the views expressed in the passage, in the text to say whether you think they are convincing or to give your own views on the topic. For instance, you read a passage, a piece of text on homeopathy what we in our common language say homeopathy. In English the word is homeopathy and you may be asked do you think homeopathy is harmful and here you are being asked to give your opinion. Now asking for personal opinion and justifying your opinion is a higher level scale. You may be asked to develop or expand on an area of experience which is described in the passage and you may be asked to express your personal point of view. For example, the passage may be about working conditions and you may be asked to comment on the conditions under which you work and indicate the area in which you think improvements or improvements could be made. Here you are being asked to state your personal views. You may be right, you may be wrong that doesn't matter. What we would like to train you is in the art of expressing your opinions. Never mind if they are right or wrong. Now let me recap what we have gone through today. We have introduced you, we are going to introduce you to a new set of reading. Reading that will involve imaginative pieces of writing and factual pieces of writing. And the questions that you will be asked will be based on finding out if you understood the passage, asking you about the meanings of the passage. Then we can ask you about facts, facts related to the passage. Then you will be asked to, you may be asked to read between the lines. That is infer, infer meaning, inferences, how to draw inferences from what is stated. Then you could be asked to comment on the kind of language that the writer has used. If he is using metaphorical language, what is the significance of using that language? Is the writer successful in drawing the images? Was the use of those images appropriate? Was he able to draw out the feelings that he wanted to? And of course it will be your personal response that we will be looking for. And then from this we moved into the area of style, again a higher level skill. Looking at the style of a writer's way of writing, what techniques does he use? Is he successful? And then you might get questions on making summaries. Now to make a summary is not easy. I am sure you have been learning summaries of passages that you read in your intermediate course. Our students learn the summaries by heart, the summaries that are available of all the intermediate essays and poems and short stories. Students just buy those books from the bazaar and they learn up the summaries and they write them out in the intermediate exam. This time we will be asking you to write summaries. You will have to write them, you will not get them ready made in the form of notes. And the last type of question would be to state your opinion. Which is again we will be looking for your personal opinions, your personal response to the text that you read. Now these are the main types of questions and approaches that you are likely to be asked. There may be others and you may become, but if you become acquainted with these types of questions and texts and you can understand them. You should be a well-prepared, practiced, confident reader. Now today we have talked about different aspects of reading and understanding English. And we have also signposted the rest of the reading-based lessons. Now do you understand the word signposted? When you go out on the road, if you are observant, you will notice that on the road, there after a certain distance you will find either a milestone or a notice on a pole giving you the directions. That is what is meant by signpost. A signpost just tells you the directions that you have to take. And in today's lesson, we signposted the kind of reading, the reading-based lessons that you are going to have in the future. And we have also tried to show you how to deal with different questions which are based on different kinds of reading texts. And in the next few lessons, we will be practicing different ways of interpreting texts. These could be dealing with imaginative texts. You will also have texts dealing with non-linguistic texts in the form of tables, in the form of graphs, in the form of charts, pie charts. You may have maps. You will look at those and interpret them. Of course there will be questions related. We will give you practice in how to deal with such texts. So in the future, you will be looking at short stories, poems, maybe an extract from a novel. We will try to include some biographical material. In short, we will try to introduce you to a lot of imaginative reading. That is creative writing, writing that is fiction. You have had a lot of material on, so far you have been looking at text which was based entirely on computers. It is not that we are not going to have any more computer lessons. You are getting computer lessons, but we will talk about computers as well. You will get reading based on computers, but we are going to introduce you to another kind of reading. And we hope by the end of this course you will have developed an understanding of how to go about reading English texts. The more exposure you have to different kinds of reading material, the better reader you will become. In the next few lessons, we will be practicing different ways of interpreting texts. And with that, we come to the end of today's lesson. Next time when we meet, we shall be doing something very interesting. We shall be looking at inferences. We shall look at a few poems, a few cartoons and we will teach you how to draw inferences. That is how to read between the lines. Allah Hafiz, see you next time.