Right. Hello everyone. Can you hear me all right? Okay. So I'm Tim. I'm visiting today from Canberra in Australia. I love living there. It's a great city, but it has been the tail end of the winter. So I've really enjoyed being here in Bangkok these last few days. The weather and the food, both being refreshingly hot. I'm really excited to be here to help pick off this conference. So thanks to all the organizers for making this happen and all of you for coming here today. And I do need to say one thanks to these people, my family. They gave me tons of time to make this little talk that we'll be sharing. So back home in Australia, I work at a company called Ice Lab. It's a place where I ride a lot of Ruby. And out in the open source world, I do the same in projects like these. And what these projects share in common is they offer a new, fresh approach to helping you build more maintainable Ruby application. And we'll be looking at some of these in detail today. But I want to point out that my work in places like these didn't just come out of the blue. It was a long time coming because I've been working with Ruby for a long time since 2001, in fact. And time really does fly. And if you hadn't thought about it, 2001 is a long time ago now. And just to remember, you know, what I was up to in those days, I firstly went back into my photo collection and pulled up a pic just to see what I looked like back then. And you believe how young I looked? And so 18 years have passed since that time. And given I'm 35 right now, what it also means is that I've been riding Ruby for over half my life. And just to continue this little trip down Emery Lane, I went and found the code to my very first Ruby project. Now, this was a time before Rails, before Ruby gems even. So this was just a little project, but it wasn't about the web at all.  Now, I might have been young back in 2001, but I already knew that Bash wasn't for me. So I looked around a little bit more and I noticed a friend who'd started experimenting with this language called Ruby. And it really did look nice. So I gave it a go, and that's what I used to write my own little IRC bot. Now, looking through the code today, though, it really does seem like a strange relic from some foreign age, from the little things like my camel casing of the file names, to some perhaps more egregious things that a beginner might do like building a whole plugin system based on global variables, through to just the plain old strange things like my complete absence of empty lines. Yes, every single class like this was looking like this, with not a bit of white space to be seen. And that fixed me, we see there. It's old enough to drink now. Not yet fixed. So I have definitely come a long way from this 11 file application, that's for sure. But the amazing thing is some 18 years later, still writing Ruby. And I'm still loving it. So really, I couldn't have found a better language to accompany me through my journey as a programmer over all these years. And it's this that I want to share with you today. Some thoughts from a life long lived with this language called Ruby. And some other ideas about what's exciting me about Ruby in the present. And we'll be tying together a whole bunch of threads to do this today. So I think I found just the right way to do this. So let me set the stage for you. It is a golden age in the land of Rubinia. After enduring years of unrest, the compatibility crises of the 1.9 epoch, and the roiling dramas played out across many impassioned comment threads, the citizens of Rubinia have at last arrived at a time of peace and prosperity. Thanks to the dedicated oversight of Lord Matz and the Knights of the Core team, the villagers are thriving, and the harvest are well managed and bountiful. And with every passing cycle, new facilities are built and spread across the land for all to enjoy. Most of the ancient pockets of trouble have been destroyed, with the only remaining hazards for wayfarers being the occasional stray band of marauding bugs. Most of the lands have been mapped, though some unexplored regions still remain. And you, as a new arrival to Rubinia, are as yet a Rubyist in name only. Your quest is to find and master the virtues of the Rubyists, then wield them to foster a new standard, to create a shining vision to lead all of Rubinia further into this new age of light. Your quest will not be simple. It will not be easy, but it will be noble for it is needed. Your destiny is Rubinia's and Rubinia awaits you. So let's begin. The quest of the Rubyists. Yes, that's right. I think the perfect way to explore this age of Ruby is to enter a big open world computer role playing game from its very own golden age, which as you might tell is 1985. And because today will be set in this golden age, we have no big evil arch nemesis to defeat. Instead, our quest as the Rubyist is to exemplify the good life. To learn and master the virtues of the Rubyist and then help create a better future for everyone. And today we'll be going through this game together. And as we do so, we'll be doing two things. The first thing is finding out the steps we need to take as we go through this game. And then we'll see how as Rubyist in our world, how taking some of those steps can help create a better future for ourselves and those around us. Now, some of you might have noticed that I'll be heavily inspired today by Ultima 4, the 1985 role playing game by Richard Garriott. But if you're not familiar with this style or era of gaming, that's okay. We'll be talking a lot about Ruby. It's why we're here. This game is just going to help us connect the threads. So I hope you can sit back, relax and enjoy this adventure. So let's get started. The first thing we'll want to do in Rubinia is explore the world. To understand the landscapes and the townships and meet the people who are all really friendly and very happy to talk with us. In fact, engaging in dialogue is one of the most critical things that we can do in this world. Because through dialogue, we begin to learn how this world works and learn about things we get to discover for ourselves. And this is how we learn what role we have to play in this world, how we can be a part of this ecosystem. Now, what does this mean for us acting as Rubyists in our world today? Well, first, I think it means taking some effort to observe what's going on around us in the community. Observing the discourse, hearing the things that are being talked about and thought about as a community. The kinds of discussions that take place on blogs and chat rooms in and around conferences like this. Those things reveal not just what people are thinking about on the surface, but also the values and the priorities that underpin our community. For a personal example, here's a talk I watched in 2015 that completely changed the way I thought about Ruby and I only came across it because I'd chosen to follow some people online whose Ruby work I thought was interesting to me. And we can also observe the actual work being undertaken as well. But just going back to that talk, it was given by Piotr Sonica and I really liked what he had to say. And his ideas were clearly informed by the work he'd been doing. So from there, it's just one click away and you're seeing 2015 GitHub and I can look at all those ideas being played out in concrete code, which I could explore for myself. And yes, I think we should take plenty of time to actively observe code as well. In fact, reading code is some of the most instructive reading we can do as programming. It helps ground our ideas about different techniques and opens our eyes to different problem spaces.  And after ating these with the language, this is something I still do every day. So if this is not part of your regular programming flow, I highly recommend it. So now after all that observation, that watching, there's just one thing left for us to do and that's to close the loop, to reach out and engage with the people we want to learn more from or work with. Because the smallest constructive steps make you a part of this community. And for me, that meant sending a single email to Piotra, which ended up leading to a long collaboration together. Because at the root of it, programming is a collaborative, social activity. For our work to make the biggest difference has to happen in teams and communities in a society. And that's why we're leading with these points today. Because the skills to work within any given society are the same skills that lay the foundation of a happy programming career. These are not soft skills, they're core skills and they're ones worth practicing. And in the Ruby community, we already have some guiding principles that can help guide our actions in our community. They're worth remembering every day. But back in Rubinia, we're starting to get some idea of how this society works and continuing our explorations. And then as we, what's this? We've been attacked by a nasty bug. But that's okay. Because as the Rubyist, it's our job, find, squish these things. But to do this successfully, however, we need to get to know our equipment. And this brings us to the first of several technical exercises for our Rubyist. And we're starting with one of the most important, understanding the purpose and the danger of one of Ruby's most fundamental pieces of equipment, state. So when we think about building an application with Ruby, we think about working with objects, right? With every object being an instance of a class, just like we're doing here with a new entry for our player's log. And since this is a brand new entry, we can go and assign some attributes and save the thing and away we go. We've already built the first part of a new application. Everything's pretty good, right? Well, I think there's one thing at play here that we should take some time to notice. And perhaps it's easy to gloss over because we can take it for granted as a feature of Ruby. And as what we did when we mutated this object state. Here, we assign those two attributes. And these methods are what we call attribute writers in Ruby. And behind the scenes, they'll be assigning or modifying the object's instance variables. And as those instance variables that make up the object's state. These are the values that it stores or manages internally. And when we modify these values after an object's already created, it means that object now has mutable state. Which means that it's possible to change the state, the nature of any one of these objects over time. Now, in a simple scenario, this will all be fine. But we all know that nothing stays simple for very long. Especially when we start building out this actual class. And this is just a few keystrokes from this. And then we get all of this to deal with. Now, these are convenient features on the face of it. And they'll get us a long way in a short period of time. But they all rest on a foundation of mutable state side effects. Which means they can go on to become a huge source of complexity, bugs, and even technical debt. And I think we can do better. And I think to do this, we have to start recognizing that some of these problems arise when we have classes whose objects try to play two distinctly different roles. That is, objects that be also behaving as objects that do. In our case here, our entry is one of those objects that be courtesy of the attributes that it holds. Objects like this exist to hold the data in our system. But our entry is also one of those objects that do, courtesy of the methods that it offers that enact change by virtue of mutating its own state or triggering side effects. Now, you could argue that, in fact, these roles combined are a foundational aspect of object-oriented programming. That is the combination of data with behavior. But even with the very best of intentions and encapsulations, this approach still conflicts our object's behavior with the notion of time. And that means that to truly know a system, we need to know every possible combination of objects and every possible permutation of all their states in the entire lead-up to any given moment, which is a lot. And I'm sure anyone who's dealt with a large Rails app can know some of these challenges. And it just goes to show how a seemingly small design decision, like relying on mutable state, can lead to much bigger problems when you play it out across an entire app. So let's see where we can go from it. How about if we took those two roles and unbundled them? To start with, we could make it so our player log entries are simply objects that beat. In fact, we could start by modeling them just as a plain data structure. And then to take the role of the object that does, we could create a new dedicated class just for creating entries. And in this role, we can see here that our class defines absolutely zero internal state. There's no instance variables at all. So now we have this new arrangement of the code, which we can go on and run and see we've achieved the same outcome as before. We've created our entry. But we've gained several benefits because this arrangement is much simpler. Each piece of code has less work to do and there's no mutation to worry about. So we'll definitely have fewer bugs because of this. This arrangement is also easier to test because we can follow that one basic approach given a certain input when we run it through our code to get the output that we expect. And in arranging our code like this, we've ended up satisfying one of the most helpful object-oriented design principles, single-responsibility principle. Because create entry now has only one reason to change. And if you want to add more behavior dealing with entries, it's clear that the best way to do this will be by adding other single-responsibility classes around the one we already have. So I think we're in a much better place now. And it all came from this idea to separate objects that be from objects that do. And just think about it, another good name for objects that be is values. And another good name for objects that do could be functional objects or functions for short. So we replace that one do everything entry class from the beginning and we've now wound up with separate values and functions. And in fact, we began by musing over some of the foundational aspects of object-oriented programming, but we've ended up with some of the fundamental building blocks of functional programming. But really, what we've arrived at here is a style of Ruby that blends both object-oriented and functional programming. And I think it's going to serve us well here in the land of Rabinia. And at the very least, it's given us the right equipment to go ahead and squish this bug. So with that first encounter handled, we can begin to roam the lands again and continue our explorations. But now that we know about the dangers lurking out there, I think it's best we don't travel alone. We'd be much stronger in a group. So we need to go ahead and form a party. So now, as we visit the towns and talk to people, we'll be on the lookout for those sorts of people who would be interested to join us and form this party. These are people who can complement our own capabilities and will most certainly help us become a better Rubyist. So what could a party look like for a Rubyist today? Well, as an example, I want to share some folks who have been part of mine at different points in my Ruby life. First, we have some connectors. Here's Hugh, who I met in 2007. And back in those days, there was a website called workingwithrails.com, where you could go in there and register yourself and list yourself as a Rails programmer. You could share your name, location, and a few other funny things like your favorite gems, access, whatever. And the funny thing about it was that this site was small enough in those days that anyone interested could just load the page and scroll through it and see basically everyone who's there. And this is how Hugh ended up reaching out to me because he noticed I had changed my location and moved into his hometown. And he ended up getting me my first Ruby job there. Then we have Matt, who came to some of our early meetups in this town, and he's a very social guy. And he went on to introduce me to the broader Australian community. Now, moving forward in time, we have some teachers. Like Piotra, whose talk I shared before, that was just so formative for me. And Nikita, and both of these people are my teammates in the Dry-Bee and Rom-I-Bee projects. And I won't hesitate to say they're some of the smartest developers I know. So I learned so much just by talking through problems with them and seeing how they go about solving them in code. So we'll need a party a little bit like this as we explore the land as the rebellious. And here's why. We actually got lucky when we squished that bug before because it was just one little creature coming all on its own. When more often than not, we'll encounter many of these things all at once. And this is where we need our party and for our party to work together strategically. And that brings us to our next exercise. So far, we've only been working on things in a very small scale. But what if we needed to express some more complex behavior, the kind that might involve several different participants working together just like our party needs to work together in combat? This is where we have to take things a step further and use composition. So looking at that code before, I called that a single responsibility class because it only has one reason to change. But I did kind of cheat because that's not fully working code. I cheated because I ignored that create-in-db method. What we want is to make this work and we need something to provide that behavior for us. But we want this something to be external so that create entry itself can retain its focus. So this is the job for a dependency. And to make this all work, we're going to rely on our good old friend's state, but it'll positry. And then it'll capture it in the state so we can use it later. And then now back in our call method, we can create the entry in the database using the create method that this entry repository gives us. So with this done, we can now make an instance of create entry, passing in that repository. And yes, while we did capture that in state, we make note to never change it later, which means the behavior of this object will never change over time. So it means we can call it multiple times over with different inputs and have it work how we expect every single time. And that's composition at work. Instead of adding new behavior directly into an existing class, what we did is we provided it through another object and then compose those objects together to ensure the behavior is available where we need it. And in fact, we accomplished this using dependency injection, which is a classical object-oriented programming technique that works really nicely with our functional style objects. And thanks to this composition, using this dependency, our class is now fully working while still preserving its focus and its single responsibility. So now we've leveled up and we have the power of composition at our command, which means our party can work effectively together to defeat even the most challenging of attackers. And this means we can continue to roam the land again and push the frontiers. And along the way, we might encounter the unexpected like these treasure boxes here. Of course, we'll want to open them up and see what's inside, but we've heard tell some of them may contain poisonous traps. So we need to be prepared for this. What we need to do is cast some spells. Now, spells in Rubinia can be prepared by combining reagents, which we can buy from apothecaries in certain towns. And then once we have the right combination of reagents of ingredients, we can combine them to prepare the spells we want that will get ourselves out of any tough situation. And you know, if you think about it, this is pretty similar to something that we do as Rubyists every day, right? Going to a marketplace, acquiring items, and then combining them to great effects. Yeah, I'm talking about Ruby gems. And what will help our Rubyist is becoming acquainted with the kinds of focused interoperable gems that express the same philosophy that we've been developing so far. And this does mean we're gonna be seeing some code here that might look a little bit different because it takes a different approach to solving common problems. But trust me, each one of these boils down to plain old Ruby and we can use them however we want. So let's take a look at a few gems. First one is dry system. And dry system will help us take the functional style classes that we've written so far and make it easy for us to build whole applications out of them. And it does this by providing a container and which will act as a central facilitator, giving us access to all the objects in our application. So given a class like this, which we've written out so far, we can now access it from our container like this using this identifier. And then we're given back an instance of that class so we can go ahead and start to use it. Now you might be thinking at this point, well, this is just Ruby. We all know how to call dot new in a class. What's the big deal here? Well, this thing really starts to matter once we need to bring together our dependencies. And we saw how we arranged this class before so that it now requires a dependency to be provided when it's initialized. And I know when I saw a class like this for the first time, the question jumped right out to me, which was, well, in a real application, how's a class like this actually gonna work? How are we gonna make sure that we bring in the right dependencies for us to use it? Well, now that we have a container in place with every object being accessible by an identifier, we can use dry systems auto-injector to declare the dependencies that we want by their names right there in the class definition. So now, when we get our object in the container, that injector resolves all the dependencies and supplies them for us automatically. So we get back an object that's fully populated, fully functional and ready for us to use. And with this facility in place, object composition becomes extremely low friction. So when it comes to adding new functionality to our applications, adding that via composable single responsibility classes becomes the easiest and most natural thing to do. So this will improve the code quality of each individual component in our apps because they'll be able to retain their singular focus. But it also improves the flexibility of our app as a whole because by default, we're building things in a way that makes them easy to reuse. So that's dry system. Next up is dry validation. Say we wanted to make sure we only save our entries if all the valid attributes were there. This is where dry validation helps because it lets us define standalone validation contracts. So for our entries, we wanna make sure that both the body and date are given to us and filled and we wanna make sure they're properly typed as well. So that's our contract. Now we can go back to our create entry class and include the contract in our list of dependencies. And then in our call method, we can then run the input data through the contract and only go ahead and save that entry if the contract validated successfully. So that's pretty good. Now that we're thinking though about what a valid entry might look like, it would be good if we could find a way to nicely model them as we pass it around our app because if you remember, we're just using a plain hash so far to represent these. And this is where dry struct and dry types can help. With dry struct, we can define classes to represent our player log entries and give them strictly typed attributes. And these classes give us a place to put whatever other methods we might want around our data. And we'll be able to rely on these methods working exactly as we expect because these entries can only be initialized if all those attributes and their type expectations are met. So now once they are initialized, those attributes can also never be changed. These are effectively immutable. So this becomes a really helpful way to enhance our values. We get the ability to add extra behavior and because we don't need to worry about mutational side effects being something that these carry, we can then pass them really freely all around our application. So we sorted that out. Let's go back to create entry one more time and take a look. So now that our validation can only succeed, now that we only can save the entry conditionally based on that validation, it would be nice to find a way to properly express both sides of that result because returning a nil just isn't good enough for the failure case. And this is where dry monads and dry matcha come in. By mixing these into our class, we can now wrap our created entry in a success object. And now we can cover the failed validation case too by wrapping that in a failure object. So now when we call create entry, we'll see its return value wrapped up in either one of those outcomes, either a success or a failure. And then when we use the object, call it, we can use this matcha block to act on either case, the success case or the failure case. And by taking this approach here, we've improved our applications robustness because we've elevated failure handling. We've made it a first class concept, just as important as the handling of the success path. But that's not all. Because success and failure are both instances of the result monad, we can start to do some really cool things with them, like forming whole pipelines of conditionally executing commands. And in fact, dry monads offers a special mode to help with this and it's called denotation. What it does is it makes it natural to express this kind of pipeline of operations in regular Ruby code. And then when we run it, if every step returns a success, the code executes all the way through to the bottom and returns the final value. But as soon as a failure is returned, that pipeline will short circuit, returning that failure immediately and all the subsequent steps just get skipped.  It's truly magic. But this is not the kind of magic that we've learned to be wary of as Rubyists. It's a good kind of magic. It's the kind of magic that arises from the combined, harmonious use of small, focused, flexible on its own, but they're all also designed to be composable, just like our own good application code should be composable. So it means we can combine the gems in a way that suits us. And then when we leverage them together, we achieve something from them that is greater than the sum of its parts. That's the magic. These gems are the reagents that will let us cast all number of spells. They'll help us through whatever feature requests come our way and whatever unexpected circumstances we encounter in Rubinia. So what about creating our own gems then? Well, the good thing to know is that every gem has to start from somewhere. Every dry-hubby gem started off small, just trying to solve a common problem. And some of them stayed that way in the end, like Crymatcher, which only has 100 odd lines of code. So if you see some common pattern or behavior in your code that you think you could extract, publish, then I say go for it because every gem is an opportunity for ourselves to level up, to practice and get better at building systems made of reusable parts. And the Ruby ecosystem might feel established, but there is always the opportunity to take another look at things and offer a new and interesting take. Every one of us has a unique perspective on things and that's something worth sharing. And this is the only way our ecosystem can evolve and continue to remain relevant. So all this experience under our belt, I think there's just one more place for us to go. In our travels, we've heard that there's a dungeon and it's going to permit our entry only once we've mastered the virtues of the Ruby. And you know, I think we're ready. We've shown curiosity by paying attention to the goings on around us and finding opportunities to engage with our community. We've shown cooperation by forming a party, working together. And we've shown cognizance by developing a working knowledge of how best to use Ruby's fundamentals along with the collection of helpful gems to better structure our code. And that's enough for us to enter the dungeon. And here, final task awaits us to find the codecs of ultimate Ruby wisdom which will foretell the future of Ruby. But we've also heard that for the codecs to appear, we have to take our own steps towards building the future for ourselves here in this dungeon. And in our journey so far, I think we've definitely learned enough concepts and elements that we can start to put something together. But I hear one of our party members ask very fair question, in the heat of the moment in this dank, unfamiliar dungeon, how are we going to know exactly what combination of tools and techniques are right to apply at any given moment? Well, lucky for us, some work has already begun on solving this problem. And that is the work being done in the Hanami team which offer a modern complete web framework for Ruby. The project was established by Luca Guidi and in the two years that have now passed since its one point over release, our three teams have realized just how similar our goals are. So we've decided to join forces to form a party of our own and work together on delivering the next major release, Hanami 2.0. And I think Hanami 2.0 will give us exactly what we need to take our steps together here in this dungeon because it takes all the concepts that we've seen so far and then curates them and it will wrap them up into a cohesive, nice, easy to use framework experience. And we're rebuilding every aspect of the framework itself according to these principles. Hanami 2.0 will be fully oriented around immutable functional objects working together in concert. We're incorporating dry system into the core of the framework which will make it really easy for you to build your whole application around components like this as well. And we're continuing our push for a framework that helps you focus on your application's domain. And this comes as part of implementing a layered application architecture. And Hanami 2.0 is gonna help us take this to the next level. Here's how it's gonna work. First we'll start with our application's core. This is what makes your app what it is. It's the code that expresses its most essential functionality. And then we can add layers for how that application is delivered in various forms like a layer for a web interface which handles routing, HTTP, view rendering. And these layers will contain their own specific behavior and access the core that's required. And then over on the other side we can introduce other layers like this one here for dealing with database persistence. And we have touched on repository objects so far. Well Hanami incorporates ROM to give us really powerful, easy to build repository objects right out of the box. And then we can take things one step further because with Hanami 2.0 we'll be able to decompose our application's core into discrete subsystems with every one of these representing a specific area of concern. And then from within each system we'll be able to use and import the others as we require. And in doing this we end up forming a clear dependency graph of our application's high level features. And then if we go and zoom into any one of these systems thanks to the way we're building our functional objects those dependency relationships adjust as clear the object by object level too. And thanks to all of these explicit connections when a request enters any Hanami app we'll be able to really clearly trace it as it moves its way through the app and the final result is served. So this means as developers we'll be able to jump into any part of the app and recognize that clear flow of data at play. We'll see the explicit inputs and outputs will notice that there's zero unsafe mutation and we'll see all the explicitly declared dependencies. And what this means is that if we have to go in and make a change we can make the change and then be truly confident of the consequences. And that's what makes for applications that are a joy to understand and maintain both in the small and in the large. And then later as our apps grow up and evolve and if we sometimes need to move away from some of those standard framework conventions well this is fully supported too because Hanami too will embody the ideal of a framework built on top of solid abstractions. The framework itself will rest on clearly defined or abstractions which it then implements using the ROMRB and DryRB gems. And as we know, we've seen these at play they're already established independently useful very flexible gems. So then if we ever need absolute control at certain places we can swap them out for our own implementations or just work with those gems directly and use them to their fullest extent. And we can do all of this without having to feel like we're fighting the framework or distorting our application. And this is what makes Hanami too framework of the future. It's a framework of the future because it's using modern Ruby tools and techniques. Yes, but it's also a framework that respects the future of our applications. It's going to help us get started quickly like any good framework should but it will do this in a way that sees us writing well factored, well-designed code right from day one. That's code that will be more than happy to revisit as our apps grow past day 1,000 beyond. So I think we've established some good clear steps for the future here in this dungeon with Hanami too. And once again in doing this we've demonstrated the virtues of the Rubyist. We demonstrated curiosity by looking at the current Ruby framework story and the struggles that app developers face and asking surely there's another way. We demonstrated cooperation by recognizing the shared ground between all these Ruby open source groups and teaming up to build something great together. And we've demonstrated cognizance by refining all the good Ruby principles that we practiced so far and embedding them deeply into the soul of this framework. I think this is enough for the dungeon to reveal what we're seeking. Off this, an altar has appeared. Should we go and take a look? Okay, upon the altar lies the codex and we open it, turn it to the last page and on it we read. The most expressive, you never know what's going to happen when you set out on an adventure. We spent our time today roaming the wide open spaces of this land called Rubinia. And for the person in front of their DOS PC in 1985, this kind of world must have seemed like an endless possibilities. Well, that's the world we have today with Ruby. Those possibilities are endless. Ruby is a language that flourished and has then endured because it's a language that embraces possibility. And if we embrace it back, those possibilities are ours to create. We can create whatever future we want to see. And then as individuals, all of us together as Rubyists, I wanna reassure you that we can each take these steps at whatever time we're ready. Because I know for me, it took a good 15 years before I met the right people and arrived at the right moment to discover the way I truly wanted to work with Ruby. And Ruby was just there waiting for me all along. And now that the language has reached this golden age, we can be sure that Ruby will be waiting for a long time. The journey is long, so we should make it ours and enjoy the ride. Thank you all for taking this ride with me today. And I do need to say a thank you to Ancient Bards, a favorite band of mine, and they gave you permission to use the music to set the scene for us today. So really, it's a joy to be able to kick off this conference, but to also do it while sharing three of my greatest loves, Ruby, Retro Games and Epic Orchestral Metal was just even sweeter. And as for Ruby, I'm more excited about the future than I've ever been, and it's largely in part to the work going on in these groups here. As for Hanami 2, it's had one alpha release already, and we're working hard to get another one out the door next month. So other than that, I hope you all have a great conference. I look forward to chatting with many of you and hearing about your future with this wonderful, weird language of ours. Thank you so much.


