I'm extremely happy to be here. It's like my first time in Belgium. And for the last few months, I've been practicing French. And I was so excited that I will finally, I will have, for the first time in my life, the chance to practice French. And then I came to Ghent and it appears that no one speaks French to me. So it didn't really work out well. But the first day I was in Brussels and then I went to restaurant and I sat down. I ordered something to drink, all in French, all perfect. And then I wanted to order something to eat. And I saw lasagna in menu. And when it comes to lasagna, I'm basically Garfield. Any time, any place, just always lasagna. But I had no idea how to pronounce it in French. Like, I still have no idea. How do you call it lasagna or lasagne or something else? So when the waitress finally came and asked me what I want, I was like, I panicked. And I said, lasagna bolognese with this characteristic hand move like Italian. And it went well. It went well, she understood me. And it went too, too well. I was too good. Because then when waitress came to tell me something, she was like lasagna diece minuto. It's like, what does it even mean? Like, why does she speak Italian to me? So probably I have too good Italian accent. But yeah, that was it about my French practice in Brussels. I had to speak Italian. Anyway, back to the topic. My name is Grzegorz Witek. I come from Poland. I am an empty stack developer. And today I will talk to you about software design patterns. So I hope every one of you heard about software design patterns at least once and knows a few examples. But just so that, oh my God, what did I do? Oh my God, this is the last slide because it's the same as the first one. Yay, thank you. Oh no, now you know how the last slide looks like. Okay, anyway, so that we are all on the same level. Design patterns appeared for the first time. This term appeared in architecture in the late 70s. And it used to describe solutions for commonly occurring problems in architecture. And a few years later, some smart computer guys like Kent Beck started working on design patterns in computer science, in programming. And 20 years ago, almost exactly 20 years ago, in October 1994, a book was released. It was called Software Design Patterns, an element of reusable object-oriented software, something like this. And it was written by a so-called gang of four, which was a group of four scientists led by Eric Gamma, a famous scientist who works in CERN in Switzerland. And this book was a huge success. And lots of people in programming started talking about patterns, started talking about the fact that lots of problems that we have in programming appear over and over and over. And we are reinventing the wheel while we shouldn't be because we can just apply these patterns. They are confirmed solutions for these problems. And today, 20 years later, I want to review those patterns. I want to answer a few questions. Like, if it's still worth to learn these basic, this traditional gang of four patterns, are they useful in dynamic languages like Ruby? Come on, it's been 20 years. Lots of things changed during this time. I want to tell you if it's worth to read the original gang of four book. Spoiler, no, but I will explain that later. The picture that you see on the right is Berlin, seeing from the sky at night. And even though Berlin has been reunited, it's one city for more than 20 years now, you can still easily recognize which was the eastern and which was the western part, just looking at the color and the intensity of lights. So, some things change and some things remain the same during these 20 years. So, let's see how it is with design patterns. Gang of four prepared 23 patterns. Like, they didn't invent them. They just gathered the solutions that were already used. They named them, they described, they split them into three groups. The first one on the left are creational patterns. They describe solutions to creating objects. The other one on the right are structural. While the last group, it's the least concise group. It's called behavioral patterns. You don't have to remember them all. I don't remember them all. Like, probably some of them are, like, haven't been used ever in Ruby. What does pattern consist of? So, each pattern has two parts. First is descriptive, which describes the intent, applicability, the problems that we may solve with this pattern. And the other one is implementation. It consists of example code, which in original book was either in Smalltalk or C++, and class diagram, and lots of stuff like this. I promise I will not show you any class diagrams here. Don't worry, don't worry. Let's start reviewing some patterns. I will not show you all of them because I don't have enough time and some of them are really boring, but let's start. The first one is one of my favorites. It's called command, and its intent is to encapsulate a request as an object so that we can parameterize client with different requests and we can support undoable operations. The possible use case for command is implement different buttons in text editor. So, these buttons look the same. They have the same structure as an object, but they have different behavior attached to them. So, here we've got this button class and it has one method called onClick. So, when I click on this button, it executes some action. And how can I implement it? So, in more static languages like C++ or Java, what I do is I have one interface, the command interface, which has a call or execute method, and then objects that implement that interface can be provided to this button. So, I provide instances of this copy class or paste class to my buttons, but as you probably already have noticed, this is not very good solution when we are in the land of Ruby, because in Ruby we've got something like closures. Like closures are so extremely important features, even Java has it right now, even C++ has it right now. So, instead of adding another class for each type of behavior for buttons, we are just providing block of code, and it's so much simpler. And we don't need these additional classes just to use them once, which makes our code more readable, more concise. And we may think that it makes actually the command pattern obsolete. However, if we check the intent, especially the last line, we want to support undoable operations, which means that except for this call method, we need another method, undo. And of course, we can provide two prox objects to our button or lambdas. But this is not very convenient, why? Because we want the same execute method to be coupled with undo. So, if I paste the piece of text, I always want the undo method to delete that. So, in that case, it's better to create just this one class and add these two methods and don't use it as a block of code, just methods, which means that despite the fact that command pattern is a workaround for missing feature, for extremely missing feature, it still might be useful in some cases. The second pattern I want to describe is probably more well known. It's decorator and its intent is to attach additional responsibility to object during runtime. And the use case here, it might be that I want to implement preview in HTML format for my pieces of text. So, I've got this text class and then I've got this decorator, which is kind of a wrapper around object. So, decorator takes my text as an argument and later I've got this render method. So, I may have italic text decorator or bold text decorator or some other ones. And the key about decorator is that it passes messages to wrapped objects. So, I do not only overwrite methods, I pass them and then I add something on the top, which means that I can use them as the layers. So, I've got this bold text decorator which decorates italic text decorator, which decorates the text object. And, of course, we are in land of Ruby, so we have some additional features that are not present in more static languages. So, instead of wrapping objects, decorating them, I may easily extend them. I mean, it's so convenient, I just create this text object and I extend it with whatever module I have and it works in exactly the same way. So, I don't need another classes, I don't need to wrap them, I would just extend the object. Of course, it comes as a price. In Ruby, the price is performance, calling extend on text, clears some global cache, but I will not go deeper into that topic. We just need to be aware that it comes as a price. So, decorator is, again, workaround for missing feature, but what is, in my opinion, extremely important is that we're using this name all the time. So, if someone asked me about intent of some class, I just say, hey, it's decorator, even though it's not this traditional implementation. The fact that I say decorator means that my colleague from my team already knows what I'm talking about and we can communicate much easier. The same is with the third pattern that I want to describe, it's iterator. And if you haven't heard about the previous two ones, like this is something that everyone has to know. Like, iterate, we say iterate over an array. So, iterator is, its intent is to provide an access to aggregate object, to elements of aggregate object without exposing its internal structure. So, if I want to open multiple files in my text editor and I want to open the new window for each file and print the text on the screen, I will just use iterator in that case. So, what does it do? The first method, open files, iterates over the paths, over the argument, and I have no idea what it is. It might be an array, which is most obvious choice, but it might be a set, it might be some custom collection object. The thing is that I've got this each method, which is internal iterator. I don't have separate object for iteration. I just call this method each on the paths and I provide each element to a block. And then I've got the second method called open file and this is example of external iterator, which means that this file, this variable is an iterator object. So, I run manually this while loop and every time I check, is it end of file? If not, then I go again. Is it end of file? If yes, then I skip it. And this method read line on file does two things. First, it returns another line of text from file, but second important is that it moves the cursor to another line. So, that's how iterator works. And needless to say, it's like this is core of many languages. It is available in standard libraries or in the core code of the language. So, iterator proved to be extremely important, which is not the case in another pattern. Singleton, it's like it's very infamous pattern. It ensures that we've got just one instance of an object and provide a global point of access to it. If you get nervous when you see this global point, that's right, that's good. So, use case for Singleton is like we've got settings object. We always want just one instance of settings for our application. And the very naive implementation of Singleton is just to make new method private and then have some other method that we'll call this new, but just once. And every next time it will return existing instance. We've got Singleton in Ruby standard library, so we don't have to implement it on our own. That previous implementation was very basic and there are tens of ways to break it. So we've got this more advanced implementation in Ruby standard library, which works, unless we decide to have some fun with that. So like, okay, there is nothing is private in Ruby. So I can call this method and yay, I've got new object. So deal with it, like it's not a real Singleton. I can do some more crazy stuff, like I can assign object class to settings and then I break the whole, probably in the whole application. Like I will get some warnings here but who cares about warnings, come on. Probably most of you don't even run the test with warnings flag, no. And another thing that I can do is I can use just global variable because if I can break Singleton in a number of ways, what's the difference between having a Singleton class and having just global variable? So they are, in my opinion, they are equally wrong. So Singleton, even though it is available in standard library, it is considered anti-pattern by the community. And features that are available in Ruby make it even less useful. So let's just decide that Singleton is an anti-pattern. It used to be described as a pattern but later, a long time, people decided that it shouldn't be used in our applications. The fifth pattern I want to talk about is Observer. So when you've got this one too many relation between object, that when an object changes its states and other should react to that, the solution proposed by Gang of Four is Observer. And for example, in text editor, when I have styles applied to some pieces of text and I change styles, each part of text should react to that change. So once again, very basic implementation is that I've got this method NotifyObservers, which iterates over Observers and calls NotifyMethod on each of them. And Observers should be able to register themselves to observe such object. And then of course, we've got this Observer object that registers itself and then responds somehow to NotifyMethod. And we don't need to write such code because once again, Ruby standard library has observable library and we just need to call this method change and then notify Observers. And that's it. It's totally enough. So Observer is available in standard library but once again, just like Singleton, it's not so obvious that it's anti-pattern but because of the coupling between the Observer and observable objects, it is considered obsolete. Like we should use something better like publisher subscriber that decouples Observer and observable objects. And there are a few more patterns that implement that solve this problem of having this one-to-many relation. So Observer is available in standard library but we shouldn't use them. Actually in Ruby on Rails, it used to be part of the core but it was moved to external gem because no one used it. Then we have a few patterns that almost no one talks about but everyone uses. So template method. I haven't heard about this name very often but if you have a method that calls a few different methods and in subclasses you override these smaller methods then you use the pattern. It's called template method. It's with us for 20 years. Like who would think that it has a name? It's so obvious. So it's example that everyone uses but nobody calls it template method. On the other hand we've got adapter. Like everyone knows the name adapter. The most common case I think is when we've got different databases we need to talk to different SQL dialects. So we have adapter for each of them. And in this case we use them very often and we know this name. We call these classes adapters. So when I see the name of a class I already know what's its intent. It's not only domain name of the class but also it describes its structure. Then again we've got bridge and bridge is something that I have never heard about. Like I have never seen it in real code. At least not called bridge. And this pattern is basically if you've got one-to-one relation and it's an abstract relation. So it's like polymorphic on both sides. If one part of relation, if one side can be abstract and the other can be abstract, that's a bridge. So it's used commonly and nobody calls it a bridge. And the last one I want to talk about is called facade. I don't really know. Some people pronounce it facade but facade sounds like facade. Like you know, so much better. And when you read the descriptions access or it provides a unified interface to a set of interfaces in a subsystem. But this sounds really serious but what facade is, basically if you have a few classes and it's complicated to use them, you just write one class with simple interface that uses the other ones and we've got facade. So once again, it's used all the time. Everyone uses that but nobody uses the name facade. In Ruby community we don't like design patterns. We don't talk about them a lot. And I was wondering when I was writing my master thesis about design patterns, I was wondering why? And I came up with a few reasons. First is that they are solutions to non-existent problems. So like as we saw some of them, we just, we don't need these patterns in Ruby. In Ruby, this language is so flexible. We've got closures. We can use classes as the values. We can assign a class to variable. It's something that when I use C++ or Java I couldn't even think about. And then they remind us of these static languages. So like when I think design patterns, I think, oh my God, so I have to write this class diagram and it will probably be like seven classes tied together and I don't even know why. And the third reason is that some of these patterns are overused. So there is this syndrome like when you learn how to use the hammer you see nails everywhere. And lots of people have this with design patterns. So they don't look for a solution to a problem. They just look for a problem that they know solution for. So they learn these 23 patterns and then they look for like, where can I use it? Where can I use it? But it's of course not the way to go and that's why Ruby community doesn't really like these patterns. And some of them like when we think about these patterns that I talked about, when we think about what happened with them after these 20 years, we see that some of them are considered harmful like Singleton and Observer. And when I read interview with Gang of Four which was like done three years ago, they presented some new patterns and they said that they would like to get rid of some of them and Singleton and Observer were those two. So it means that they are not perfect and even in languages like Java or C++, these are not the patterns that should be used. Some of them are totally useless in languages with certain features like abstract factory. Like this is basically workaround for the missing feature that you cannot use class as a value. If you can do it like in Ruby, there is absolutely no need to use abstract factory. Then some of them are deprecated and some of them are useful but in very, very rare cases. However, when we see at the other part, we have patterns that are very, very useful. So we've got iterator. We've got some that are, this is not a good example. Like in Starter Library, we've got Observer and Singleton. Like I don't know why we have just these two patterns in another library, they are deprecated. Nobody should use them. And we've got some that are very commonly used as adapter or decorator. And what's in my opinion most important is that some of them are used for communication purpose. And this is for me the biggest value of design patterns. So implementation is different than it used to be in other languages. But the name remains the same. The intent, the problem that we are solving remains the same. So if I say that something is decorator or iterator, my colleagues already know what I'm talking about. And that's why I think that we actually need more patterns. And I don't mean that we need patterns like presented in Gang of Four book. No, we don't need patterns that solve problems in Java or C++. We need more patterns that solve problems in Ruby. So we don't need design patterns in Ruby, but we need Ruby design patterns. Because they facilitate communication. And actually there are a few patterns that weren't, that didn't make into this book, but we use them quite commonly, like null object or dependency injection. There are a few patterns that were added later, like extension or type object, which are not very common, but still they solve problems and they can be used for communication. I think that in Ruby we miss patterns, or I don't know, maybe we should call them practices. We are missing best practice or patterns for metaprogramming and DSLs. We use lots of metaprogramming. We write lots of DSLs. And some of them are excellent. Some of them are nearly perfect. And some of them, when we see their code, we regret that we opened that file. So I mean that we should have some confirmed ways of designing these DSLs or using metaprogramming. We shouldn't abuse it, but we should use it and we should agree on some way, where is it okay and where it's not okay to use them. If you want to learn a bit more about design patterns, there are a few resources. First is design patterns in Ruby. It's a book written by Russ Olson and it covers I think 14 or 16 out of these 23 patterns. It's really interesting. In contrary to the second position, which is the original Gang of Four book. And as I told you in the beginning, I don't think it's worth reading it. I read it cover to cover when I was writing my master thesis. And when I finished it, I was like, I should got my master degree just because I finished that book. The first part of this book covers some pitfalls and problems with object-oriented software and it's really cool. But then the second, the big part, describes the pattern and it's full of code example in Smalltalk and C++. It's full of class diagrams and really, really boring descriptions. The third resource is a talk from last year Barucho by Corey Haines. It was a bit more general, but it was great inspiration for me to prepare this talk. And the last one, if you know this Wiki, if you know c2.com Wiki, you know it's value. And if you haven't seen that page, just go there. It's extremely interesting. This is the place where lots of discussions about design patterns took place. So that's all for today. Thank you very much for listening and enjoy the rest of conference. Thank you.


