There's been some important updates to Starship Simulator since we last reported on it on this channel. In this video we're going to go through what's changed, what's just arrived in the game and what is next for this exciting and ambitious indie space simulator. It's been a solid five months since we last looked at the in development indie titles Starship Simulator and there's recently been some significant additions to the project. If you're unfamiliar with Starship Simulator you'll find our original introduction video linked on screen right now but in essence the title is aiming to ultimately simulate all the systems and functions of a fully crewed Star Trek styled science fiction starship capable of faster than light travel all set in a one to one scale procedurally generated galaxy. The game can be played in single or cooperative multiplayer but unlike games like Elite Dangerous or Star Citizen etc where everyone has their own ship Starship Simulator will house everyone playing on just one ship but allow full and detailed access to multiple roles within that ship. Those roles will encompass the familiar bridge crew positions such as captain helmsman or sensors etc but as the name implies it also simulates the entirety of the rest of the huge ship in the same one to one scale meaning players could for example choose to spend their entire game in engineering or the science labs for example far from the direct starship control roles of the bridge. Since we last touched on Starship Simulator the game has moved on to the latest version of the Unreal Engine 5 and has started to take advantage of some of the graphical and run time benefits that new engine brings. Some new features have been added to the multiplayer systems adding the kind of features you'd expect to see such as allowing hosts to set passwords on their servers see who's in the game kick players if necessary or even send them to the brig. So crucially all the engineering systems on board are now synced across multiplayer meaning multiplayer sessions can take advantage of the latest significant gameplay changing update to the game what the developers fleet yard studios are calling the cold and dark update. When starting a new session of the game players can now choose in single player or multiplayer to start the game with the ship completely powered off in its cold and dark state where the ship must be correctly powered on in order to make it in any way functional. Remember first and foremost Starship Simulator is aiming to become a simulation of a starship and all its internal systems right down to the nuts and bolts starting the sim cold and dark means you can't just flip a switch and off you fly. The ship must be correctly powered up that means starting the fusion reactor up before you can even turn on the consoles and lights on the bridge let alone firing up the warp drive. There's extensive patch notes published to the game's official discord server but to serve as an example cold and dark has added new user interface controls for systems such as fuel cryo storage tanks cryo pumps coolers valves the reactor output distributor high voltage battery distributors and battery power aggregators and the list goes on. The cold and dark update means that when you go through the ship's startup sequence you will see for example the helium and deuterium fuel tanks filling up ready for the fuel to be injected into the reaction chamber before the fully simulated reactor is even fired up. Not only must the fuel be flowing but batteries and their associated power input and distribution systems have to be charged and multiple power distribution systems must be set correctly right across the ship in order for the ship to function. If you go through the new excellent cold and dark tutorial the end result of all this is that you really start to get to see where this project is heading and the inherent complexity it's aiming for. If a player chooses to specialise for example as the chief engineer on board the ship then there will be systems on board the vessel that they will have intimate knowledge of and should the ship be damaged in combat or because of an accident etc then they will need to wield that knowledge of the ship's systems in order to diagnose a fault and repair it before the vessel can carry on with its primary mission. The long term plan that the developers have for the game is to eventually replicate this level of detail into every corner and roll on the ship. And speaking of the ship directly it was always the plan that the starter vessel the Magellan class would be somewhat redesigned before the game officially launches and that process is now well underway. Developer Dan Govier has begun sharing work in progress images of the reimagined Magellan exterior that is now being built. It's early days but rather than the previously familiar place holder saucer shape the ship now sports a somewhat more streamlined appearance and the all important systems that will house the warp field generators can be seen enclosed in a huge ring that encircles the ship's vertical axis. The developers now publish and update a roadmap on their discord server so you can see where the project is at and what's coming next and right now fleet yard studios are actively working toward their next major milestone on that roadmap, a full trailer and kickstarter campaign to help fund the project going forward. Once that is complete the plan is for the full game to enter early access late in 2024 but before then you can try the Starship Simulator demo via Steam right now. Starship Simulator whilst hugely ambitious is a very exciting prospect for the space simulator community in general and suffice to say we're continuing to watch the development of the game very closely here. You'll find Starship Simulator on Steam and the Fleet Yards official discord server linked in the description below this video. If you've enjoyed this video be sure to like and subscribe as that stuff really helps the channel. You can also become a patron and directly support our work here at the burp pit. That's it for now we very much look forward to seeing you next time.


They get you coming and going on price. Holy smokes, let's hope this works.  Get it, get it. What do you think, Michael? We're taking the on cloud flash shoes out for the first time. These arrived, I think over a month ago and I've just been waiting for the right moment to try them and you know, it's been snowing here a lot so this is on one of on's racers and I'm intrigued, I'm intrigued. Give it a shot, let's give it a shot. All right, gotta get laced up here, Michael. Come on, come on. Like I said inside with Michael, these arrived about a month ago. The weather, the just wearing other shoes, trying out other shoes for all of you and I just haven't had a chance to take them out. So today, first impressions on cloud flash, 10 miles. I'll do probably a little bit of dirt but I'm gonna stay mostly on pavement. These are definitely road shoes for sure and we'll give you my thoughts on it. I tell you what, lacing them up right now, I'm kind of intrigued, okay? I'll give you my thought that like walking around the house just the last five minutes, hmm, fascinating. All right, let's go. Okay, here's my first steps. I always like to film my gut reaction of my face as to how the shoes feel in the first 100 meters of running. Let's go. Get to these guys in a minute. Oh, I love that color, you know I do but first gotta finish the foam, little more foam to hang up in here and then yes, that cord, where'd it go? Gonna test this guy out. Oh, baby, man, let's do this. Okay, last foam for the shoe deal. I think we're gonna put one right up there, right up there. It did not work. It did not work. It didn't work and guess what? That's okay, we'll keep trying. If you're a live streaming expert out there, let me know. I'm trying to use a Canon 5D to connect it to my MacBook Pro and it's just, and I'm using Ecamm as the live streaming software. Oh well, not gonna stress about it, just move on. I can't put any more time into it today. Maybe we'll keep troubleshooting moving forward. Okay, diving into your thoughts about, remember yesterday's question of the day was all about what questions do you have for me about how to run faster? So here's a couple examples of what's coming in. Stride length, that actually popped up quite a bit. People are wondering like how to improve or increase your stride length. Running form, interval training for marathons, increasing one's endurance, beginner running speed work. So if you're newer to running, like when to introduce it to your overall training, that actually came up a couple times. And then how to get faster for the half and full marathon. So thank you. We're gonna tackle these questions, not now, but I would say over the next four weeks, four to six weeks, I will hone in on some of these topics and I love it. And I love the thought about running form and I think there's a lot there for all of us for getting better at running in 2019, working on our form. And let's move on to the on cloud flash. And just so you know, if you're looking for the shoe online, cloud flash is all one word. That took me a minute to figure that out. So it's all one word for the on cloud flash, a few initial specs, five millimeter drop from heel to toe, an engineered mesh on the upper, very, very breathable, very, I can tell it's like really well constructed. Even though I've had some issues with on uppers in the past, you remember when I tore that on shoe, maybe about six weeks ago. And actually I don't know the official weight for my size. Let's weigh it right now, come on. There we go, 193 grams, 6.8 ounces. Not too shabby, not too shabby. That's pretty lightweight. And I must say when I put it on my feet inside the house this morning, I was like, okay, this is a racer for sure, definitely a road shoe. One first impression that I would like to give is that I could feel the laces on the top of my feet. It wasn't painful, not like the Vamara 14, but I could just feel them and this tongue on the on cloud flash is very, very thin, very thin. It's one of the most like thinner tongues I've ever seen actually. It almost looks like a track spike as far as the tongue. And so I can feel the laces on the top of my feet.  That definitely jumped out of me as soon as I put the shoes on, walking around in the house, they felt good. I did feel a little bit. So the whole on lineup is built on this cloud technology where these little clouds of rubber are on the outsole. And sure enough, like through the midfoot, you have a little break in the clouds. And so I did notice a little bit today. It went away probably at about mile two or three, but that first two or three miles, I could feel this row of clouds right where the midfoot is beginning to approach the forefoot. Was it a major deal? No, but I noticed it as I was running like, okay, I can sense a little bit of a gap there in the clouds. And I will, I'll do a little more research, a little more testing as to why they left probably because of weight. They want to make this shoe as light as possible because it is a racing shoe. And in the on clouds for my first run today, 10 miles, 16 kilometers, about seven, 10 per mile. So, oh gosh, four, 45 a kilometer, approximately 430, 445 a kilometer, approximately. So not too fast. Today was a little more of a mellow day in my training schedule, but it felt like I was slapping my foot on the pavement the last two miles. Like it is a hard landing, okay? And I realized like, this is not a training shoe. And I knew that going into the run. It's definitely a racing shoe, but it's a little bit of a hard landing. And maybe if you're an on fan, maybe you could talk to me down in the comments about what you're experiencing. And it's not like, I think for racing, yeah, good ground contact feel through the outsole. Like I felt today like, okay, I can really feel the road and make a good toe off.  However, it's just a hard landing compared to, it seems like every other shoe. And I've noticed that in some other on shoes as well. And you're probably wondering about the distance. Not a marathon shoe, okay? I think we probably would all agree on that. And I would say probably not even a half marathon shoe. Now I guarantee there's people out there racing half marathons and marathons in this shoe, and that's fine. I think after, and this is just my first impression, not my full review, just my first impression, 10K. This feels like a great 10K shoe, not a 5K. There's lighter options out there for the 5K. But as I was going, I was like, okay, I could see my legs withstanding kind of the less cushion feel for six miles. 10 miles, 13 miles, eh, I don't know. Probably once again, there's better options out there. But for the 10K, I think that's where this guy lives. And the 5K, again, I just think the 5K is short enough that you can go like really lightweight and go all out and just let it rip. Whereas the 10K, you need a little more sustenance to the shoe. Here you have it, that is my first impression of the on cloud flash and listen. In the running shoe world, I like innovation. I like taking risks. And you see what works and you see what doesn't. And I feel like in the last, even just in the last 10 years, like since I was in college, we've come so far with different types of shoes. Sometimes it's a little overwhelming. And on is a good example of a gentleman in Switzerland having an idea and going for it. And I don't know yet. I'm reserving my full thoughts for the full review. I just, you know, anyway, like I'm not bullish on the on lineup at this point. You know what I mean? I'm not incredibly excited, but I do appreciate the innovation, the creativity and testing the limits and seeing what works and what does not work. Does that make sense? Okay, thanks for watching, but guess what? The vlog's not over. I'm actually going inside, packing up my gear for, yes, an early morning run in the Innovate Artic Claw 300. That's right, a bright and early morning tomorrow. So I got to go pack. I think somebody was talking to each other when it came up to the colorway, ladies and gentlemen, look at that. That is pretty amazing. I love it. I love it. Okay, let's go inside, pack it up. It's official. I need a bigger vest. This is a three liter from Raidlight. It's looking like I'm going to need at least a five liter to continue carrying filming equipment, cold weather running. Like in the summer, this will be perfect, but in the winter, you just have extra clothing that you have to carry for safety. And so three liter is not cutting it. Just putting that out there for everybody. Shoes are organized. True love. What's going on for dinner? Oh, just a little, just spaghetti and meatballs basically are for whatever, bow ties and meatballs. Hello. A little vegetable. We always do a crackpot something on Thursdays. Oh, there we go. So, boom, throw it all in. Michael loves it. Fueling tomorrow's big run, fueling tomorrow's, that's perfect, perfect timing. And Michael has a little cucumber here. If you're new to the channel, by the way, in addition to running, we're also just living life here. We're also just living life here. So, life is exciting and beautiful. Exciting and beautiful. All right, let's get this table ready. You know what the mission is? Can you say the key word for today? Yeah, for the on cloud flash shoes. Thank you, buddy. Delicious dinner. About to put the boys down, but not before the question of the day. All right, here we go. Stretching the boundaries a little bit. Something a little unique. What a question of the day. What is something that you love to do outside of running? Okay, and I know we always talk about running here, but what is, for me, you know what it is? Charcoal grill in the summertime. I love sitting on the patio for two hours, three hours, four hours, just low and slow, cooking chicken, steak, burgers, all that good stuff. So, that's the question of the day. What is something outside of running that you enjoy doing? Thanks for hitting it up down below. Seek beauty, work hard, and love each other. Good mountain day tomorrow. Come back from that in the Innovate Artic Clause. All right, here we go, come on. Boys, you ready for bed? No. No, they say.