Background Anacetylcysteine, NAC, is a mucolytic agents with anti-inflammatory properties that has been suggested as an adjunctive therapy in patients with COVID-19 pneumonia. Objectives We conducted a systematic review and meta-analysis to evaluate available evidence on the possible beneficial effects of NAC on SARS-CoV-2 infection. This article was authored by Periskeva Stemistoclas, Cantani's Anastasios, Carolus Iasif, and others.


Obviously the recipient would benefit from getting the money, but from a tax standpoint they'd have to pay taxes on it So they would like to get the money and not have to pay taxes on it now after the cutoff date of December 31st 2018 they removed that rule so that the recipient wouldn't have to include it in income whether Alimony or child support and the payer doesn't get the benefit of taking the deduction for alimony or child support For after the cutoff date, which you might think would be Non-advantages for the payer. It's not fair to pay her but again my argument would be well Obviously if you change the tax code and everybody knew what the tax code was I think the agreement would be different Before obviously because you would say well there's tax consequences We're going to take those into account and that's going to adjust the amount of payments that are going to go from one to the Other and then if there's a divorce agreement that happened after the cutoff date as long as it's not retroactively Changing what happened before to the agreements that happened before it makes sense that you would just change the divorce agreement an agreement and it should be more easily to do that Without with the taxes just get out of the way taxes. Just stay out of it. Just stay out of it Okay, Iris just stay out of it for crying out loud. I think that makes more sense actually but so let's if so let's say what's imagine we had an agreement before the Date and we're gonna say so this is the alimony the recipient name. I'm just gonna say just Just whatever I'll just say recipients last name Anderson recipients social security number which we have to give the IRS to because they have to show it get the income on their side Let's say it was let's say it was 15,000 or whatever and the date. We're gonna say is on 0101 17 before the cutoff date of December 31st 2018. I'm gonna say, okay Roll on over roll it on over and there it is. So now we've got this deduction We paid the alimony it was agreed upon before you changed the law and therefore I this person gets to deduct Mr. Anderson the 15,000 so the 15,000 is gonna roll down to the bottom here and then on the 1040 We're gonna have the 100,000 the 15,000 deducted to get to the adjusted gross income the AGI the 85,000 12,950 still the standard deduction getting us down to the 7250 on the recipient side as we saw on the income Presentation and section they would have to include the alimony received in that situation It has to be that symmetry if someone gets the deduction someone else has to have the income is the general rule You would think let's just put that into our Excel worksheet over here because because why not? So we're gonna say this is an adjustment to income and let's add. I'll just add a line item for alimony Alimony That's not spelled right. There's no way there is no way that you spilled. Well, I did is that really it? Did I do it right?  No, it's right. What are you talking about? I know what I'm talking about Okay, so then we're gonna say this is gonna be this is gonna be this one and and Let's just put it on the outside assuming we only have one alimony payment We're not paying multiple people alimony in our worksheet although you could set a worksheet with that multiple alimony So I'm sure that comes up So we'll say 15,000 and then we'll sum that up and that'll pull into the page one of the form 1040 So we've got the 100,000 minus the 15,000 gets us to the 85,000 12,000 950 and the standard deduction gets us down to the 72,050 and So if I pull that on over that mirror mirror mirror on the wall is what we have here 72,050 page to calculation of the tax 11 474 11 474 And that gets us down 15,000 withheld to the three five two six three five two six There we go. So that's just an example Of the alimony bottom line It was more difficult before the cutoff date if you haven't if you have an agreement that happened before the cutoff date You'll probably be able to see it from prior year tax returns And you can just copy the same kind of process going forward And if the divorce agreement happened after that time period and people ask you about child support versus alimony What am I going to do? What are the tax consequences? I think they're trying to pull one over on me with this complicated tax stuff Hopefully it'll be an easier situation. You could say and and you could help them out to to say It's actually the tax the taxes are staying out of it. It should be easier. Hopefully Going forward, but we never know what the tax code could change suddenly. You never know, but that's how it is now


