I haven't guessed by now it is on inheritance and composition in Ruby. So a little background on this talk, why did I write this? So when I started looking into these concepts, I found a lot of information that was kind of geared around more experienced developers. Maybe it was developers coming from another language that already knew these concepts, they just wanted to know how to do them in Ruby. But I didn't find a ton of material that kind of combined these two ideas in context so you could compare and contrast them. So I wrote this talk for people like me in that scenario that maybe you're new to programming, maybe you're new to Ruby, maybe you're new to object-oriented programming, maybe you're just unfunctional, and you want to understand these things and understand why people tell you things like prefer composition over inheritance. So let's get started. So inheritance is a little bit of a sensitive subject for a lot of programmers. Especially when you talk to seasoned programmers, it's kind of interesting the feedback you'll get about it. And I think that this is mostly due to a lot of people getting burned by inheritance. I think a lot of people have bad experiences with it being implemented poorly or not really fitting the problem that it was used to solve. And I love to troll my Elixir friends by talking about inheritance, so that's where that comes from. So yeah, when you talk about inheritance, you get a lot of angry people. They just don't want to deal with it, super mad about inheritance, or maybe just sad. So the goal of this talk is really to give you guys a firm understanding of what object inheritance is and what object composition is so that you can understand the trade offs of both. I'm a firm believer that there's not an absolute solution for problems that you're trying to solve, at least in programming. So we really need to understand the problem space that we're trying to work in, and understand the tools that we have available so that we can solve that problem effectively. So that's what this talk is hopefully going to do, is give you that understanding of these two tools. So before we can talk about inheritance, we need to talk about Ruby. And I'm just going to go into some actual demo code. Can everybody read that okay? Bigger? Okay. So this is about as simple of an example as we can get. So puts hello world. This is probably one of the first things that you saw or wrote in Ruby. But has anyone ever thought like, how does this actually work? Where does puts come from? How come I can use it in a top level instantiation like this? I hadn't thought about it until I wrote this talk. So maybe I'm alone there, but it's actually really interesting. So we've got some different examples here. If I run this file, obviously it works. It's going to output hello world. That's going to work top level. It's going to work if we put it into a class method. So this one, we're defining a new class hello to. We have a class method using the self keyword. So we're going to call it on the class itself called greet. And then we're going to put just a message in there. You can see that when we run this, we get hello from a class method, just like we would expect. So when we start to get into the internals of Ruby, what we're going to find out is when we start to have these naming collisions, you get some interesting behavior. So what we're talking about here, oops, is method lookup. So when we get into something like this where we have a class, and this class actually defines a puts method, and we're just accepting a message, what's going to happen is when we call puts on line 10, it's not going to use the normal puts that it usually does. It's actually going to use the puts method on line four. So we can see this working. Instead of actually outputting hello from an instance method, you can see in our puts method we're just ignoring that message and we output what is the password. So this is kind of the very basics of inheritance for method lookup, and I'm not going to go into full method lookup, it's not the point of this talk, but I really just want to give you idea of how this stuff works. So what happens is in a Ruby file, in a class, when you call a method like puts, it's going to check to see if that class has that implementation. If it does, it will use that implementation. If it doesn't, it will continue to look for it, and we'll explain where it goes to find those. So here in our next method, we've got another interesting example. We'll skip over the speaker for now, but right down here we've got a class hello four, and this little less than sign is telling us that we're going to inherit from this speaker class. So we have a speak method, we call puts, and you'll see from the output that we get hello from the grade unknown. So it's stopping here, and we're putting, this is a global variable standard outputs, and that's how the actual puts method works under the covers. Does anybody know why we can't call just puts here? It'll call itself, perfect. So if we were to instead put, well, get rid of that, so we get a stack level two deep error, and you can see this, we get from hello four, and it just keeps looping over puts, so it keeps calling itself recursively. So that's not what we want to do. In our next example, so we have hello five here, this one is going to, it has an attribute on it, and it's going to initialize that attribute with just a string in its value. So it also has another method called puts, and you'll notice my linter down here is actually telling us a little error. It's telling that we have a duplicate method. So this is kind of interesting because Ruby doesn't necessarily respond to messages with only methods. It can also respond with attributes, and that's why you see this here. So we're defining kind of a responder on puts on line four, and again on line 11. So when we call puts here, it's kind of a mystery like what we're going to get back. Are we going to get back the method, or are we going to get back the attribute? So the method is set right now to accept a default value, or it doesn't need a value, it'll default to nil. So when we call this, we get what is the password? We don't actually get the string attribute, and why that is is in Ruby the kind of the last one wins. So if we move our adder reader below this, you'll notice that my linter changes, right? So now it's telling me that this is the duplicate method, and you can imagine that when we run this, it's not actually going to output anything because it's just returning a string. If we change that to actually call puts, we'll get the string attribute. Okay, so on this example, we have another class with another method that you're used to seeing now, but now instead of speak, we have puts as a local variable. When we call this, we're going to get that same thing. We're not going to get a return value unless we actually output it, oops, and then we get the local variable. So kind of the basics of this method lookup is going to be check inside of my method that I'm calling this from. If I have a local variable, cool, use that. If I don't go into my class, do I have a method, use that. If I don't go to my parent class, if I have a method, use that. So to answer the question, where does this puts come from? We've got our last example here, and I get undefined method puts. So you might notice something kind of shady about this file, requiring this setup file. So I'm sure that's where a lot of you are drawing your attention. So if we look at this setup, you can see that module kernel, we have removed the method puts. That's why we get that error. So in Ruby, we'll go over this in the next few slides. Every object that you create will have an inheritance tree. That's just how Ruby is built. And in that inheritance tree is kernel. And that's where methods that you probably take for granted have never thought about like puts and sleep are defined. So anytime you call those, you're bubbling up that ancestor tree until you get to that kernel class unless you've actually defined them. All right. So now that you know a little bit about the method lookup, we can start to talk about inheritance. So what is inheritance? So this is from Wikipedia. I won't read it verbatim, but the basic idea is that you have a child object and when you inherit, that child object will acquire all of the properties and behaviors of the parent that it inherits from. So you might have heard, it described that inheritance should be used for an is a relationship. So an example, a duck is a bird where a duck would inherit from bird. So you could set up a base class of bird and give it common attributes that a bird would have like wings, feet, whatever you want. And then you could make a child class of duck that would inherit all of those features and then specialize it for stuff that only ducks have, right, like a buoyancy level or something like that. So inheritance and Ruby, we have a couple different types and tools available to use it.  So in action controller, active model, stuff like that, you're gonna see a lot of inheritance in those frameworky stuff. So this method down here, so I've got at the end child.ancestors, is this method, this ancestor tree that I was talking about. So with nothing else, we have a child in its next ancestor as a parent. Parents' ancestor is an object and then it goes to kernel and then to basic object. So any class that you create outside of this parent inheritance will have these kind of, it inherits from object, it inherits from kernel, it'll inherit from basic object. We also have multiple inheritance in Ruby. So there's more than one way to do this. We're only gonna talk about include, the other two, there's also extend and prepend, but they're kind of outside of this talk. So we have the option to include multiple inheritance. So you can see that we have in our ancestor tree a child and the first thing that comes after child is the last thing defined. So in this case, it's step parent. If you were to switch those two parent, you'd actually look in parent first and then step parent. And then again, we've got object, kernel and basic object. So multiple inheritance, any dangers that you've heard about single inheritance is kind of just exacerbated in multiple inheritance. There's a lot more moving pieces and a lot more chances for you to miss something. And then the last thing I wanna touch on is namespacing. So a lot of people will see include a module and they'll kind of think, oh, I've seen classes wrapped in modules, is that inheritance? That's actually not, this is literally just kind of qualifying and creating a namespace around your class. So you'll never refer to child without that parent colon colon. You'll always have to access it that way. So it's literally just given it a different name so that you can group things together. All right, so when should you use inheritance? And the answer is when you wanna specialize an object. A child should use every single attribute and method of a parent if you really wanna use it correctly. And you should never use inheritance as a way to kind of clean or dry code up. There's much better ways for doing that. We'll actually talk about one here in a second. So the pros of inheritance are you can make code reusable and extendable, but there's a pretty big caveat on this and that is if it's done correctly. If you don't use inheritance correctly, neither of these things are true. It actually makes it really hard to reuse code and really hard to extend code. The cons, when you inherit from a parent class, you are literally creating a coupling between the two. That's usually a word that's synonymous with bad behavior. You get reduced readability. So if you have a method in a parent class that's not in a child, but the child calls that, a developer that's looking at this fresh that's never seen it before is obviously gonna have to do some digging to figure out where that method comes from. It's easy to abuse. So I would argue that inheritance and its benefits are really tied to properly naming things. So you can create these taxonomies or these hierarchies in your code where you can create kind of a visualization of how your application works. You've probably heard before that one of the hardest things about programming is naming things. So I would argue that a framework around naming things is probably gonna be hard too. I think that's why a lot of people get it wrong is it's hard to define those domains in our systems. And the last point that I wanna bring up is that it can complicate unit testing. So if you're inheriting, it's pretty hard to isolate a child and only test child behavior because you get all of that parent's behavior for free. And I have an example to show that. So you might be feeling like Tina here a little bit.  So why are we even talking about it? Should you just never use it? I think there is a use case for it but we'll see how limited that can be. Okay, so next I wanna talk to you about the alternative to inheritance composition. So what is composition? So again from Wikipedia, it is a way to combine simple objects into more complex objects. So you might have heard it described as a has a relationship. For instance, a car has an engine where a car would be composed with an engine. So composition and Ruby. We have, this isn't really talked about in Ruby but it's worth bringing up so you know about it. So there's functional composition which is really just creating a method from other methods. So again, you're not gonna see this in Ruby but if you look at JavaScript examples or examples in other languages you'll see this quite a bit. And then we have object composition. So this example is okay but I've got a different one that we wanna show. So we go back here. Okay. So I kinda wanna just explain what composition is and how you get to it with a concrete example that you can actually see. So we have a very simple application for explanation purposes and this is gonna have one method where we're gonna call an API and we're gonna save the result. So there's a couple of problems with this type of programming. Right now the structure of this is very rigid. It'd be very hard for us to come in here and actually change anything with confidence knowing that we're not gonna break something out. This is very small and easy to understand but imagine this in a much larger ecosystem. So what are some things we can do to make this better? So the first thing is we can start to break out these dependencies. So instead of having this method know what its dependencies are we can move them out of that method and just allow the method to access them. So this is kind of step one in composition. Step two is gonna be we actually wanna inject those dependencies into this class. So we don't want the class to hold the knowledge of what its dependencies are. We want the class to only receive that and know that it can do things with them. So this might be new to some people. It's just a key value argument and these are just default values. So we're passing in a DB which is this repo class and an API which is that API class. We're setting those to attributes and then we're using them in the method. So the benefit here is we're now able to update and change our application without changing the internal details of this method. So as long as we know that if we create a new API object all we need to know is that that API object needs to respond to this get method. So we're able to interchange anything that we want so long as it responds to this method which gives us a lot of flexibility. Same thing with the repo. And you can do this with anything that you see possibly changing in your application. Blake likes that. Okay, so when do we want to use composition? As much as we possibly can. Composition kind of pushes you towards making smaller classes and methods. That's a great thing. That's literally never a bad thing. So whenever you can use composition unless you know it's like prototype code or you're gonna throw it away but it gives you a lot of flexibility and there's not that much work. So pros that we have, it's flexible. Like you've seen, you can interchange things and swap things very easily. You can update your app pretty painlessly. It's readable. You're not guessing where things are coming from. It's very explicit.  It's easy to unit test. It's really easy to isolate each part of the system that you're passing in and test it in isolation which is what you wanna do in a unit test. And all the cool kids are talking about it. So the cons, you have to write a little bit more code. That's a con. Okay, so we're gonna dig a little bit deeper and start to look at some examples of this stuff. Okay, so the first example that I wanna show you guys and this is to kind of contrast or to talk about why inheritance can complicate testing. So I have a pretty simple user class here. We have an after create method where we're going to just populate an attribute which is a good. Other than that, we've got some trivial methods like asking if there's a first name, a last name, and a method to change the first name. So we get a new feature request that comes in that we need some sort of administrator in our system. We don't wanna necessarily write all of this logic. We wanna use what we've got for user but we do wanna do some things a little bit differently. So we decide to make an admin class that inherits from user. And this class right now only has one extra bit of functionality which is to populate this admin true flag. So let's talk about testing. So when we test our user class, our unit test our user class, it's pretty simple to see. We're just gonna test all of our methods that we have available. Pretty simple, pretty straightforward. When we go to look at our admin class, we're gonna test its method. So there's a huge problem with this. When we inherited from the parent class of user, we inherited all of those methods. So how this can complicate testing is if we don't test all of those parent methods in admin, somebody can go in and change our user and not know that we're dependent on those methods in admin, right? So someone can go in, they can look at user class and say, hey, this method's really dumb. I don't think we should use it anymore. I'm gonna delete it. They delete it, they run the test suite, their user test breaks. So they go in, they say, of course it broke, I just deleted it, they fixed the test, deploy the code, everything's good. Later on you figure out that that admin class is actually using that method. You don't have a test for it now because it was tied to your user.  If you were to do that, you'd have another failing test in admin where the original changer probably could have seen, oh, this is using a little more places, I need to actually go do some investigation. So it's easy to overlook those little details like that. We've got another one. So flexibility, so we're gonna check out another example. Oh, okay. So we're gonna talk about how composition can help you when you're trying to actually isolate and test. So this is kind of the contrast to that problem. So we have a pretty simple sign up class here. It's got a couple attributes. The ones that are interesting are that persisted and invoice user payment processor and user repo or just for our initializer so that we can pass things into it. And that's the boilerplate that I was talking about. So you're gonna have to set these classes up if you're gonna use composition, but it's really not that much more work. We have a branch in here, so if we can create a user, we're gonna set persisted to true and then we're gonna set invoice to true if that payment processor can send an invoice. And if it can't, we're gonna set both of those to false. So it's a pretty contrived example, but what we can do when we're testing this is we can test each one of our logic branches however we want, right? So we know that as long as we pass in a, when we're testing this, as long as we pass in a user repo that responds true when you try to call the create method, you can get to this true logic, right? So you can stub out that actual saving and persisting because it's not really what you're trying to test here, right? You should have separate tests for your database actually making sure that you can save things and then same thing with the payment processor. So in this test, we shouldn't really be testing if the payment processor can send an invoice. We just wanna test that when they can, we actually mark it as invoiced. So you're able to isolate the bits of logic that you actually care about in this class and allow your other classes to test the logic that they should be concerned with. So you can pass in, you could create a new mock class actually think, yeah. So this is a simple example where instead of passing in the real payment processor or the real repo, you could create new classes that hold that and that mock processor could have a create method that just returns true. You could also create an open struct. So as long as you create something and pass it in that can respond to that message and you can change that, you can isolate your tests a little bit better. All right, so the funny thing is when I wrote this talk, I was really trying to defend inheritance. That was kind of my main goal. I know it's in the Ruby language for a reason. I know that there's some good in inheritance and I really wanted to find it. It was pretty difficult. There's a lot of times where it just, it doesn't solve the problem that you think you're trying to solve with it. But I did think of one that hopefully is a little bit helpful. So if you have an API where you have common things that you're always gonna share across all of your API calls, like an API token, a key, any type of kind of setup stuff that you have to do with your API provider, I think that inheritance is a great tool for that. What you're able to do is you're able to actually have these headers defined in one place. If you have very similar error handling for an entire API in different routes, you can put all of that error handling in one place. And then sometimes you get data back from APIs that isn't exactly what you want it to look like. And if it's consistent, you can also kind of clean that API response in one place. So what you're able to do is create more specialized versions of this class. So this one is a product class. It inherits from that base object so I can just call get with the route that it needs. And then I don't have to worry about any of my authorization or credentials or anything like that in this class. And then if I need to do something special to clean, like maybe the index on this one API returns in just a really weird way, I can specialize that call and clean it up the way that I need to, without all the implementation details.  I didn't write this talk for single table inheritance, but I'll just kind of give the same warning is it's basically inheritance taken to a database level, so you get all of the same issues that you can get with class inheritance. And I haven't had to do this personally, but I've heard that splitting them apart after the fact is a lot harder. So just make sure that you really have a good use case for it before you consider it for an option. That's all for my talk. This is my contact information. That's my dog, her name is actually Ruby. So I love Ruby so much. She's very dorky. But yeah, if you have any questions, that's my Twitter handle or send me an email or come up and talk after. I'd love to hear any questions you've got offline. I work for a company called Nav, we're in Salt Lake. Really cool company, we're growing a ton. So, and even considering remote work, so if you want to work remote or come check us out, if you have any questions come talk to me. Cool, thank you. Thank you.