You know what? It don't even matter. We're uploading two videos this week. You're welcome. Howdy how's it going? My name's Davy Chappie, and if you've seen my cleric or my wizard videos, then you know that I am personally of the opinion that the company, known as Wizards of the Coast, may have been playing favorites with certain classes during the design of 5e. Because between these two classes alone, you have about one fourth of the entire classes in the game. Despite this, the voracious appetite of the wizard's conglomerate cannot be sated. So here we are, going over not two, but three new archetypes to take the multiverse by storm, in the forms of the Twilight Domain Cleric, the Circle of Wildfire Druid, and the Anamancy Wizard. So with that out of the way, let's begin. Our first new domain for the bros and robes is the Domain of Twilight, which is an interesting specialization in that there isn't really a concrete description for what it is. It represents healing and rest, but also bravery and protection, traveling, dreams, night time, the transition to night time, it sort of keeps itself polyamorous in the world of domains. In terms of abilities, you get proficiency with martial weapons and heavy armor, you have Invinence Dark Vision, and you can spend an action to give your friends Invinence Dark Vision, and you can give any one person, including yourself, advantage on initiative rolls. Moving on from level one, your Twilight Cleric will quickly learn to make a bubble that gives temporary hit points and shakes off fear or charm effects, you yourself will get advantage against fear effects, you can give yourself a flying speed for one turn as a bonus action while you're in darkness, you get a psychic divine strike, which if you don't know what a divine strike is, howdy, welcome to clerics. And your final ability lets you choose an amount of people when you cast the darkness spell who get to see through the darkness as if they had magical dark vision. This class is bonkers and as a DM I immediately hate it so much, like on a personal level. The Invinence Dark Vision is ridiculous because nobody else has that, so fighting in darkness isn't a challenge anymore, you just stay out of their line of sight, and there may as well not even be enemies. The bubble of temporary HP is ridiculous for somehow being even more of a sponge than the heroism paladin from the last UA, because the bubble doesn't just heal you once, it heals you every time you end your turn in it, and I understand that that's only temporary HP, but considering you get this at level 2, at low levels, that extra d8 may as well be a normal healing for anybody that gets hit each turn.  The flying speed is fine, the divine strike is the divine strike, and by level 17 the darkness ability just means that any non-boss enemy that the party fights has a 0% chance of winning, and if you don't believe me look at the shadow sorcerer and then multiply that rudeness by 4-5 party members. Blizzard, please nerf. Taking a break from ranting and moving on to the subclass that I was personally excited for, the circle of wildfire druid took a look at all the press coverage that California gets and decided that this was the quickest way to get on television. Wildfire druids believe that Smokey the Bear is fascist propaganda that gets in the way of teaching people that part of nature's beautiful and blossoming growth cycle is the part where everything dies and burns so that new stuff can grow there. The circle of wildfire starts out with the firebolt cantrip, and while I don't normally talk about bonus spells, it's worth mentioning that this archetype gives druids fireball, which I'm sure that they will only use responsibly.  And it can even teleport the people around it once for short rest, which I'm sure must make some sort of sense somewhere. Anyway, the spirit sticks around for one hour or until it gets beat up for being a nuisance, which is good to know considering the next ability synergizes with it by letting you add a d8 to any fire-based spell or healing spell whenever the wildfire spirit is around, and you can use the spirit as a transmitter through which to cast those spells.  I'm not sure if anybody has told the testing team this, but the druid has a reputation for being completely impossible to kill, and that last feature just cements it. Granted, you don't get it until level 14, but once that hits, the DM can just pretend that the druid is an unkillable wall in the shape of a druid, and the wall is on fire. To be fair, I don't have too many problems with this subclass, it just sort of does more of what the druid is already supposed to do. Maybe it does it a little too much, but it's up to opinion. I just really didn't expect the pyromancer archetype that we've been waiting for to come from one of the least straightforward classes in the game, especially the druid. And finally, the subclass that, judging from the Twitter comment section, clearly nobody likes, and how dare they even include it in playtest material, the Onamancy School of Magic asks, What's your name, man?  First off, the Onamancy School, not to be confused with the Oncology School, gives you proficiency in calligraphers tools, and lets you use a bonus action to charm someone and learn their true name, or their lack of one. The Bane and Bless spells are also added into your spellbook, and you can cast them without spending a spell slot, as long as you speak the true name of the person that you're casting it on. After that, you get the power of Resonant utterance, which does just far too much for me to explain, just look at this. The important bits is that you can choose two of them and two more at level 10, and then from then on, when you speak your target's true name, you can add the Resonance effect onto it that can do things like give you temporary hit points, give disadvantage on saving throws, deal extra damage, nullify spells already on them, move them, or target them as long as they're in range, regardless of other circumstances. Finally, your last ability says that when you speak your target's true name, you can change the damage type of your spell to either psychic, or force damage, as a means of bypassing any resistances that they might have. Overall, I think that the beginning abilities are a bit much, but after that, it's not that offensive. Getting a level 2 charm that you can just do up to 5 times is a little silly, and it's not like it's even a necessary feature for you to get someone's name, since your average person is usually fine with answering a benign question like, what is your name?  The Resonance don't bother me much, except for the ones that give you free to spell Magix on, no, because I see them as pretty similar to a fighter's maneuverability dice, and they're pretty restricted by whose name you do and don't know, although I do think that scaling them up is a little extra. Finally, the damage type changeability... it exists? I mean, it's not bad by any means. You basically get to guarantee that they don't get to resist your spell, but I wouldn't call it overpowered. It's still doing the same amount of damage, and it's not a guarantee that the spell that you're casting would even be resisted by the person you're casting it on. Really, if anybody remembers the olden days when True Name Magic was, uh... not good, it's interesting to see that the True Name archetype is maybe getting a little too much love this time around. Overall, these subclasses are all varying amounts of way too good. When balanced for each other, they're fine, but if you take a look at what's available in the PHP or even some of the stuff in Xanathar's Guide, you might see that the power differential is just way too much. I don't know, maybe you disagree, and that's fine. I just don't like the idea that I might be seeing these reprinted into an official book, because then I'm gonna have to start breaking hearts. But that'll about do it! I hope you enjoyed this video. If you did, be sure to like, comment, subscribe, ring the Reckoning Bell, and maybe support me on Patreon so that I can afford a vacation after making two videos in one week. But yeah, Davi out.


