Some people are still coming in. I want to make sure I give you guys enough time to ask questions and kind of get through all this. So welcome. Thank you again for coming to my session. 30 awesome Drupal 8 API functions you should already know, this giant sentence of a session. That seems to be like the new hotness when doing sessions at conferences. It has to be like this very snarky, memorable sentence or it won't get actually accepted. So hope you guys like it. If you want to grab the slides, that's the bit.ly URL up there. I'll show it again at the end. There's a GitHub repository. I'm actually using Reveal.js for the slides. You can grab them because I'll be showing some code. So don't worry about taking pictures of slides and stuff if you want to go and look at them. Then of course, if you want to follow me on Twitter, you can do so. The only caveat is my first name has one e and no k. If you add a second e or a k to it, then you won't be following me. You'll be following some other random person. All right, assumptions. So in this session, the first big assumption is that I assume you want to see some code. I labeled this talk as an advanced session, so it'll be kind of deep diving into the code. I'm going to do my best to kind of interpret it as best as I've looked at it. We do have some distinguished VIP core contributors in the room. So if I say something wrong, I'm sure I'll be corrected. And again, that's part of open source, right? Fork modify and do what you got to do. I'm also assuming you've written something custom, preferably in PHP, if you're coming from a different language. Hopefully a lot of these concepts are pretty similar. I also assume you like using APIs, and APIs in the general of, I want to connect things. I want to be able to change assumptions. I want to see the assumptions that are made behind the scenes in Drupal 8 that are going to empower me to do these really, really cool and awesome things. The fourth assumption I'm making is that you understand the concept that Drupal is a framework. It's not just a CMS, right? It has this very robust, documented set of API functions and just like Laravel or just like Xen framework, right? It has this kind of architecture, and you understand that that's part of the package you get with Drupal as well. I'm not going to argue the merits of those other ones. I'm just saying that the concept is there. Then the fifth one, and this is probably a stretch assumption, is that you've read a blog post that I made basically talking about KDS. And KDS is this really simple philosophy of keeping Drupal simple. And basically only build what you need, right? And if you want to kind of find more about that, there's a link about it. But it's a little bit of a pitch to really kind of think about what architectural decisions you're doing when you're embarking on a project, right? Build versus buy, i.e. should I create something custom versus going off a third-party module? What type of API function should I constantly and consistently be using that kind of thing? So if you take that, and if you're curious about that, please go ahead and take a look at that blog post. It's pretty cool. All right. So you can probably notice I skipped over who I am, but my name is Frederick Mitchell. I'm a senior developer at phase two. And my passions are Drupal. I've been doing Drupal for, I don't know, X years, five, six, seven years. I have to look at my Drupal.org page I haven't looked at in a while. I'm a big proponent of the dry principle, right? Don't repeat yourself.  Basically, trying to come up with solutions that you build once and then you use over and over again. And I'm proud to say, right, D8 has a lot of that philosophy kind of built in. I'm also a big fan of strategic communication, right? So if you're a developer or you write a lot of backend code, sometimes it's frustrating to build this really cool, awesome thing and then no one uses it. Or no one uses it correctly, or no one uses it the way you intended. So getting into the idea of how to use strategically communicate principles to clients in terms of what they want versus what they need versus what we've built. Save them money, et cetera, real big into that. And of course, I'm also big into graphic novels. Watchmen, that kind of stuff. So if you wanna get in that conversation, please, you know, ask that question till we can talk about that all day. All right, cool. So before we jump right into these functions, right? Quick disclaimer, in Drupal 7 API functions, right, was the same thing as saying the common procedural functions, right? The word function was the common procedural functions we use in D7. In D8, I'm pretty much using the same thing while acknowledging, right, that when I say API functions in my talk, right, we'll probably be talking about a lot of common class methods, right? Or common classes that you're gonna be using with your D8 stuff. In some cases, I'll actually highlight some procedural functions that actually act as wrappers around certain classes and methods. So we'll kind of talk about that a little bit too. So the functions piece still kind of fits the narrative. And again, the whole point of this conversation is to kind of talk about what we're doing now or what's happening then in terms of Drupal 7, what we're gonna be doing now in the future with Drupal 8. Additional disclaimer, disclaimer. All these recommendations are based off of my introspection of Drupal 8 as of today, right? I've changed this presentation seven times. As many times I've given it, why, because as we all know, Drupal 8 is an alpha and things change. So if I have some names that have changed or pulled out, please let me know. I did my best to kind of go through them and update it for you guys today. So things will change. They will change, not may, they will change. I probably should change that too. It will change moving forward. All right, so let's get into the meat of why you guys are here. So let's start simple. Strings, right? Strings are how we print things, or echo things, or get things out into whatever type of context we plan to consume that content. String, static method, check plane, right? So in Drupal 7, we actually just had a procedural function called check underscore plane. It was a wrapper for HTML special characters, right? That procedural function is still there in Bootstrap, but it ultimately just calls the static method and the string utility class checkpoint, right? So instead of calling HTML special characters, it actually refers to this method. So as I said, you can still use check underscore plane, but again, the idea is to kind of show you that as Drupal is progressing, they're doing that, we're doing a counterbalance between legacy procedural functions and then jumping directly into the appropriate utility classes as you need them. Another one, Drupal underscore placeholder, right? Anyone use this? D7, if you were like, what are you talking about? I've never seen this function at all. So Drupal underscore placeholder is another string function allows you to wrap m tags around a particular string. And again, I'm just kind of highlighting, this is another one of those static methods that's inside the string utility class, right? And that still is in Drupal 8. I'm assuming everyone's heard of t function, right? T function, okay, cool. Yes, I have no idea. Drupal 9 question, that's an interesting question I honestly could not tell you. What's gonna be eventually deprecated or not? But to answer the question, no, I don't have any indication of that. The question was, is there any indication that these will be deprecated in Drupal 9? And the answer is I'm not, I don't think so. That indication hasn't been made, doesn't mean they're not gonna be deprecated. So yeah, getting into the t function, right? We know what t is, it allows you to translate, right? And it sanitizes input if you pass in placeholders. That still exists in D8, which is awesome. So there's a quick little example there, right? And depending upon the keys of how you pass in your placeholder values, it'll either wrap your text around, right? The check plane method we just talked about, placeholder, or actually print it without any type of sanitization at all if you use the exclamation character. So simple enough so far, strings, t, got that. Okay, let's go into the L function. L function's still there. That's good, right? Able to create links pretty easily, programmatically, using a conjunction with the t function, no changes there.  You may, by the end of this presentation, there's some function here that I'm gonna say I've been removed, but so far it's going okay. All right, so we got the string stuff, pretty straightforward, not too much, DX changes there. Let's get into rendering, right? Making stuff pretty. Actually taking the content that we have, maybe putting it inside of an array or theme functions or what have you to, again, kind of add that additional layer of user experience context to the content we're presenting. So in Drupal 8, just as in Drupal 7, just as in Drupal 6, Drupal render, right, is still there. And basically as you guys probably already know, Drupal render allows you to kind of give it an array with various keys and then it will do some sort of magic around the various pieces, right, of data that you add to that array, depending upon the keys that you've signified and then give you some nice markup. So the big thing in Drupal 8 is, Drupal render is everything, right? There is no more theme function. Don't use theme function anymore, right? No more theme function. There is kind of buried inside of Drupal 8 inside some of the kind of dark halls of Coreland. There is an underscore theme function that will be deprecated and that will probably be removed. But when you actually want to theme something, you wanna basically build a render array, right? And as you saw from my example, you use the keys accordingly to define how your content should be themed and you use the pound theme key in your render array to determine what theme function should be used with this array of content, right? You can also use pound type, which refers to whatever elements have been defined and hook element info like table, link, et cetera and any other custom ones that you have. So a quick kind of code example, right? In D7, if we wanted to print out a table programmatically, we would call the theme function, we'd pass in our special name for table as the first parameter, then we'd pass in an array of values that the theme underscore table, right? Because it would eventually get passed at the M underscore table, eventually take that information and build you an HTML table. In D8, we actually just start with the array, right? In this case, because table is an element defined as hook underscore element info inside of Core, you can just do pound type table and then pass in the values as key specific to that element type. So header, rows, et cetera.  You see a little bit different there with the pager. Pager, that's technically not an element. So in this case, you would actually just call directly from Core the pager theme function by passing in an array with a key of pound theme, okay? Cool. So we did strings, we did rendering, right? Let's get into some meat of stuff. Nodes, storing content and data, right? Wait a minute a second, okay. So I was around in a Drupal 5, Drupal 6, and then when Drupal 7 came around, we had this big ho-up about entities and everything's an entity and forget what a node is. A node is nothing anymore and node is just this thing that's essentially an entity or what have you. Aren't we still gonna be talking about entities with Drupal 8? Why are we talking about nodes? And the answer is yes. We are gonna be talking about entities and I'll get there in a second. All right, so in Drupal 7, the really cool function that I'm sure you guys are all using, right? I'm hoping you're all using, no load multiple, right? When you want to programmatically load an array of nodes, you would use no load multiple. In Drupal 8, right, you're gonna use entity load multiple, okay? So no load multiple is technically still there in Drupal 8, but if you were to actually inspect it, all it's doing is calling entity load multiple, okay? So kind of knowing that any load multiple is that procedural wrapper, so there's almost like two wrappers, right? You got no load multiple calling any load multiple, which ultimately calls, right, the load multiple method for the controller of the entity that happens to be loaded. So nodes, as you know, excuse me, are default entities, right? They're defaulting is to come with core, so the controller that's defining, the controller class that's defining the entity type of node is already there, and so it automatically knows to call the load multiple method for that specific entity type and that specific controller controlling that entity type. Users have a different one, right? And a lot of things are entities, and we'll get into that in a second. Field configurations have their own, field config instances have their own, et cetera, et cetera. And again, that controller is more than likely, again, that storage controller for that entity, and then that storage controller likely ends up ultimately implementing the entity database storage class, okay? And so I wanna stop here just real quickly just to kind of think about that for a second. In Drupal 8, right, we're finding this balance between the functions you know and love, right? But you're at this presentation and kind of trying to figure out, okay, what do they do behind the scenes? And does it behoove me to basically understand what's behind the scene, so that way if I need to change those assumptions, I don't wanna change the storage controller for my custom entity or nodes in general, right? Maybe you have some custom storage controller where you want the node system to look at something completely different, right? Or a new type of database storage. Knowing the behind the scenes, right, allows you to change those assumptions because of the object-oriented architecture that these procedural functions are wrapping around, right? The nature of object-oriented architecture is you can create your own child classes and inherit or implement the various interfaces that are assumed as you need it, okay? So quick kind of code example, right? You have entity load multiple, you pass in your entity type as your first, right? Parameter and then you pass in your NIDs. Just recently, and recently I mean as in last week, there was a new helper static method that I was throwing in there that you see there and you can use that instead of having to call any load multiple and pass it in, they actually have some helper static methods for the first class entity types that come out of core. So for nodes, users, I think another one's like filter formats, all the different entity types that are in there, right? We have the static method that instead of doing any load multiple, et cetera, you can actually just do, right? You'd use the node namespace and then call the load multiple static method and it'll automatically know that it's tied to the node entity type and then you pass in your NIDs accordingly. So there's a lot of these helper static methods that kind of shortcut a lot of stuff. But I think it's really cool because then it'll make it easier to kind of eyeball and skim and read when it comes to, you know, when you're on multiple, when you're in those projects that have been around for a little while and you've got multiple people doing multiple things and changing different stuff, et cetera. Entity view multiple, right? Kind of the same thing. In Drupal 7, you had node view multiple. In Drupal 8, it's entity view multiple. And as we know, this is just how we create a render array of many node entities, right? So as I said before, node view multiple wraps around entity view multiple. The entity view multiple, again, depending upon the entity that you're actually trying to view, in this case, we're talking about nodes. It's gonna load or call the view multiple method, right? That's a tie to that render controller class. That render controller class, more than likely, is the get view builder portion of that entity. And that builder controller is likely gonna be implementing the entity view builder class, okay? So again, just kind of give me a little bit of backstory of how these wrappers, some are there, some are not. So we gotta kind of follow the train of thinking of, okay, why do these still exist? Okay, they're more of a DX, right? Decision to kind of keep it there. But as you get more into DA, when it finally becomes available, it's good to, again, know how the sausage is made. So if you wanna add some cool little spices in there, you can make some spices. Like the metaphor? Cool, so again, quick code example. Any view multiple you pass in, a whole bunch of node objects. Do what you gotta do. All right, Drupal 7, node save, right? That's how we did in Drupal 7, Drupal 8. We're gonna use entity create, right? And this is actually pretty cool because now with this, right? We actually don't need the special procedural function for just nodes. All our different entity types can use the same, right? This same procedural function, entity create. So node save is gone. So in the other cases where it was just a wrapper, this one is actually completely gone. So entity create actually wraps around, again, the controller for that entity and just calls the create method, right? Same kind of, again, deal with the storage controller for that particular entity. And then it's gonna use the entity database storage class. I know that storage controller is probably not the class name anymore. I believe that changed recently, so I need to update it. But the concept is still there. Each entity has its own storage controller and then that controller will implement or implements the entity database storage class for that one. So again, from quick code example, right? You could do entity underscore create, pass in your node type and then pass in any other properties you wanna set for the entity. Similar to what I was talking about with the load multiple, right? Helper function just recently, as of last week, I think it was May 28th. There's some helper methods for the first class entities there too. So if you wanna create a node kind of programmatically, again, you would use the node namespace and then just use the create static method. Does the same thing, okay? So you can set your various properties on that node object, then call the save method and you got your node saved programmatically or any entity in this case, right? Cause it's using the entity create portion. It just happens to be a type node. All right, everyone with me so far? Did I bore anyone, people? Anyone wanna sleep out there? No, okay, cool. So everyone's still with me. So we talked about, again, strings, rendering, talked about storing data with nodes. Let's get into menus, right? You guys love building menus programmatically, right? Everyone loves doing that. So in D7, you had hook menu. Hook menu is gone. Any chairs, any chairs from? Hook menu is gone. I know one change long, a long time ago said hook menu is still there. The last change like I looked at said hook menu is gone. I believe it's gone. So if you've heard otherwise, we can fight about it in the hallway. From what I understand, hook menu is gone. The way that we now define our menu items or in this case, paths, right? We use a routing.yaml file. I won't get into yaml files too much. I'm assuming again from the advanced session, you guys kinda know what yaml files are, right? Their static files allow you to kind of set configuration. In this case, what we're saying is, is that routes are configurations of pretty basic symphony concept. So again, a quick D7 example, right? You got hook menu, you have your callbacks, et cetera. In D8, you basically define a routing file. A yaml, a routing.yaml file, excuse me. And then you point it accordingly to the method that's gonna be used on that route. This particular code example may technically be wrong because I know that in the course of me building the slides, Drupal 8 went from PSR-0 to PSR-4.  So I apologize for the PSR Nazis out there. Oops, down arrow. Okay, here we start, and this is where the chair is really starting for me. All right, so in D7, we have this function called menu get item and it allows you to kinda get a router item, right? In D8, we're using the new symphony router system. Clap, all right, no clap for router system. Okay. I think this is awesome to be quite honest, like the new router system is symphony is ends above. Yeah, that's right.  But anyway, using the router system, and so now instead of calling something like menu get item, which is gone, right? To get a router item, you're actually going to inspect the request object and then the attributes property of the request object. You can actually get a particular request object from there. So a lot of the code that exists in D8 right now, as of right now, that hasn't been committed yet, as of right now, disclaimer, disclaimer, right? This is how they're getting the various route objects and the same is true for our favorite function, menu get object, right? How do we know what node we're on? How do we load exactly what I'm looking at? Menu get object is gone, right? You have to inspect the request object. So in this code example, again, as of right now, disclaimer, disclaimer, this is how you would do it, but it'll probably change, right? You could use the global Drupal namespace and I'll talk about that a little bit. Inspect the attributes and in there you can grab the node itself. Now, as of six hours ago, see what I do for you guys? As of six hours ago, there was a patch that passed, all right, hasn't been committed yet, but there was a patch that passed that talks about a route match object, right? So now instead of having to go into the request object and find all the different things that you need, because there's a lot of stuff in that request object, there's now a helper function or at least a helper object to get the appropriate route. So instead of doing what I'm showing you here, there is a patch that passed as of six hours ago that should kind of help the DX portion of how do I get the object or entity that I'm currently on, et cetera, specifically with the node. So if you want to follow up on that, that link is there. And this is what it kind of looks like, right? Lot simpler than jumping into all the properties inside of the request attributes. You can just use the global Drupal namespace and we'll talk about that again in a second. I know I keep prefacing that part, but with a route match object, according to that patch. And this was a big conversation. I used to have a link in here what showed the Drupal.org issue with the 200 comment responses and I don't understand and I think we should do this in option 17, et cetera. At least this one has, this is what we're gonna do. Let's get the patch in there. Let's get it passing, et cetera. So this is, I believe, I hope, is the direction. That's gonna be taken and eventually get committed to core. Okay, so we talked about meaning to get object, meaning to get item, et cetera. We're hopeful this new route match object is gonna be completely awesome. And that quick little helper in the Drupal namespace, global Drupal namespace is gonna help us kind of get what we need. Going back again to that favorite topic of building menus programmatically, menu tree page data, still there. All right, you can create the page data for a menu using write a machine name or a nice clean name. You can still get that. Menu tree output, still there. All right, so if you wanna build again menu programmatically, what you're gonna use is, right, as we all know, menu tree page data, menu tree output is gonna give us what? Render array, right? Drupal renders everything. So now we have our render array. And if we now want to do something with that menu, pass to a new theme function maybe, what have you, just all you have to do is change, right? The pound theme key in that render array. Then print it out, Drupal render, yay. No more stuff in TPLs and pre-process and template of PHP, et cetera. That's all move away from that. So yes, render arrays, menu tree output, menu tree page data, still there. Two of my favorite functions, unsung heroes. Cool, menus, menus are there. Again, we're just gonna do 30. We're not gonna go through the whole change log and Drupal 8 library, just, you know. But menus are cool. Let's talk about taxonomy, right? We all know these are entities as well. Entities that allow you to categorize content, categorize your data, get some sort of organization. In that wild west of a content system you have. You can see that some of these names are kind of deep, but anyway, in Drupal 7, right? We had taxonomy, vocabulary, machine name, load. Wonderful procedural function that allowed you to load a vocabulary object using the machine name of vocabulary. That's gone, right? Because again, we wanna use the entity API and use all of the entity features and functions that have been built and all the classes that have been built inside of Drupal 8. We wanna use entity load, and as you probably can guess, entity load is a wrapper for a load method. So in this case, in this example, in Drupal 7, you would use taxonomy vocabulary, machine name, load, load the vocabulary, machine name, et cetera, and you'd get your nice, robust vocabulary object. In Drupal 8, we just call entity load and then pass in the entity type instead of node, we pass in taxonomy on a square vocabulary. Then of course, pass in that specific bundle that we're looking for, in this case, forms, and we get the same exact thing. Taxonomy get tree, programmatically building a tree of taxonomy terms, still there in D8, all right? That's pretty cool.  Hopefully, ultimately passing it to Drupal render, render array, yay, no more theme function. Cool. All right, let's start getting into some real meaty stuff. So we talked about all, we talked about menus, taxonomy, strings, content, let's start talking about fields. Fields got a nice overhaul, right? In Drupal 8, fields allow you to organize the content, create these pivot points of how our content is structured. Before I jump into the code, I just wanna say that I think it's imperative, extremely imperative, that when you're working with folks and you start talking about structured content, right? It's very important to understand the power of using discrete fields versus giant WYSIWYG blocks, okay? Okay, I'm sure hopefully you guys go to Eden Session and maybe you've been to a couple of the ones that talk about the content API philosophy. Do yourself a favor and try your best to convince your organization, your clients to be as discrete as needed. If you need to do some UX improvements to make sure your content creators understand what fields are doing what, do those UX improvements but don't, in my opinion, don't just say we're gonna have a giant blob of WYSIWYG text and kind of move forward, right? The more discrete you can make it, the more future-proofing you're doing to allow you to connect to those discrete elements in various ways, whether it's an API layer down the road, whether it's gonna be consumed in an app, right? Whatever the context is, the fact that you've already structured it and had your content discovery in a structured, componentized way will save yourself a whole bunch of headache in the future and I think one of the shining and kind of unsaid points that I've heard about D8 is because of all these changes, the relationships of how content can exist and coexist with each other, now there's a more significant architecture to make those relationships even more robust, right? So that's my sole box, discrete fields as much as you possibly can. All right, D7, we had field info field, right? To get our field data. In D8, right, we have just a get field method on a field info object that can be returned. So in this case, what you're seeing is again, back to that global Drupal namespace, you'll see that kind of running theme here a lot. There's this nice kind of helper, right? Static container that's there to allow you to essentially load a field and then get the field information as you need it. So in these cases, what we a lot of times use this for in phase two is if instead of, well, let me say instead of, in the cases where features isn't a good fit and we wanna make field changes to a particular platform because that platform may be touching various different contexts, it makes more sense to change field configuration via an update hook versus telling everyone, okay, get out of the system, we're gonna do a feature revert and hopefully we don't break anything that you've done. All right, right? So kind of knowing these kind of field creation, field inspection, API functions is useful in certain contexts. Cool thing about the get field method is that it actually wraps around entity load, right? And why that's awesome is because now the configuration of fields is an entity as well. It's not just a giant array of garbage. Garbage is the wrong word. It's not a giant array of fun things, right? So the cool thing about, again, this is that there's actually a shortcut inside of, again, that Drupal global namespace. So if you really wanna just kind of get the field info, you can just call the static service method and again, because the configuration is entity, every entity has its own service. You can call services via the dependency injection mechanisms and containers that we have. There is a static service method inside the global Drupal namespace where you can essentially pass in that service label and it'll get you the information on that entity. So this kind of goes for all entities, but in this case, trying to paint, connect the picture. So we went through the whole like, okay, storage controller classes, field database, storage controllers, et cetera. Now I'm showing you at the end of the day, right? You've got this global Drupal namespace with this service static method and you can just kind of quickly plop the service information that you need accordingly. Get instance, very similar, right? Instead of updating field configuration, maybe just wanna update the instance of a particular field, right? Again, this idea that if you start with discrete fields, the idea of an instance is that it can be reused in various contexts, right? Those relationships, again, how do you get the information of that particular instance? Well, as you see here, you can grab the instance and then pass in the values that you need, the entity type, right? The bundle, and then the field name itself. This particular one wraps around in the load multiple, which we just talked about, right? And just like the field configuration, the instance configuration is also an entity as well. All right, so you gotta start to see and hopefully you're starting to kind of get these wide eyes, it's like, oh, okay, if everything is an entity and we have this architecture of various controllers and view builders and storage mechanisms for entities, now lots of things become swappable, can be, right? Extended, implemented as I see fit if I need it in that context without having to touch core. I just created a new child class. It's all starting to come together and that efficiency in learning how things actually exist behind the scenes is extremely powerful. Very, very powerful. I'm hoping you guys are starting to think about that as we're going through these, right? So again, quick little examples. We had, in D7 we had field create field, in this case we're still using entity create, but in this instead of passing in an entity type of vocabulary underscore, or taxonomy underscore or vocabulary, or node we're passing in field underscore config, right? And as we talked about, field config is an entity type, right? It invokes the create method that's attached to its storage base, the entity storage base, which just happens to be an abstract class, right? And field config ultimately maps to the field config and field config storage classes that are inside of core. So if you really want to kind of inspect and see all the cool stuff that you can do with the field configuration, definitely check out that class. It's very simple to kind of rock and understand, right? So quick little example, in field create field as we talked about our magic array of awesomeness with fields, right? This is what it used to be in D7. We'd have our custom field and we'd have all this array stuff. DA, look at that. All those lines saved. So much easier to understand. Efficient learning. That should be Drupal 8 mantra, efficient learning. You'll have to learn, but it'll be efficient. All right. Quickly, as we talked about, field instance configuration, same kind of deal, right? In D7, you had field create instance. D8, you're still using entity create, right? And it's just using, it's basically creating a field instance config, right? Object, because it's its own entity. Same exact thing, right? You use had its own field instance config and field instance config storage classes. Definitely jump into that and kind of look at all the cool little goodies you can do programmatically with messing with the field instance configurations. So again, in D7 instances, we're a lot more magical in their arrays, right? You'd have these giant scrolling things and then you'd wanna change something. In D8, just a lot more saner, right? Awesome sauce. Here we go. All right. Look at this one. So I'm actually like trying to do a shortcut and pack in multiple D7 functions with one kind of replacement DA function. So in this case, we talked about updating fields. We talked about create, et cetera. So in D8, we just have save methods. No more field create, field update field, field update instance, et cetera. When you wanna update something, you instantiate the field, right? Using our config object or what have you, our instance object. Then we just call the save method once we're done with it. Pretty straightforward. And the same is true for delete, et cetera. Kind of keeps going on. All right. Alters. I love alters. Sort of. Right? Changing the assumptions, right? This kind of aspect-oriented kind of idea of things calling themselves in this horizontal fashion before the execution continues. So Drupal alter is gone, right? But the alter mechanism is still there. In this case, we're using a module handler, right? Kind of helper that comes back again. So you basically end up getting a service back from this module handler static method inside again that global Drupal namespace. And then you can alter your data accordingly. Right? So instead of using Drupal and score alter, you just use this cool little D8 helper function.  And then next thing you know, you're like altering render array stuff, like probably makes sense to just change the pound theme key in your render array versus doing that chain of events there. Cook form alter, still there, right? So that concept is still there, which is pretty cool. If you wanna change something, you can still do your hook form alters. Hook form form ID alter, still there, right? Now the cool thing about this is, in D7, how do you get the ID of a form? What do you guys do? Do you do that right click, inspect element and look for the, look for the ID in the tag and be like, okay, I think this is the ID. Hopefully this catches, okay.  Right? In Drupal 8, there's actually a get form ID method. Yay, which makes every form easier to find. What is the ID of this form that I want to alter? So here's a cool, quick example, right? I have my custom form. In this case, I define a get form ID method and that is, right, the string that I'm gonna use in my hook form form ID alter. Sweet. Good, efficient learning, right? All right, and we all know how a form form ID alter works. If you want more information on the form API for DA, definitely check that link out. Everyone loves forms, everything's a form, everything can be altered. We've all been down this road. Drupal 8 makes it even more awesomer. Yes, I made a word, you can tweet that. Make sure you CC me when you tweet it and make sure you like, you know, attribute me as saying awesomer in DA. All right, hooks, engage other processes, right? So in D7, you had a module invoke all, that's gone and said again, we have these helper methods, right? Static methods where we basically just call the module handler service from the global Drupal namespace and we just call invoke all as the method from that service. Get implementations, right? Anyone use this one a lot? See if a module uses a particular implementation of your hook that you've created. If you do a lot of platform building, you're kind of trying to build things that are gonna be reused in various contexts, right? So at phase two, we specialize in building platform, using Drupal as a platform, i.e. if you have these big organizations that have their own individual teams, but they want kind of a set way of doing certain implementations, right? Having a platform that they can essentially fork or start from, custom hooks, et cetera, using something like module implements, something they use all the time to kind of check, okay, what brand is using this, what site is using this, et cetera. Same kind of deal, you gotta get implementations, right? Static method there from that service container. URLs, grab the get, right? In this case, again, we talked about utility functions. I showed you for strings, there was a string utility function. Other utility function, there's the urithelper utility function, so Drupal get query parameters is gone, right? Anyone use that one a little bit? I like that one. Just grab the query parameters real quickly, do some stuff with it. In this case, we're gonna use the filter query parameter static method, right? From the urithelper class inside of our utility stuff. Quick little code example there. You'll notice that in order to get the URL, right, I had to instantiate the request object, but again, hopefully that won't be as, I don't wanna say ugly, but as not as nice looking as it will be once this patch kind of goes through in terms of getting the route. Paths, where am I? Where am I in my code, right? Drupal get path, people use this all the time, still there, right? Glad that's still there, that's the one that's used a lot when you wanna load specific assets or what have you. The user, global user is gone. No more global user, yay. So instead in D8, right, there's actually a helper method inside the global Drupal namespace, just called current user. If you wanna learn more about that, you can, it's pretty cool. So there's a quick code example, right? Actually you can get a full, you don't get a full account object, but you'll get a user access an object and just kinda quickly inspected to see what user is accessing, whatever I'm about to do. Oh, the other cool thing I wanna note out here, and again, this is kind of reiterating these points, the account that you get back from current user extends the account interface, right? Why is that cool? Because then if you then want to change the class that defines an account, you can extend that interface and now your new implementation will be part of it. Yay, module load include is gone, right? Now it's just a load include method on top of the module handler helper inside the global Drupal namespace, okay? Pretty straightforward. Queering entities, right? Who here has never heard of entity field query? Look at that, no hands. So proud of you guys. Any field query, we all know, right, that really awesome thing that Chex built to join all of the tables, the field tables for entities. Entity field query is gone, it's renamed. Now it's just an entity query, there's an entity query static method, again, part of that Drupal global namespace that just calls the particular service that does the querying, the entity query service, okay? So in D7 we would do some cool magic like this and instantiate an entity field query object, right? Add our conditions as needed, execute the query, get what we needed, node load multiple, et cetera, and manipulate it accordingly. If you've never used entity field query, I'd definitely recommend you check out my entity field query presentation, there's the link, but everyone here, no one raised their hand or at least some people were ashamed to raise their hand. So for those quiet people who didn't want to out themselves, here's a link, you can kind of note that down and I won't hold it against you. So in Drupal 8, again, here's a quick little code example, right? Use the entity query static method, passing your entity type, your conditions, et cetera, execute, and you get your stuff. There's a link if you wanna get into that a little bit more if you wanna argue with the core contributors about why they called it that, jump into the changelog there and have fun. Was that 30 functions? Man, I didn't feel like it, right? I mean, we kinda, somewhere removed and et cetera and, right, so what about those ones that would be completely removed? Which ones don't actually get a slide of a replacement in DA, like what happened to those, right? Let's talk about those. Drupal AdJS, Drupal AdCSS, Drupal AdLibrary are gone. There are no replacements. I love the tepid applause, you're like, wait a minute, so what am I supposed to do? Oh no! What am I supposed to do? So you're supposed to use the attached key, okay? And I recommend for those who don't know, this isn't D7 too, so you can do this now, right? So the attached key in your render array, yay! So the attached key is how you can load specific assets. So here's a quick little example. Here's the settings form, actually render array or form array in that case. In the settings form, right? I pulled this from CK editor inside of core. You can see that in the render array, we have the theme function defined, or in the form array I should say, we have the theme function defined. And then for the element of toolbar, you have this attached key, and then depending upon what you wanna attach, a library, a JavaScript library, et cetera, you just basically pass an array of those values, okay? So what did we all learn? Never use Drupal.ac.css, Drupal.ac.js ever again. I don't wanna see anyone in their D7 code using it. Go ahead and take it out, make a note, no more of that. You can use attached, it works today, use it today. Future-proof yourself today for D8. All right, 30 functions, here we go, right? Talk about T, check plane, placeholder. Some people probably roll in their eyes, I cheated with placeholder, no one used placeholder. L, Drupal render, right? No load multiple, no view multiple are gone. We talked about those. Node save is gone, no more hook menu, we're using the routing file. At some point we'll have a route match object, but in this case we have a request object that we inspect to get our attributes, et cetera. The cool unsung menu functions are still there. The long fun taxonomy function is not there anymore, but weak taxonomy is an entity. Any load to the rescue? Same with field configurations, right? The get field method, the get instance method, et cetera, creating entities, all that good stuff, only up to 17, all right? But then we talk about alters, form ID alters are still there. Invoke all, get implementations, right? Replacements, Drupal get quick parameters is gone, but we have a new helper. Drupal get path is still there. Load include entity query, that's only 28, what's that about? That wasn't 30. I was cheated. Well technically no, it wasn't 30 functions, but if you count the fact that I told you not to use Drupal.js, Drupal.css, Drupal.li library, you technically got more than what you bargained for. Plus, right? I have bonus, arg is gone. Yay, arg is gone. No tip and a plus for that one, huh? So this one was committed a couple of weeks ago as well. Arg is gone. If you want to learn what you're supposed to do, then get a chance to do a big code piece, so definitely check that out. Hint hint to use the request object. Yay, when you get object, it's gone, so now use the request object and then eventually use the route match object instead of arg. No one's happy about arg being gone? No one's happy about arg being gone. More bonus, talked about it, right? Technically this would probably get its own little thing, which it does. The global Drupal namespace. So this is, again, as I said, a static service container wrapper that basically just allows you from a DX perspective to quickly load your service containers and also has some other helper static methods to do some really cool things, right? It's a unified global accessor, again, to various arbitrary services, right? Again, we're kind of going into the service motif of various things. So whether you're using something, again, like get implementations or invoke all, they also, other really cool methods in there like has request, the queue, HCP client, et cetera. And again, if those particular pieces have their own service, it'll probably just call that service container if it's something else, right? Then you can expect it accordingly, but the global Drupal namespace, something I feel like you guys are gonna be using a ton. So love it, enjoy it, give it a hug and a kiss and it'll be awesome. So what's next? What should you do next? Contribute to examples. People like the examples module. I like the examples module. G7 examples were great, especially when people wanted AJAXI forms. Like AJAXI, okay. AJAXI form. I don't remember what am I supposed to say? States, is it invisible, is it optioned? Let me go check the examples module. Okay, cool, yeah, this makes sense. Okay, I can do that. Cool, right? Help the D8 examples. Definitely check out the API, right? It's got its own, just like anything else. It's got its own functions. Cool thing about the API, as you probably already know, right? It reads the doc blocks inside the code. So if something is labeled in the doc blocks as deprecated, it will show up in the API. So if you're looking at something, you're trying to figure out, hey, is this gonna be around in a while? You'll see it in the API documentation because it'll have the add deprecated tag inside the doc block. Another cool thing I would definitely recommend is try the scaffolding piece that my friend did, Jesus. If you're curious of how you're supposed to structure and architect your custom modules, this little scaffolding, little scout, this scaffolding app is pretty cool. It basically borrows from the concept of symphony for those who have no symphony already. It's a console application, right? We're essentially very similar to Drush. Load it up in the command line. It prompts you with a whole bunch of stuff and depending upon the services you want, it will pre-create your routing ammo files and your folder structure and all this other cool stuff for you. So you've got this kind of starter kit depending upon where you wanna go. So definitely check that out and that'll kind of give you again that meat to say, okay, this is how it's supposed to look and here's how the namespaces would go and this is what I would include, et cetera. Also next at DrupalCon, right? Participate in the sprints, right? Continue to help improve Drupal. We're still in alpha. Continue to help, help, help, help. Over 2,000 contributors so far. I'm sure you guys heard that a lot this morning at the keynote. But continue to help. And before I end, I'm gonna do something really strange. I'm gonna take, I believe, which is the first ever session selfie. So I want all you guys who wanna be in my selfie if I can figure out how to use them. Which I can't now, okay, nevermind. I won't do it. Sorry. You can see how often I take selfies. I don't even know how to use the camera on my phone. There we go, selfie. All right, here we go. Everyone say cheese. Cheese. Thank you very much. I appreciate it. Any questions? Thank you very much for being attentive and patient and awesome with me. Hello. What's up? How's it going? Hey, it's all right. What's your name? Derek. Hi, Derek. Is entity metadata wrapper kind of moot or unneeded now? And is like the method of accessing data any different inside of an entity like using field to get info and anything on that. So I believe your question is if I want to get the meta information in entity has how I'm doing it right now in D7 change in Drupal 8, is that sort of what you're saying or something specifically to the... I guess maybe it's two questions. One, has it changed at all in D8 for just accessing entity field data? Yes. And then number two, are there still plans? Do you know to port the entity API module maybe so that we can continue using entity metadata wrapper? I don't know the answer to the second one, but I do know a lot of the entity API stuff is in core. Yes. Okay. Yeah. I don't know if the specific metadata one wrappers that function specifically is in there. It's very similar. Oh, okay. Okay, so this man right here with the epic beard said metadata wrapper is being completely dropped entirely, so don't blame me. Yes, sir. Form building, there was a slide that had a very quick sort of class of like a base form, something like that. Yes. Are we building forms and functions or are they classes that return something? I'm gonna say use the classes. You can probably do both, but use the classes. Yep, use the form base class, just extend it, build your form, you're done. Do that. Yay, look who it is, guys, XJM. Yay. Hello. Hi, so Fredrick has done an awesome job of keeping the session up to date, but there is one big change I just wanted to highlight for people that went in a couple of weeks back that the field information's a little bit out of date. Okay. So if you guys wanna see the updated, the list of API changes with regard to getting field definitions and so forth, what used to be called field info, I'm gonna read a Drupal.org node ID out for you. So the node ID is 2167167. And let me just make sure, yeah, so this is the issue that removed field info star procedural functions and it's also a lot of related cleanup. And then they have a, the change record, node ID is 2260037, the title of which is field info methods are now provided by entity manager. So the source for that's moved to the entity manager class. So it's all in one place. The entity is where you need to know, you pass it an MEID and in the case of an instance of bundle ID and then you can get the field definitions from there. Thank you, Jess. I appreciate it. Yay. Sir. Hi, so maybe a silly question. Maybe I'm missing something. There are no silly questions. Wow. Maybe. So now that addJS is gone, if I have to, from a module level, add JS to every page, like with the every page parameter, how would I do that? Because now I don't have access or I don't think I have access to any of those render arrays at the page level. The info file of the theme? Well, but I don't want to do that because it's dependent on, it's the module level, right? Like what if I change themes? It's like I'm declaring this JS to make a module work. I gotcha. Right? Good question. And like if I don't add it to every page, like varnish will like say cache my home page and never get the JavaScript that I need to run something on my sub page. Hook page build. Thank you. Look at that. The answer is hook page build. I have to check that that's existing in DA. It is in DA, okay, cool. Hopefully that doesn't go anywhere. Any other questions? Did I miss anyone? Great, thank you guys. I appreciate it.