Everybody forced here ripping 2022 contenders football hobby six-box half-case number six pick your team style Got Bernie s the Niners and Steelers Brett. Oh Patriots Brian M Broncos Chris S bears Darren with the Chiefs. Oh, it's your Darren's Darren G with the Chiefs Darren B with the Rams Dominic Washington Edwin Giants Eric Cowboys Harper Bills hung see Jaguars Jacob L Falcons James T Raiders Jeff G with the Chargers Joe H Ravens Kevin s Seahawks Mathias Browns Michael J. Dolphins mincubes Panthers Paul G Saints bucks Ryan s Lyons Colts Sean M Titans Stephen H with the Eagles Thomas R has the Packers Vikings and Texans Tyrone with the Cardinals and Bengals Wayne S Jets Good luck everybody. Let's get started Let's do it Tony what up, dude He's going have a nice release. They still trying to pull a big quarterback out of though We've had a lot of nice receiver stuff. We've got some cracked ices, but yeah, I Like to pull a quarterback out over somebody here Willis Olava and not will Willis for sure But um Willis howl ritter and obviously pick it or pretty I want to see I want to see someone of those MVP contenders Tom Brady First auto is a rookie ticket auto of Trenton Gill for the Bears D. Gill Marjax and insert John Riggins Piranha Longmore, Thayer Munford, rookie ticket auto Raiders Yeah, all right one one two three top four five six bottom on the round numbers here And this is gonna go for the whole break unless there's an auto or one of one of which case that'll be random instead That is a two.  Yeah, that's cool. What was he doing? That's cool legendary Steve young Pedro Pascal Oh, dude, the boys sorry the boys Harry and Winfrey and the Browns rookie ticket auto was gonna say if Pedro was there the pandemonium Even dude, he's he's the biggest star on the planet right now And he's still like TV shows Roger's winning ticket Packers number 20 of 25 He was also in a yeah He's getting those big IPs Big Ben Ralthusberger admit one is that a one of one be very carefully sleeveless Admit one Ben Ralthusberger And hold this in my hand for a second here There's such as SP. I think it's just an SP Yeah, first one we've seen though and this is the third case the end of the third case today. So that's pretty rare Dependence the jewel. Yeah, it doesn't say anything about it being rather which is crazy It doesn't even have anything about it in the description. It just has on the list. Yeah Very strange nice hit for the Steelers Again, so admit one penance contenders penance and then crown jewels Pretty rare Non-common not like an answer you find every box even every case Ricky the air contender George Pickens I wonder if those are like one a case inserts We've seen literally one of each one of each. Yeah Huh? As we saw crown jewels last case you saw pennants the first case. I want to know about the pennants got supernatural Mahomes They also have like a shine to him, you know When he's breakfast Gonna roll a die here for the contender series one two three left four five six right The whole break six gonna go right side on these right side on the contenders series Hassan Haskins Titans where he take it RPS Taylor Jalen hurts on the game day ticket that does it insert on it's got to be an insert auto Yes, Aiden Hutchinson three of 49 draft class rookie auto Those are cool to show those always a good though. Nice hit for the Lions. Very nice winning ticket Rogers Julie Julius Chestnut championship ticket rookie out of the 49. That's Joey's brother dude. No way We did it we broke the simulation.  No chance that just happens Joey chestnut commercial on TV as he said as we pulled up That was the first Julius chestnut auto today. That was weird man. That was weird Y'all've seen that pistachio is Joey chestnut commercial that literally the first time they aired it ever that was the That was kind of weird As soon as I say Joey's brother, he's literally eating pistachios in a commercial That was pretty cool Montana rice touchdown tandems Man Drake London rookie of the year Jonathan Taylor number 21 out of 25 game day ticket. This game doesn't cool. Nobody check it. Oh redemption first redemption of the day Be big Kenny Pickett rookie ticket variation rps Bernie there you go Bernie variation of the horizontal areas Is redemption it's like the only is redemption maybe like one of the thing but that was like early on there it is That's going in a mag. Congrats on that one Bernie God Joey chestnut. We got cornerback auto good stuff man Jalen Thompson Cardinals on the rookie ticket auto. Yeah, yeah, I that was strange man I reminds me the one time Caleb and I were ripping luminaries at the old shop and The first field of dreams game was on and Fox has a rod Frank Thomas and poppy It's like the first three autos we pulled out of that case were like A rod Frank Thomas and poppy That was creepy like what if this next one is a the David Ortiz or whatever Roger McCreary rookie ticket auto Titans Do why do people have any of this stuff Where do they get the lamp from the Disney ride like you know what I mean? Debo Samuel Malcolm Rodriguez Lions now Ricky ticket auto. It's been a good break so far to hit that nice Hutchinson as well Omar Jackson MVP contenders Gladiators Earl Campbell round numbers James Cook Alec Pierce John Ridgway commanders rookie ticket auto Supernatural Herbert Book Pepe Williams rookie ticket auto Ravens Pepe He has a meme Pepe Sylvia Pepe Sylvia Brady and Evans in all time Charlie bit that is with the Dave bow bow Niners Davis price, so they date Dave bow bow Do bow bow The March action were shot Bateman I'm actively trying not to put $7 Kavon Timidow variation Giants rookie ticket auto Giants Timidow, but Chaco rookie of the year chiefs Living by some of his prison prices. He may have actually won rookie of the year and we just don't know it Travis Kelsey Anthony Brown Ravens rookie ticket auto first Anthony Brown auto. I think I've pulled Period Terry kill auto is an emmer as a Martin Emerson rookie ticket auto Brown Traylon Burke's rookie of the year Pepe Williams again It's so different I wouldn't be shocked if he's just someone that like Signs differently, honestly, they're very similar in essence, but like obviously very different looking But I have the same like PEE PEE, huh? very different looking but Same like vibes. I guess very strange Yeah, we need a third one. We need to know we need to know the real the real one Romeo Dobbs He legit might just be someone that like At the end of signing all the stickers. It's just different. Yeah Playoff ticket to 199 James Robbins and Jets Honestly, hey, that's that's how especially with an auto like that where it's you know, it's just Yeah Signs of both hands confirmed. Does he actually orange? Oh, she's actually doing that. Is he actually that would be he's like I got to get this done Payton Hender shot rookie ticket auto Cabell I thought orange do something that we didn't to a It would not be a horrible idea on it like I want guys to sign, you know nicely, but hey, you know Who am I to say don't sign the stickers like that never had to sign them any things well actually My apartment lease might be might be that many signatures Got a lot of stuff going on over there But at least a lot of leases nowadays is online. Well, yeah, that's totally my signature. That's it Traylon Burks. Hey championship ticket rookie out of 20 of 49 Titans Great hit We will get this one mag for you Titans. Congrats. Congrats first Traylon of the day Nick Chubb. Oh boy, Eddie. Don't don't go there Eddie. Don't go there. Jalen hurts AJ Brown.  You could literally have hit like a J rod and then like that card in the same box I another one Another one, please. I would have just been like Thor thrown on the ground another Jalen hurts It's not my dog dog does when he's hungry Are you don't give him the right food dude? Sometimes he'll go up to like his bowl If there's like still a bit of foodie left in there and just like start snacking it around Jerome Ford Brown's rookie ticket auto.  I just want the tree and we're like, oh my god So he made a mistake rookie Alec Pierce to 99 for the culture made the mistake of him putting it out like He would he would go in the room and I'd like put one like on his bull To go out there and check it out.  Where is it? He would wake up at like 2 a.m. They go out there. We're like, what are you doing? Or can you take it out a pair of Murphy Browns? You need a treat.  No go back to bed. He still gets us up early sometimes What's that treat Aaron Donald We got on one of those but I was using that for like cuz you record your voice over it. Yeah, I was using that for like bad words and stuff And he wouldn't do it he didn't care a Tanner Connor Ricky take it out of for the Dolphins Stafford and cup. I think he's he's 12.  Come on here hurts winning ticket We get five autos in that box. There were none of like the last like eight packs Didn't miss any Probably then maybe it's all came early. All right, I was lock it in last two blocks to the break Oh What does that say See those could break though. They had that Robbisberger insert about time Steelers are due I think Niners are due now Alec Pierce nice one Colts rookie ticket RPS Woodson Khalil Shakir variation bills rookie ticket auto Marj Jackson MVP contenders Stafford and Cup Chumlee that's a cool time. I sure you got to get it James Cook Alec Pierce Both lost so much weight Louis scene variation rookie ticket out of Vikings James Cook brandy moms. This is part of the show now.  I'm out of the packs later on Channing Tendall rookie ticket auto for the Dolphins Malik Willis supernatural Lamar Jackson Garrett Wilson Steve Young game day ticket come on and Tyler. I was your rookie of the year to 25 Falcons all right last one guys, but before we get to it Number seven has Broncos Texans Colts Jags Bucks left five to go in the next one my home's MVP contenders Nice a Josh Allen Jalen Ramsey. This one's number to 99, which way did these go? Right, right. Yeah, it goes to the Rams on this one. Sam. Howl commanders rookie ticket RPS. There he is There you go. Congrats commanders get that one bagged for you first howl of the day Eddie George Ray Lewis two howls now one howl auto One Kyle howling. Oh one of those, huh? Car horn blank 1915 rookie ticket Channing Tendall auto Dolphins Aaron Donald Aiden Hutchinson rookie of the year contenders Jared Gough Backwards base card Cooper cut Matt Stafford Jalen Virgil Broncos rookie ticket auto D on there Coach prime The Neil Hunter Dak Prescott Steve Young I mean, that's that's what carries history channel Britain Brown rookie ticket auto Raiders Marathon a baseball tomorrow Forest Buckner, I'm for sure. I don't know. I don't even know what the first game is I can watch on tv I'll watch it tomorrow. Tyler. I was here. I probably blacked out Sam Williams variation on the rookie ticket showcase auto for the cowboys Rookie the year Kenneth Walker the third and I have to like that's very annoying. Yeah, supernatural Malik Willis Uh olave and london and Jesse Locata Rookie ticket auto Cardinals Sir Jordan Brooks I remember he was what 2021 class or 2020 class Yeah, he's That's one of the reasons they let bobby waggon go. I think I know this guy's pretty good Recap area Jesse Locata showcase Sam Williams Britain Brown Jalen Virgil Channing Tendall Channing Tendall Tide Chandler A lot of Channing and Chandler's there Lewis scene Khalil Shakir Alec Pierce RPS Tanner Connor Perry and Winfrey Payton Hendershot Jerome Ford showcase Tyler Gordon Pepe Williams Martin Emerson Anthony Brown Pepe Williams Kavon Timpado Tyrion Davis Price John Ridgway Malcolm Rodriguez Roger McCreary Jalen Thompson Julius Chestnut championship ticket Aiden Hutchinson of 49 draft class rookie auto Hasan Haskins Perry and Winfrey Mayor um Thayer Munford not mayor Thunford Mayor Thunford sounds like a made-up politician Thayer Munford Trenton Gill We had a trail on Berks championship ticket 49 rookie auto for the Titans. They're very nice Berks Sam Howell rookie ticket auto rookie ticket rps. I just say in a rookie ticket variation rps redemption Steelers Kenny Pickett Thanks again, everybody. We're on to the next one