The airborne observation platform consists of a small winotter airplane that's fitted with three sensors, the waveform lidar, imaging spectrometer, and a high-resolution RGB cam. And all of these sensors provide data at a high spatial resolution of less than one meter squared. The AOP typically samples an area of around 100 square kilometers for every neon site. So you could think of this as a regional scale data collection for each neon site. And this is a photo of how those three sensors are integrated on an airplane. The gold-colored drum that you see here on the left, that's the imaging spectrometer. It's the same as the average next-gen sensor developed by NASA JPL. The green box that's kind of hidden here, that's the lidar sensor we use and there's also an RGB cam also present along with the lidar. I'll be spending some time on this slide here because this will be the key for this tutorial. We'll be using lidar data here. The lidar stands for light detection and ranging, and it's an active instrument, meaning it shoots pulses of light at a high frequency of up to a thousand kilohertz, which translates to one million pulses per second. And the sensor then records the reflected energy. By keeping track of the amount of time it takes between sending the pulse and when it was received back by the sensor, one can calculate how far an object is from the sensor. And this way lidar could be used to characterize a three-dimensional structure of the lidar. There are a couple of popular use cases for lidar. The first is determining vegetation heights, which we'll be doing today in this tutorial. And the above, the other common use case would be to estimate above-ground biomass in the vegetation. So let's focus on this diagram on the right here. It shows an outgoing laser pulse at the top, and then as the laser pulse travels through the air, it will eventually encounter objects. In this example case, you'll see three objects that the waveform encounters. The first one is a tree. So as the laser pulse hits the tree, some part of it is reflected back to the sensor, as has been shown in this peak here on the right. So this is the reflected energy coming off of a tree. But remember, a tree will also have gaps in the canopy. So not all the energy that hits the tree will reflect back to the sensor. Some of it will actually penetrate the canopy and go deeper in. And then it encounters a second object. In this case is an understory shrub. And the same is applicable to this as well. There will be some energy bouncing off of the shrub back to the sensor. And again, the shrub will have also some gaps in the canopy. So it will penetrate that as well and hit the third object, which is the ground. So in total, this particular laser pulse encounters three objects here, shown by three different peaks here on the right. Now, NEON provides two different kinds of LiDAR data. One is called a waveform LiDAR, and the other one is a discrete return LiDAR. And I'll be going more in the pros and cons of both. Let's focus first on the waveform. What you mean by waveform data is you, for every pulse of laser that is shot by the sensor, the waveform data will provide you the exact shape of the reflected energy coming off of all the objects that it encountered in its way. The advantage of waveform data is, as you can imagine, it will provide you a lot of detail about the complexity of the vegetation in that area. So it's a lot of information, which is great for doing scientific analysis. But the downside to it is that you will have to store a lot of data on your hard drive. Remember, we are shooting a million pulses a second. And for each pulse, you have to keep track of this entire waveform. It will easily run out of hard drive space. So to avoid this situation, we provide another kind of LiDAR data called a discrete return data. So instead of saving all the information in the peak here, you could ensure that every time the reflected energy exceeds a certain threshold, shown by this horizontal line here, then you record it as a return. So for the energy bouncing off of the tree, you could summarize this peak in the form of just one point here, which is one discrete return. Similarly, for the second object, the understory shrub. Again, if the reflected energy exceeds a threshold, you record that as a return. Again, for the ground, you record that as a return if it exceeds a certain threshold. So by doing so, you are compressing the vast volumes of data stored in this entire waveform into three discrete points and thereby the name discrete return. You're discretizing the reflected energy and thus saving space. So that's the advantage of a discrete return is that you will save some space, but then obviously the downside being you'll also lose a lot of context here. So that's a quick summary of waveform versus discrete return data. And we'll be focusing on the discrete return part in this tutorial. And as you can see going forward, even though we have compressed our data by going for discrete return, you'll still end up with compute issues because there are just way too many pulses being recorded every second. Moving forward, the second sensor on the airplane is an imaging spectrometer, which provides hyperspectral image. Now, you may have heard of satellite-based platforms like Landsat or MODIS, which provide reflectance data for about 8 to 10 bands, making them multispectral sensors. Now, what makes hyperspectral data special is that they capture the entire range of visible to near-infrared shortwave-infrared regions of the electromagnetic spectrum. So you're sampling this entire range and then you collect this data at a fine spectral sampling interval of 5 nanometers. So you divide this entire range by 5 and then you end up with over 400 bands, 426 bands to get precise. And this is what makes it hyperspectral because of the hundreds of bands that are available from the sensor. Now, hyperspectral data has been shown to be effective in characterizing the physical properties of leaves. For example, the leaf mass per area or the leaf water content. And you could also, it's also been shown to be effective in capturing polar chemistry, like what's a percent nitrogen or percent carbon or percent calcium present in it. And this hyperspectral data is collected at a high spatial resolution of 1 meter. And finally, we also have an RGB camera, which takes photos in a high spatial resolution of 10 centimeters. We provide the camera imagery to provide some additional context when you're analyzing the LiDAR and hyperspectral data. Of the 180 data products that NEON provides, 29 of those are developed by the AOP team. And these 29 products are broken down into three levels, level one, two and three. And the raw data that the sensors collect are referred to as level zero data that we do not put out to the public. The level zero is processed to create a level one data product. And then from level one, you go to level two and then three, so it happens serially. And as you go from left to right from level one to level three, you'll notice that the dataset sizes typically tend to go down. And for this tutorial, we're going to be looking at the level one data product, the street return LiDAR point cloud. I don't know if you can see my mouse pointer. That's the one we're going to look at. In addition to that, we're also going to be the level three data product called elevation LiDAR. So this will give you the ground elevations in a raster format at one meter spatial resolution. We have a standard protocol in place to determine the ideal conditions for flying over a NEON site. The biggest impediment to flying over flight is ensuring that we have a cloud-free sky. And we have been successful in conducting most of our aerial surveys in almost near cloud-free conditions or low cloud-free conditions. But that may not always be possible. And you'll be seeing an example of that in the tutorial today. So although we aim for a near cloud-free sky condition, you may inevitably have some clouds here and there. And that might affect the data as well. And you're going to see that in the tutorial. We fly the airplane at a constant altitude of 1,000 meters of ground level. And typically, we cover at least a 10 by 10 kilometer box. That's the minimum. We even go above that for every NEON site. And these flights are conducted at each site at three greenness conditions. So what we do is for every site, we collect EVI trajectories derived from MODIS. And then we draw this interval, time interval, which corresponds to peak greenness for that particular site. And we ensure E-greenness collections so as to have consistency between annual collections. So let's say if you're comparing this year's NEON data, like the reflectance data collected by NEON, but let's say a couple of years from now, then if you collected during the same time of the year, it will ensure easier comparisons between the two years. And yeah, we typically fly these lines in a north-south direction to reduce any BRDS effects. This graphic that you see on the screen summarizes the number of times each of the 20 eco-climatic domains have been surveyed by the AOP over the period 2013 to 2023. As you can see, places within the continental US tend to be sampled more often. I guess every site in the bonus is sampled three times out of every five years. We ever take. And then places that are outside the continental US, like Hawaii or Puerto Rico, they are sampled once every five years. And we do this purely for logistical reasons. Going back to LIDAR, the discrete return LIDAR. This graphic was the value of discrete return LIDAR for characterizing the 3D vegetation structure. On the left, you'll see that all the discrete returns are colored by elevation values, with blue meaning low elevation and red meaning high elevation. On the right, you're going to see the same data. But this time, the returns are colorized by the RGB values from the camera sensor. So by adding the RGB from the camera, you're providing a little more context. And for today's tutorial, we're going to visualize this RGB colorized point cloud in Python. The level one discrete returns are used to generate a whole bunch of level three rasters. One example of that raster is a digital surface model. The digital surface model or DSM provides information on the surface features, such as the top of canopy vegetation heights. So going back to this graphic, the way we generate a digital surface model is we will take the highest returns that are recorded and then we'll interpolate them and create a smooth surface, a smooth raster of one meter resolution, and that is a digital surface. Think of this as draping the landscape with a blanket. That's what it gives you an idea of the top most surface. The next raster that we derive from the discrete return data is a digital terrain model and we'll be ingesting this in Python today in the tutorial. The digital terrain model gives you the elevation of the ground with respect to a vertical data, and this is also provided at one resolution. Going back to this graphic, instead of taking the top most returns, if you were to take the bottom most returns and interpolate them and create a surface, that's basically what a digital terrain model. I'll keep flipping between the DSM and DTM for the same location and you'll see what the difference is. The DSM will give you the top of the canopy view and the DTM will give you where the ground is. So if you have DSM and DTM, you can subtract the DTM from DSM and you can get a new product and this is called a canopy height model. So for every one meter pixel on the ground, it will tell you how tall the canopy is. So this was a quick overview of the neon and the AOP data. Now what I'll do is I'll share my screen again and we'll go over the tutorial real quick. Bridget, can you see the... Yes. The tutorial, okay, nice. Yeah, I'll quickly summarize the content in the tutorial and then hopefully we'll have sufficient time for the coding and any questions you may have. So this tutorial talks about the creek fire, which was a large wildfire that started in September of 2020. And in this tutorial, you'll find that I have provided links to a lot of content. Let's say if you go to the first link over here, it talks about the 2020 California fires. And here's a cool graphic of all the fires that happened in California in the year 2020. And this is the creek fire right.  So if you look at the top 20 largest California wildfires ever recorded, five of those fires shown in red here happened in the same year, 2020. And the creek fire is here at number six. So it's the sixth biggest fire ever recorded in California. So it's pretty big in size. And unfortunately, this fire affected one of neon sites in California. It's called the Socrude Tidal site in neon. When you have time, you can actually look at the video here as well. It will give you a good idea of how the landscape of the Socrude Tidal site looks like. I won't be going into that now because of time constraints.  And we have some photos of the damage caused by the fire. So this is one photo that was taken of Socrude Tidal site. I think we sampled it right after the fire. And you can see that most of the understory vegetation is gone. And some of the leaves on the tall trees are also gone as well. So it's just dead individual standing. And there's yet another photo here. You can clearly see the burns cars on the ground and much of the later gone. Yeah. So that was the background of the creek fire. Now the neon AOP team fortunately conducted aerial surveys over the SOAP site in 2019 and 2021. So a year before and after the creek fire. It was rather fortuitous. So this exercise aims to study the effects of fire on vegetation structure by comparing the LIDAR derived relative high percentiles before and after the fire. So if I were to go back to... Oh, you probably can't see the slides. Let me stop here. But going back to the slides here, what we are trying to do is... Yeah. We are trying to understand how the vertical distribution of these discrete returns change before and after the fire. That's essentially what we are trying to achieve here. Okay. So this Python tutorial is broken down into three parts. First we'll be reading in the discrete return LIDAR data. And I've provided you with links for the data product. This is where you can download your data. We'll provide you with information about how the product was created. Feel free to go through the documentation here. And if you wish to download the data, this is how you would go about it. You don't have to download it for this tutorial. We have already provided you with the necessary data and code. Yeah. And if you're interested in checking out other neon tutorials, we have a couple of them which are relevant to this one. For example, if you're interested in using an API to automatically download any of the remote sensing data, then please feel free to follow this Python tutorial. And let's say if you're more comfortable in R and you want to do the LIDAR processing in R, I would highly recommend this R tutorial. Like I said, all the data for this tutorial and the code are all provided on this Google Drive link. So if you right-click on it, you will see a page like this and make sure you hit download all here. And it will download the whole drive onto your machine. It shouldn't take too long. It's about 115 MB in size. So maybe a couple of minutes stops. And then the only data set that is not derived from neon is a shapefile for the Creek Fire parameter. And we downloaded this from the California Department of Forestry and Fire Protection, the CAL FIRE website. You can check it out. This actually has information of the parameters for all the fires that are connected to the state. But in this case, there will be just a Creek Fire shapefile. Then I go over the details about setting up your environment. And I'll go into this in more detail later. For now, I'll quickly summarize what we're trying to do here. So the part one of the tutorial is about reading and visualizing the discrete return LIDAR data. These LIDAR data are provided in something called a LAS format. LAS stands for laser. I think it's short for laser.  The X, Y, and Z coordinates of the discrete return. So for every point, you will have the X, Y, and the Z. And then you'll also have the intensity of the return. And the return number and the total number of pulses. I'll quickly go back to my previous. Yeah. So in this example case that I talked about earlier, you have three discrete returns in this case. And the first return happens at the top of canopy for the tree. The second return is for the understory. The third return is for the ground. And the intensity here refers to the amplitude of this reflected energy. So the Y axis here, if you want to call it that, or the X axis here is the intensity. Okay. Going back to the tutorial. So you have the X, Y, Z. You have the intensity of the return. You have the return number and total number of returns per pulse. And you can also determine if the return is a ground return or a vegetation return. The LAS tool software follows a standard classification. So if you right-click on this, it will give you the classification of the return as well. It could be ground, low-wedge, medium-wedge, high-wedge, or building and so on. So these ports here mean classification types. And then it also collects the scan angle at which the LIDAR interval is collected. So anyway, this function here imports the last file as a data frame in Python. So when you run this code, you will ingest all of your distributed on data in the powerful data frame here with information like X, Y, Z intensity, return number, classification for every discrete return. Now you'll notice that the X and Y values are not lateral on. They are the easting and northing values.  All the neon data are available in a UTM projection, Universal Transforcement Workator projection. And the Z coordinates for the discrete returns are reported in a North American vertical data. So it's a vertical reference against which all the heights are measured. I would highly recommend reading this article here. You muted yourself. Shashi, you're muted. How about now? Can you hear me? Yeah. Sorry about that. I was talking about the vertical datums. Normally when we talk about the earth, we refer to it as a sphere. But in reality, the shape of the earth is closer to an ellipsoid, as you can see. And this North American vertical datum basically refers to this ellipsoid. So the Z elevation, when you say 907.778, it means it's 907 meters above the ellipsoid, not above the ground, above the ellipsoid. And that's the case for all the elevations that neon provides. Even the digital terrain model elevations you'll see later on. They're also measured against that ellipsoid. But as ecologists, we don't really care about the ellipsoid so much because it doesn't really get a totally made up concept. So for the Z values to make more sense, we'll use the ground elevations from the DTM to calculate the height of the return relative to the ground. We'll be doing that in this book. But for now, we'll be visualizing the discrete point cloud. If you print the number of returns you have in a one by one kilometer file, you'll see that we have about 15 million returns. That's a lot of data. And by the way, I'll quickly share my screen for the QGIS component of this. So if you go to the Google Drive and download all the data and open it in QGIS, this is what it will look like. So this is the Creek Fire in California. And the red outline you see is the boundary for the Soaproot saddle site. And then on top of that, this is the digital terrain model that is available in the Google Drive folder. This provides the ground elevation for this one by one kilometer file and it's available at a one meter spatial resolution. And then on top of this, you can also plot the colorized point cloud discrete return data. So you can see here if I zoom in, yeah. So you can see the discrete returns here which are colorized by the RGB values from the camera. So these are all returned and you can visualize this in QGIS. And similarly, you can also open the point cloud data for the 2021 year as well. So if I simply flip between the 2021 and 2019 data, you can already see the impact of the fire just by flipping between the two. You can see burn scars in the 2021 data versus a much greener looking landscape in 2019. And this big dark shade that you see in the middle is a cloud shadow. And this goes back to the point that I mentioned in my slides that although we aim for near cloud preconditions, it may not always be possible. This is one such example. And if you're wondering why the cloud shadow has such sharp edges, it's an artifact of merging different flight lines. So this is not actually how we collect our data in one by one kilometer tiles. We collect it in the form of flight lines which are then merged to create this square shape tiles. And those edges are I guess the artifact of that. So this is a quick description or a quick visualization of all the data sets using QGIS. Now I'll go back to my tutorial. Yeah, so we have a whole bunch of discrete returns in the 2021 point cloud. And then here we visualize this in X, Y and C. I'll move real quick because we don't have much time left. But we have data for the 2021 and 2019. And in part two of the tutorial, we'll be ingesting and visualizing the digital terrain model using a package called reox array. And this is how you ingest the data. And then you can print the metadata stored in these digital terrain model files. One important thing to capture or to make note of when you're doing this analysis is to see what sensor, what LiDAR sensor was used for the data collection. And you'll notice that in the years 2021 and 2019, we use different LiDAR sensors. In 2021, we use the OpticGalaxy Prime, whereas in 2019, we use the Gemini. And when you're comparing data from two different years with different LiDAR sensors, it's always good to keep track of consistency in the LiDAR sensors. In this case, it is not. So the older sensors like the Gemini have a wider outgoing pulse width, which results in a poorer range resolution for the sensor. And poor range resolution of the LiDAR makes it challenging to resolve objects close to the ground, such as low vegetation. The Gemini has a range resolution of about two meters, which means it can be challenging to distinguish objects less than two meters apart along the vertical profile. But for the Galaxy Prime, this range resolution is substantially better at around 67 centimeters. For more about this, I have provided a link to the theoretical basis document. We can go through that. These are the values stored inside a digital terrain model. And again, all these values of elevation are with respect to the reference data, which is that ellipsoid threshold. And here we plot the DTM here, Northing, Easting, and the values of elevation above the datum. And this part here is the optional part. You don't really need it. We are basically trying to create a pretty looking map here that we earlier saw in QGIS, but created in Python. The only reason why you need so many lines of code here is that all of these are in different projections. So we're trying to bring them to the same projection here. And that's why all the code here pretty much does that. And then part three is the main key takeaway from the tutorial where we calculate relative height percentiles relative to the ground. In the first case, we calculate the heights of the district returns relative to the 2021 DTM. So we have a Z value, which is the height of the return of the ellipsoid. And we extract the digital terrain model raster value associated with that district return. And that will be the ground elevation. So we subtract ground elevation from the Z and then you get the dispute return height above ground. And in this case, what you're doing is maybe it's easier if I share my QGIS screen. So up until now, we have been looking at one meter rasters. So we want to calculate the relative height percentiles for every pixel on the ground. And right now our pixel size is one meter. And this is how one meter pixels look like. And the dots here on the screen represent the discrete returns. So when you want to calculate height percentiles for every one meter pixel on the ground, you would have to aggregate all the returns that fall within the one meter pixel. But because there aren't very many discrete returns in a one meter pixel, what we do is we force in this one meter data to, let's say, 10 meters. So this is how it looks like. I'll flip between these two. This is how a one meter raster looks like against a 10 meter raster. In a 10 meter raster grid, you'll see that each pixel has many more returns. So any percentiles that you calculate here will be more robust. So that is what we're trying to do in this part here. And I'll share the screen again further. We are creating a 10 meter spatial resolution raster grid. And we assign a unique ID to each 10 meter pixel. And then we group all the discrete returns based on the 10 meter pixel they fall into. That was the visualization I showed you in QGI. So for every discrete return, you capture the 10 meter pixel that it falls into. And then we also ensure that we have a sufficient number of discrete returns per 10 meter pixel, which is true in this case. And finally, we calculate these percentiles for every 10 meter pixel. And this is the final plot that you see here. So again, what we're trying to do is I'll go back to my QGI screen. We calculate our height percentiles, the 20th, 50th, 75th and 90th percentiles for every 10 meter pixel in this map. And we have several such 10 meter pixels here. So those box plots that you see there represent the distribution of the height percentiles across all these 10 meter pixels. And we see how those distributions change from one year to the next from 2019 to 2021. Now, the first key takeaway is that the 2019 high percentiles look higher than the 2021, which makes sense because some of the vegetation was lost to fire. And the other cool takeaway is that the differences in the distributions are more evident in the lower height, which kind of makes sense because if you go back to your photos from the side, you'll see that much of the damage actually happened in the under store. So the lower height percentiles were affected more compared to the higher. Because there are still some standing trees here. Even the dead trees that you see will be recorded as heights, vegetation heights. So that's why it's possible that the differences are not as abrupt in the higher compared to the lower ones. Yeah. And there's one other thing I wanted to mention. I don't know if you can see my screen right now. In the neon LiDAR tutorial, I have provided a file called a summary of natural disasters at neon sites. So this has a really cool graphic here, which can you see? Yeah, we're still seeing the screen from the website. Oh, okay. Sorry about that. In the Google Drive folder that I shared, we'll find a PDF called summary of natural disasters. This is a poster that my colleague Bridget presented at AGU conference last year. And it has a really nice graphic at the center, which gives you a summary of all the neon sites that were affected by some natural disaster, not necessarily just fire, could also be flood or a hurricane. So this is, I wanted to point this out to you so you could do similar change detection analysis for other sites and other natural disasters as well. So anyway, with that, I guess I'll stop now or the hands-on tutorial part of the session. So maybe you can follow the instructions on the tutorial and then let us know if you have any questions.