I think it would be, you know, useful to kind of talk about like the romance kind of relationship side of things. Well, what have you tried in terms of that or is that kind of on the back burner to developing a friend group? I mean, the more I try to invest emotions into it, the more I'm disappointed and feel kind of. The way I see it is that I will get, I'll be as lucky to get romance as I am to get a full-time paid permanent job. Right. Right. What have you used in the past? Because I know that, you know, there has been some apps and things that. I've tried different dating websites, but they're all like fake profiles and none of it's real. Not like Tinder, Hinge, Bumble. I mean, Tinder's, yeah, I mean, yeah, there isn't really anything that's actually agency-based in terms of agency and agency looking for to bring people together.  They're not people who are in London, they're people from another country and they're posting fake profile pictures. It's all a bit of a con to me, a bit of a scam to me. It's very difficult. I mean, especially if you're a man on dating size, it tends to be very, very, very difficult to get matches or find people that are willing to match and talk to you and also even further like go and go and go on actual dates and, you know, meet you and stuff like that. I know that there are some services for disabled adults, mostly for autistic people and in terms of like matchmaking and stuff, have you looked into anything like that? I've tried, but I haven't been successful in finding anything that's been helpful long term. Sure, sure. Yeah. It's tough. And I think there's a lot of aspects to being autistic that can make it really hard, I think in terms of dating, like there's so many nuances to both texting and in-person kind of things. Everything seems to be very kind of indirect, very difficult to understand where you stand with somebody. I think that is part and part due to the, you know, sort of like the modern approach to dating, which is very like, you know, as soon as you see something or you don't feel completely 100% like you want to go and see someone, it's kind of like, oh, well, I'll just see what else is out there and I'll do that and it kind of goes in like a leap for a lot of people. I mean, I use social situations like going to London Film Comic Con as practice for going on a date because it will have all the same social anxiety issues, the autism issues, like the loud noises and stuff like that.  It's very nerve-wracking and that is similar to meeting a woman for the first time because you've maybe met someone online and then you're going to see them in person and you're trying to make conversation with them and not come across like a totally weird, you know. Yeah, yeah. I mean, there are issues in terms of dating that I suppose like, you know, even going further than that, the aspects of maintaining relationships, particularly when it's a neurodiverse one with another autistic person even and also particularly with neurotypicals, holistic individuals, it can sometimes be a very, very, very difficult thing to navigate. And there's a lot of, you know, you were talking about kind of like fake profiles and stuff, you know, well, there's a lot of people who do take advantage of people who are struggling to kind of find someone to develop a relationship with and stuff. And it's definitely something that I've heard about a lot. I mean, I've almost been conned a couple of times before, but for the most part, they're not very clever about trying to scam me so I've kind of seen through it. But yeah, if I was really, really desperate for interaction with a woman online and I looked at these dating sites, I could get taken in by all of these profiles and I could spend money to speak, to get a subscription to be able to send messages to speak to these people because I think most dating websites, you have to pay a subscription to be able to message. So you're kind of just wasting your money in the sense that you don't know if you're going to get anything out of it. I've tried a bit, I've tried a couple of times, but it's nothing good has come out of it. The few times that women have talked to me on dating websites has been basically we just don't have anything in common. No, no. Yeah. Yeah.