I woke up this morning thinking, you know what, video game movies are almost always just terrible. And it's almost as if the Sony fairy godmother had heard me and said, hey, we have a new Uncharted trailer. Let's talk about it. If you've done yourself the disservice and never played an Uncharted game, I feel sorry for you. If you have, however, I feel sorry for you also having to see this trailer, because it looks nothing like the video game outside of a set piece or two. Sure, Tom Holland looks the part, and by looks the part I mean they cosplay him in some of the outfits from the video games. He doesn't sound like Drake, doesn't have any of the characteristics, smolder, or charm as Drake. Doesn't really have the physical appearance of Drake either, so really, he just has the wardrobe.  And Mark Wahlberg's in this as Sully, because he was too old to play Nathan Drake, who he was originally trying out for and was actually cast as years ago. This movie's been in production to help for like a decade or so, but why get rid of him? We can just have two Nathan Drake's, because he's certainly not playing the Sully I know from the video games, and maybe I should separate it. Maybe I should just look at this from newcomers to the franchise that haven't played the video games and are just seeing this with fresh eyes. Okay, what you have on display in the trailer is a very kind of generic, fast and a furious looking heist movie of sorts. Doesn't look terrible, doesn't look good. Even more perplexing is they seem to have just kind of willy-nilly taken things from different games and shoved them all into one storyline. It appears to be Uncharted 4 for the most part, but it's clearly a young Nathan Drake, which we saw a lot of in Uncharted 3, which is also present because of that end-plane sequence that looks atrocious. Physics have no place in this movie apparently. I kept waiting for the camera to zoom into one of the vehicles and we see Vin Diesel there as Dom saying, one last ride, and he pulls something and the car flies at the camera with Nathan Drake on it, Tom Holland, who then Spider-Man's back in. It just looks terrible. And cards on the table, I wasn't looking forward to this to begin with. Once I found out they passed up on Nathan Filion a decade ago for this role, I said I'm out. There was no reason to make an Uncharted movie to begin with. The games are already movies, you barely play, and I love them. I love them with all of my being. I've played through them all multiple times, platinumed the first three, I believe.  Great story, though. The stories are phenomenal. They don't seem to be translated into this trailer, but it's just a trailer, so who knows? The final product could blow me away. It won't. But it could. There's a possibility. My Chloe's in this. She looks to be about 19 now, instead of the older woman that I've appreciated over the many games. The thick THICC character that's sassy, sultry, sexy, and really everything I want from a woman. She's gone from this. Now we have a younger woman that's probably fine. She sounds like her kind of. That's something. If it's not coming across, I'm pissed about this trailer, and it's gonna put people off. I know a lot of people watch trailer reaction videos to just see someone watch along and go, whoa! That's from Uncharted 3! I recognize that! This is fun!  I'm giving you an honest review of the trailer. I didn't like it. It didn't win me over as a fan of Uncharted.  Maybe it'll have more appeal. I don't know. Like, let me know in the comments if this is your sort of thing. If you like Tom Holland as Peter Parker, he seems to be doing the same character here. I didn't see any of the sarcasm or the charm or the swagger that Nathan Drake has. Did he have a half-talk on the shirt? If there's no half-talk, don't even bother releasing it.  That's like his thing.  With Sully, it was his goddamn perfect mustache. They're both gone from the trailer. Where's Elena? She's not here. She's gone. I don't know. I looked at IMDB. She's not credited. We have Antonio Baderas as the bad guy. That's about the only good thing I see going on here. Antonio Baderas is fantastic. Fuck. I mean, what? Why? Why, Sony? Nathan Fillian even did a fan short years back. It's like 10 minutes long. Highly suggest you watch it on YouTube.  So it's not like he can't do the role. He can hit the bow flex. He can hit the gym for a few weeks, a few months, get in tip-top shape, and get this done. He knocked out a trilogy in less than 10 years. That's what I want. Or nothing. Because what I saw is trash. It's honestly hot trash. The theme song is subtly present for about two seconds when the thing fires up. Then we're off to Led Zeppelin for, I don't know why. No idea. It doesn't fit with the trailer even. I'm kind of glad though that the Uncharted theme isn't present in this trailer really because now I'm at the point where I want this movie to be as distanced from the material as possible, so then I won't get as pissed off like I clearly already am when things aren't represented correctly. Now I know how book lovers feel when a movie completely botches the source material. So is there anything good going on in the trailer?  It looks completely generic and mediocre and fine. That's not what Uncharted is though, and so therefore I am upset. I don't have anything else to say. Those are my thoughts on the trailer. Let me know what you have to say about it. Maybe you think it looks amazing. You're blown away by Tom Holland's performance. He's basically encompassed everything about Nathan Drake here. Mark Wahlberg is just a shoe-in for Sully. Everything's perfect. Let me know. Like the video if you like honesty. Don't like the video and go watch one of those reactor things. Those are everywhere.  You can enjoy them. Subscribe if you want. I do a lot of honest stuff on my channel and usually I'm a little bit more happy about things. Either way, thanks for giving this a shot and hopefully I'll see you around. Little fun fact for you.  I did one for Uncharted. It was kind of a parody thing. I'll play this at the end here so you can see it. It's not very long and while that's going on there's some things that you can do. I think some interactive stuff to subscribe or watch other videos. Enjoy. When my buddy Chris informed me PlayStation was doing a contest, yeah, I fangirled out pretty hard. So with this contest, PlayStation asked us to recreate some of our favorite moments from one of our favorite franchises. Uncharted, it wasn't a problem. So we dusted off the green screen, half tucked our shirts, and we put in the work to make this a win. From the burning chateau to cruising up the river on a jet ski with Elena, it's all there. We recreated all four games, the Vita Exclusive, and the card game Fight for Fortune in their entirety. What we didn't have in acting, talent, any relevant skills in the filming industry, we made up for in passion. I'm not Nolan North. I'm also not Mark Wahlberg or Nathan Fillion. Whoa, look, Sully, it looks like we just uncovered the secrets of the Golden Abyss. But I am a gamer. So in that extension, I am Nathan Drake. We wanted to make the most authentic Uncharted experience we could.  Get too old for this, Nate. Swinging. Oh look, this isn't our first rodeo in the games to film business. Killzone, Little Big Planet, The Last of Us, Infamous, Heavy Rain, Parappa the Rapper. These are all games we at one point or another failed at making into movies. Hey kid, which Sony exclusive is your favorite? Huh, why do I think we should win the PlayStation contest? I'm pretty sure I'll let my level 26 PSN trophy rank do the talking on that. I am PlayStation and I'm always waiting for that next great exclusive right on the horizon. Now let's see it. We're prepared to give you all the PlayStation cards. Alien Nation guy, Firewatch, that's nothing, MLB the show, a collectible plushie of me, and the crown jewel, a PlayStation Vita. He doesn't know what that is.