Hey guys, what's up? It's Kinsey and welcome back to my channel in today's video I'm going to be doing a summer clothing haul, which I'm so excited for I guess it's like my designated Area for halls like a new tradition of you guys are new here. I would love for you guys to subscribe I am so hungry, and I'm about to go get Chick-fil-a, which I'm very excited about you guys are coming from this video Go comment on this Instagram Hey That's what you should comment. Anyways, I have done a little bit of online shopping recently I have some clothes from fashion Nova and some clothes from Princess Polly two of my favorite online Retailers I'll link the stores below and I believe I have discount codes for both of them So if you guys want to check them out feel free to so I'm gonna start off with fashion Nova Okay, these shoes these are the first thing I'm gonna start off with these shoes are Unbelievable I haven't worn them yet, and I need to like so desperately, but They're over-the-knee white boots guys heel to these are really just like a Kind of like an all-or-nothing outfit like you really got to just do it when you wear these, you know But I love them. Let me know how you guys would style them down below I would love to wear them with like a denim on denim outfit or like a big like the perfect like the right dress You know big fan. Okay. The next thing I have is this all-white dress, which is really really pretty Um, it's a little bit see-through, which worries me a little bit by a little bit I mean a lot, but it is really cute, and it's also very comfortable. It's a very nice dress It has a little knot in the middle of it and I just think it's super pretty especially for the summertime I have been getting as you guys will notice a lot of dresses lately. I want like 30 more dresses I literally want to do an entire princess holly princess holly princess poly haul of like 500 dresses and that's what I'm gonna work for the entire summer. That's my plan The next one I have is this dress also from fashion Nova It just kind of cuts off in the middle and then you tie it up a little bit. This is like a more casual dress Yeah, it's really comfortable and soft. I need to wear it I have another dress from this one is really cute. Um, I don't even know how to describe it It's kind of a color block dress. Um, the red registers a little bit different on camera here It's kind of like a brighter. I don't know. It's a cool color. It looks a little bit different on camera I noticed that but it's really cute. This will be nice for like a summer night out Okay, the last thing I have is this set because it would not be a fashion nova haul for me without a matching set I also would love to do an entire haul with fashion nova of like Matching sets basically like literally the entire thing be like 30 matching sets. I would so do that Um, so this is the first shirt Just super soft and really cute and the exact same material These pants which are flowy like guys this outfit. It's so cute. You may have already seen it on my instagram But it's so comfortable. Like I can't even express to you how comfortable it is. It is just wow Okay, moving on to princess poly. I love princess poly. It is an australian retailer Their shipping is unreal. I get my stuff in like two days I'm gonna start off with the accessories that I have from princess poly. So I have two pairs of hoops Um guys, I have literally had these ears pierced three times. This is my third time I'm at my eight week mark and they said to take them out between eight to 12 weeks But I am terrified. Also. My back is weird and it's like a screw I try to take them out last night Does anyone know what to do about this like, you know Like this outfit would be so much better with these hoops. Like when I will be wearing hoops every single day like So much better So I have these gold hoops, which are thick and so pretty. They're thick I hate myself and I have these mini silver hoops Which are also just nice. I picture myself wearing these with like slick back hair in a hoodie It's like definitely what I'll be doing.   I don't know. This actually is also from princess pauling now that I think about it from like a Year ago, but I love this together. It's like this really easy slouchy big purse I also just bought two mark jaco's bags. They get in tomorrow I'm obsessed with like their newest collections with the bags. I mean, they're not that new I saw them around christmas time But they are so cool Like if you guys want to see what's in my bag of both of them and I can compare them because I couldn't decide between the two So I ended up getting both Um, let me know and I will do that but follow my instagram because I'll definitely be showing them Probably very soon next thing I got from princess paulie is this top Uh guys, this is so soft like the quality just the material of this is unreal Like I cannot even express to you how just like amazing it is and it's such a cute top Big fan the next top I have I wore to a white socks game the other night when I was in chicago Um, great top. It's on it. It's inside that right now. I really like this. It's kind of like the baby doll vibe This is also already on my instagram, but super super pretty. It is a little bit itchy like But you know beauty is pain. So this is the top I just think it is really cute and really really perfect for summer I'm like obsessed with this right now. Um, you guys are noticing on a lot of dresses for princess paulie So this dress is a silk wrap dress. I am in love with this thing guys. It is just like so pretty I love silk wrap dresses. They're so pretty. They're so easy. They're just cute very feminine love love this I also wore that out in chicago and My boobs are really out of it, but I realized it's because I was wearing the wrong bra And I realized that days later when I felt very uncomfortable. So that's awesome. Go me I also got this dress, which is a denim dress. I love this. I kind of want to wear it with like denim on denim Um, it's really really cute and also it would look great with like cowboy boots or free people Love this thing. Okay. I have another wrap dress. This one is not silk But it is just this really pretty black and white kind of floral print dress It wraps also this one shows a lot more boob than I thought So I don't know I wish that like I could find dresses that like don't show all of my boobs, you know That would be nice sometimes But this one is like really cute still and it's really pretty super light too So it'll be perfect for like a really hot summer day the last dress I have this is something that's like very different for me Very proud of this one. Um, it is just this Nice little I don't even know how to describe this thing. What would you describe this dress as also? What's on it? Um, it's just this white dress. It zips up. I have no idea how to describe it It's a really cool dress though. So that is it for my summer haul. I hope you guys enjoyed I know it's not my longest haul ever But that's honestly probably good for me Um, I love you guys so much be sure to subscribe follow me and instagram if you guys want to see these outfits styled And I will see you soon. Bye