So I'll start by thanking Peter and Kenneth, who are the ones who actually implemented all the back end for this work. What I did and I'm presenting here is just the deployment of this and the testing of the framework. So big thanks to Kenneth and Peter and also all the team at CSS who work on this project. So we do claim we have reproducible HPC software installations, though geeks are saying that we are not giving that. We do think that we can achieve reproducibility, so just one more that I think we do have problems with bootstrapping. Sometimes when we move from one operational system to the other, but then that's where the dockers and containers, they can take a hook-in, but after that I can assure you that we can have reproducibility with EasyBuild, and that's why we chose EasyBuild and we are going to present. So this is the outline of the talk. I will first start with the background. I think if you're here you already know how hard this installing software on HPC, so I won't spend much time explaining all the troubles that we ran into. Then I will talk about the EasyBuild framework implementation on Cray. So this is the work from Kenneth and Peter, and the last part I will present two use cases. So all the two deployments on our main systems at CSS with EasyBuild have many other systems. We don't have time to talk about them here, so I will focus on two systems that are Cray-based and how we manage to solve the installation problem with EasyBuild. So in the end I will also show some integration we have now with GitHub for doing continuous integration, for testing the build software and also for archiving the recipes. So the problem of building HPC software in HPC, as I already mentioned, I think it's known from you. So we had the same problem on Cray systems because users, we have many requests from users and they have requirements of software that depend on specific versions. So you cannot just do a ticket install on the software that they need. They depend really on specific versions and these versions need to coexist. So this is a huge problem for the teams maintaining the software and not always these people using the HPC systems. They are scientists, so they are not developers or CIS admins. They don't have all the background for installing software, so they need help from people with this background and with experiencing installing system. Also the people developing the scientific software, they are not formed on computer sciences or development. So when they produce new packages, they often don't use correctly the build tools, just to name a few of the problems we see when using scientific software that we don't see in common, let's say software outside the scientific world. So we have incomplete build procedure that you don't have configured or installed and you have to tweak the files manually. Then this is my favorite interactive installation script. This is really the thing that you shouldn't do when you're packaging a software. You should really provide a way where people can install it automatically and not answering questions, which is your favorite color. Please install it here or not. So please don't do that. Automation is not a new thing. So we should think that there are people working on installing the software at full time. So then the other things are missing documentation and also the dependency held. These are slides from Kenneth that I'm just quoting here. So the dependency held. We can see many software packages that you can have up to 40 or 50 dependencies in only one software. And then if you need to upgrade, then good luck. So this is the big picture. So we have a problem. So the request for HPC user is always growing and unfortunately the quality of packaging this software is not improving. So we have solutions out there for installing regular software but not specific for HPC. So we have the speaker before just mentioned about spec. And we have also easy build but the other tools, they don't really focus on HPC. So the impact of the lack of these tools is that when they have the request for new software, the researchers, they spend a lot of time waiting and then we also spend a lot of time as HPC staff trying to fix that. The other main problem is that it has been already mentioned here is the very little collaboration among HPC sites. So everyone is doing their own builds on their own sites and then people are solving the same problem everywhere. And this is not good in the sense that we don't have a common tool or a forum for sharing. So some sites they do work together but there's no common ground for describing a build. So people are basically redoing the same stuff on all sites and there's very little collaboration. So this is also true on Cray systems. So that's why the way we are just moving, it's just a new case, the Cray system for the easy build and the HPC build software problem. So we have the same problem on Cray. So just one slide on easy build for those who do not know yet is the framework for installing a specifically scientific software. So it's not for every kind of software so it's focused and then the idea is to group all those people who have this experience in HPC and to know how of these people they should be in a single place so people can reuse.  So it's based in Python. It started at Ghent University in 2009 and it is open source since 2012. Now we have community, we have a stable version that is released every two weeks. So from my experience we can always use the new version and I don't say we had zero regression so far but every time we had it was very small and fixed very quickly. So it is something that you can really use in production even for large scale systems. This is my word as a group lead of scientific computing support at CSCS. We have more than 500 users and we have easy building production since more than one year. So there are many well-known scientific software that are already included. You might not find everything but every package manager is giving the figures with how many software you have but the thing that you need to do is go there and see how many of your software you can find it. So I encourage you to go to the website and check if you find your software there and then you can have an idea if it's useful for your use case or not. So the main features of EasyBuild, you have autonomous building and installing of the software. You also have the logging so you don't need to care about saving the output. You're going to find the logs of the installation somewhere and you don't need to worry about that. You have archiving of the build specifications so every time you build a recipe you have a copy of this recipe somewhere so that you know that you can redo it. So this is one step for achieving reproducibility. It's highly configurable on command lines or files. It's up to you or site-wide configurations. It is dynamically extendable so you have the recipes but you can write your own so you can just extend existing classes and then write the things that are specific to your software. So it is tested and it is actively developed so you can just go to GitHub to see that. There's just a graphic to show the community that is sane so it is growing so for the moment it's growing. I think by the moment when it stops growing you're going just to show the figure, the numbers and not the graphs so for the moment you can show the graphs it is growing and you can just look at the mailing list and you can see that it's very reactive and also on GitHub so usually there aren't people who have problems that remain open. Typically people have to find a solution when they need to contact the community. So just one slide and I will try to avoid getting too technical here because I think it's better to discuss the ideas here. So just I will present quickly the terminology of EasyBuilds so the EasyBuilds framework is the part that takes care of installing, downloading the packages, creating the module files and provides all the functionalities that are common let's say for all the builds, for all the software. Then we have EasyBlocks that can be specific for a software or mostly they are generic so you have an EasyBlock for applications that use ConfigureMake for example, you have one EasyBlock for that and then depending on the application you might need one as well but mostly you use only the EasyConfig file which is a recipe that is not generic, you have the version and that's one of the key ideas of EasyBuild that you have the versions of the software everywhere in a recipe so that you know if someone else takes this recipe and tries to rebuild it's going to use exactly the same versions while other software packages like EasyBuild they are more open, more flexible but then there's no guarantee that you're going to use the same versions and that you're going to achieve reproducibility. Less concept is the tool chain which is very important is the base for any EasyConfig file it's actually the compiler and also the basic libraries that are used so typically it's MPI, BLAS, LaPack, ScalaPack and the basic things that we see that is used on HPC so it's called the tool chain and it's grouped together so it's done in a way that it is a base tool chain for building the software so I move to the next part now which is the implementation for Cray so what was missing to use on the Cray system and why so this is a typical example of an EasyConfig file what do we have inside for a build for example this is one software called GMP it relies on this tool chain this is a tool chain which has GCC, OpenMPI, OpenBLAS, O1 and it uses the configure make easy block and then typically with EasyBuild you are going to rebuild everything from scratch you are going to rebuild all the tool chain that you need because we don't want to use the things that you have already available on the system because we might not achieve reproducibility and then the difference on Cray is that the programming environment it's already there so since it's provided by Cray in this case we do want to reuse the existing software because they have the optimized version of scientific libraries and also MPI that is optimized for the interconnect so in the case of Cray we do want to reuse these libraries these compilers and so on so we just created actually Peter and Kenneth created the easy block and the tool chain for Gnu for a Cray, for Gnu compilers Intel and the others mapping the programming environment available on Cray to EasyBuild so that we can use the Cray tool chain as any other tool chain that it was already existing on EasyBuild so the three main features that had to be implemented are the support for external module files then the definition of the tool chains and the custom easy block I want to thank again Peter and Kenneth but I won't go into details this implementation because we don't have time here so this is a key feature for the Cray support so the support for external module files so before EasyBuild was creating and building everything from scratch and creating the module files here on Cray we need to reuse these module files so there's the support for a file where you map the existing modules to a way that EasyBuild can read so this is useful for, it's needed for Cray but it can also be used elsewhere if you have already modules that you want to reuse so also the easy block I will speed up a little bit here because of the time so the easy block are specific for the Cray tool chains you can go on GitHub if you want to see the details then here is just to mention that we have one tool chain for each programming environment available on Cray that we automatically map the variables that you need for building software on the Cray because we have our wrappers on Cray we don't use GCC or the compilers directly so we use the Cray compilers I'll move now for the last part I would say it's more interesting from my side because it's where we managed to use all this infrastructure to deploy software on production so the two use cases that I'm going to present here it's first the machine from MetalSwiss which is the weather forecast service of Switzerland they have production systems it's two cabinets with production and failover with a very GPU dense system with 8 k80s per node so 16 GPUs per node and this is a CS storm series so I explain what we had in the Cray programming environment typically this machine is already different from the rest this is a new series that they provide only partial support for the programming environment so they provide only programming environment Cray and not GNU and Intel so we had to rebuild our software from scratch in this case even the GCC that they provided it was not able to compile AVX instructions so they give you the hardware and they don't provide you a working compiler so we opened a bug and meanwhile they took a long time to give an answer and then meanwhile we rebuilt everything with EasyBuild it took us a couple of weeks and now the software stack is in production since more than one year our main use case I move on to Pitsdient which is our main flagship system so it's a GPU based system it has two partitions so here it's our largest partition with the Tesla Pascal P100 GPUs and then we have the Brodo partition so according to top 500 is number 8 fastest supercomputing in the world and according to the green 500 it's the second most efficient supercomputing with respect to energy consumption so this is the list of software that you can find for Cray on the stock EasyBuild repository meaning that we have already contributed back and we also have our GitHub repository where we have our recipes and then here is just the list if you want to find look for your software so here it's just to mention that we have this GitHub repository where people can also open pull requests and contribute back it's for Pitsdient specifically we have also automatic checking of the recipes using the GitHub pull requests builder plugins so we check everything before merging to the master we check everything and then the last thing is that we have the autonomous deployment of the software on the system so the final comments here is that proprietary and open source software can coexist so we had the case where we use open source in order to better exploit our system we had available and in this case we had the best of two words because we have an optimized software stack and we also had support from both community and from the vendor and also minimizes the risks of vendor locking meaning that we have an alternative it was the case when we had a problem with the software shipped by the vendor we managed just to rebuild everything with open source and then actually don't need the software their software stack anymore in that case so it's the best of two words as I said okay one slides with links that will be available on the web and then we have time for questions thank you very much thank you the army questions time for a couple of questions and regarding vendor locking how many create provided applications in the last day so regarding vendor locking how many create provided applications we replaced for the CS storm series we replaced all the software stacks so meaning that we don't count on them only for the operational system and then we replaced from MPI GCC up to all the things that Metal Swiss needed for post processing all the data so I would say here at least 20 software for all the net CDF HDF 5 all of this came from from easy view then we didn't have to change much all the defaults work for them so I would say 20 software in this case and then in the future maybe for the XC series where we might start looking in also using the open source only and then we know that other place like tech they just dropped all the software stack from create so they use Intel compilers and MPI and then with easy view we could think about doing the same the same in the future so this now we have the possibility more questions I have a question how is this being received by create itself because it seems like we are giving the signal to create that they're not doing a good enough job in terms of and you have to put something on top to actually make it feasible so for the for the CS storm series the feeling that I have is that they don't really care it's not important for them it's the series that they are focusing on the it's the low end not harder but the version that they for the support they don't really care that's my feeling as for XC they not only because of the efforts on easy build but from the complaints that we have open tickets that took so much so much time to resolve then I think they realize they are not doing a good job but they don't give any feedback to us so but they know because we have people inside from create they know that we are using less and less their software every time we have an error before or at the same time we open a ticket we build software with easy build so if they don't realize that if we continue like this we might not needing their software anymore it's bad for them but then it's it's the free market so that's so okay that's it thank you