The proposed method is able to improve the accuracy of downscaling microwave soil moisture data from AMSRE to MSG Severi. It uses two parameters related to soil moisture, mid-morning rising rate and daily maximum temperature time instead of LST as the traditional method does. This method can be used to downscale microwave soil moisture data from other satellites with similar characteristics. This article was authored by Wei Zhao and Ion Li.


Is the narcissist trying to help you? In this video, I'm going to be discussing a topic that isn't discussed often. I am going to be talking about the communal narcissist. Although this video may resonate with you, that does not mean that you are dealing with a communal narcissist. It could mean that the narcissist just shares some of the same traits. Whether you are dealing with a communal narcissist or not, you may recognize some of the behaviors that I am about to describe in the narcissist that you are dealing with. The communal narcissist differs from other types of narcissists. They rely on communal means to satisfy their self-related needs. They play the role of a good Samaritan, of a compassionate person who unselfishly helps others, especially strangers. They manipulate people by displaying false characteristics that suggest they are supportive or legion. This is how they gain people's trust. This is how they get people to believe in them by acting supportive or legion. As though they are devoted to a task or purpose. As though they are exclusively allocated to or intended for a particular service or purpose. They display these fake feelings of being dedicated and loyal to a cause, activity or job. Especially if it is something that you might be interested in or something that you might approve of. But that is only to deceive you. That is only to take advantage of you. They are intentionally giving you a mistaken impression and causing you to believe something that is not true in order to gain some personal advantage. They want you to see them as this good helpful person so that you will stop being cautious about potential trouble or danger. When secretly they are lacking consideration for you and they are only concerned with their own personal profit or pleasure. They are only concerned with putting themselves in a position where they can have power and control. At first the narcissist will seem as though they are trying to assist you or comply with your requests. It will seem as though they are in agreement with you. They will try very hard and use a lot of effort to prove their importance, worth or usefulness to you. To give you the image or impression that they are loyal and dedicated to a cause, activity or job. And that they are always going to be there for you. But it isn't real or genuine. It's an illusion. It's a deceptive appearance or impression and they have planted false ideas and beliefs in your mind. They are giving you false support and encouragement, acting as though they are on your side. And as though they will try very hard and use a lot of effort to ensure that you both achieve the desired aim or result. In reality, all they care about is themselves. All they care about is your approval and admiration. Your validation of their false self and the illusion that they are trying to portray. They want you to see them as something valuable or significant. It feeds their ego and makes them feel as though they are special or important. As though they are worth something. They put in a lot of effort. And it seems like they are working with you to produce or create something and to show their loyalty or commitment. But as soon as they find a better opportunity, they will drop what they were working on with you. As though they never wanted anything to do with it. They will leave and move on. And that person who is supportive and alligent and loyal and dedicated to a cause, activity or job, suddenly disappears. The narcissist is not loyal or dedicated to anyone or anything other than themselves. They might put the work in and give you the appearance or impression that they are loyal or dedicated to a cause, activity or job. But they are only serving their own interests. They only have concern for their own welfare and interests before those of others. It's not about being motivated by a common issue or interest or working together to achieve a common objective. They are only interested in their own personal benefit or advantage. They are only interested in their own satisfaction and fulfilment. They are focused on regulating their own emotional state. This is why they are so competitive. They are competitive because they are striving for a goal that cannot be shared. They want it all for themselves. So your gain is their loss. Which is why they always have to have an advantage over you. They are always trying to be better than you. This is what motivates them to carry out these tasks or functions. But it only appears to be true or real until it is examined more closely. And that is when you will see that it is not real or genuine. It is not sincere or well-intentioned. It's a false display or an act. When you observe the narcissist's dedication and commitment to a cause, activity or job, it can be very convincing. It can cause you to believe that it is true or real. But beneath their false display of dedication and commitment is their own personal benefit or advantage. They create the false appearance or impression that they are assisting you or complying with your requests. But that is nothing more than a scheme or trick that is intended to deceive you. It's just to lure you in so that they can get what they want from you. They are only sticking around until they find a better opportunity. And their selfish desires and need for their own personal benefit or advantage will only destroy everything that you have created in the end. The narcissist is not trying to help you or anyone else. It's a false display. They are doing it to retain their respect and avoid humiliation. There is nothing real or genuine about any cause, activity or job that they are involved in. The first opportunity they get to take advantage of you and exploit you for their own benefit or gain, they will take it. Be cautious around people who are too kind or friendly. People who put in too much effort too soon. People who seem too eager to be around you. They are only interested in the attention and admiration to feel like they are something significant or valuable. But they conceal their motives by giving you the appearance or impression of them being loyal or dedicated to the cause, activity or job. The narcissist is not trying to help you. They are just using you for their own needs. Thank you for watching. I hope this video resonates with you. Please like, comment, share and subscribe. Click the bell icon to receive notifications for my future videos. If you are elected tonight, my PayPal link is in the video description. Coaching inquiries you can email me at noxforevercoaching at gmail.com Thank you for watching and I'll talk to you soon.