So, I'm happy to introduce Robin Buell. I know what everybody's thinking. Finally, a talk that's not about things with backbones. So I actually, I looked, so she's from Michigan State University. I took a look at her bio, and as far as I can tell, she did all of the plants. She's involved in every single plant genome project. Probably not, but that's what it looked like. But also runs a bunch of the plant genomic resources out there, including some additional database, and then the much more memorably named SpudDB, which I had no idea even existed. So, thank you. Okay. Yeah, so I think this might be the only plant talk, so I hope I can give the whole kingdom justice. And a lot of the things I'll talk about have already been spoken about by Eric and Harris, and I think you'll see them echoed in some challenges we have in plants. So a little bit about the first plant genome. This is Arabidopsis thaliana. It was the first plant genome done. This was done five years after the first microbial whole genome assembly. So to me, this is a big achievement. That's when I started in genomics, just down the street. It's really 157 megabases, but it's really only 119, and we only have the five centromere gaps plus a few other gaps. So I think we're almost perfect. Not quite. Okay. So it's a model species for plants. That's why there was so much effort in it. It's a homozygous diploid with very limited repetitive sequences, which is one reason it was chosen. It's excellent quality. I have to go to the definitions. I think it's just one tier below perfect, because this was old-fashioned back-by-back Sanger sequencing and essentially manually curated. A person actually looked at every sort of base that had a problem. And there was a dedicated annotation project, so every gene model was examined by a person. And then there was a whole host of these functional genomics support data resources developed. There's a whole set of TD&A insertion lines. These are tag lines. There was a dedicated full-length CD&A project, so people could then get open reading frames for functional genomics works, and then a stock center as well. And then there was also this species-specific databases, first tier and then airport. And so that really took off in terms of advancing plant biology. So now, 20 years later, after Arabidopsis, it was succeeded by RICE in 2002. And now we have hundreds of plant genomes, but most of these are draft quality. Some are sort of below draft quality. All the major crops have a genome assembly, as well as a limited number of ecological models and evolutionary taxa have at least one reference genome sequence. Some species have hundreds, if not thousands, of re-sequencing data to look at them. Everything such as like maize has lots of it, as well as something like tomato. But the problem is that there's a lot of complexity. So compared with animals, especially mammals, plants can be quite challenging to work with. The size is just all over the place. So 54 megabases for their carnivorous bladderwort to 149 gigabases in this flowering plant. There's a high degree of repetitive sequences. So there's transposable elements, and these are really rather recent in some species. So they're very difficult to get through, even with a long reed-based assembly. And then there's large centromeric satellite arrays. And so I highlighted here maize, which is the number one crop in the United States. And it's 2.5 gigabases greater than 85 percent transposable elements, with genes interspersed between these large transposable element blocks. And then breadweed is a hexapoid. It is in bread, so that makes it a little easier. So over 90 percent transposable elements, but it's 17 gigabases. So going to what Eric was talking about, there's also a high degree of heterozygosity. So in potato, I work on that. It's great. There's one snip per every 37 nucleotides. So you would actually think you could assemble the two haplotypes if you were working with a diploid, essentially as if it's an allopolyploid. But the problem is there'll be large, highly heterozygous regions, and then regions where they're almost nearly identical to each other. And the assembler just can't get through that. And so this leads us to the underlying problem here in plant genomes, is that there's a large amount of genome duplication, either allopolyploid, autopolyploid, and paleopolyploid. And so this figure here is actually taken from the Amberella genome project that Pam Solstice was involved in. And essentially throughout the evolution, there's been at least one whole genome duplication, if not multiple whole genome duplications. And that really complicates the genome assembly process. And so this just highlights here, I think this is the pointer here, there, okay. And that if you look at some of these species, there's been multiple duplications when you trace it all the way back through to the ancestral angiosperm. But we also have high rates of gene duplication, and I like to use this example. So this is eucalyptol. It comes from eucalyptus species, and this is used in mouth washes and cough suppressants and cosmetics. And what's shown here is actually just a phylogenetic tree of terpenes and faces. That's what's responsible for the proper, for eucalyptol. It also produces a lot of violatiles that are used as perfumes and fragrances. And what's shown here are different species, including chlamydomotus with enalgae, moss, which is fisco metrilla, and all the way up here to eucalyptus. And so, chlamydomotus and algae doesn't have a terpenes synthase. Moss only has two, but eucalyptus has 113. And that's in this sort of like lime-green color right here. And when you look at this phylogenetic tree, you can see that there's this entire branch over here of terpenes synthase family, subfamily A1. And you can see that there's just major duplications, and these are nearly identical, and then they're also found in tandem. And this is just one example where you can have high rates of gene duplication within a species, and these are actually very hard to resolve. Okay, so some other issues is that a lot of times we couldn't actually even sequence, say, the representative organism. So in the early days of genomics, what happened is that people were really clever and they knew something about biology, and they could manipulate them. So in plants, in some species, you can inbreed it. You can also make what's called a doubled haploid, and you can reduce the heterozygosity. You can also sequence the progenitor species to bypass some issues with polyploidy, and you can also sequence haploid tissue. And that's what's shown right here, and that when grape was first sequenced, they actually had an inbreed grape line that was sequenced. Banana is a triploid. That's the commercial banana, but they sequenced the doubled monoploid. And lab-lolly pine, which I still believe today is the largest plant genome that's been sequenced. It's very heterozygous, and they actually sequenced a haploid tissue from the seed. And then for potato, it's a tetraploid, and what was actually sequenced was a doubled monoploid to get past these barriers. So the value of one, so the question would be, and Eric raised this, is there a representative organism that you could do? And mostly because of funding and effort, typically a single reference genome is done, and that's followed by alumina re-sequencing that will reveal the variants. And so a few communities, not many, and you notice all of these are crops here, except for Arabidopsis. They have multiple de novo assemblies of multiple genotypes, and this is typically done when there's large communities, like for maize, soybean, Arabidopsis, and tomato. They're able to generate multiple de novo assemblies. These are also, I'll tell you right now, they're all homozygous inbred diploids, so they're much easier to do. And so the question to ask is, is there a value in getting multiple ones, other than just to do it and see what kind of variation there is? And my answer would be most likely, there is value. And the point is, is that we have structural variation in plants, just like in other organisms, and this has been studied in several different plant species. The take home point is that most of these structural variants tend to be genes that are lowly expressed. They tend to be shorter than other genes. A large number of these are actually on the way to being a pseudogene, but others have actually been associated with adaptive responses, such as biotic or abiotic stress, or responses to the environment. And I always like to show these examples, so when people have actually done functional genomics with some of these structural variants, they find that these genes are really actually pretty important to biology. So in we, one of the structural variants controls flowering time. A really, really critical example is in soybean. There's been copy number variation of three genes. And when you get up to, like, three sets of those copies, you can actually be resistant to the soybean cyst nematode. Submergence tolerance and rice is controlled by a copy number variant. Herbicide resistance, polymer amaranthus, because you've had large gene duplication of the EPSP synthase. And that's, of course, a major agricultural problem that we have roundup ready weeds across the Midwest. But I like to use this example especially, because this is an IH conference, that poppy actually is sort of, I think, a really interesting example of how structural variants can be very important. And in this case, it's secondary metabolism. So in poppy, there's one cultivar of poppy that produces nascopamine, and that's an anti-tuber alkaloid produced by this one cultivar called HN for high nascopamine variety. And it's not produced in two other poppy varieties. And some work done by Ian Graham's lab showed that they did differential transcript analysis. They found that there was actually a cluster. It turns out it's a 440 kilobase cluster right here, where there's 10 genes, and they're unique to the HN poppy cultivar. And they're arranged in this cluster, and this is what's responsible for nascopamine biosynthesis. So if you hadn't sequenced this specific cultivar, you would have never have found the genes responsible for production of this alkaloid. And when they looked at and they hypothesized how this actually came to a rise, that there was gene duplication, neo-functionalization. They occurred at this cluster locus. But in other cases, there was a gene duplication that seemed to then be relocated to this region. So in this case, you have secondary metabolism. You're getting new de novo cluster formation. And you're producing here a compound that, of course, is important for human health. So also about these structural variations is that they can be very dynamic in how many you can find. So the question is, does tomato have a lot? Does maize have a lot? And these numbers are actually quite dynamic. And this is because there's different amount of genotypes that are actually studied when people do these kinds of structural variation experiments. And also different types of germ plasm that's actually used. So you can look at different cultivars. For example, in the poppy, you can look at land races. And you can also look at wild species and make these comparisons. And then, of course, we know the methods employed will give you different numbers. Some of these are actually artifacts of the computational methods, how genomics and bioinformatics was done at the time. So there's missing sequences and some of our reference genomes. There's annotation errors. I mean, we could talk all day about annotation errors. I thought it was only plant people that had to amplify the gene and sequence it before you to the experiment. And then the question is, what's an allele, right? So how do we call something the same and something that's actually different? So all of those things can determine how many structural variants you find. But others are because of biology, and I like to sort of emphasize this, and this is a figure my graduate student came up with. And what I'm showing here are five different plant species here. Arabidopsis, small size genome, inbred diploid. Rice, it's a little bit bigger. It's about 400 megabases. Again, it's an inbred diploid. Cucumber, I think it's about 300 megabases. It's also inbred. Maze, which we know is 2.5 gigabases. It's an outcrosser, natural outcrosser. And then potato, which is a polyploid and clonally propagated here. And what's shown in the two different shades of green is what percentage of the genome was found to be variable in terms of structural variation and what percentage of genes. And what you can see is for Arabidopsis, rice, and cucumber, even though they looked at 80, 50, and 115 different accessions from some different genetic groups, either subpopulations or wild species, they really didn't find very many. But as soon as somebody looked at maize, they looked at 103 different accessions that included elite cultivars, land races, and wild, there's actually an awful lot of structural variation. And in potato, this is work that we did. We only looked at 12 samples. These were land races. And you can see we have an awful lot of variation here in terms of structural variation. And the point is, is that based on the reproductive mode, whether it's selfing or out-crossing or vegetatively propagated, or if it's a polyploid, it can actually tolerate more structural variation. The transposable element composition is having a big role. And all of these are impacting not just structural variation, but also genetic load. And so I think you could hypothesize that if you looked at an out-crossing polyploid, you're going to even find even more. So the other thing we want to ask ourselves is, are we sampling? And I think Harris brought that up. We're not quite sampling everything we could. So there's some major questions in plant biology. And I pulled this one out just as an example of how comparative genomics could actually answer this. And so in plants, we have different kinds of photosynthesis. We have what's called C3 and C4. It involves changes in the anatomy of the leaf. And it turns out that this has evolved many times across the history of angiosperms. This is in monocots right here, where you have examples of C3, C4. And then over here in the dicots, you see that it's evolved many times, where you have C3, C4. And you also have these intermediate species right here. So being able to do a large-scale comparative analyses with sister species across the entire phylogeny would really help to understand how this evolved. What are the key mechanisms that are involved in this major change in photosynthesis, where you're concentrating CO2 very efficiently in the bundle she sells, and also changing the leaf anatomy as well? So in terms of what we've actually sampled, I'm really pleased I came up with the same number. Because I went to NCBI, and I didn't believe any of the numbers when it said genome projects. Because I looked at some of those, and I was like, I think this is just like re-sequencing data. So this is just an example of the phylogeny. And angiosperms, the flowering plants is what we emphasize a lot. But there's definitely lower land plants right here that are important. And there's 350,000 species of angiosperms, about 400,000 species total in the plant kingdom if we're counting algae. I suspect we have only about 400 genomes, maybe 12 or of not perfect, the next level below perfect. A lot of them are draft, or even, I don't know what the standard is below draft. A lot of them are really not very good. So I think that would be very helpful to get those definitions unified. So there's clearly a lot there, and there's certainly been a lot of focus on certain taxa over others. So it's definitely getting easier. I don't want to make it sound like it's terrible. So definitely it's a lot easier to do this, compared to what was done with the rabbitopsis, or even the rice genome. The logistics are easier. There's lots more trained people doing this now.  It's just fabulous. Also, this came out a long time ago. But sequencing technology is democratized. You can do it on your lab bench with your laptop. And it's really, really changed how things have been done, and they will. And it's definitely a lot cheaper now. So here, I'd like to use this example. So this was on a cover of Nature Genetics in 2001. It was strawberry, and they actually had dipped it in chocolate, because the chocolate genome came out too. They did a diploid. This is a Woodland strawberry. They did a diploid, because at the time, you couldn't do an octoploid. And it was really a great quality at that time. The N50 scaffold was 1.3 megabases. It was absolutely fabulous. And now this just got published this year. This is octoploid strawberry. It is bigger, not just that it's bigger. It's an octoploid, and it's bigger, because this is cultivated strawberry right here. This is 805 megabases, and it's chromosome scale. And so clearly, this is going to really facilitate work on strawberry. There's four species that went into making the octoploid strawberry. So but what are some challenges? So first of all, it's the size. Imagine the cost. If you're trying to do something like the bread wheat, that's just ridiculous. The repetitive sequences is a huge problem. The polyploid, both current polyploids and also paleo polyploids, and the heterozygosity. And also, I haven't talked about it very much, but there's a lot of genome, what I call heterogeneity, where you can have like 400 kb that are just missing in one of your haplotypes. And I think that's a big problem for the genome assemblers. And I think they're mostly all designed to either human or mammalian or bacterial genomes. And so when we get to use them on a plant genome, we can find that they sort of choke or they have problems. And I think this really is a big challenge for people to take on so that we can do this. Single cell omics methods, they're very challenging because we have things called the plant cell wall. And we have to make protoplasts first. So that's, of course, problematic. And then also, the cell size is variable, and so that's a problem as well. So the funding sources clearly emphasize crop species. I mean, that's just the way it is. And their relatives, and that leaves most of the phylogeny unsampled. And then I think, and I really liked Eric's presentation, because there's really a lack of community standards for the assembly, the annotation, and the germplasm. And so what we have is poor quality genomes, a lack of documentation and provenance. And these really limit how we can advance the research community, because once the genome's done, you're not going to ever get any money to clean it up. And I think, and I started in Arabidopsis where every night something got sent to NCBI. That was just automatic. And really, there's been a big lack of enforcement for data sharing. And so we were asked to provide one thing about our vision. So my vision, and I'm only going to go until 2025, is that we want to have accurate, inexpensive sequencing platforms, and that's going to allow us to get near-identical repetitive sequences resolved will be able to identify similar alleles, homologs, and homilogs, and complete centromeres. And that will have a genome assembly algorithm can accurately assemble a plant genome in just a few days on even a large compute cluster. And it's haplotype resolved in spite of this homologous or homeologous chromosomes and these repetitive sequences. And that there's a set of community standards that are actually enforced for the metrics, for the annotation. And then here, that there's actually a voucher specimen, a seed, or a clone, so that I could go and get that same genotype and do work. And that was all I had. Thank you. Well, thank you, Robin. You very well represented the plant community, I think. So we are going to take a 15-minute break. So please come back to the room at 11.10. And I have one thing to say. So for those of you in the back, we are aware that you cannot see it. And we are going to rearrange seeds during the break to try and give some more space where people can see it. And we do apologize. We had everybody wanted to come. So it's wonderful to have you all here. But we also want you to be able to get something out of the meeting. So we are going to be working on that. All right. And the other thing I was supposed to say is coffee is here and bathrooms are this way. Yeah.