Hey guys, what is up? Welcome to my channel. So for today's video, I just felt like playing. Like this isn't a full blown in-depth review.  So in particular, I am using the new Jeffree Star and Morphe collection. This came out a few weeks ago. It's been sitting in my room. I played with the products a couple of times. I wanted to sit down and use them on camera. So I have the eyeshadow palette, the eyeshadow brushes, and the setting spray. So if you want to see my experience with these products, then just keep watching. Alrighty, so we are going to start off with the eyes. So I already did my eyebrows. And just so you know, all of the brushes that I'm using are from the brush set. This is $42. You get 10 brushes inside. As you can see, I've used a few of them. Not all of them quite yet. I like Morphe brushes. I think they're good for the price. I mean, you do kind of in a way get what you pay for. So like these are not my refer brushes. Wayne Goss, Sonya G. These aren't that type of quality, but they're cheap and they get the job done. So I definitely think, you know, if you don't have a lot of money for brushes, Morphe is the way to go. I mean, these feel cheapy to me, but they are cheap. So whatever. I mean, they're really cute. They're pink. So I pick it up. It was one of those situations where I was like, you need to five more dollars to get more shipping. So I spent 42 on the brush set because that makes complete sense, right? And then of course, we have the eyeshadow palette. So this is $35. I was simply just intrigued to see how this compared to the Jeffree Star formula versus the Morphe. Was it the same? Was it different? I have played with this once or twice. I will admit this palette, it's Morphe quality. It's definitely not Jeffree Star. Not that I was expecting it to be, but the couple of times that I've used this, I honestly haven't really liked it. I only use a select few colors. So we will see playing today. I still want to play with it because there are so many colors. So I've played with the oranges kind of wasn't really that impressed. And the shimmers honestly, usually Morphe has decent shimmers. The shimmers that I used the other day were not very good. So kind of confused. I really like how this is kind of organized. You can have a really cool tone smoky eye, some greens, pinks, orange, a light pink eye over here. I really, really love the organization of this palette. I think it's wonderful. Let's play with colors. I haven't played with yet. So I'm going to take a little bit of honest truth. This is the JS8 brush and we're going to put it all over the lid. All I have right now on my eyes is a little bit of the Too Faced Born This Way concealer. And this particular color is kind of like neon-y. Yeah, I don't know. People seem to have had good experiences from what I can tell with this palette and I just haven't. It's weird. And normally like I don't dislike Morphe palettes. You know, they're not high quality, but they're not high priced either. So this just added kind of like a weird color to my lid. I don't know. I'm using the, what are you? JS5 brush and now I want to play with what's the tea. This looks like an interesting color. I hope this look turns out okay. Honestly, this color looks like puke. That's not a bad thing. I kind of like it on the eye, but I mean, doesn't this color kind of look like puke? This color was kind of nice. It definitely comes off lighter than it looks in the pan. So I decided in this very moment that I'm going to stick with the greens right now because I haven't really played with the greens yet. So this is the JS9 and we're going to play with Waken Bake right here. And I like this brush because it's pointy. It's a nice shape and I'm going to put this right in the inner part of my eyelid. Honestly, yeah, these shades are not doing it for me. And this is the problem I've been having with the other shades. Like it's just not pigmented and I've seen other people use this palette and it always turns out beautiful on them. I just, I'm not understanding. I feel like I got a bad one. I mean, look at this to this. Like it's just not translating on the lid. So I'm going to take the color right next to it right here. This is Nate. Really, really powdery guys. Like this is just not good. There's like no pigmentation. Look at this granted. I didn't blend it well, but it's just like so terrible. It goes on like see through and I'm not bashing it just because it's morphe. Like I literally have morphe palettes that work great. So I'm just, I haven't watched many reviews on this palette, but I swear I have not seen a terrible review on this and like look, this is so dark in here and I'm going to try with this brush. We're going to try Nate again and see. It's not really adhering to the lid. I don't know if you can see so much fallout. The colors literally, it's not going on the lid. The look I created with this the other day, I liked better and I'm not going to say, oh, you can't create pretty looks with this palette because you definitely can. Doesn't turn out the way you want it to. For me anyways, the looks have been nice, but they just haven't turned out the way that I wanted them to. I'm about to take this off because this is, this is ugly, but let me play with a couple more colors first. Let's play with drive through. This one looks really pretty. Generally, Morphe does work better with a finger. So, I mean, that's better, but I'm really having to press it into the lid chunky and it really, it's like not adhering to the lid. I'm like forcing it to work on my lid. I'm going to take this off and we're going to try this again back for round two. This is why I'm happy I did not do my face makeup before. Thinking maybe an issue was the concealer that I used as my base. Maybe the shadow didn't agree with that. So, I did use some Mac Pantegralee paint pot on my lid this time. It does have a little bit more tackiness to it. So, maybe the shadows will stay. I have spent some time quickly spot cleaning my brushes. I mean, obviously they're stained, but that's all it is. Let's try something else because both green shadows were not working with me. Channel right here. I'm just going to play with these cooler tone smokey colors. So, I have not used channel so much better. This color is not bad blending out a little bit too much to where it's becoming more of a sheer color. We kind of just pat it on. We're actually getting pigmentation. So, we're going to start off with the warm base shade right here. And now we're going to take some of High Dude right here, which is a darker chocolate color. I'm just going to continue with this brush and okay, that's nice. The shadow is pretty good. Kind of just blend it away, but it builds on pretty nice. Reapplying a little bit of channel. Okay, so that dark brown color, it's not bad at all. Actually, I think we're going to go warm now that I'm looking. So, I'm going to take some of Calabasas right here. Just kind of like a deep cognac with a little bit of raspberry to it. I'm going to put that right in between. I think the base choice is definitely making a difference. The shadows I do find are still kind of over blending a little bit, but if you use patting motions and just kind of leave them where they're at, you can get this to work. We have to play with the black a little bit. I really like this brush. This is the JS12. I think it's a really good shape. And we're going to use Fast Lane right here and I'm just going to smoke out my outer corner right here. Just a touch. Less is more. Start off with a little, you can't take away, but you can always add. This isn't bad to kind of smoke out a look. It's not staying true black because they over blend, so they don't really keep their pigmentation. So, it's losing some of that, but because it's black, it still darkens the look. This looks kind of weird. I want to take some of designer label right here, which is this really pretty light shimmery color. I'm going to apply that so much better. I don't know what colors I was using earlier because I guess I was grabbing for all of the wrong colors because this color is actually pretty nice. And that's with a brush, so this definitely will work better with a finger. Side note though, I really hate this look. Now we're going to go into some of Lynn right here. I'm going to put that underneath the eyebrow just to set and brighten. You see how that just like brightened the whole look. And I do want to play with this glitter right here. This is millions. I'm just going to put a little bit on my finger. And it's not, you know how some pressed glitters are gel-like? This isn't gel-like. It's actually adhering to the lid pretty well, kind of like this formula of glitter.  I'm back to finish the eyes. What I did off-camera, I did apply some of designer label as my highlight. It adds a glow, but it's really not that flattering on the skin. It's a little bit almost gray-based and it looks a little chunky on the skin. So, not my favorite. And then I did take some of Welcome and apply that to my inner corner and it's really pretty, very, very beaming. So, for the lower lash line, as much as I want to continue what we have going on up here, let's play around with something down here that's different. So, I think what I'm going to do and I know it's not going to match, but you know, this look is not working for me anyways. Let's take some of Pink Fleet. I've not used this yet and I love this brush in here, the JS10. Super good for getting that lower lash line. That's very, very pink and it's not applying too bad either.  I know the pink's a little bit out of place, but at this point I just need to discover this palette a little bit more. That's all I'm going to do with the eyes today. So, next thing I'm going to play with is the Morphe and Jeffree Star Set and Refresh Mist. Now, I love the original. This is an additional $2. It's supposed to have better ingredients and have a scent to it. I mean, the $2 is definitely just for the name, not because of the ingredients. But nonetheless, I'm going to use it. I really like the original. So, this was the one thing I wanted the most. Like, forget the palette. I wanted this the most, so... Mmm, smells really good. If you're easily offended by heavy sweet scent, you're not going to like this.  It's almost too much for me and I love a good sweet scent. Ugh, it's very heavily fragrance. It smells really good, but a bit much for me. I mean, my skin looks good though. I really love this spray to set everything in. So, I don't think that I would go back and repurchase this because honestly, the scent is very, very strong. It's a bit much. It's not that pleasant. It's overwhelming. I definitely will continue to use this all the way until it's finished, but once it's finished, I'm not going to repurchase that. It's a very strong artificial strawberry scent. I'm going to put on some liner and lashes and lips and I will be back to give you my final thoughts on this collection. Okay, so, I'm back. I couldn't, I didn't even bother with fake lashes because honestly, I just really don't like this look. No point. So, let me go over my final thoughts on this collection. I know they are coming out with some lip products in the collection. I'll take a closer look at the colors. As of now, I have no interest in purchasing anything from that. I haven't really looked at the colors that they had, but that's, let's talk about the original collection. The best thing in this collection, in my opinion, is the brush set. I think it's a really good deal for the amount of brushes that you're getting. Decent brushes, it's a really good set. I didn't talk about each brush individually, but you get like an eyebrow brush, a liner brush, which I did use to apply my liner. It's a nice liner brush, a multitude of blending brushes. And I mean, Morphe brushes aren't amazing, but you know, just for somebody who wants a good cheap brush set, this gets the job done for sure. So, I was not going to get this, but it's honestly my favorite thing in the collection. I really hate these white haired brushes. They're always the trash from Morphe, but they do get the job done that I cannot deny. The set and refresh mist, it's too overwhelming. It's too much of a set. I know a lot of you guys are sensitive to scents. Stay far away from this. And I love scents, and this is too much. Like, I still smell it. It's too artificial. It's just, it's not good. The spray itself is nice. It actually does feel more moisturizing than the original spray. Like, I mean, I feel a little sticky where it hit me, so you might not like that, but that also kind of feels moisturizing at the same time. So this, yeah, this is sticky. The original Morphe spray does not leave my face feeling sticky and unset. I kind of like it, though. Like, for my dry skin, I like that. But, yeah, that's very different than the original spray. Strange. So I do actually, I do like that. It's more moisturizing. It's like sticking to my skin, but once I'm done with that, I'm not picking that up again. And then the eyeshadow palette, if you couldn't tell, I just, I don't like this. I am very sad that it didn't work out for me. I'm going to continue to play with it to see if I can get it to work for me, because it's an affordable palette with a lot of colors. Like, I want this to work for me. I was excited for it. But even, like, the look I have on now, it looks muddy. The colors aren't vibrant like they were in the pans. The application was not good. Honestly, like, the way to get this palette to work the best is to pat it and not blend it, which defeats the purpose of myself who likes to blend. So if you're very gentle with the shadows and you just kind of place it where you want it, you can get this palette to work out a little bit better. But honestly, I'm very confused because I have a few other Morphe palettes that I actually really enjoy. Even the colored ones, the quality seems fine. Very good for the price. And this is, like, not worth it. It's not even worth $35 unless I can figure out how to get this to work. Am I the only one that this happened to? I don't understand. The colors die. The pigmentation goes away because they blend so quickly. They just blend away. And, okay, I'm done trash talking that. I just don't like it. So an alternative that I feel like is kind of similar and better quality, better value. So this is only $20. It's this Pro Fusion palette from Walmart. Obviously, not all the same colors. They have a lot of different palettes that have different color schemes. But this one I felt like was kind of similar. It had the browns, the greens, pressed glitters, all of that. This is the Sun Kiss palette. $20 from Walmart. The quality is better than the Morphe palette. So, again, it's not the most amazing quality, but this works. The Morphe one did not for me. So yeah, unfortunately, these products didn't work out for me. I know I had a couple people comment that they did the Morphe palette. Take what I had to say with a grain of salt. I'll keep you guys updated though because I'm determined to get it to work for me. So thank you guys so much for watching. If you aren't subscribed to my channel already, I hope you take the time to do so. And I will see you guys in the next video.