Hello, I am Dr. Venugopal, consultant neurosurgeon, Manipal Hospital, Whitefield. The recovery following the head injury also varies based on the severity of the head injury. The mild injury or the concussion injury, they usually recover within few days or within few weeks and they can resume to work. The problem comes in the moderate or the severe type of a head injury. We can see these kind of patients, they take about anywhere from four weeks to about three months to recover. In the case of severe head injuries wherein the patient needs surgical treatment or the patient is on ventilator for many weeks together in the hospital. So these are the patients which take quite a long time to recover. So the severe head injuries or the moderate head injuries are the one which takes about three to six months for recovery to even able to take care of themselves. Then based on their assessment at the end of the three or the six months, we will be able to tell how and when they will be able to resume to the work. The treatment can be in the form of a simple treatment like medications for treating your pain, like headache, all those things to the medications which can control fits and it usually depends on the severity of the head injury. Minor clots in the brain are what we call it as the contusions or the small hematomas or what we call it as a subarachnoid hemorrhages. These are these are a form of severe head injuries, but usually it would subside over a period of time and they may not have any long term effect on the patient. Okay, there are different parts of the brain, what we call it as a frontal lobe, parietal lobe, temporal lobe, occipital lobes and we have two hemispheres or the two sides of the brain. Like we see the left side of the brain controls the right side of the body's function and the right side of the brain controls the left side of the body functions. So the injury or the blood clot or the hematoma, what we call it depends on which part of the brain is affected. The seriousness of the injury or the deficits or the problems what the patient may face depends upon which side of the brain is affected. These are called silent because any injury in this part of the brain may not manifest or may not give any symptoms. Okay, so that is how when we see a CT scan or an MRS scan where we see a clot, but still the patient is absolutely fine, normal and it heals over a time. This is because the injuries are involving the silent areas of the brain which doesn't give any problems or which doesn't cause any deficits. Vegetative state of a patient is what we see in serious head injuries that is being treated. So, a patient would be usually a severe or a diffused axonal injury kind of a patient who's been in the hospital for about weeks to month and he would have taken about one to two months to recover in the hospital. We can see that the patient when they get up immediately following a concussion injury or a trivial head injury they say that I'm not able to remember anything whatever has happened after the accident. So, this memory loss can happen for a few minutes for a few days depending upon the severity of the head injury. If it is a mild concussion injury then there is no worry the memory would come back to normal. Usually what we see from the patients or from the patient relatives that doctor the patient is not able to remember anything. He doesn't remember exactly what has happened. He went in a bike or in a car and he suddenly he became unconscious following a bang on the head then he's not able to recollect somebody has to take him to the hospital. So, is it of a serious concern? So, I would like to say that this amnesia is of no serious concern and that is a normal response because of the temporary damage to the brain. The concern becomes only when it is long standing and they tend to keep on forgetting things. So, these can happen in a serious form of head injuries and then you need to take a medical attention and should be on a regular follow up. What is important is you should be aware of the rehabilitation centers available to your place. So, there are a lot of neuro rehabilitation centers depending upon the which part of the India we stay in South India there are good rehabilitation centers. So, Manipal Hospital Whitefield is one of such kind of a place where and we have a complete neuro rehabilitation center which is involving multi modality treatment.