Okay. Hi, Jonathan here. In this video, I want to explain to you how to use high rows. Number one, what is it? How does it help in your need of buying as well as how to set it up and then how to track the actual data coming through. Okay. So high rows, high rows is basically just an application. It's a tracking application, which helps, especially when you're running, for example, Facebook, Google ads, paid advertising, right? You're spending tons of money. And then you need to track whether that conversion is actually producing actual sales. Okay. And so this works well, for example, with phone call funnel. So people have a book a call funnel, right?  And then that conversion data, right? That purchase data, for example, the guy bought a $500 product from us, right? That $500 is attributed and credited to the account and that data is being fed back into ads manager. And so Facebook and Google predominantly, they are very, very bad at doing this because they have no interest whatsoever in doing this type of platform. And that's why high rows, this platform allows you to track attribution and add data to the exact purchase itself. Okay. So it's created by Alex Becker, very big internet marketer. And then in this video, I'm just going to show you how to set it up. Okay. So I'm assuming a big assumption right here that you already have already have an account. Okay. So once you get your account, for example, let me just show you how to set it up. Okay. You need to go into your account. Okay. And what you want to do is go to the top right, for example, you want to go to settings first. Okay. And then in settings, there's something called the API key. Okay. So in the API key, this one is blurred out. You can't see it. But basically, you need to first copy the API key, for example. Okay. And then afterwards, you need to head on over to Google. Okay. Go to Google search for something called this document. You probably need to find this document first. It's called setting up and using the Hyros Chrome extension. Okay. And so you can see here under the written guide. Okay. You see step number one, you see you press this button right here. Okay. You press here, right. You will be you head over to this page right here. So this page is basically the Hyros Chrome extension, which you need to install for you to be able to see Hyros in your ads manager. Okay.  Okay. Once you installed it, for example, right, you can come into ads manager. Okay. So I've already installed the Hyros application. And for example, I'm going to show you the data on this account, for example. Right. And what you want to do is when you press this, right, so you activate Hyros. Okay. At first, right, you see, you need to insert your API key. Okay. You do need to insert your API key. Okay. In this case, this account here, I've already synced my API key. But what you want to do is obviously take the API key from their previous pages now and you paste it in here and then you just enter. Okay. Then afterwards, you will see this configuration come up. Okay. So this configuration is you are telling Hyros, what exactly do you want to track? Okay. So in this case here, Hyros is already turned on. But let me just show you. Okay. So for configuration, I normally just select scientific. And then the rest, I just use default settings, nothing special. Okay. And the reason why is because like, if it's default, it's probably just, it's good. You know, you don't really have to touch it that much. Okay. I don't like using last click because the last click is not really accurate per se. I rather use scientific. Okay. Then what you want to go over here, you can see at the top left-hand side, you press configure columns and then you just select the configuration that you want. So for example, this, this ad account here, right, this is a big ad account spending a lot of money. They are doing e-commerce. So e-commerce, you would generally want to have revenue. You can see, I mean, you can see my one. You have sales cost per sale, which basically means cost acquisition, right? Revenue and then profit. Okay. If you're running a book of call funnel, so you're doing high ticket book of call phone funnels, right? Then you probably want to select calls, cost per call, cost per lead and revenue and probably profit as well. And ROI maybe. Okay. So these are the specific things that you want to be tracking because everything else honestly does not matter. Okay. So once you selected that, you will go back and then you press enable high row sets. In this case here, my account is already enabled. So you don't have to do anything. Let me just show you. Okay. So after you've configured your Chrome extension, right? After you installed the Chrome extension and put in your API key, right, you need to go into the advertising account that has high rows installed in. Okay. So here you don't see the columns. Okay. But let me just go into the ads that level to show you how this will play out. Okay. So imagine if I go to the ads that level. Okay. And then I will let high rows basically pull the data from your servers. Okay. So you can see here very clearly, right?  So what I want to do because I've selected more columns, right?  Hopefully allows me to pull this column for some reasons, like, okay, I want to pull this column to the right. And so that I can see and track the numbers very, very accurately, for example. Okay. So now you can see here it's just populating. High rows is probably just a bit slower at this point, right? But what it means for you as the media buyer, for example, is that I am able to see for every single ad set, right? For every single ad set, what is the sales, the cost per sale, the revenue, the profit, et cetera, et cetera. And so you can see here, right? Let me show you something. Okay. So imagine Facebook. Facebook is telling me I'm getting seven purchases on this ad set right here, right? But high rows is telling me they are three sales. Okay. So who is correct right here? Like Facebook or high rows? Okay. A lot of the times it's just at this point, I'm like, don't really trust Facebook that much. So I would just say, okay, let's just trust high rows. Right. You can see here that 11 purchases who came in, right? However, high rows is telling me that 22 purchases. Okay. So you can see like in terms of data per se, right? I'm using the scientific method, right? So last click attribution may have something different. You might want to see for yourself on your own account. Okay. Every account is different. So I can't really say for you. Right. And so for example, you can see here, okay, these three ad sets right here, right? Ad set one, ad set two, ad set three. Okay. You might be saying, okay, John, why are you spending money when you are basically losing money right here? Like this profit is negative 11, negative 2, 18, negative 70, right? Why are you still spending money? So the reason why is because I'm still in the testing phase for these ad sets. So I cannot definitively say that they're not performing. Make sense? Okay. I cannot definitively say that. Okay. So however, these ones, they are, they are all running, right? And they're all making profit. Right. And so this is very, very useful purely because especially you think about it, for example, like physical product or even digital product, right? When you are running ads, you are, you have top line revenue growth, right? Imagine you make a thousand dollars, you spend $300 on ads, right? You cannot calculate in your mind or very quickly how much the actual revenue profit is. And so this, this is very, very useful purely because here I can make decisions based on profit now. I can make decisions on whether this ad set, whether the audience from this ad sets actually performing how I want it to perform. Okay. Not based on estimates or whatsoever. Okay. So let me show you, I guess, like how else you can use it for example. Okay. So let me scroll down a bit. Hopefully the data is populating faster. I think it's just my internet connection. Okay. Okay. Sorry about that. Okay. So basically you can see here how, how an example of this is that you can see, right? Okay. By the way, this campaign is totally off, right?  But this has been producing profit, right? So this is, I guess the benefit of using Hyrule Swear is like the campaign is previously not profitable, right? But then after the true tracking attribution and data comes in, we see that actually this ad set is profitable. Okay. And so that we are seeing that we shouldn't have turned off this ad set for example, right? We should have let it play out a lot more, right? So this is what I mean by tracking attribution wise, right? Facebook is telling us that there's one purchases that come in. But in reality, the actual sales that she came in is basically for purchases who have come in, right? At $88 cost per purchase. Okay. So the profit is massive, but this campaign is turned off. Okay. So this is why a lot of people are using Hyrule nowadays. And yeah. Okay. I would think that if you are spending tons of money, right? This is something that you sold for you, especially if it's selling high ticket because there's a lot of data that's being attributed wrongly. And the worst thing that you can do, especially when you're running tons of traffic is that you have wrong data attribution and then you make decisions wrongly and then you cut ad sets for no reason, especially when you're actually making money, but you think you're not making money, right? And that just totally messes up your entire flow. Okay. Just another thing, right, just to let you know, like, I know that, what's it called? Hyrule is just a tool, right? So you must think about it from your situation, your situation as well. You do need to become a good marketer. You do need to know how to sell. You need to know how to craft good offers before you even think about tools like this. Because this tool is just an additional layer on top of whatever you're doing. Okay. So keep in mind, if you do not even have a good offer, good whatever, good line of page, good copy, like everything else, right? This does not matter. This will not give you the magic potion and stuff. Okay. You do need to have already sales, you know, consistent sales and you're trying to scale up. And then this could potentially help you save a ton of money as well. Okay. So that's pretty much it. Yep. And I'll see you in the next video.