Advances in nanoparticle, NP, production and demand for control over nanoscale systems have had significant impact on tissue engineering and regenerative medicine, term. NPs with low toxicity, contrasting age and properties, tailorable characteristics, targeted slash stimuli response delivery potential, and precise control over behavior via external stimuli such as magnetic fields have made it possible their use for improving engineered tissues and overcoming obstacles in term. Functional tissue and organ replacements require a high degree of spatial and temporal control over the biological events and also their real-time monitoring. Presentation and local delivery of bioactive, growth factors, chemokines, inhibitors, cytokines, genes, etc., and contrast agents in a controlled manner are important implements to exert control over and monitor the engineered tissues. This need resulted in utilization of NP-based systems and tissue engineering scaffolds for delivery of multiple growth factors for providing contrast for imaging and also for controlling properties of the scaffolds. Depending on the application, materials, as polymers, metals, ceramics, and their different composites can be. This article was authored by Milad Fafia-Chakaluye, Helena Knopf-Marquez, Helena Knopf-Marquez, and others. We are article.tv, links in the description below.


What do I see when I look at this plot? I see that we have magnitude on the x-axis, and we have mean annual occurrence of earthquakes greater than or equal to some magnitude on the y-axis. So this means this plot is the same as the plot that we sketched earlier, showing how often earthquakes or different magnitudes happen. But this data is not for the whole world. It's just for the new-matterhood seismic zone. And there's two different datasets being plotted on top of each other here. So let's just look at those. One is Otto Nutley's catalogue, and it spans 1816 through 1984. It might be a little hard to see, so I'll just draw over it, but it looks like this, right? It goes down here, and there's some kind of jaggedy parts like that. Okay. The other catalogue is the new-matterhood seismic zone catalogue. This is the digital catalogue, and it's shorter. It only spans 24 years. It looks sort of like this. Great. So the difference between these two catalogs is that one spans a lot longer in time, but since it isn't a digital catalogue, it doesn't have as many small earthquakes in it. The other one has more small earthquakes, but isn't as long in time, so it doesn't have as many big earthquakes. And neither of these looks exactly like the plot we sketched, right? Remember the plot we sketched looks sort of like this, where you had magnitude here and log of the number here, and there was this perfect straight line. And these don't have that perfect straight line. They tip over and kind of go flat at some point. But you can extrapolate if they did have a perfect straight line, they would look like this. So what this is saying is that earthquakes smaller than about magnitude 3 in the Nutley catalogue, or about magnitude 1.5 or so in the digital catalogue, those earthquakes are there, but they're just not getting recorded. So when a plot like this flatlines, that's what it means. At this end, it's not a perfect straight line. It's kind of jaggedy. That's just because the catalogue is limited in time. So there's just not enough big earthquakes to really do useful statistics. In order to get a recurrence interval, these researchers extrapolate from the part where they have data to the part where they don't. And they calculate these time intervals. This is how often you can expect a magnitude 6 to happen in this region based on this earthquake data. Here's how often you can expect a magnitude 7, and here's how often you can expect a magnitude 8. Now is a good time to point out that uncertainty in the magnitude of those historic earthquakes in 1811 and 1812 becomes uncertainty in calculating the recurrence interval because it makes a big difference if you know you're trying to calculate how often a magnitude 7 is going to happen as opposed to how often a magnitude 8 is going to happen, right? See how different these numbers are. So there's kind of two big ways that you can have uncertainty in one of these calculations. One is just the limit of your catalogue, right? The shorter your catalogue is in time, the more you have to extrapolate from what you know to what you don't know. And the more uncertainty you have in the magnitude of the earthquake that you're looking for, like whether it's a 7 or an 8, the more uncertain you're going to be in calculating the recurrence time also.