Oh, excuse me? Hello. So today, as you can probably tell by the title, we are going to London and I'm gonna try and make it to as many kind of independent bookstores in London as I can. I mean, I realized that it really has been years since I've shopped in a lot of independent bookstores. I tend to shop in secondhand independent bookstores but not full price independent bookstores. And I just felt like if we can't afford to do it and monetarily we should stop buying our books on Amazon and just go some independent bookstores. So this is my Christmas present from Tom and we're gonna be going to two of my favorite restaurants as well. Oh my God, I'm so excited. I'm gonna take you along with me and I'm gonna try and buy a book at every independent shop we go to but like I'm only gonna get one if I want one. I'm not gonna just like spend money if there's no book that I'm like super desperate for. So we're gonna try and find a book I want at every independent book store we go to and we're gonna try and get around to as many as we can. Without further ado, let's just get into the video because I'm sure we don't care about this. We're not in London. Let's go to London. Okay, bye. The word is our first bookstore and this was the first ever and still only LGBT bookstore in the UK. And when I asked on Twitter which independent bookstores in London I should go to this is the one that everyone said. So I'm here. Gaze The Word was filled with so many amazing books and it had such great variety. It had Young Adult, more literary fiction, poetry, graphic novels and so much more. There were so many books from my wish list in there that it was really, really tough to choose which one to buy. So I picked up The Prince and the Dressmaker which is a graphic novel. I've had so many people talk about this and I may be doing a graphic novel video soon in the new year. So yeah, I was really happy that I found this because I was worried I wouldn't find books like this that I wanted so I'm very happy. So next we're at Scoob Books which is this, go to the sign over there. Yeah, lovely. Well it just says books. That's why it's called Scoob. It's books. That's it. Cut the cameras. Dada. That's intelligent. I just thought it's Scoob for Scooby-Dee. I'm disappointed. Which is a second hand book store so we're gonna see if we can get any steals. Scoob Books had literally every genre and type of book you could possibly think of. History, philosophy, politics, spirituality, travel and then just normal fiction as well. It had literally everything. They had these great penguin classics with the original orange covers. I just want to take the whole bookshelf home but alas, I couldn't. It just felt like a complete treasure trove of books that you could just spend hours getting lost in. So if you're in the area, it's just by around the corner from Gaines the Word, then I would definitely check it out. Excuse me? So we just went in there and I got down and out in Paris and London by George Orwell which is kind of an account of him being really poor in Paris and London and also like the experiences of other people who witnessed there. I've been wanting to read more George Orwell for like forever. I've only read Animal Farm on 934 so I thought that another one of his I should pick up and then Tom picked up a book. Do you want to tell him about it? A history of Anglo-Soviet relations. That took me a second. Yeah, it's really boring. It's boring. Nothing. It's just for uni stuff like about trade deals and negotiating, going from enemies in the Russian Civil War to being friends. Well, friends loosely. Cool. OK, I don't know where we're going next, so we've got to decide. OK, bye. Football, Tom?  Hang on. I'm going to zoom for the squad. Wow. No, your face is enormous. Can you do your thumb now? No way. So now we're at the Persephone Bookshop which reprints neglected fiction and non-fiction from 20th century women authors so that we can read books which we otherwise wouldn't have been able to read. So hopefully I will find a hidden gem. Persephone Books was probably my favourite store I visited just because the atmosphere in there was so lovely and cosy. I loved all the matching editions and it just felt like such a welcoming environment. They had some really great and helpful descriptions underneath each book so you could just quickly tell what they were about and I just love the idea of what they're doing there. Wasn't that your favourite one we've been in so far? Would you agree, Thomas? It was pretty special. It was pretty cool. I like the colour choice. Yeah, I really like... I'll show you one of the covers. So most of them are like this. So this one I got, I think, is about a woman who's in prison during the Suffer Jet movement, right? I'm pretty sure. And it sounds really interesting. So they have... It details the life of what living in a... Woman's prison. Back then, yeah. I'll change the colour just so I can see it a bit clearer. Okay. And so then most of the editions are like this square on the outside and then they all have like a printed inside like this. Ta-da! Cool. And then come back up to me. And then the other one I got was Miss Pettigrew Lives For A Day, which Tom picked out, really. You've already wanted to get this one, but it sounds super interesting. And I think it's basically about how her life is really similar, right? Until like this one day, which the book is the whole day. She's like her nanny or something. Oh, you know more about the book than I do. She just has a really fun life and stuff. Oh, so she lives it up. She goes... In one day, she starts to live it up. Okay, cool. So they were my choices for that. I think if you're in London, you should definitely pop into this one because I think it's really like a really unique bookshop, I think. So we've just stopped to film in front of this, which looks so pretty. Is it like an advent calendar type of thing? And it looks so cute, right? We were next door at... Oh! We were next door at Hatchards, which is the oldest bookshop in London. So I was so excited to go to it. And then you walk in and it's basically just a Waterstones because they're owned by Waterstones now. And so it kind of felt a bit disappointing. It felt like the whole pointless was to go to independent bookstores that are a bit different. And it just felt like the same old, same old, other than the floors being a bit old. So yeah, I didn't buy anything in there and we were kind of a little bit disappointed. But now we're gonna go... Oh! But now we're gonna go to Gosh Comics. So hopefully that'll be more successful, so we'll see you there. So now we're at Gosh Comics, where they do graphic novels, manga, zines. And as evident by my earlier purchase, I wanna get more into graphic novels. Hopefully I can find a really good one here. I already have one in mind that I almost bought at the first shop. So we shall see. So in Gosh Comics, there was literally everything you could possibly imagine would be there. It was really, really incredible and it gave me so many ideas for things I wanna get in the future. There's so many things I wanna add to my wish list now because of it. And look at these Naruto editions. I've only like 20 episodes in. But yeah, they still look really cool in part of me. The catalyst home in me still wants them, so. Yeah, but it was really, really an amazing shop and so unique. Okay, I picked up Laura Jean keeps breaking up with me, which I almost got a gaze at the word, but I thought, I reckon, gosh, we'll have it, so I'll wait. So yeah, I've heard really great things about this, particularly from Ariel Basette, has read it. Particularly from Ariel Basette, who read it during the reading rush and said she really enjoyed it. And I really like the art design in it. So one thing I really like about this is the use of just pink, black and white and gray. And I think it's really unique. So I think it's a really beautiful graphic novel, so I'm really excited to give it a read. So that was our pick for gosh comics, oh hey. So now we're at Daunt Books, which may be the last one of the night. I don't know if we're gonna fit anymore in, but I've always wanted to come here. I've seen so many of the events they've done, like on Twitter and stuff, and I've always thought, ah, I should wish I was there, but now I am. So I'm excited to go in. I've heard someone tell me on Twitter that their books are arranged by location, like destination, like, do you know what I mean? Like, where the book is set. They're arranged in that way, in part of the room, so I'm excited to go and explore that. And yeah, let's go have a look. Although I didn't end up buying anything in Daunt Books just because there was nothing really that grabbed my attention, it felt like such a magical place, particularly in that big hall. As you enter to the right, it was really, really just amazing. And I don't think camera really captured it as well as it came across in person. It was just amazing. So it's definitely one of the most atmospheric bookstores that I've been in recently. So if that's what you're looking for, I would really go check it out. And then we just wandered around London for a little bit and finished night off at my favorite restaurant, Nobu. And I haven't been there for like five years, so it was really great to visit again. Hello. So I'm sitting here to try out the fact that my bed isn't made because I don't want to move them. I want to move you. I want to move you. Yeah, I thought I would just recap really quickly what I picked up. So at Gaze the Word, I picked up The Prince and the Dressmaker, which is a graphic novel. So I think this is essentially about a prince and a dresser. I'm not speaking from experience. I just want to hear say, but yes. But isn't it, doesn't he want to wear dresses, isn't it? The prince wants to wear dresses? Am I right? I think I'm right. So the artwork in it looks so cute. You know what you think? I just can't wait to read it. I'm really, really excited to give this a read. When I saw it in there, I was like, yeah. Okay, we're getting that. So next is Scoob Books. I got Down and Out in Paris in London by George Orwell. I just, oh my God, what are you doing? I always want to read more George Orwell as I said, I think in the clip. And yeah, I just don't feel like I read enough of his stuff. So when I saw this, I just thought I'd pick it up. It's nice and short. And like, it was a second hand bookstore and still in very good condition. So Goodreads says this unusual fictional memoir in good part autobiographical, narrates without self-pity and often with humor the adventures of a penniless British writer among the down and outs of two great cities. It's essentially about going in, like living in lodging houses and seeing the people who live on the streets where you're really poor. And I think it's just like a look at poverty. It's the one I've heard people talk about loads. So I'm excited to pick it up and see what I make of it. And it's short, so I feel like it's quite accessible. So then next we went into Persephone Books, which I have to say, I think was my favorite bookstore out of all of them. I really, really loved it in there. I thought just the vibes in there, they had music playing, like incense on. And I just love the design of all of their books. And I shot the idea of it. So if you are in London, I would really, and you can only go to one bookstore. I think that this is a really unique bookstore. You're not really going to find anything like it wherever you're from. So I really, really recommend going to this one. So I got two here, because I kind of felt like other bookstores, I can just get those books another time, but these books are like so unique to this location. So I thought I'd get two. The first one I got was the one that's like typically in their style, this kind of gray cover. And that is No Surrender by Constance Maud. All the Goodreads tells me is that No Surrender describes minor aristocrats and male girls as they struggle together as part of the suffrage movement, which is really interesting. It's only got 126 ratings on Goodreads. So like barely anyone has read this. So I don't know, I'm just super excited to pick it up. It sounds super, super interesting. The little blurb they've got sounds so interesting. And I love how for all of the books, they all have these like different designs on the inside. And you can buy like, sorry, I've got two bookmarks here. You can buy the bookmark that matches that. So I think it's just a nice touch they've got going on. And then the next one I picked up was Miss Pettigrew Lives for a Day by Winifred Watson. Goodreads says this one, Miss Pettigrew and approaching middle-aged governess was accustomed to a household of unruly English children. When her employment agency, Sins, said to the wrong address, her life takes an unexpected turn. The alluring nightclub singer, Delisa Lafoss, becomes her new employer. And Miss Pettigrew encounters a kind of glamour she had only met before at the movies. Over the course of a single day, both women are changed forever. Now this is one that Tom really wanted me to get. He was like, I think it sounds so interesting, you know, how it only happens over one day. I think it will be, I think it'll be such a fun, yeah, such a fun idea. So I mainly got this because he really liked the sound of it. And he was being so supportive. I was like, okay. And he's buying them for me anyways. But yeah, it's really short. I think it's only just over, it's like 230 pages, but it has got some illustrations, not loads, but it's just got some pages where there's like these little lines drawing illustrations. And then the last book I got was Laura Dean Keeps Breaking Up with Me, which is another graphic novel. Again, oh my God, I love the artwork of this one, how it's all just black, gray, white, and like the like peachy pink salmon color. I just love it. I just love the design of this one. So this is I believe about a girl who is dating Laura Dean and Laura Dean is kind of like a really, really bad girlfriend, quite manipulative, and it's just a really bad relationship I think. So yeah, I just, I'm excited to read it and it just, it's everyone I've heard has given it a really, really great review.  So yeah, if you had told me when I went out that I'd only be buying classics, oh, I'd only be buying classics and graphic novels, I would not believe you because I've never read a graphic novel and I barely read classics. So I thought I'd become really into fantasy, you know, but I ended up getting kind of books which I wouldn't otherwise have got if that makes sense, which for me is really great, you know, like the books that you're gonna get, and I feel like with something like this, it's fun to kind of go and discover some other books. So I'm very happy with my haul. And yeah, I hope you enjoyed the video. It was a really, really great day. I had a lot of fun and yeah, it was really, really great to go to all of these bookstores and the ones of course I didn't buy stuff out were still really great to visit. So yeah, I hope you enjoyed the video. I hope you've all had a wonderful, wonderful Christmas and you're having a brilliant rest of your holiday season, wherever you are. Tell me how it's going down below because like I said before, I know that holidays can be both a brilliant time and a difficult time for people. So let me know how it's going for you and I will see you very soon with another video. Bye.