So I'm going to talk about memory leaks and all the trouble we had and so on. Before I start, I want to say that this was originally an internal presentation that ran on for a couple of hours and the show went tell, you know, we all were trying out things and so on. I've been trying to size it down for this, but yesterday I had a charge of my functions so I was just doing it now. So there's going to be a couple of raw things in this, you know, to bear with that. The second thing is I'm notorious for talking really fast. So if you see that I'm talking fast, you'll have to let me know. I'll slow down. All right. So I'm Vishnu Mayangar and I work, I direct, I talk to Tuki. And that's my Twitter and GitHub handle. Vishnu, can we talk in the mic? Yeah. Okay. Is this better? Do another mic if you want. No, I think it's easier. So I'm going to talk about some of the trouble we had in memory leaks, right? So let's start with how do you know that you have a memory leak? So relevant to this is the application that we're building, which is top dot two. It's a chat solution and among the various parts of a chat solution is a chat client. So because we wanted to build a chat client and we wanted it available on different platforms, mobile, on machines, you know, desktop and so on and on the web. And we wanted to build different clients for these. We thought we'd cheat and we'll just build one client for both web and desktop. So it's essentially a web client. And on the desktop, we bundle this with a browser and we make a few, we have an additional component in there, which gives you the desktop like feature. So it's a web client, but it's very different because, you know, people expect it to act like a desktop client, which means that you have expectations of being able to run it for a very long time. You know, you've run it for days at a time. And it's also the kind of, I mean, because chat client is stuff that's constantly going on. You know, first of all, your engagement with it is largely large. You're on it quite a bit of the day where you're chatting with people. Messages keep coming in. People go online and offline. Your roster has to change. So all this stuff that's going on. So, you know, you're working on this for quite a bit and every once in a while, they release something new when you are testing it. The QA guys pull it and they tell us, okay, move this box in three pixels to the right. That's our thing. And it all seems fine until we release it. Then you go ask people, you know, how are things? How do you like the client? And people are like, yeah, it's okay. And, you know, you want to know what you did wrong. So you dig a little more and then they say, it's really slow. And that doesn't make sense. You know, modern browsers are pretty fast. JavaScript has changed so much. Are they using an old browser? You're not sure what it is. So you go to their machine, you start to client up and it's fine. And then they say, yeah, it's fine. Now, you know, wait a couple of hours, it becomes really slow. That's usually a good sign that you have memory leak, right? In fact, they'll tell you things like, I'm doing something else and I get a ping because somebody messaged me and I switch to the client and it takes so long for the client to come up. It takes so long for me to click and do anything. So what that means is that you're using a lot of memory and ultimately the OS has started paging your stuff out of memory. And now when you switch back, it's pulling stuff back from hard disk. And hard disk is just way slower than memory. That's the problem. So that's when you know you have memory leak. And the kind of applications that have memory leaks are essentially what I mentioned. I mean, most web applications are short lived. You know, you're on the page for maybe 10 minutes, so half an hour. But ones that are there for a long time is where you start to have a problem because on a client that's short lived, you don't have to worry. I mean, even if you leak memory, you're not going to notice. But this client is something which has a huge number of elements. It's a fairly large application. So that's one thing that's going to leak to memory leaks. The second part is, I mean, you've got dynamic elements that are constantly being created and destroyed. I chat with somebody. I create a chat tab. Something comes online. I create an element, represent that person, and so on. So there's elements being created and destroyed all the time. And it's got to stay away. You know, stay online for like three, four days a week, whatever. How long? You don't want to keep it. So you can't afford to leak memory at this point. And the other thing that will contribute to this is if you have a large enough team, or the code base is complex enough, then you can't work with a simplified model. You start using various abstractions that are commonly powerful for this kind of thing. You start using a component-based model. You have widgets that develop by different people. And as the scale becomes large, it's harder to reason about what's going on. And all these things contribute to, you know, first of all, there being a memory leak, and then it being hard to even discover that the memory leak exists. So let's talk about how you can get a memory leak in JavaScript. So back when we all learned C, there was this point where you learn about how you allocate memory every time you want to create an object. It's based on the game. And when you're done, you delete it. And I mean, memory leaks meant that you forgot to delete something that you allocated. But, you know, JavaScript is memory managed. You shouldn't have to do all that. So what happened? So the question is how is memory reclaimed on JavaScript? So really it comes down to this whole thing about scope. When you say new object, whatever, JavaScript's allocating memory on the game. And it's waiting till that reference is out of scope until there's no references pointing to your object. And then it's going to reclaim it. And that's really all it is. So, I mean, it should be fairly simple to deal with. I mean, think a little complex with closures because JavaScript has closures, right? If I retain a function, the function has access to everything that was in scope at that point in time. So technically, it's possible that you'll be holding on to stuff that you don't realize you're holding on to. And you've got to figure out what gets ahead and what doesn't. All right. At this point, I'm going to switch to the demo. And... Oh, there we go. Right. So, let's actually take a look at this. So I've got this. I mean, this is the HTML file. And in most of the cases, I'm actually going to switch to the file and then switch back to Chrome. Now, I'm going to use Chrome for this because the Chrome's Web Inspector is really good, especially if you're trying to figure out what's going on in the heap and so on. So, we'll be using that as an example. Obviously, different browsers are going to have different tools and they're all not going to work the same way. This is a really, really... I mean, there's nothing in this file really, right? I just created this object first with the little manner and then I'm creating the object using the constructor mechanism. So, you've got the stuff and another. Now, the first question is, you know, how long is this object going to stay on the heap? Both of these. Forever. Forever. So, if we switch to Chrome, I'm just going to take a heap snapshot. We're looking for this thing that was called Movie. This is the slowest part of the session. Searching for the stuff. Thank you so much. That's it. There we go. Right. So, we can see this is the one we created. Now, there are two objects and one of them actually represents the function itself which is a little confusing. So, yeah, you can see this is here and I want to take it out of the mistake. So, we know it's called another, right? Now, I say delete another. Does this work? Let's take another snapshot and we can actually do a comparison. Then let me search now, does it? So, you can see it's not here, right? It didn't seem to clear it. Let me switch away from the comparison mode. There's still two objects. It didn't clear it even though I deleted it. So, this was the first gotcha. It confused us for a long time. The problem is the console. If you type something on the console, it's going to stay forever. So, for the rest of the presentation, I can't use the console. So, I'm just going to refresh this.  So, let's do this again. I believe we should get deleted now. There we go. So, we've lost one object. It's been deleted. So, this is... I mean, we just see that stuff can be removed from scope. So, now, a lot of people just trying to figure out what is held in scope and what's not. Now, there's a second part of this where I've got this make object that's going to create a movie but it's not going to let out a scope. In this case, clearly, we expected not to live. So, I mean... So, we just have to call the function. We can see that. And I should just take another snapshot. I mean, the number of movies should be the same. There we go. And now, it shows one. But, yeah, I already deleted the first one. So, there we go. So, this is... So, we see that stuff is removed from scope if you delete it from the global scope. Otherwise, as long as it's stuck in a scope, one of the scope end should vanish. So, now, let's take a look at what happens at the closure. This is only... we just change it most into something of a... a force which is not reclaimed as memory or... You're talking about how GC works, right? Yeah, I don't want to really get into the complications of GC because there's so many different implementations. And, I mean, I feel that out of scope over here. But, let's just talk about it at a very, very rough thing for the sake of the discussion. I mean, you're right. Most of them probably use these generational GCs and so on. But, at a basic level, we know that the way GC works is that when all the references come to that object is zero, it's going to be a pre-claimed. And, old GCs used to have a problem. Old GCs used to have this problem where they would count the number of references to an object. Now, you could have two objects referring to each other, and that's going to happen all the time. You'll have... I mean, if you want to build a complex in a core base, you want to end up with this cycle. At one point, they could not clear it, but no modern browser has this problem. So, you will never have trouble with cycles anymore. There's a second kind of cycle that people used to have trouble with, but I'll come to that when we come up with DOM. So, a quick question. Let's say I have a DOM element. I detach it from my DOM, put it in a document fragment. And the document fragment goes, let's say, in a reference called A. And the scope finishes, and the document fragment is lost. So, will all this DOM stuff also get cleared, or is this just true for JavaScript variables? Can you hold on to that and make it DOM? Oh, sure. The reason being that it becomes a more complicated DOM. So, I wanted to start with just pure JavaScript for a bit. So, let's take a look at this one. This is Closure Scopes. So, I've got this button called Make Closure. Now, as I said, I'm not using the console, so I have to keep showing you files and then pressing buttons on the screen. It's going to feel very clunky, but that's the best we can do at the moment. See, I've got this function with this button, which is going to be called Make Closure. And so, this is that movie object again. Here's Make Closure, where I say Make Function. And I'm just... Yeah, I'm just... I'm just executing the function and putting the return value in this div called Closure, which is up here, a spam called Closure. Make Function is going to create a movie and return the function with the movie trapped in the closure, but it just returns the string, which is the title of the movie, when you execute it. So, it doesn't actually return the movie object. Now, clearly in this case, we know that it should be trapped in the scope. So, let's actually look at that and then we can look at a relative piece. Oh, I broke it somewhere. If everybody sees it, let me know. Where's that? Function. Oh. No. Thank you. That's what you meant, right? You think I did this? It's the same, but yeah, okay. I don't know what you're doing there. All right. So, let's refresh the page. Take a snapshot before. And let's press the button and take a snapshot again. Now, one thing I've deliberately done is in that... Where is that thing? Make Closure. I've stored Function in a global variable. I mean, that's deliberate. I'm talking about what you're going to do in real life, but it's just to make a point in this case. And we should find the movie is there. The same one I did. Yeah. So, now the question is, if this is true and closure strap objects, you know, then are we screwed? Because technically inside a closure, you can access everything outside, right? So, if you ever return a Function, does that mean that every single thing is an experiment where we're going to create four movies and we decide that why that is not a talented movie. So, we only put the remaining in this talent movies array. And now we're turning a Function, which is just going to randomly, you know, pick movies from this. And then we've got this Make Suggester, which I believe is the second button being called, which is now going to create this movie Suggester, which is just random talent movies. And then I print this 10 times. That's really all I'm doing. So, we do the same thing. Come back here. And I've already taken a snapshot before, so I do this. And there we go. So, Twilight's not in there. Ideally, it would be great if Twilight is not caught in the scope. And, okay, we've got five. And we should see. So, clearly, the browser is smarter these days. If you're using a closure, it's only going to trap those things that are referenced in there. Now, they're doing some sort of parsing to figure this out. Clearly, there are places that are going to break. First of all, JavaScript has eval. If you eval, then all the ways are off. So, if you're returning a function that's going to eval, they're no longer going to guarantee anything. There are a couple of other places where they don't guarantee anything. I think if you use width, they do the same thing. They clean it as an eval scope. So, in both those cases, you don't know what you're doing. But otherwise, if you're using closure, you should be okay. If you know what you're referencing, that's the only thing you're holding. So, if it's that intelligent, why is it not storing only title? Why is it storing only title? It's not that intelligent. And also, just to try to understand, yes, and fun, you have made it a global variable to make sure it's not... Yes, I wanted to live for this page. Yes. This first section in the page is just a demonstration of scopes. And the second part is where people usually leak memory. All right. I mean, they had an eval this thing, but I dropped that example, so I'm not going to get into that. Now, I'm going to refresh the page again because the lack of memory, I'm going to kill the tab and do this again because otherwise, each subsequent page is going to have all the stuff trapped open in the previous pages. Now, we're getting to DOM. So, again, this is basic stuff about DOM first. We know that... So, let's talk about how DOM actually works. Now, we know that all the browser objects are all in C++, right? This whole thing is not in JavaScript. Whereas, but within JavaScript, you have complete access to the DOM. You can travel to DOM. The DOM object themselves seem to reference each other because, you know, from an object, you can access its parent, you can access siblings and children. So, if you're in the DOM, which is the attached DOM, you can travel around anywhere. And on top of that, you also get access to that in JavaScript. In JavaScript, if I get access to an element, I can do parent element and I get access to another DOM element. I can do siblings and children or I can do next sibling, previous sibling, and so on. So, you know, let's figure out how this really works because it's relevant to this discussion. So, even though all those objects are in C++, what's happening is that the proxy objects that are being created in the JavaScript world, the proxy object refers to the C++ object and that's how you get access to it. But these proxy objects don't exist for every single element of the DOM. They're created on demand. So, when you try and refer to something, it creates the object until then it's lazy. So, you're not going to have too many JavaScript objects that represent DOM objects all the time. Whenever you use them, they exist and they're tied to the DOM object. Yeah, thanks. Do you want me to repeat the image? No, no. So, yeah, I was saying that you have proxy objects in JavaScript that represent each element of the DOM that you end up accessing at some point to the other. But technically, it can create one proxy for each element that exists in the DOM. Now, in the DOM itself, these objects refer to each other. So, it will clean up cycles. If some part of the DOM vanishes, it will collect it. And it's got its own garbage collection world in the C++ thing that we have no access to. Similarly, in the JavaScript side, we know these codes work. Now, it's possible for JavaScript and DOM objects to refer to each other and we know it. So, here are simple examples. We've got the first button which is calling hold some DOM where we're just getting hold and we're then removing it from the DOM. But restoring it in a glow. So, now we're holding on to an element there. Now, I don't think I actually mean... Oh, no, I'm using the movie down further. Right. Then in here, we're actually not going to see much in this particular case, I think. I forgot. So, I hold some DOM and I see what it had and it had this string. Just to run you through what happened because I'm not sure if all of you caught that. So, I hold some DOM was getting hold of this div called snafu, I believe, up here, which has this string, tura, tura, tura. I got hold of the div up here. I stored it in a JavaScript variable. I then removed the div from the DOM. So, the C++ side is no longer referring to that object. But, I was able to clearly... When I did see what it had, which is a second button I pressed, I was able to see the result. So, clearly the C++ object lives I mean, I can't show that to you in the inspector because the inspector does not show you the C++ object. But, we know that it lives. So, from the JavaScript end, I can hold on to DOM. And then there's the reverse. So, out here, I've got this other button which is called attach handler, where I'm getting hold of result and I'm attaching a click handler where I'm just going to print the movie title. Now, sorry, go on. Is it cloning the object or is it just a reference? How do you know which one it is? Well, it just creates a new proxy object. Technically, you can't know what's going on the C++ world because every browser is free to implement its own. But, the most likely thing is that they're just giving you a proxy for the same object again. There's no need for them to clone it because I mean, when you modify the object for multiple references, the object for all references. So, if you have multiple copies in JavaScript of the same object, you change the text or whatever. All of them will see that. So, there's no need to clone it.  Right. So, does it mean that you document that gets element by ID same, now they give you the same reference object or you think that's a new JavaScript reference. I mean, new JavaScript proxy but refers to the same C++ object. So, you're asking me whether it shares the reference in the JavaScript world. Is that it? Yeah. So, is it two JavaScript references related to the same JavaScript proxy? I'll repeat the question. Go on. Many of you should just keep it here. Is it two JavaScript references referring to the same JavaScript reference object? It's not on. So, is it two JavaScript variables references referring to the same JavaScript proxy object or are they using proxy objects with their own references which refers to the same C++ What do you expect of the answer? So, let me put it a different way. If I get hold of the reference twice and I set a property on one, do you expect to see the property in the other? Both will work because ultimately they refer to the same C++ object. So, if I add a JavaScript property, if I do, you know, document and then I say .x equal to the JavaScript property, it has nothing to do with the C++ word, right? Okay, I got it. So, you're saying, if I add a property to the JavaScript property, the other one wouldn't remember it? No, the other one also sees it. That's why it's a shared reference. The proxy object or it will have multiple proxies to the same C++ It is, I'm in the same question and there's single proxy. So, my expectation is completely compatible with being the same proxy. I know that in JavaScript if I do something to one of those objects, every reference should get modified. So, that's the reason they give you the same proxy. Torotoro there is a proxy object, right? Or is it a reference object? Well, it's a reference to a proxy. Yeah, reference to a proxy. So, wouldn't the reference to a proxy get deleted or something after the function is finished? It's global. I've not done what. It's literally making everything global. Right. Shall I move on? Next example. So, yeah. I'm getting hold of results and oh, I think I mentioned this but yeah. It's just a click handler on which I'm axing the dom and doing this. Right. And now, I should look for movies. That's okay. I've already taken the gif snapshot and there's nothing to see. I don't know where the gif is. It was this one, right? And let's just take a comparison. I think with a search it's now easier not to take comparison. So, the movie isn't there. So, we can see that not only can we do this but the DOM work can hold on to the JavaScript side. Now, you could ask is it just a proxy object holding on to the JavaScript? How do you know if the DOM side holds the object holding on to the proxy side? And the answer is that for efficiency reasons, it makes sense for the DOM side to do it. If the JavaScript side is attaching click handlers to every proxy then they'll have to always call in the JavaScript word to do something. So, for efficiency reasons the DOM side actually knows that there's an image handler but that's just a magic one so I can't show you anything. So, yeah, that's the purpose of this was just to show you that we know that DOM holds on to JavaScript and JavaScript holds on to DOM in these two worlds of C++ and JavaScript. Now, again, this is again later cycles that somebody talked about. I think even as far back as 2007, you used to have process where if you have a DOM that's holding on to, I mean had a click handler or whatever and inside the handler you're holding or reference to the DOM then you have a cycle across two worlds and you'll never get clear up. You're not going to see that anymore. Most modern browsers don't do that. So, again, you're safe from those problems. Most of the issues where you can blame the memory leak on somebody else are gone. Now, I mean right now memory leaks only mean that somehow your objects are being held on to by the global scope. That's all that memory leaks are. So, Define when we can start blaming and when we can I actually don't know the answer to that, sorry. Okay. I don't know when they fixed that. I know I6 had the problem and they fixed it. So it's very old problem of the cycle. So, yeah, I love my thing of the art. Yeah, I was talking about cycles and I said cycles are not an issue anymore.  That's really all it is. So, I mean, at this point clearly it becomes an error on the JavaScript programmer side but that's it. Memory leaked, I mean memory managed languages have always had memory leaks. It's not just C++ world. I mean the Java world and the dotnet world have had a share of memory leaks. So, even there the answer is the same. You're holding on to stuff. If your application is complex enough you're not going to realize you're doing this and you'll probably have some map somewhere, some array somewhere that you're not paying attention to that's going to hold on to something. That's really all it is. So, I'm going to sort of cover through the presentation certain sort of common patterns that people use where they run into this trouble and they're not aware that they're holding on to a reference. That's what the rest of the talk is going to be. Before that I was thinking we would actually take a look at the memory leak and see what it looks like. I'm going to look at the file first. Right. So, I've got a button called create some DOM which says create a div which is a mistake to create some DOM. It's no longer one div clearly. So, what I'm doing is when you take create some DOM, I make an element and I then push it onto this array, global array and then I'm appending it to this container div. So, every time you press the button I'm just making this thing and putting it there. And in the beginning I just created one div but the memory grows so slow that I did this and hopefully you can see some results. Then I've got this other function called start creating. What this is going to do is as long as this flag is true and it's a flag so I call it flag it's going to set a time to create some DOM and then it'll just again start creating. I'm doing this as a set time out and it should be apparent why. If I don't do that it's going to be an infinite loop. I'll never be able to stop it. This actually gives me access to be able to stop it. You should close the which tag, sorry. Oh, thanks. Maybe that just made the DOM more complex. I don't know. I really, really forgive forgiving. Stop is just going to turn the flag off. So this process of creating this thing should stop and remove is going to go to the container and just clear the DOM. Now we know by now that this is going to leak DOM because I've been storing all the elements in this array. So we know that from the JavaScript side we're going to leak DOM. Let's take a look at it in the Web Inspector. This is just going to create that here. So I start creating and now I think we can go to the task manager here and take a look at the memory growing. So, yeah, it's I mean it's visible now at least, right? But 1MB a second or something like that. So, I mean you can see it's clearly growing as some CPU activity but it's not 100 so I get a chance to stop this thing. Now what I'm going to do is let's take a look at the Web Inspector and see what we can see. So it's going to get close to about 90MB in like you know 10 to 15 seconds less than that actually. So I'm going to stop it now and I'll clear it. Now let's go here take a snapshot and let's see what it tells us. Okay. So according to this the shallow size is like 1MB of this array and I mean you can just tell looking at those numbers that it's not going to add up, right? It's nowhere near the amount of memory that we are actually using. So I mean by now I guess some of you already figured out what the deal is but the point is that very hard from this to figure out where the memory is being used. So the count is clear is the count of the JavaScript object but what's not represented here is the C++ the DOM objects are not going to show up here. So if you are leaking memory it's from this at this point in time you still can't tell where you are leaking memory what the biggest thing to shoot is. Now this gives you the constructor of the object which created the thing in the JavaScript side the objects count is again clear shallow size refers to the actual proxy object the retail size is a bit confusing it's trying to tell you what other JavaScript objects it thinks you are holding it's wrong half the time so you really can't depend on it yet and the retail size the way it works that thing has got to add up to more than the total amount of JavaScript memory because multiple objects will there's another view I mean out here you can go you can see the summary, you can see the comparison and the containment view is where you start following back and figure out what holding onto my object. Now the point of this is that most other places where you deal with memory leaks the common way of looking at it is to figure out what's taking the most memory after you run the plugin for a while and then just find that and shoot it you can't do that because you'll take a lot of memory in completely innocuous places the actual leak is somewhere in dong and this you might have a large count of something but it's not going to be clear and if you're using some kind of large JavaScript framework which is doing all these clever things with closure and so on, half your functions would have constructors which have names so you won't be able to figure out what those things are you'll just see a bunch of function, function, function and there'll be a large count of them and they're different places, they're not even referring to the same object anymore so it becomes quite hard using this to figure out where the memory is leaking and how quickly you can solve the problem I mean the point of this was again to make sure that you're all in despair about this world yet and we will eventually hopefully get the tools we need from what I know there are some experimental bits of Chrome that have some kind of I mean sorry, 15 5 no way so they're giving you some kind of memory counter or something of that sort but yeah alright let's go back I mean I was getting to the meat of the discussion now which is what leads memory how it leads memory let's move on after its leak memory does it go away once you turn on the next page sorry so I mean again this is very specific to a browser and all that so from what I remember as long as it was in the same domain they keep the memory and even if you have multiple tabs in the same domain they share memory but if you navigate away from the domain then they can clean it up at least close the tab but I mean I can't tell you but from what I know as long as you navigate away to a different domain they know that they don't have to keep the obvies anymore for some reason they use the same process for everything in the same domain I think it's because they're allowing you to communicate across pages and stuff like that right so yeah this is a trivial example but there's a big point to this so creating a thousand divs and appending it there and that's what this button up here is going to do I mean I'll call the creator and I'll clear I will just empty them and the question is you know how much are we leaking I mean the opposite thing is here again LM is global so let's figure out how much leaks I'll create a thousand divs I mean the comment actually gave it away I think so we actually don't leak much over here the point is that we know that within the C++ world you can navigate from objects to the siblings so the expectation is that if you're holding on to one object then why aren't you holding on to all the other and again this is just from being really smart what is the thing called that we're looking for oh it's a div right still doesn't have any so yeah I mean we don't have any so it's being smart it says that once you hold on to one object and you retract it off then you are not expected to be able to navigate along the siblings anymore then clear the siblings they won't clear children but that's the deal let's move on prototypes this is very specific to one kind of problem that occurs when you're using frameworks so the framework I'm using in this example is dojo which give you this classical structure and the classical structure is very easy to reason about as opposed to product structure so a lot of frameworks do that so this is one trap that people frequently fall into about how they leak memory when they do that so let me show you that so the way it works in dojo you can declare a class declare a breadth producer and I've got a field called button and then I've got these three functions right actually this is the solution to the problem we know that for now and pretend I didn't show it to you there we go so I've got this button producer and when you say create it actually creates a button and what it's doing is storing the buttons in an array and then when you say change color it will change the color on all the buttons let me actually show what it looks like so I produce buttons I make them blue and they turn blue and that's it now the point is when you create let's see what happens so I've created buttons and I've said that the button producer says that whenever you do this I'll iterate over the buttons and I'll change the color now what I've done over here let's go to the top I've called produce and produce is going to say it's going to create a button producer and for each one it's going to create a button that's fine and then change color is being called to the button producer itself and I say blue now the question is if you look at empty we just take going to the button area and setting the html to blank so why is it that the buttons are being used I mean because of the fact that the prototype the thing so a lot of things will give you this way to create fields called buttons and what they're going to do is mix it in but they expect you to realize that when you do this buttons are actually on the prototype object so if I create two button producers they share the buttons which I say fields and so even though I'm deleting all the buttons they share across all of them and so on so I'm not going to bother running through this example I expect mother clear it you'll see a bunch of buttons in there and the solution is just to make sure the button is declared on the I mean the cut-stuff top so the thing is in JavaScript if you set a property on an object it's always setting it on the most adjacent object it doesn't go on the product chain if you're trying to get it then it will follow the product chain as far as possible until it finds that object so over here the mixing thing was causing an issue so I mean you don't have to beware anytime you use any such framework even in JavaScript in this raw form sometimes they do these things that make code look very convenient not necessarily what you expect though alright so there's closure so let's do what we do so we produce an unsafe toggler and toggler is empty so unsafe toggler says that it returns the toggler to you function the toggler is basically going to take a button and swap the background color and the color itself and we're using dojo here but it's the same as having an event listener on click it's going to call the toggler and we return the toggler function now what we're doing is when we create these buttons we're storing only the toggler functions and not the I mean but we've covered the sort of closure thing and we know that this probably won't hold on to the button right so on emptying it it's not going to clear the area clear the area so I mean since we've seen the example I'm not going to show you how to fix this because in case you want this kind of pattern and there we go sometimes you can't report to the object you have to break that closure in this case what we're doing is using id so you know that and make sure it's not referring to the scope break it using a string or something some immutable object which is small whereas the button object might be large and could leave so I've covered jquery on p and the dojo widget p one question on closure if these variables created so that the past tree is first created if past tree is first created I'll just repeat the question so there are n number of variables that you would have declared and you would have let's say referred that variable alone inside your let's say so this means that the javascript function is first created into a past tree and the compiler finds out which are the closure variables which are potentially referred inside the variable you're getting an implementation of the engine and I really can't talk about that I mean I don't know enough about it I could make a guess but probably not a good idea so it's better if we just tell you what I know happens I mean this might be specific to different browsers and different engines but this behavior is the same everywhere but you know for a fact that if you do eval again they're trying to be smart about eval what they're saying is that they cannot guarantee anything with eval because eval they have no idea what you're really doing now they'll keep closing that boundary every once in a while they'll take a look and say some pattern people use eval and I can guess what he's trying to do over here but you know unless they can be 100% same they can't afford to reclaim those objects so every time they notice something new they'll sort of say okay this is a pattern of eval that you can afford to reclaim but since eval essentially takes a string they have no idea what the contents of the string are you know if they freeze a string they may be able to figure it out so they've got ways to intern strings now and so on but again it becomes really complicated it's possible they could create an immutable function based on the string so that the same function can be repeated again yeah that provided the string itself is not a parameter of some pattern I mean the minute the string starts coming from some text area you have no idea what's going to happen anymore so I mean let's take a look at jQuery on because jQuery on is something that people use a lot so there are multiple ways to use jQuery and now there's a more recommended way but let's look at the old way and people know one problem with it which is you know the memory leak issue it's interesting because this one is not so apparent so I've got this randomizer and it takes the account as a variable and stores it as a field and then make text is actually going to get hold of this span with that count and it's going to store a random number in there so that's simple now the button over here is going to say create one and I have a crave min so we can look at both so create one says every time you say create one it's going to increment this count it's going to make elements get a randomizer and then it says on find this button on click make text and it passes that function now what I've done over here is make elements is creating a div which is a hold of inside which I'm setting a button with this id and a span with the same id and I'm pinning it to container so just to show you this if you go here I have this and they expect me to be setting this to such a random number create many is just creating a thousand of those so they're all just independent troubles now clear is going to actually remove which is just going to set this in HTML now at this point I haven't trapped anything in a closure I haven't really done anything all I've done is you know set this on click touch this but let's see if this is leaking and you know that it's going to have to leak or I wouldn't bother showing you this let me just repeat this not sure what I missed oh is it so we can see we've got a thousand button element thousand div element but we have span we have six span element what's going on because for every button we created a span and we put them in a div and for every touch pair we have a randomizer so why is it that we have thousand of each and just one span I mean a six span you know what I guess so the answer is that I never referred to the span anywhere the proxy was never created so again remember that the memory provider can't fool you there actually are thousand spans there you just can't see them in this because I never referred to them I've referred to everything else in this creation process which is why the proxy objects exist there are buttons and randomizers so why six then I have no idea must be this markup there are other parts I don't even see any span there so I don't know it's possible so they're not saying that they're going to not create the proxy objects maybe they start creating a few and then they give up at some point sorry oh yeah that's a good point I probably should six buttons I wasn't thinking about that so yeah so the reason that the memory is being linked is because of if you think about it if jQuery is doing this it's not magic you don't have to hold on to these objects so if you use this pattern with jQuery you are bound to leak memory to clear on the DOM and I'm going to do the same thing with the safe manner and clear it up so let's do that let's actually remove the... oh I don't have any snapshots anyway so create these the same things they work so we take clear let's take a snapshot because the difference should not see these things so yeah I mean I've got like four buttons so clearly it works so I mean what's different so there are two ways to solve this problem there's one way which is very recommended right now for other reasons which is don't create a thousand handlers so now they recommend that you know you attach the handler to the container object and then you know you smartly figure it out in this case it would be a bit annoying because you have to get hold of the button figure out the ID, figure out the number and then find the corresponding span but you could do it that way or maybe you could travel the DOM and find it and what I've done here is with the current pattern how do you fix it so now I've got handlers which is a hash and every time I create this I'm storing the function handler that I've passed to the bottom right so earlier I was just passing the function inline now I've stored the function inside a variable and then I'm passing it in and that's stored in a hash and now when I remove I actually say jQuery off of all of those handlers on those objects which then takes out those corresponding handlers and then it's safe to clear the thing then when I call remove it to mine so this is the correct way to do it if you have a complex enough application there are points where you might use the smart jQuery handlers but sometimes even the containing div is going to vanish because you really don't want to attach everything to the body that's actually going to slow down the processing so you will attach them to some smart container you know if you have a widget you're going to attach it to the container but if the widget itself vanishes you'll have to take care of destroying the handler so you're going to have to store the handler so in a way you know you would think that as long as you're not holding global references everything will be fine here's a place where you actually have to create something like a global reference at least global to that scope and clear it up so if you start doing this stuff with event handlers you might actually have to create scope and in your mind it will look like you're making the problem worse before you fix it so again I mean the same way the jQuery recommend is fairly good for a small enough ever application where you know that the containing element is never going to vanish it's only in cases where no matter what container you've chosen it might vanish and you don't want it to live forever that you're going to have to look at this process and figure it out and use jQuery off probably one of the least used jQuery problems so how am I doing in time? 10 minutes fast I'll do one more and I'll stop at this point I'm just talking about the widgets of dojo and this is interesting for a different reason again it's something you know if you're building an application you might end up using dojo so for large problems let's go up so let's go up here and I create widgets and let's take a look at the memory meanwhile I'll show you what's going on I've declared my button it's a widget so it's got a template and it's got all these things and when you click the button it does some stuff it's a dojo object which internally is going to create an HTML button and I'm just creating a thousand of them they're not stored anywhere this isn't global nothing if we take a look at the heap we're going to see a thousand of these buttons so the reason this is happening is that dojo when you create a widget and with this template and so on it's going to create DOM and hold on to it and the expectation that they have is that you actually call destroy when you're done with it so with the widget lifecycle this might seem painful but the reason they're doing this is because they're trying to give you another advantage when you're trying to build something with widgets and it's big it's not going to be easy for you to hold on to all these things you're factored your code base in a particular way you've come up with these various layers but you're going to have to find ways to transfer control to one place to another typically they give you access to magic ways of getting access to things for example dojo digit which is the widget library which is another widget from somewhere so it's like it's a global hashtag but it's maintaining so instead of having you do the plumbing they're doing the plumbing but correspondingly you have to destroy this is similar to what happened to the jQuery click handle I had to show the click handle and that's the reason why I had to destroy so if you find that something is letting you access stuff without storing it in a variable then you have to question that somebody is doing it if it's not you so the minute you find that you have access to things across scope and you're not storing it in a global variable somebody must be doing it and if they do they'll have a life cycle that let you destroy it so that was the point of this so I think I'm done there so I'll just take questions at this point you want to take the mark line? yeah I think some people want to take a coffee break or something thanks Vishal