Everybody Matt here for late in sports cards ripping 2023 top series to baseball Jumbo six box full case break number four pick your team We have AJ F Royals Bill H Padres Brad B Cubs Christopher O Orioles Daniel K Mariners Darren L Phillies David P Cardinals Frank C Nationals Henry C Blue J's Jeff M Marlins Jim L twins Judson C Guardians Kengo F Angels Lively H Rockies Matthew K Tigers Michael M Yankees Miles H Dodgers Patrick M Giants Rob B Reds Ronan G Pirates Roy M Rangers Sean D rays Sean L White Sox Thomas W Mets Todd D Astros Tony K Brewers Von B Red Sox D backs Braves and Wenchu L A's Here we go Good luck everybody Last case was wacky we had One box with three silver packs. We had three Patch autos number to 25 and a silver golden mirror image variation SSP Just had this silver foil as long as just an error forest pulled one earlier and Said that it had gold foil Rekker breakers glad is there a game? Oh, yeah. Oh Oh A's are winning 7 7 7 nothing first inning is this real life? Don't they have like 12 wins? It's Daniel Bard you Darvish WBC and Ortiz Yeah, he's winning 7-0 then A's winning that part is pretty remarkable right now Historically bad James Altman. It's a well-bred rookie gold foil and Tigers crowning achievements triple crown Miguel Cabrera 2012 Nice one Detroit There's judge and poo holes. No, I've got to chat up on both. Sorry about that They managed to get him in the set. No, I don't think we're gonna see L. A. Taylor Cruz until 2024 tops. It's just that would be my guess. It just makes too much sense. I think he's too big of a Prospect slash rookie to have him to miss an entire year of Having him as a rookie and stuff J. D. Davis and Royals rookie player worn jersey Vinnie Pascantino I can shrink that down a little bit so I can see more of the screen There we go. Did I kick force to the smaller desk? Just today. There's a line zone each row. We're gonna be Gonna Back and forth here on the channels Anthony Fulpe Brice terrain. I Would be very shocked to see Ellie an update might be too late. Yeah Corbin Carroll. I mean you'd miss him in tier one. You'd miss him in I Tributes coming out. Was that Willie Castro? I kill but do Gold paper and Don Mattingly legends of the game of Ryu Masatake Yoshida as Waldo Cabrera and Nathan Yavaldi Francisco Alvarez Miles Michaelus Gold foil and Jose Ramirez home run challenge all aces Logan Webb Bo Jackson 88 all-star. I think that would give me some pretty solid bragging rights Josh young that'd be awesome. I pulled one from update Wasn't a huge one. It was George High Pockets Kelly, but still awesome. He came Hernandez Babe Ruth Yeah, Jordan Walker rookie Xander and David Ortiz all-star sky blue Mike trout Favorite son and Prado have a Senga me just a little bit slower going through this box. We've got Some cards put backwards. There's now Thomas future stars rainbow foil Nicolado gold paper bow nailer Oscar Coloss spaniel Rivera Gold foil and Miguel Vargas rookie auto Dodgers 88 style nice one Dodgers Senga all aces Excuse me. I guess I should have turned away from the mic. Sorry about that Garrett Mitchell I was thinking about turning away from the one person in the room. Not the microphone So I brought everybody into the room. There's a Logan Oh, Hoppy I'll just do like a half chair spin next time since I'll Go to the Google Sheets The next Started using the sheet to Nick Gordon Was advanced stats trade Turner? Yeah, we're gonna have to get that figured out. I had a kind of a system going when we have a baseball champ Mark Pell Yair Sario Jill Musgrove and Roberto Clemente Mark Bientos Carlos Rodan, but I sanga and Kyle Tucker. I opened a pack of Rob in a box on time of Hoskins and I called the hostings There's Tatees record breakers box topper I pulled a Hoskins and it was like a team MVP Maybe it was updates. Anyway It was like an MVP. There's supposed to be like the team logo medallion and had the Brewers instead of the Phillies. So I threw it on eBay for like 299 or best offer People are like roasting me with it. It's pretty funny They were sending me offers of like two seventy nine like two dollars and seventy nine cents I didn't know what they were looking at drew waters rookie rainbow foil a contra and musial. I was like, I don't know some kind of an error I take a shot, you know So maybe no, this is it. That's a thing. So the average person is not there to search Yeah, kind of stumble on that something Austin Hedges and Pond rays silver slugger award winner commemorative patch 399 Josh Bell says commemorative patch, right? Yeah, silver slugger award winner patch card They should actually if you win the silver slugger, they should have like give you a patch that you wear all season St. Wright which the golden lovers? Yeah Yeah, that would be cool or like their bats have like a silver label to their batter Mm-hmm same with like MVP and stuff. That'd be really cool, right Carlos Perez rookie rainbow foil Reds Jersey hunter green Lars newt bar and Ricky. I do wish Ricky was a Yankee in this because that's what he was in 88 tops I'm almost positive Thompson there Yeah, James Altman, it's Charlie Blackman gold foil and Andrew McCutcheon Gold paper Neil Cruz and bellinger Carson Kelly called foil sunny gray and judge Jordan Walker rookie. Oh AJ. Yeah, it was a gold mirror image variation SSP With the foil on that one was silver on the front on the tops logo on the front and on the SSP on the back And I checked with Forrest because I thought maybe that was just something they were doing with series too But he said that his had gold foil. Yeah, he pulled one Alvarez rookie and pull another one See it ourselves Brewers rainbow foil Green foil board Jake Fraley Now Thomas and the mookie Anthony Volpe Kodai Senga You're Matt's fan, right? Oh, yeah, you didn't have a good start the last Walked pull him in a second inning. Dang Corbin Carroll, he's been a That's stable part of the rotation. Oh the rest of the rotation. It's kind of been up and down may you 299 orange foil board rookie Michael Siani Hank Aaron legends of the gay man Jeter all-star. There's moustache Yoshida rookie Sturdy Ruiz Josh young Mike Moustakis rainbow foil Nick Castellanos old paper Rookie Sasaki WBC. That is a random to all Kyle Schwerber Logan Ohapi Yeah, reds reds a plenty here for you. Hi, France gold foil and this is Tigers 88 Rookie Otto Ryan Criedler Another hit for Detroit Sunny Gray favorite sons and you're done Jordan Walker Jumbo pack of box to Josh young rainbow foil and vintage stock to 99 Eric Haas is a house or house Profar and verlander. I said Haasie last time so I'm going with Haas this time. So at least I'm batting 500 I'm gonna be mad if it's like Hasey or something Logan Ohapi. I was calling him Logan Ohap for up until like a month ago Francisco Alvarez Mike Yastrimsky bow nailer and To 25 that is Red Sox orange refractor Roger Clemens Nice rocket what movie was Clemens in is it Kingpin? It's a Greg Maddox Shohei Otani Alec Burleson and Tony Gonsolin Yeah, he had like a cameo in a movie. I think it was Kingpin. Does anybody remember Kingpin? Kingpin had Bill Murray Woody Harrelson. Oh that one. Oh, it's a E-Turo record breakers. I think he had a cameo on that Think my favorite baseball player cameo is the in the other guys Derek Jeter And the guy he acted as good to get shot So I wouldn't he has green foil board 499 out to vey and Ripken I have that movie on DVD actually the other guys. Yeah, and I haven't I've only seen it once Anthony Volpe rookie terrain Codeis Senga, well the problem is it's a part of a four-pack and it includes stepbrothers and Palladig and I So yeah, I mean every time I grab it I end up putting either Palladig and I Anchorman I know people say they don't like Will Ferrell Mike are you being just for the sake of being they weren't born in the right time frame to Donnie Sands rookie gold foil and Phillies Silver slugger commemorative patch to 299 Kyle Schwerber 42 of 299 Johnny Bench legends of the game and Logan Ohopie 88 rookie Same with Adam Sandler movies like his good ones must take a sheet of rookie Yeah, I can watch his These a plan on like TBS or something like like every other weekend Mariners rainbow foil and red socks that's a player worn jersey. That's Tristan Casas rookie Yeah, that's the thing like no, they're not cinematic classics. They're just glad they're funny and they're highly rewatchable The rewatchable value is very important. Yeah, Logan Ohopie rookie It's also the same era where Since now we have streaming back then it was all about getting DVD money if you didn't go see it in the theaters Yeah, so I It was that extra scenes or deleted scenes or bloopers and mm-hmm Take out shioka Ken Waldechow Rookie gold paper Verlander Dan's be stuff these days don't have that much rewatchable value There's your Walker rookie even like Interstellar I thought that was one of the best movies I've ever seen I'm not sure I would watch it a second time. I'm gonna have to watch it again because my girlfriend I haven't seen it yet. Oh geez. We just watch it. We just watch in septic for the per first time Wow, yeah outman So There's a TV show on prime Francisco Averas might be the greatest single-seated show of all time. So jury duty. I Think I've seen it Because I watched it last Garo It's it's like a mockumentary for everybody except one person. It's a documentary. So everybody is an actor Except one guy. He doesn't know James Martin So it's just like the actor that couldn't get out of jury duty That's hilarious They're probably bringing back for a cameo Donaldson Goldschmidt As we were sold out today appreciate y'all filling up the breaks today Forest is sold out as well Kyle's live-on drip tonight and I think Sam is on the main channel Josh young Austin Voth cold foil and Mazatake Yoshida that is rookie 88 sky blue Red Sox nice one Nice Yoshida Felix and Hunter Brown Von Soto Randy Rosserina Rainbow foil Marcus Simeon gold paper Wayno and Soto So I watched the entire series of jury duty With somebody About a half an hour.  Yeah, James Altman rookie Francisco Alvarez Forest looks like he's streaming from a VHS recorder Yeah, it's a little skipping isn't it's just like it's Frazier Minor skipping, but it's you can notice it. Oh, dang This is nice. That's Brewer's baseball stars auto black 14 of 99 The artist formerly known as Prince fielder. That's the first Prince fielder auto. I've ever pulled. That's awesome. Go Vargas Kutchin and Freeman. I Wouldn't say hardwired it over there because I had a hardwired Wasn't strong I guess might be the wire Yeah, I was on the internet on Wi-Fi landslin and red foil board Casey mice Devours and Cabrera. All right, silver packs Paul Molliter Garrett Cole Roger Clemens and a ground Veltrae O'Neal Cruz Matt Walner Nester Cortez and Wilson Contreras There's Big Mac record breakers Francisco Alvarez rookie White Sox rainbow foil Acunia WBC and Aranado Mastaka Yoshida rookie Sturri Ruiz Anthony Volpe rookie nice pack here And Kodai Senga, you know like half of the top two rookies in the same back half of the pack there Corbin Carroll branded Nemo gold foil and Cubs crowning achievements commemorative patch Ernie Banks Ernie Banks legends of the games back-to-back Ernie Banks Kirby Puckett I thought that the chat was just being super quiet today and didn't realize that Restring chat wasn't showing you too. So there was like an active chat over on YouTube for over an hour and I had no idea Rehabilitizing Contreras and A's to 50 that is rookie Jersey Shay Langaliers gold parallel Mookie and Bryce Harper Logan Ohapi Longsoto It's Nolan Aranado gold foil and Michael Brantley gold paper Williams and Naylor Jordan Walker rookie. I really like the idea of Jordan Walker going on a tariff in about 28 to 30 home runs actually being set down. I think I'll maybe Mental booth. Yeah, apparently what they told him was that they wanted him to work on lifting the ball And there's Bobby Whit homerun challenge and he went down there and he was hitting horribly in trouble Johnson Let's let's do this here in the major so we don't kill the guys confidence Jordan grossions rookie rainbow foil Harry Ford and chipper Josh young Michael Kopeck Gold foil and black paper 72 Corey Kluber all aces the grom and the grom 88 free jumbo packs and two silver packs to go in box number four Keegan Akin rainbow foil and I'm sorry. Yeah, rainbow foil and gold paper Astros team card Shohei Otani world baseball classic and Big Mac all star James Altman rookie Joe Ryan gold foil and to 199. This is Astros 88 style rookie Black Hunter Brown Corbin Carroll rookie insert the Puckett It's Kearlaw rainbow foil and legends of the game Mariano. That is black to 299 Nice card for the Yankees Rios and Maddox Lenin Sosa, Sandi Alcantara, Kerry Carpenter and Eloy Jimenez Sia Suzuki Kyle Schwarber Garrett Mitchell and Ryan Mountcastle at box number five Just one non MLB world baseball classic card so far. There's Mike trout record breakers Well last time was the first time I'd ever seen three silver packs in a box of flagship Jumbo, how about four this time? Well, what what? Huh? It's the misfire We'll see something good out of one of them I'll bring more of those big top-loaders to sleep soon. Be right back. Appreciate it Peterson. It's a Logan O'Hoppe Marcio Jackie Bradley, Jr. Gold foil and Giants it's crowning achievements commemorative patch Willie Mays Rizzo and Pujols Jordan Walker rookie you put it in the scope And Braves that is rookie player worn jersey von Grissom South really Ted Williams We have two more cases up after this and that'll be it for the day Grab your spots up for tonight Josh young and if you want personals grab them with Kyle I'll be back tomorrow morning, and then also be doing personals over on the L LSE to channel on Friday night Chris sale gold paper Hunter Green and Joe Musgrove Oscar Coloss Corbyn Carroll rookie gold foil Jazz Chisholm, Jr. Home run challenge and Frank Thomas legends of the game Francisco Alvarez rookie 88 nice pack here must hockey Yoshida Jamison Springer Freddie Freeman and trout all-star Bubba Thompson James Altman rookie Francisco Alvarez rookie KK Hernandez gold foil and sis red foiled 199 Nico Horner Judge and Corbyn Carroll rookie 88 Miranda Max Meyer on the sands on White Sox rainbow foil Andrew Vaughan and Joe Adele gold paper Ken Waldichuk rookie green foil board 499 Trey and Bo Anthony Volpe To ring Kodai Senga rookie Corbyn Carroll rookie Zay Buto rookie gold foil and blue jays to 50 That is game use Jersey Otto George Springer You go Congrats to Rano Ricky legends of the game and Pedro there's Yoshida Ruiz Padres rainbow foil and I'm Jay Melendez WBC. That is gold to 75 Those are the Royals Marcus Strowman blue Gary I did just realize I haven't done a dice roll yet for this break for the multi-team duels Come on Anthony Volpe rookie and Jay's drawing to you Kodai Senga. Hey, you can turn into it like a star player All right Here we go again for silver packs in this jumbo box Pujols Tovar a pal and Rosario Musgrove Clemente Casas and to 75 that is purple O'Neill Cruz pirates. Yeah for sure. It's a Randy Rosarana Louise Castillo Jonathan India and Ken Waldichuk Eddie Murray Mike Piazza, Sandra Bogarts and Francisco Alvarez last box Aaron judge record breakers They should have done variations like they had an 88 were like Like they had the Maguire record breakers where there was like a little Like a little white triangle underneath this foot and then there was a variation the more there wasn't one should have done some little nod to the error card Josh young rookie PJ Higgins Rainbow foil Hasiang Kim or baseball classic Mariano Logan O'Hoppy rookie seven Longoria gold foil and Mariners crowning achievements commemorative patch Ken Griffey Jr. Home run and RBI leader 97 and a gromp from Walker rookie Craig Kembrill and Yankees That is Jersey game use Jersey Derek Jeter world baseball classic Lee Jung who that'll be a random to all Nolan all-star David Hensley rookie gold foil live on Soto gold paper All aces Nolan and Kabali buttoe Oscar Coloss Copac Corbin Carroll rookie Jase Peterson gold foil Home run challenge Chris Bryant Ted Williams legends of the game bow nailer Masataki Yoshida rookie ready Peralta rainbow foil Mike trout WBC Griffey all-star of a Thompson James Altman Ken Maldechuk rookie gold foil No, we'll all be breaking on both channels Advanced stats Lord is Gary L. Jr. Erin judge and a lay him in as Francisco Alvarez rookie Yoshi Susugo and nice. This is rookie gold paper Josh young That is to 2023 for the Rangers. They go Texas Javier Bayez and Erin judge Anthony Pope cut by Sanga To jumbo packs to silver packs left or in Carroll rookie. Let's see a big Otto here some Orioles gold foil and A's baseball stars rookie Otto Cody Thomas you go Oakland Nolan legends of the game and gunner rookie 88 Yoshida Alvarez rookie Michael Toglia rookie Gold I'm sorry rainbow foil and golden mirror image variation SSP Dalton Varshow again that one has the silver Foil what the double-checked one for us pulled they said the foil was gold on that one, but I Wouldn't think I just found like extremely rare errors and consecutive cases That is orange foil board Taylor Herne 299 Maggie Willie Mays Anthony Volpe Yeah, for sure appreciate you Join an AJ Kodai Sanga Yeah, they did really well today project Clemens, Adrienne Beltray, Jeremy Pena and Logan Webb I know They beat him last night to 11 to 4 Simeon Woods Richardson Michael Grove drew waters and Dale Murphy Actually before we do that I'm gonna do a random between all spots We have top spot will get a rookie Sasaki and second spot will get Lee Jung who? Let me get that ready to go here. This is number four. There we go He's highlighting pirates because I searched for Merler We will randomize eight times. Good luck one two three four five six seven and eight Astros get the Sasaki and angels get the Lee Jung who? Tag those here So we had WBC Lee Jung who that went to the angels WBC Rosie Sasaki goes now went to the Astros both in the random We had Josh Young rookie gold paper to 2023 and golden mirror image variation SSP Dalton Varshow That was blue jays then we had relics Mariners Ken Griffey Jr. Yankees Derek Jeter Reds Hunter Green Royals rookie Vinnie Pasquantino Giants Willie Mays Braves rookie Vaughan Grissom Tigers Miguel Cabrera Padres 399 Josh Bell Red Sox rookie Tristan Casas Phillies to 299 Kyle Schwerber A's rookie Shea Langaliers Cubs Ernie Banks, and then we had A's rookie Otto Cody Thomas Blue Jays game use Jersey Otto George Springer to 50 Astros rookie Otto Hunter Brown that was black to 199 Brewers That is baseball stars Otto black to 99 Prince fielder awesome hit for the Brewers Tigers rookie Otto Ryan Cridler and Dodgers rookie Otto Miguel Vargas. I'll do it for the break. Thank you everybody case 5 is up next