In Kaduna states, the governor-elect Uba Sani says democracy will cease to make meaning to Nigerians if political office holders fail to rise up to their responsibilities. In a message marking the Edofitri celebration on Friday, Sani said democracy can only be sustained and deepened when the masses are happy. The governor-elect added that political leaders must prioritize the welfare and security of the citizens and implement policies and programs that will raise the quality of livelihood. On his part, former emir of Kano, Sanusi Lamedo thanked Allah for the successful completion of the Ramadan fast and the Edofitri celebration. For those that have prayed and fasted for 29 days, we all know the essence of the fasting and the prayers we all had is to pray for the unity. We thank Allah SWT for enabling us to witness another Eid and we pray to Allah that he give our country peace and prosperity. We call on Nigerians to maintain the peace. We are seeing what is happening in countries like Sudan, in other parts of the world. Whatever our issues, we are better off resolving them peacefully. We pray to God to return prosperity and peace and unity to this country and pro. Thank you.


The Rural Health Program RHP, that a project aimed to improve access to quality health care services for women and children in rural areas of Pakistan. The project involved collaboration between government health system stakeholders, community members, and an academic institution. A referral system was established to ensure timely and appropriate care for maternal and child health emergencies. Community volunteers were trained to provide transportation and refer patients to health facilities. Additionally, an ambulance service was contracted with the local health department and private transporters to facilitate patient transportation. Qualitative interviews with community members revealed positive feedback about the referral system, although some structural challenges such as out-of-pocket costs and direct self-referrals remained. This article was authored by Imran Nehima Basi and Samin Siddiqui. We are article.tv, links in the description below.