All right, so we have these two avatars that are kind of working okay. More or less, and the camera is not positioned very well. You can see the hands and everything. The fingers are pretty accurate. It's me typing or using the mouse. Yeah, I don't know. They're a bit jitter. I'm actually not moving my fingers. So I don't know why they're jitter. Let's start actually GPT4 straight away. And GPT air handling script main block. Okay, now the problem is where's the HTML would be in templates. I have the same line of code there. This is a reference only to not generate any code. So we have this HTML. Now the question is when I hit play each music. So music conversion is path in the JavaScript as well. And music conversion. Sort filtering later. We already have other applications that do that anyway. Might as well use the unfiltered stuff for now. Low data is working because the data is there. Now the music conversion. Okay, we have a G music output is empty. And the button doesn't work. So we assume that code wasn't actually executed properly or not executed at all. Fishing in G data, take data, converting, trigger back end process. But that's what it should do. Issues with midi player button. Button when listener is inside on success code. If the plugin or instrument fails to load. Right. The when listener might not be set up correctly. F errors probably too. Success is not defined. So the main JS 100 is that's the problem. How to fix I wouldn't know. Success is being used in a standalone function. Yeah, probably don't need those two. Can we correct that? You should remove correct setup. So it removed that line. Okay, I get that. Didn't make any ava changes function. Clustic rampiano function. Midi player document by mini click. Okay, this is the same. Show this path is correct. Well, there's nothing in it. The music is empty. Generating very slowly. And it's probably the GPT-4. Yeah, what's wrong with that path? Yeah, so we're calling this function correctly. Called with valid AG data output file. I don't know, is it being called correctly? Can you help me with this bit? Now the data is okay. Can't show what the problem is. Can you make magic happen? And just solve this for me. Yeah, last version you should save the file, but there's nothing in the folder. Is it a control of five? Right, so it is loading stuff. It's good. Can move across the G. It is play MIDI button. It also doesn't generate anything in there. Let's just script attaching them. And listen to play MIDI button. Play MIDI. This bit should match. We have in the index HTML. Yes, it does. Yeah, we do want to do that. Especially this problem. If it works, console log. No, MIDI load is successful in the console. The HTML file. MIDI. JS. Yeah, remember this one actually working? Yeah, this URL. It does work. I think this need to go to the end, is it? It is to script. So that one wasn't working at all. These two scripts go to the end. It's doing something? No. Five? Still have trouble with that. Just check that it's actually... Now I still get that surprisingly. This is the script should go. Check the order. Script loading. Yes, I need the charts first. Then MIDI. And then the main JS. The music file is still not there. The play MIDI button. Play G-Muzie button. That's not good or anything. Yeah, don't see the MIDI JS loaded successfully. Can you help me with this one? It has a lot of library. So over here. And let's try again. Not loading. It's to put this error in static. What's this thing called? It's on the HTML. Get rid of that. So that error should go. Surprising nothing happens when I click the button. That's because this MIDI load plugin doesn't doesn't work properly. We find those MIDI JS examples. It's this piano example. One day Fiji will actually look more sound more like JS or and then heavy metal or something when there's a seizure. Those are pre-recorded songs. So what is it using? It's like a different approach or what kind of what I'm doing this with. Why then it suggests doing this in shell itself. Why do I need the MIDI in shell script if I'm already doing this in. Why then? Yeah. I already have that installed. Yeah, I can do a minimal setup. How do I do this? Let's do it. The HTML. Assume this is self-contained. Is it? Why is it assuming it's French? Okay, is this working? It gives me a live reload enabled. It's not giving me the MIDI JS loaded successfully. What is it doing? Right, gave that error. I haven't noticed it to use even if the syntax is not specified in the MIDI options. Right, I haven't actually noticed this. The message permission is in the not specified items. It just browse a trigger and permission request using MIDI devices. This behavior can occur in web MIDI API which assists communication communicative MIDI instruments, API security. Okay, how do I change the code? Okay, the third part I think. Guess it doesn't mean I shouldn't be using this at all. It's a C6 permission. How do I actually change the code, duplicate feature, potential issue? Okay, can you do this for me? Can browse the web and stuff? No, don't you? Must be some sort of outdated API. It's from 2012. It's MIDI. Do I search for these things? Yeah, right. Set the waiting for Cloudflare. Okay, what are the packages? Oh, I'm going in the circle here. Okay, for MIDI, web MIDI JS version 3. Slink working, yes. Different CDN. What am I currently using? MIDI JS. And this one, web MIDI. I'm not having fun so far. Okay, what is it called? It's actually called web MIDI JS. It's that I, I, F, E thing. I have information. Can you do it for me? Update the MIDI JS version. Now this is the same thing. Replace it with web MIDI JS. Okay, which one? Do I have to be... Is this one actually works? No, it's not funny. Giving me fake. This one actually is the previous one. This is fake. It's the outdated one provided in the documentation. Do you have access to it? Yeah, and you do this for me? No, it's called a link legit. Okay, script run code again. One to one MIDI is not defined. Right, but this means that the previous code is working. It still says deprecated. And I give up and we've been doing this for too long. We need like a different approach next time. Try something else. I'll see you now. Bye.