EFNN, The Tiger, Financial News Network, Update. Hi everyone, Basel Chapman here. This is the Tiger Financial News Network, 10 a.m., Market Update, and it's on Thursday, the 7th of April. We're looking at the Dow, down 173 at 34,323. Fascinating markets. We were talking a lot about it. As soon as I get back with the Tiger Technicians Hour, what we're all looking at is the objective in the Chapman-Wade methodology is to get you from a buy signal to a buy mode from the low bar all the way up to at least four higher peaks. That's PD. We did that at 35,372. Now this is the 7th day of the digest. I have a rule of 136. We're now on the 7th day. That means that any signal that comes in now for a new upward move has to be like a fresh move to the upside. It starts almost from the low of the stochastic. We'll talk about that in the show. The S&P right now is trading up eight divergence. We saw that yesterday, 4489. Yesterday we saw the defensive stocks, like at Johnson & Johnson, Wal-Mart, Costco, etc., moving to the upside while the growth stocks pull back. We're looking at the S&P underneath the 14-period moving average, the QQQ, the NDX100 having a good session today up 228 at 355.60. Now the growth stocks are having their turn to rally somewhat. We're looking at the IWM, the small caps, very weak, down 11 cents at 200. It's just been real struggling. Gold, this is going to be very interesting because gold, it didn't seem like it could be, but I spoke about this about three weeks ago. I said, there's a chance now that gold is going to go into sidewards, rectangle formation, just trading between the boundaries of about 1980 and maybe 1900 or 1880. And that's where it's been looking at. So gold is up $13 and 1936. Normally that would be a great move, but it's had such a spectacular rally. It just needs a digestive phase. Crude all exactly the same thing, up 83 cents at 97. You're looking at this move that's gone from the 129 area down to the 93s, up to the 116, now it's at 97. The real story, as we've spoken about every day now, has been the TLT made a lower low. It's going to the bottom of that downtrend channel. We'll talk about that in my show, the Tiger Technicians Hour coming up. And don't forget, I've got a webinar for my opening call. Subscribers coming up Wednesday the 13th, and you can go to Discord. Best way to go.