OK, so I'll continue where I left off. There was one comment I wanted to make about the green short super particle before I forget, which is when we split theta dot a into a theta a, and we call this equal eta j bar over p plus, one way to think about this is that you have a constraint, a second class constraint. And of course, you have eight p's and eight theta's, but they're related by this constraint. So this choice here, what it does is it chooses four of the theta's to be interpreted as coordinates and four to be interpreted as momentum. So in some sense, it's solving this constraint. And instead of thinking of it as a second class constraint relating eight momentum and eight coordinates, it just allows you to express four of the coordinates in terms of momentum and vice versa. So you just think of these theta's and p's. This is like p. So this is one way to interpret what we did in the morning. So you're solving the second class constraint by just writing four of the variables as coordinates and four as moment. So any questions about what I said in the morning? So now we're going to discuss the pure spinner super particle and how to get it from this twister-like action. So I wrote down the super particle, the action. And I told you this lambda variable is constrained. And this is the definition of a d equals 10 pure spinner. And there was a question about how to define this in any dimension. So in any even dimension, as I said, it's just the definition that lambda alpha lambda beta is proportional to the phi form, or the self-dual form. So in dimension d, it's m1 to md over 2. So obviously, contract. So all the components, all the forms with fewer than d over 2 indices is set to 0. So in 10 dimensions, this is the one form, which is set to 0. OK, now there's a feature of this action, which we'll get to later, is there's no term of this type. We'll see later that you could put such a term in, but it turns out to be BRST trivial, so it doesn't have any effect. But in order to get physical states, you have to include a BRST operator. So the BRST operator is defined to be, and this is what was called d alpha. OK, so what we'll show in the first part of the lecture today is how this BRST operator, when it computes the cohomology of ghost number one, it just describes 10 dimensional on-shell super Yang-Mills. But before we do that, let me say a little bit more about this pure spinner. So it's convenient. Of course, this is a quadratic constraint, and one can solve it, but not in a covariant way. So the easiest way to solve it is to wick-rotate from SO 9-1 to SO 10. In fact, even more convenient is to wick-rotate to SO 5-5, but I'm not going to do that. If you wick-rotate to five dimensions with positive signature and five with negative signature, you find that this has a solution where lambda is real. We're not going to do that just because it will make life more complicated later. But we're just going to wick-rotate to SO 10. In that sense, oh, I should have said, there's something similar that happens in four dimensions. So people that use twisters in four dimensions like to work in signature SO 2 comma 2, because their two components, spinner, can be chosen to be real. So in 10 dimensions, if you work in signature SO 5 comma 5, you can describe a pure spinner as something which is real. OK, but in any case, wick-rotate to SO 10, and it will be convenient to decompose in terms of U 5 representations of SO 10. So in terms of U 5 representations of SO 10, a spinner splits up in this way and splits up into lambda plus lambda AB with A and B going from 1 to 5. So this is anti-symmetric and lambda A. So this is a 1. This is a 10 bar and a 5 of SU 5. So of course, there are 16 components here. This is just how a 10-dimensional spinner splits up into under U 5. And an easy way to understand this decomposition is using the notation where a spinner in any even dimension can be written with 5 plus or minus signs, which tell you which of the gamma matrices annihilate the spinner. So what you do is you split gamma M into complex gamma A and gamma A bar. So this would be like gamma 0 plus i gamma 1, gamma 2 plus i gamma 3, et cetera, up to gamma 8 plus i gamma 9. And these would be the complex conjugates. And the plus or minus tells you, well, this will be an eigenvector of gamma 0, gamma 1, gamma 2, gamma 3. So acting on this spinner with gamma 0, gamma 1, gamma 2, gamma 3, et cetera, will give you either plus or minus a half. So this sign here would be the eigenvalue of lambda when hit with gamma 0, 1. This sign here would be gamma 2, gamma 3, et cetera. And for example, if it has all plus signs here, it means it's annihilated by all of these gamma matrices, whereas these gamma matrices don't annihilate. Similarly, for example, if the first index was minus, then it would mean it's annihilated by this one and not by this one. So you can think of these as raising an index from minus to plus and just lowering it from plus to minus. OK, so this is convenient notation in any dimension. But now in 10 dimensions, obviously, you can have 5 pluses, 4 pluses, 3 pluses, 2 pluses, or 1 plus. Now it turns out if it's vial, then it has an odd number of plus signs. And if it's anti-vial, it has an even number of plus signs. So this one will be denoted the one with all 5 plus signs. So that's this component here. This component here will have 3 plus signs and 2 minus signs. And obviously, there are 10 different ways to choose it. That's why it's 10 bar. And this one will have 1 plus sign in the other's mind. OK, so this is different ways of thinking of a spinner in 10 dimensions. So are there any questions about this notation? And now what's a pure spinner? So a pure spinner satisfies this constraint here. Now obviously, the constraint is Lorentz covariant. But we're going to try to find a solution of the constraint, and we can't do that in a manifestly Lorentz covariant way. But we can say, suppose this component is non-zero. So this is what's called on the patch where lambda plus is non-zero. So suppose we're on this patch, one can ask, what are the constraints on the other components of lambda? So of course, it has 16 components, and this is going to constrain them. And what you find is that it doesn't put any constraints on lambda AB, but it implies that lambda A, why is it lambda A, is equal to 1 eighth. So obviously, this only makes sense when lambda plus is non-zero, because this is in the denominator. And you see that these components are not independent. They depend on these. Now this is on this patch, but of course I can do a Lorentz transformation to any other patch. So we see that it has 11 independent components. Instead of having 16, it only has this and these are independent. Now one can say this in a better way, which is that the space lambda alpha parameterizes the space SO10 over U5. This is a 10 dimensional complex space. So this has 45 real components, it has 25, so the difference is 20 real or 10 complex. And if you multiply by a complex scale factor, those are the 11 components. So you can think of these lambda ABs, there are 10 of these, these parameterizes space SO10 over U5. And then finally you have the scale factor, which you could think of as being the value of lambda plus. OK, in general, in any even dimension, it will always be SOD over UD over 2. Now this complex scale factor, we're going to require that it's non-zero, which means we're not going to allow all of the components of lambda alpha to vanish. That's why I put the star here. So it's the complex plane minus the origin. And this space here is what describes a projective pure spinner. So a projective pure spinner is lambda alpha defined up to a scale factor. So a projective pure spinner has 10 complex components instead of 11. OK, the only question? No. So if you add two pure spinners, you do not in general get a pure spinner. Because you have this quadratic constraint, which is obviously not satisfied.  It turns out in fewer dimensions, so if you go down to four or six dimensions, it turns out you can solve this constraint algebraically. So in four dimensions, the solution to this constraint is just a vial spinner in four dimensions. So it just has two components. Because lambda gamma and lambda in four dimensions is always of this type, lambda a lambda a dot. And in four dimensions, you can just set lambda a dot to zero, and you've defined up pure spinner in four dimensions. But once you go above six dimensions, in eight dimensions, for example, you can't algebraically solve it. So it's really a quadratic constraint. And 10 also. Any other questions? Yes? Yes? 16 bar of SO10. So you have SO10 as a vial. And antiviral representation. And that's right. It's the antiviral. Yes? OK, so let's look at gamma 0 plus i gamma 1. So we know that, first of all, gamma 0 plus i gamma 1, the square of it is 0. So what it's going to do is it's going to take, it's easier to say how it acts on it. So acting on lambda, which has a plus sign here and anything here, it gives me 0. And acting on something with a minus sign here, it gives me lambda plus, where these signs are the same, of course, is here. So you see that eight of the components are zero, and the other eight will take this to this. So I don't know, it's not one. But I think you understand what I'm going to write. And here, of course, it's zero and zero. So it doesn't, is the notation clear? So I think this notation is probably better. OK, and similarly for the other gamma matrices. There are other questions? OK, so if you ask how, so lambda here is a vial spinner because it has an alpha index up. If you have an alpha index down, and you ask how it splits up into under u5, it turns out to split in this way. So actually w alpha is something within an x down. So let's do that one. So that gives you w plus, wab, and wa. So this turns out to be like a 5 bar. This is a 10.  And this object here is something with all, you wanted to have, sorry, you wanted to have an even number of plus signs, is that what you asked? OK, sorry. So this one would have zero plus signs. It would be minus, minus, minus, minus, minus. This one would have two, so the lamp, yeah. Yes, OK, so this isn't zero plus signs. This is two plus signs. This is four. Zero plus signs, two plus signs, four plus signs. Is that OK? Other question? OK, so why does this describe Super Yang-Mills? So first of all, q squared equals zero, as I showed you at the end of last lecture, because lambda gamma lambda equals zero. So you can define the cosmology. And I'll say much more about this tomorrow. So maybe I'll just try to convince you that this is Super Yang-Mills, but I'm not going to go into details, because I'd like to get to this Twister-like description today. OK, so v, if it has ghost number one, so the claim is that the cosmology of q goes number one. So at the moment, this will have ghost number one. This has ghost number minus one. And all others have ghost number zero. So of course, that's natural from the BRST operator. So it has ghost number one. So if it has ghost number one, it has to be, let's think of the lamb as being coordinates, and the w's as momentum. So it's only a function of lambda x and theta. It's linear in lambda, because it has to have ghost number one. So this is essentially the most general thing you can write down, which has ghost number one. And no one wants to ask, what does it mean to be in the cosmology of q? So here's q. So q of v is easily seen to be lambda alpha, lambda beta, d beta v alpha, where d beta is equal.  And p, of course, is like ddx. Now this object here is just a 10 dimensional supersymmetric derivative. So one can easily show that this anti-commute with space-time supersymmetry, exactly like it does in Fortiment. So this is a constraint on this super field. Furthermore, the super field is defined in the cohomology. So it should have a gauge transformation of this type. Now omega is a super field of ghost number zero, because of course q of it should be a super field of ghost number one. So this is just equal to lambda alpha, d alpha. So we see what does cohomology mean. So this has to be zero, of course, which implies that d beta, a alpha, when contracted with lambda alpha, lambda beta is equal to zero. But the definition of a pure spinner is that this combination is only proportional to the five form. So this implies that gamma m1 to m5, alpha beta, d alpha, a beta equals zero. So this is the equation of motion on the super field. And of course, the gauge transformation from here tells you that delta a alpha is equal d alpha of omega. It's clear that this leaves this equation of motion invariant, because the anticormutator d alpha and d beta is proportional to the gamma matrix with one vector index. OK, now these two equations together are enough to describe super angles. So what you do is you expand this in powers of theta. The lowest component, of course, only depends on x. You can write terms of this type. This lowest component, it turns out you can remove a version called lambda. You can remove by choosing omega appropriately. So this turns out to be pure gauge. So if you choose omega to be equal theta alpha, let's write it like this. It's equal to f plus theta alpha g alpha. Then it's easy to see that d alpha has the term d d theta.  So this could be gauged away using g alpha. Now f is just a gauge transformation that generates the usual gauge transformation of AM. And it turns out that if you work this out, you find that this only satisfies this equation if AM satisfies the usual super Maxwell equation. So this here implies dm. So that's the usual Maxwell's equations written in terms of the gauge field. And of course, the gluino should satisfy the usual on-shell Dirac equation. So this just describes the on-shell, d equals 10 super angles. But of course, it does it in a covariant way. Now this is in superspace, but you should be aware that it is just equations of motion. So you might have heard the story that you can't do 10-dimensional super angles in a manifestly supersymmetric way. It's true. We don't know how to write actions in a manifestly space in a supersymmetric way. But we do know how to describe equations of motion. So these are just equations of motion for d equals 10 super angles written in superspace. Any questions? OK, so this is the answer. But what is the starting point? So I already mentioned, it's a little bit mysterious that this action, although it's gauge fixed, there's no EP squared term. And furthermore, there's no BC ghost, as you might have expected if it came from gauge fixing some world line reparameterization in variant action. So similarly in the BRST operator, here there's no CP squared term. So it doesn't look like the usual thing you get from gauge fixing a world line reparameterization variant action. So here comes the new feature, which is the claim is that it comes from gauge fixing a purely bosonic action. So the idea is the theta alpha variable, as I already mentioned here, is a world sheet scale, or a world line scale in this case. And it's going to come from gauge fixing a constraint, which is spinorial in spacetime, which is constructed from p slash and lambda. So the constraint, which will be essentially the starting point for this description, is p slash lambda equals 0. This is called twist you like, because if you work in four dimensions, so pen rows, of course, only describe twistures in four dimensions, but the idea is that in four dimensions, if you have a null vector, you can write it in the form lambda a dot sigma m a dot. And this, of course, identically satisfies p slash lambda equals 0. So if you try to solve this constraint, you find that p can be written in terms of lambda. Now, in 10 dimensions, things are a little bit more complicated. So this lambda has now 11 independent degrees of freedom. So we're not going to try to solve the constraint, but one thing you can see immediately is that this constraint implies p squared equals 0, just as it did in four dimensions. And that's trivial, just if you hit it with another p slash. So literally what it implies is that p squared times lambda alpha is equals 0. But we already decided that lambda alpha cannot be vanishing because of this c star. So this implies p squared. There's one more thing that I should say is that, of course, this constraint does not require the scale part of lambda. So this lambda is going to be a projective pure spin. OK, so that's the starting point. And now we're just going to write down an action built on that starting point. So the action is very simple. There won't be any thetas in the classical action, but you're going to have this constraint times the Lagrange multiplier for the constraint. This is the Lagrange multiplier. And the claim is that quantizing this action in different gauges will give either this pure spin or description or the green Schwartz description. OK, now the surprise, of course, is that this action does not have any fermionic variables in it. So the claim is that the super particle is going to emerge, which I put in a minus 1 half, yeah, I know. It's going to emerge from this only after the quantization. OK, now there's one thing that I didn't say, which sorry, there's a mistake here. I want the action to depend on a projective pure spin. So the action should be invariant under scale transformations of lambda. So scale symmetry will be imposed by introducing a covariant derivative here, where the covariant derivative is defined to be. So A is just going to be a world line gauge field. And the scale transformation will be lambda alpha goes to omega lambda alpha. W alpha goes to omega inverse W alpha. The Lagrange multiplier will transform with omega inverse so that this is scale invariant. And finally, the gauge transformation will transform in this way to leave so that this scale is covariant. Sorry, there's no alpha on the A. OK, so that's the action. There's a scale symmetry of this type. And there's also a gauge symmetry, because here you have a first class constraint. So in addition to the scale symmetry, we're going to have a first class constraint, which generates the following gauge symmetry. So we want to describe the particle. And we want to end up in this gauge fixed description, or green Schwartz. All I can say, OK, why did I introduce it? Because it works. I don't know. There's not many things you can do which are simple. And this is certainly simple. Of course, we already had the idea that a pure spinner is in the game. And it turns out that in the 80s, some people, not Penrose, some people were trying to generalize twisters to higher dimensions. And what they found is that pure spinners are the generalization of twisters to higher dimensions. OK, I don't have too much time to go into this, but papers by people like Lane Houston and also Lionel Mason worked on this in the 80s. So of course, pure spinners in this language, I should have mentioned also, it didn't come from that. It came from actually some work of Paul Howe, who showed that integrability along. So Witton showed in the 80s that integrability along light-like lines was related to caposimetry in the green Schwartz super particle action. And Paul Howe showed that in the 90s that integrability along pure spinner lines were related to super Yang-Mills also. OK, so in some sense, it was natural to think of pure spinners as twisted variables from those two points of view, either trying to generalize what Penrose did in four dimensions or to understand what Witton and Howe did in the sense of integrability along these spaces. OK, so of course, there's been a lot of recent work on twisters that I guess Freddie will talk about. I don't know if somebody talked about already. I guess Simon probably mentioned twisters also in four dimensions. And usually, when people describe N equals 4 super Yang-Mills in four dimensions, I would say 90% of the features of that theory are also present in 10-dimensional super Yang-Mills. So of course, dimensional reduction reduces 10-dimensional super Yangs to four-dimensional super Yang-Mills. You lose four-dimensional conformal invariance when you work in 10-dimensions, but you gain lots of new symmetries. So it wouldn't be surprising, I think, if twisters play an important role in 10-dimensions just as they played in four dimensions. OK, so by the any case, I'm doing it because I can and because it's simple. And it will generalize to the string, of course. Otherwise, I wouldn't waste your time. OK, so the gauge symmetry generated by this, you have the usual transformation of the Lagrange multiplier. With the hindsight, I will realize the gauge parameter here is going to be interpreted as a ghost, which I'll call theta, so I'll already call it theta here. The transformation of x is just, this is the gauge parameter, remember, and p slash lambda just generates this type of gauge transformation for delta x. And of course, delta w, because w and lambda are conjugates, it will generate a transformation of this type. Now there's another gauge symmetry which is not generated by p slash lambda. So this just comes by using the canonical commutation relation of p slash lambda with x and with w. And l is the usual way that the Lagrange multiplier transforms so that the action is invariant. But there's an additional symmetry which is of this type where rho is a new gauge parameter and that just comes from the fact that lambda gamma lambda equals zero. OK, so that will also be relevant. So these are the gauge symmetries and also there's an extra gauge symmetry coming from the lambda gamma lambda equals zero constraint. OK, there any questions? There's one more thing I can say which is suppose lambda is constant. If lambda's constant, of course, this term goes away. And this term, if lambda's constant, just looking at how lambda acts, for example, suppose that the only non-zero component is in this direction here. So lambda's constant, the... So let's say it's just in this component, one, zero, zero. This implies that the constraint has only five independent components. So if you split Pm into Pa and Pa bar, it implies that Pa equals zero for A equals one to five. OK, we'll have split Pm into... So just into five complex components. Now, for people who work with a topological string, this is essentially the constraint for a topological string. You impose this becomes dxA equals zero. So what lambda does, because it parameterizes SO10 over U5, it parameterizes how the complex structure is chosen. So the usual topological string, what you do is you fix the complex structure. And then you say, for example, that dxA vanishes where A is the holomorphic exit. What I'm saying here is that if you start with a topological string and you integrate over the choices of complex structure, you generate the super string. So it turns a topological string, on this case topological particle, into the super string. So that's another nice idea that follows from this construction. OK, any questions? OK, so let's see how to quantize this. OK, so in addition to these gauge symmetries, there's a further gauge for gauge symmetry. The gauge for gauge symmetry comes from the fact that if you look at this transformation of L alpha, if I shift rho and I shift theta in opposite directions, I can get a compensating gauge for gauge symmetry between them. So the transformation is what's called delta prime. If I shift theta in the direction proportional to lambda, and I also shift rho to be equal to del phi, then these two terms almost cancel. So first of all, this term doesn't change because theta lambda gamma lambda equals 0. This term will shift, but there's a gauge symmetry associated with lambda gamma lambda that I should have said from the beginning. This constraint here implies that W alpha should be identified with W alpha plus. So lambda gamma lambda implies that only 11 of the 16 components of lambda are independent, which also implies that only 11 components of w should be relevant. And those are the gauge invariant Ws under this gauge transformation. So this transformation here should be thought of as a gauge transformation of W. And you can see that shifting theta by lambda is of that type. But this doesn't quite cancel because you can get a derivative here acting on the phi coordinate. So this is a gauge for gauge parameter. And it turns out that this is not quite invariant. You find that delta prime of delta L is equal to phi del lambda L. But this can be canceled by doing a shift of W because, of course, the equation of motion from W is del M equals 0. So finally, there's a shift of W. OK, so what is chi? Chi is the gauge fixing fermion. So what we're going to do is when we find gauge fixing in the usual BRST fashion, by choosing chi as we like and saying that the gauge fixed action is equal to the classical action plus q times chi. So for people that aren't familiar with this, OK, this is standard in any BRST or any textbook that discusses BRST. And now if chi depends on L alpha, this thing here implies that q acting on q chi, or if you like, delta prime of q chi is going to be equal to delta chi delta alpha times phi del L. So that's why we need this shift of W in order to cancel this shift of q chi. So in other words, the BRST operator's nil put it up to equations of motion. Equation of motion is del lambda. And to get rid of that equation of motion, I have to shift W. OK, so putting this all together, we're going to find the BRST transformations as follows. OK, now remember theta is a ghost. Rho is a ghost. So these are fermionic. These are fermionic ghosts. But phi comes from the gauge for gauge symmetry. So phi is actually a ghost for ghost, which means it's a bosonic and not fermionic. So every time you have a ghost, you change statistics. So if you have a ghost for ghost, it becomes bosonic. OK, so it looks a little bit complicated, but it's pretty straightforward. So the idea is you start with this action. You describe the symmetries. It has a scale symmetry, including this world line gauge field. It has this gauge symmetry generated by the first class constraint. But then it also has gauge for gauge symmetries. And this is the gauge for gauge parameter. And then putting all these symmetries together, you find the BRST transformations. OK, so that's essentially the game. There's one more thing I should mention, which is under the scale symmetries, of course, this is how the matter fields transform. But of course, theta also has to transform. So under the scale symmetry, theta goes to omega inverse theta alpha. And phi goes to omega minus 2 phi. So that just follows by requiring that all of these transformations are scale invariant. OK, so that's the story. And now we're going to gauge, fix, and get either pure spin or green schroids. But are there any questions? So I think what you're asking is there are different ways to gauge fixes, gauge for gauge symmetry. One way to gauge fix it is just as you said, for example, we can remove rho. So if you look at how rho transforms, you can of course choose a phi so that rho will be gauge to 0. But you have to be worried that that will have some ghosts. Because rho transforms with the derivative, that will introduce ghosts. So yes, the gauge for gauge symmetries are essentially there in order to remove some of the gauge symmetries. But the way do we move them, it's important to keep track if you get derivatives so that you might get ghosts coming from it. As you like. So I will tell you the ones that give green schroids and pure spinners. OK, any other questions? OK, so let's first do the pure spinner. If we have time, we'll also do the, OK, I don't need this. Yes, please? Yes? Yes, I should have written it if I forgot to. So this action here. So I wrote down this PRS-T operator, but I didn't tell you where it came from. OK, so what's the gauge fixing fermion we're going to choose? So for pure spinner, we're going to choose chi to be, to gauge fix the Lagrange multiplier to 0. So what that means is that you write chi to be L alpha times an anti-ghost, which multiplies that Lagrange multiplier. So in general, if you want to gauge fix something to 0, you just take the object you're going to gauge to 0 and multiply it times the anti-ghost. So we'll see exactly why that does it. And we're also going to gauge rho to 0. So this rho here, we're going to gauge that to 0. So we're going to have an anti-ghost for that. Now, of course, this is bosonic. This is fermionic. But this is fermionic, so this is bosonic. So this is really an anti-ghost for ghost, whereas this is an anti-ghost. OK, so q chi, we have all the PRS-T transformations. The only thing I haven't told you is what is q acting on the anti-ghost. So the standard thing to do is to introduce something called the Nakanishi-Lautru field of this type. So this transforms into an auxiliary field. This transforms into an auxiliary field. And then the auxiliary field of PRS-T invariant. So these are called Nakanishi-Lautru field and L field. So this is all completely straightforward PRS-T language. OK, so there are two contributions. One when the q acts here, one when it acts here. So obviously when it acts on p-alpha, you get m-alpha l-alpha. When it acts on l, OK, it's fermionic. So you get a minus p-alpha times. So that just, I'm reading off from here what q of l is. I guess a head minus. Then you have q of beta, that's n. So you get n-row. And then finally you get beta del phi. So you see the q of chi multiplies the Nakanishi-Lautru field by the l-alpha. So obviously the equation of motion for m is going to be l equals 0, which is the gauge we wanted to impose. OK, so the full action is equal to sc plus q chi. This should be del. I don't know, sorry. OK, so these contributions, of course, were from the classical action. This comes from this term here. This comes from this term here. And I've explicitly written the gauge field that appears in these connections. And of course I've used the equation of motion that rho equals 0 and that l equals 0. Now we still have the scale symmetry. And now we have a choice how to gauge the scale symmetry. But a Lorentz covariant choice would be to use a scale symmetry acting on phi to gauge phi equal 1. Now this is only possible if we assume that phi of t tau is non-zero for every t, for every tau. So we have to assume that there's non-vanishing on the world line. If it is, then we can just use the scale symmetry to gauge it to 1. Now this is a bit bizarre because phi carries ghost number. So phi carries ghost number 2, in fact, because it's a ghost for ghosts. So what the scale transformation does is it shifts the ghost number of other fields. So let me explain how that works. So suppose we have an operator of scale weight s and ghost number g. So if you want to write something which is scale invariant and which gauges to this in the gauge phi equal 1, then the object to construct is phi to the minus s over 2, O sg, because this obviously has scale weight minus s, because phi has scale weight 2. So this is a scale invariant operator which in the gauge phi equals 1 reduces to this. But this object here has ghost number not g, because this has ghost number s. Because phi has ghost number 2, phi has scale weight minus 2. So this should have been a plus s over 2, sorry. So phi transforms like omega to the minus 2. So in order to be scale invariant, this should be a plus s over 2. So this has ghost number s or g plus s, because this has ghost number. So what we've found is that an operator which has scale weight s and ghost number g, after gauge fixing, it's actually the relevant state has ghost number g plus s. So giving a non-zero expectation value to a field with ghost number is going to shift the ghost numbers of the other fields. So what does this mean? So for example, theta alpha started out having ghost number 1, because it was a Fadea pop of ghost. It has ghost number 1. Just if you look at how it transforms. But it has scale weight minus 1. So that means the ghost number after doing this scale shift is going to have ghost number plus 1 minus 1 is equal to 0. Whereas lambda alpha started out having ghost number equals 0 because it was a classical field. But it has scale weight plus 1 because of this scale weight here. So after doing the shift, it's 0 plus 1. So it has ghost number plus 1 as we want. So you see that using the scale symmetry to gauge phi equals 1 because phi carries ghost number plus 2, it's going to shift the operators, shift the ghost number of the operators, into precisely what we wanted in the pure spinophonism, where this now has ghost number equals 0. OK, so the last thing we need to do is see how this affects the action in the BRST transformation. Let me do that here. So the action after gauge fixing phi equals 1. First of all, the equation of motion in the gauge phi equals 1 is that a equals 0. So if you just, the equation of motion for beta is just going to be a equals 0.  So this just comes from varying a in the action. And of course, this term drops out if phi is 1. So the action is just, OK, it should be exactly the same as here. And we can read off the BRST transformations from that line there. So we find that q of theta is equal to lambda alpha. q of xm is equal to 1 half lambda gamma m theta. q of w alpha and q of p alpha. So these just come from that line there, plugging phi equal 1. OK, so these are precisely the BRST transformations that are generated by this. OK, so we've landed on the pure spinophonism. OK, the only question? OK, so if you had world line supersymmetry, I would say the answer should be s. We don't have it, so I can't guarantee. So if we were doing the stream, then you would have an equal number of bosons in fermions. Because the critical, it will turn out all the world sheet fields will have either conform weight 0 or 1. And so in order to get the central charge to vanish, you need equal number of bosons in fermions. For the particle, that's not true. So we can think about green Schwartz. So green Schwartz, OK, I don't know. We can look at it here. I'm sorry. q is BRST symmetry. So it takes bosons into fermions, but it takes it with derivatives and things like that. So it doesn't just take a field into another field. It takes sometimes with derivatives, et cetera. q squared is equal to 0, yes. That's right. But it's nilpotent. So it's not like spacetime supersymmetry, which is q with q is equal p. So I don't think q squared equals 0 implies that. Well, look at the bosonic string. q squared equals 0 for the bosonic string, but there aren't equal numbers of bosons in fermions. OK, so I don't think you have an equal number of bosons in fermions for the particle, for the string, you will. OK, are there other questions? OK, so I'm not going to have time to do green Schwartz today. I'll do that first thing next time. But let me just say what's going to happen. So what's going to happen for the green Schwartz is that you're going to choose a different chi. And obviously, this W alpha has no role in green Schwartz. So what we're going to do is we're going to choose a gauge in which W alpha is BRST invariant. What will happen is that's going to produce another charge, which is actually 0. So it will produce BRST transformations which don't completely gauge fix. So obviously, when you have a local symmetry, the other charge is 0. So the fact that the resulting BRST charge will be 0 will imply that actually you haven't completely gauge fix as a local symmetry that survives. And that local symmetry will just be kappa symmetry. OK, so we'll do that next time. I won't have time to do that. OK, so let's start.