Okay, right so hello everyone, welcome to the graduate student online seminar, summer 2021. Before we get started just want to say a couple of quick things, despite the words graduate student being in the title attendance is open to pretty much everyone and people background can vary a lot so it's like to ask people to be respectful of your friends and colleagues here during the seminar. I think said, please do feel free to ask questions the primary goal of these kinds of seminars is for it to be a sort of nice positive learning experience for everyone involved in asking questions definitely helps. In the spirit of sort of a usual in person seminar. It's perhaps easiest. If you do have a question or you would like a certification or anything like that just go ahead and unmute yourself and politely interrupt. You can also post your questions and chat I'll try to keep an eye on it and I can relay any questions. The speaker. And then we will also leave a little bit of time again if you have maybe a longer question or like a more involved or detailed explanation. We'll have a little bit of time for that. So with that being said, it's my great pleasure to introduce Dan Summers who will be talking to us about the RSK dash fly proposition. Alright, so just thank you for the invitation to talk at at the seminar. Clearly, my date is wrong on my title page. I commit to not being able to find the tech file this morning. So I'm just, here's a PDF of the same talk I gave three years ago. So a little background on me first. I finished my PhD at Drexel in 2019. I'm an Algebraic Competitor Symmetry, specifically Symmetric Function Theory, which is something I'll be talking about today. It's a branch of math that hopes to solve some kind of hard algebraic geometry questions in just counting things which, which makes me happy. I'm no longer associated with Drexel University that's where I did my PhD. I currently teach high school. I kind of bailed on academia, burnt out a little bit on research. And now I'm very happily teaching at a school in New York, and one of my students is a participant in today's talk so that's that there's a win right there. So, kind of the theme of this talk is the power of like smashing different branches of math together. So one example of this is in calculus. So how do we find the perimeter of a circle. Well, we're good at polygons. And we just add up all the side circles unfortunately, don't have sides I can't just add them all up but if I take the limit of the polygons that we put around the circle, we can we can figure out the perimeter of a circle, right so here's like one fruitful part of math or we kind of smushed to different branches together and this is kind of true throughout a lot of mathematics. I like to do combinatorics, I'm an algebraic combinatorialist but like that algebra part of the sentence is really. I don't do that. I do the combinatorics we count combinatorial objects that mean something in algebra. I know what some of the algebra words mean but I don't like, I don't chase diagrams and I don't really want to know what a category is because it scares me a little bit. So let's just fix some definitions for today. So bijection bijection is a one to one and on to function. Some basic examples we've seen in our lives before, and multiply everything by two, right, if I, that's the bijection from the natural numbers to the even natural numbers. There's a natural bijection from C to R cross R, just by getting rid of the eye and making the plus sign a comma.  So I think of combinatorics is the study of bijection on five bijections on finite sets. A lot of people say combinatorics is study of counting but if you want to think about it just counting a set is a bijection between a set and a subset of the natural numbers. So I think of combinatorics is the study of bijection because really, I deal with infinite sets so we're not actually really counting. So what kind of combinatorics like what kind of bijections do we care about care about my injections that means something in algebra, and what kind of algebraic objects that I care about symmetric polynomials are the basic version of this. So, symmetric polynomial and in variables X one through X, and it's finally where if you change the role of any two variables to get the same polynomial back, you can also think of this as a group action of SN. You just permute the variables and each of these polynomials is invariant under all group actions by permutations and SN. So with two variables like here's an example. If I switch the role of X one and X two. It's the same polynomial. Right, which I show here. With four variables. Right. So the last guy is some as symmetric polynomial with five variables, however, you might notice that like I just wrote the same polynomial down twice, but with five variables. This last guy is not symmetric. And the reason is because if I change the role of X five and X two, I get a different polynomial, right so there are, we need to take into consideration, all variables in my polynomial ring all unknown to my polynomial ring. So the amount of variables you're considering can throw you for a lurch. But there's ways to take care of that, but we'll get there. So the elementary symmetric polynomial degree D and and variables is defined by this kind of gross sum, which is iterated over a bunch of eyes. But the best way to think about it is you add up all the ways to pick D of the exercise and you can't pick one twice. Right, so if you notice in between all the eyes in the subscript of that some is all strict less thans. Right, so that means you can't pick the same twice so we're just adding up all ways to pick DXI without picking one twice or all monomials with D in determinants where where the kind of power pattern is all ones. So those are the elementary symmetric polynomials that we have the homogeneous symmetric polynomials which I always say homogenous and the people make fun of me. Definitions almost exactly the same. These are real nice and easy to tech up. You just got to change your less thans the less than or equal to us. And it's always to pick DXI we can pick each more than once. So these are two types of symmetric polynomials. So, right, I'm a combinatorialist. We like our examples. Here's our definitions. We pick two right in X1 X2 X3. That's always to pick two of the indeterminants and I can't pick them twice. Right, I can't pick anyone twice so that's X1 X2 X1 X3 X2 X3. Notice if I exchange the roles of any two of these. We get the same polynomial. The fact that the ease and the ease, particularly our symmetric isn't. I mean it's an easy fact to prove but it's not. I don't think it's inherently obvious from the definition. The H is maybe more so. These are both symmetric H2 right we got to pick two of X1 X2 and X3, but I can pick something more than once. So it's E2 right so it's X1 X2 X1 X3 X2 X3 plus the ways to pick the things twice.  I do H3 in X1 and X2 right now this is a little weird. Did I make a mistake? Hmm. It's always to pick three X1s and X2s. Yeah, so I made a mistake there. That should be plus X1 cubed plus X2 cubed. But yeah, I need to pick three of the X1s and the X2s and I'll have to pick them more than once. Not particularly important that example this is the important one if I want to pick for E3 of X1 X2. Notice I'm not allowed to use two variables more than one variable more than once. So, this guy is defined to be one right zero excuse me this is defined to be zero this doesn't. Choose three in determinants without choosing one twice. Right, so we have another issue here we talked about the issue before of the issue before here. Where was it. I don't remember where it was there was another issue we talked about. We have this issue here with some of these guys aren't really well defined. A lot of them end up just being zero. We deal with that well we switch to something from. We use infinitely many variables now these are no longer polynomials. We call them symmetric functions, even though we're never plugging anything in. So we're not thinking of them as a function that maps from one set to another. We call them symmetric functions when we have infinitely many variables it's just a bit of terminology that's been around a while that we just held on to for some reason. So you notice here all that change between my definitions is that there's no less than or equal to n. At the end of it, right, we have infinitely many variables. And when we have infinitely many variables we leave off the variables we just use ED and HD. So here are some examples, right so e to always to pick two variables. H two H three right so these are the same kind of idea. And you notice any three you're going to get some like issues you can get some bizarre terms but I picked one, for example in e three at the bottom, or one term will be x three x 43 and x 12345 right like that has to appear in there it's always to choose three of the infinitely many variables. So there's some families of symmetric functions in this case. Give me a second to take a peek at that. Any questions so far. I know I went kind of fast but this is kind of the more basic stuff at the beginning. Right. So, they're great they're compact definitions but they're probably difficult to work with like if you want to multiply two of these things together that's alright that's like some giant interlacing thing and I don't know that sounds terrible. So how do we encode this in combinatorics is is kind of the power of my field. So for more definition. We call a partition of an integer and a string of non increasing positive integers, who some is n. We write lambda is a partition event with this weird little sideways T. And we call each of the little lambdas I part of lambda. So we know we're talking about so here all the partitions of five. We can create a string which adds up to five and you can't get bigger. Right you can get smaller you can stay the same but you can't get bigger. So there's all the partitions of five. And we're finite partitions like you can always pad with this really many zeros that's not a big deal. So we associate with each partition a young diagram by taking the parts and drawing boxes in the I throw ensuring. Yeah, there's a lot of words here it's just easier with examples, we're taking what's known as the French notation. So the first part of this partition is for so we put four boxes in the first row. And also for so four boxes in the second row, and three boxes two boxes two boxes one box. So this is the young diagram associated with the partition lambda. It has to be up left justified. And here's the young diagram associated with the partition mu three boxes three boxes one box one box. So we use these diagrams to encode our combinatorics. Turns out these ended up being pretty useful. And here's one more example with new, I think I was just showing off my knowledge of Greek letters at this point I'm not really sure why I needed another example. Okay, so what is a semi standard young tableau well we're going to take the boxes and we're going to put numbers in them. And as when we go across the row from left to right, the injures can stay the same or get bigger. And if we go down the column to injures have to get bigger. And we call the content of a semi standard young tableau. A string which counts the number of eyes in the tableau. So if we have look at this example here. If you look at the semi standard well you notice if you read across the rose. Each row either stays the same or gets bigger. And if you read down the columns each column gets bigger. So yes you are semi standard. And here's the content, the tableau has three ones, three twos for threes, zero fours, three fives one six and two sevens. And here's our tableau. And it is semi standard. We use another example here I'll let you guys take a peek at this is this semi standard do the are the columns increasing and the rose non decreasing. And you probably can see pretty quickly yes, and the content is three ones two twos two threes two fours two fives and a six. And finally, since I'm sure you were waiting for this one for the for the for the. So threes the third one is always a non example right. So this guy's not a semi standard tableau. If you look at it, there are this one place is not semi standard and that's that to in the first row, right that to come before that one. Actually there's two places can I can anyone find a second place this thing is not semi standard. Three places I say ah man, world's greatest example. This column, it's one one, and then the second column to two. Yeah good right so there's a lot of a lot of numbers on top of each other remember you have to increase as you go down the rose. No surface. So, again, why do I care so we're going to use these guys to define more types of symmetric polynomials. We can define a list of non negative integers. We can define x to the a as just x one to the first entry in the list x to the second entry and so on. And then we can find the search, the shore function of a partition this is the same shore that pops up all over to place it took an advanced linear algebra class same shore. Isaac or Isaiah I don't remember one of those guys. And it's just an element. So, right here's our weird definition as lambda is the sum overall semi standard young tableaus of shape lambda. Whose content is T. But let's see an example to make a little more sense of this. So S 21 that means I have shape 21. And I want the variables x one x two x three. We're going to restrict to finitely many variables, just so we have finite examples. So I want to fill the boxes with the numbers one two and three, so that we have a semi standard young tableau. Here are the eight ways to do it. Right, so these are all eight semi standard young tableau of shape 21 in letters one two and three. Each of these is associated with a monomial. So this first guy on the top left x 112 is x one squared x two. Then we have 113 that's x one squared x three. Then we have 122. That's x one x two squared. We have 123 and 132. Those are two x one x two x three, and so on. Right, and if you look at this polynomial we have here. This, this guy is symmetric. It's not clear at all that sure functions need be symmetric. There's one definition in terms of determinants, which gives you a really nice clean proof for the sure functions being symmetric if you do it from the tableau definition. You might want to look up something called the bender Knuth in pollution, which will show that these are symmetric, not particularly important for the talk. But this is symmetric. If you want to do the sure function and infinitely many variables we just need more tableau. We need infinitely many tableau. So it just gets messy, but we can do it. One more example if you want s two in x one x two x three. So we got shape just two boxes in the first row. Here's all the tableau. There's our polynomial. Anyone recognize this polynomial. So we talked about it today, think about how I'm allowed to put numbers in the boxes. And what, I mean, we've only talked about three types of polynomial. So what other one would follow the same kinds of rules. Is it the H polynomial. It's the H is right it's the homogeneous ones right because the homogeneous was I had to pick two variables for each two. But I'm allowed to pick the same one twice. Right, and that's all these, these tableau are I need to pick two numbers, but I'm allowed to pick the same one twice because they live in the first row. That's H two s one one similarly is going to be e two. Right, I need to pick two numbers, except they can't be the same because they live on top of each other. So the homogeneous and the elementary guys live inside of the sure function sure function is a larger class of symmetric polynomial symmetric functions. Right, so what who cares right, you know we could moosh symbols around it's really not a big deal. We're going to get to it right so. Right, the commentators were weird we call numbers letters. So we're in the letters, all the letters come from the national numbers is finite list of entries from the set a. Here's a list here's here's a word we don't put commas because why. It's a different thing and here is here is kind of the main bit of the talk. There's a bijection between words and tableau to tableau. Where one is semi standard and one is known as standard. Now we haven't defined a standard young tableau yet. So we're going to do that here. There's two ways to think about a standard young tableau I think the easiest way is it has to be semi standard, and you have to use all the numbers up to the number of boxes once. So say we have eight boxes is a semi standard young tableau where I use each the numbers from one to eight once. Here's an example. Right. So this guy is semi standard, but it's standard because each number is used exactly once, and we use all the numbers, starting at one, and ending with the number of boxes which is eight. Okay, so we can, if we take a word, we can create a semi standard and a standard young tableau. If I have a semi standard and a standard young tableau, I can recover the word. This is indeed a bijection, and it's known as the Robin, Robinson shensted Knuth algorithm, the RSK algorithm, making the name of this talk a risky proposition. I love bad wordplay. So, what's the insertion algorithm. That's a lot to read. If you have slides afterwards you can go through it more slowly later. So, how do we insert the word a one a two a three all the way up to a n. Well, it's a kind of an inductive process, we, we start by just, we create a tableau is one number in one box is the first number on our inner word a one. We put a one in our tableau. After we've inserted I letters, how do we insert the AI plus one. So we have some tableau. If AI plus one is bigger than every number on the first row, just put it at the end of the first row, and you're done. If you're bigger than every number on your first look first row, you find the left most entry in the row which is greater than the thing we're trying to insert. Replace it with the thing we're trying to insert pretend the first row is not there and do the same thing with the second row, and continue until you're just putting something at the end of a row, and stop when you've inserted everything. The thing to read the method here is kind of gross. So let's just look at an example. We want to make the word 23211 into a tableau. So when I insert the number two. I just put it into the tableau there's nothing to do. And my q tableau my recording tableau is just recording the way the boxes are being added so we added one box. There's there it is. So now we want to insert the number three, the second number in my word. Now the number three that's bigger than every entry on the first row of my p tableau. So just get stuck at the end. Just get stuck at the end. And my again my recording tableau. Just records the way the boxes are being added. All right so now I have the tableau 23 I want to insert the number two. Well two is not bigger than every number on row one. So what it does I find the left most instance of a number bigger than two, which is that three. I take the three out I replace it with the two. I pretend the first row doesn't exist, and I do the steps of the algorithm again. I pretend the first row doesn't exist there's no tableau there. So I just put a three in the second row right there and that's the third box I created so there's my q tableau. Right now what do I do with one. Well, one is not bigger than every entry in row one. So replaces the left most number greater than it. Now I got to do something with that to pretend row one's not there. All right that to in row two has to replace the left most entry which is greater than it, that three. And then I still got to put that three somewhere but I pretend the first two rows don't exist. And I just pop it down there at the bottom. And then this to this to. Well I look. There's, it's not bigger. It's excuse me, there's not an entry in row one which is bigger than the two. So we just gets popped on at the end there. So this is the Robinson sense that Knuth algorithm for taking a word and making two tableau out of it one which is semi standard, and one which is standard. So knowing the P in the queue you can reverse engineer this thing right so I know that five is the last box that was added and I can figure out how to reverse engineer it we're not going to do that here today. I don't care so much about the recording tableau. I can start with the tableau and insert a word. Start with a tableau and insert a word, and it's the same process so we're going to start by inserting that one. In the first row it bumps out that to that to in the second row in the second row is going to bump out that three. And that three is just going to go down there. After I inserted that. Now I have the word 123 that one bumps out that to which can just go at the end of that row that to can just go at the end and that three can just go at the end, and I have nothing left to insert. So this is just an insertion algorithm we can take a word and smush it into a tableau. I know that was a lot. Oh, geez. Anyone have any questions about that algorithm. No, okay. So, what happens, well I took a tableau of shape 321 and I created a tableau of shape was that 532. It's a way to excuse me a young diagram I took a young diagram of shape 231 may want to shape 532. And notice where the boxes were added. Right they were all added kind of along the outside of the shape. And in this example, none of them lay on top of each other. Right so they all are either in one row. In the next row they live on top of part of the old tab low. This is not an accident. Right this is a this is a important part of what's going on today. You work hard enough to notice that if your word is non decreasing, which is what we had here we noticed our word here 1123 non decreasing. The boxes in your shape never lie on top of each other the new boxes, never lie on top of each other. And this is one of the bijections that we care about. So what this is going to do is going to define a bijection between pairs of tableau and non. I can't read my notes pairs of tableau and non decreasing words and tableau who differ by adding boxes so that no two boxes lie on top of each other so we have this pair, a tableau and a non decreasing word, and it lives in bijection with new tableau where the boxes added never lie on top of each other. So what is a non decreasing word of length D. Well, in the kind of the new terminology we talked about today it's a semi standard young tableau of shape D, right, all the boxes in the first row. The boxes in the first row. And furthermore this algorithm gives a fact that the, the numbers like the numbers never change our newest tableau has the same numbers in the old two objects. So hopefully we can get some kind of algebraic fact out of this. And the fact is this, if I take a short function of shape lambda multiply it by a sure function shape D, where D is just a single row, right just one number. So the thing about it. S lambda we're summing over all the semi sum semi standard young tableau shape lambda SD we're summing over all the semi standard young tableau shape D. The distributor property says we're going to have to pair all these things up in all possible ways right that's how the distributor property multiplication works it's really just a pairing. Kind of an interlacing. We can, we know how many of them are from this algorithm, right how to pair them. So let's see an example. You want to do s 11 times s two. So s 11 in the two variables is x one x two s two in the two variables is x one squared x one x two x two squared. If I want to multiply these I just need to think about it in terms of tableau. So, here's the tableau version in terms of sets. If I multiply them out right using the distributor property is the same as writing them as ordered pairs in the tableau. But RSK gives us a way to manage two pairs of tableau. The second one is just a row. Right, it can create new tableau from that. So let's go from pairs of tableau to one tableau via RSK. So, this third list right here is just insertion of the one row tableau into the one column tableau, which tells us essentially that s 11 times s two is just equal to s 31. Because we have all tableau of shape 31. In variables x one and x two. Right, so this is what RSK would tell us there is a natural way to pair up pairs of tableau in this kind of restrictive case with singular tableau of a different shape. This is known as the peary rule. So I want to do s lambda times sd. It's the sum of all sure functions which are created from lambda by adding d boxes, which never lie on top of each other. And now the specific example here is really small because there's only two variables. This isn't always to do it. But let's do this peary rule, for example, in in three variables. So if I want to do s two times s 21 times s two. I got to add two boxes to s 21 so that the two boxes never lie on top of each other. The ways to do that are shown there. I either add them both in the first row, one in the first row one in the second row, one in the first row. And a third row, or one in the second row and add a third row. So this is what the answer should be based on the peary rule. And let's, let's check it. So here's s 21, which is done by just writing out all the tableau. Here's s two, which again just has gotten by right now all the tableau. And I want to multiply this out. There's 42 terms. I don't want to do that. So the trick here actually saves us a whole lot of time right so this combinatorial trick says a lot of time this is a lot of what the study of symmetric functions relies on how can I expand products of symmetric functions into sure functions. But this is how it works so I have a problem to leave you with. So if I want to do s lambda times ed right so that's the that's the sure function where they're all written in this in one column, similar methods work, but I'll leave that to you to try to figure it out. And this is really kind of the end of my talk but let me give you a little talk about why I guess people care about sure functions so. Sure functions are really originally came up in the study of the representation theory of the symmetric group. If we want to figure out how to play around with irreducible representations it turns out it's easier to actually just deal with sure functions and there's a nice correspondence between the share functions and the irreducible representations of symmetric group. And from there actually a kind of a big study came out of it, they pop up in geometry, particularly when studying the grass money into the affine grass money and I believe the quantum cohomology of one of those things has to do with sure functions they pop up, then over in Schubert calculus they also pop up. They're kind of like a really they seem to be inextricably linked to like hard geometric problems. So, well, to me this feels like doing like adult Sudoku. Like they really are kind of a very important mathematical object that really has a pretty rich study to it right now. So, I know this is to try to get you guys into or understanding a another bit of math that maybe is not taught at your school I have no idea if it's any any if there's anyone at Georgia doing anything like this. But I think it's awesome. I think you should read about it. If you want references. I think I'll happy to give them to you if you have any questions, shoot in my way. Otherwise, thanks. Okay, thank you so much. Let's go ahead and give a round of applause. If you're wonderful. Thank you. Feel free to unmute yourself and clap or clap emoji. So anybody have any, any questions. Double check with this kind of last, this last year and years this is giving you a way to sort of expand out that huge product of polynomials but without ever having to do multiplication, right, you just know some combination of other ones. Right so yeah it turns out that the ring of symmetric functions you can think of it as a ring. You can also think of it as a vector space. And over queue. Right so the sure functions themselves form a basis for this vector space. So it gives you a way to do this kind of ring. It gives you like do this ring thing this multiplication and and just expand in terms of the basis of a very nice natural basis of the vector space. And if you're maybe only concerned about, you know, like some bounded number of these, maybe only ever want to go up to a could you actually write some change of basis matrix that just. Yeah, yeah. Yeah, and the entries in the in the change of basis matrix are like a lot of really cool combinatorics. I mean so I guess we have a little more sophisticated audience here than the last time I gave this talk so the H's and the D's and the ease themselves don't give a basis for the vector space. But if you take products of them. They give you a basis as well. So like the natural basis would be like fix the monomial right so say you want to do x one x two squared. Right, and then you just end up always to do x one x two squared that's like a natural. Those are the monomial symmetric functions. That's kind of the easiest basis but they're like the worst to compute with. So the H's and the D's, they're kind of the second easiest to compute second hardest to compute with maybe a little easier to find than the sure functions. But again, you need to take products of them to get a basis. The sure functions themselves are a basis. Any I mean any linearly independent set of which there's partition, many, or that's a probably, I think you get what I mean, although that's not the correct term is a basis. It is an infinite dimensional vector space so it's not. Not always easy to poke around with. It's really cool. Would you say it falls under just algebraic combinatorics, like strictly in that realm. So, yeah, so I mean I guess this is algebraic combinatorics is people that do a lot of different stuff a lot of it I don't understand where the symmetric function theory crew. So if you want to kind of learn a more about this stuff there's like Google more symmetric function theory then then algebraic combinatorics is people that do like hard algebra stuff with hopped algebras and then I again I don't not my not my jam. I like to count things. So some talk on. Oh, I don't even know it was like a mini course I didn't even get to a half hour of the mini course before I was completely lost on and there was algebraic competence or so there was just some guy doing hard algebra, instead of, instead of moving boxes around. I mean it's, it's, it's a small field but it's, it's kind of a very active and very. It's a wonderful research community that I've never met nicer people than I have an algebraic combinatorics, but we're a smaller group, most of us are in Philadelphia San Diego. There's a few of us that I know someone at Virginia Tech I know someone at Virginia. But, you know, it's a good group. Any, any other questions before I start reporting here. Let me go ahead and thank Dan one floor. Thank you. Thank you.


Students, we are discussing mergers and acquisitions and we are discussing it from the perspective of human resource management. In this topic, we are going to talk about strategic human resource management and the role of human resource function in mergers and acquisitions. Strategic human resource management has to be aligned with the strategy of the organization and when the merger and acquisition is taking place, then it has to align with the strategy of the new enterprise which is created after a merger or acquisition. The strategic alignment of human resources and that of the organization means that you have to follow the human resource department has to follow the strategy of the organization. So if the strategy of the organization is that of expansion, human resource department should be expanding its skills, its number of people, its resources to align with the strategy of the organization. If the strategy of the organization is diversification, for example, they are going for diversifying the market or diversifying the product range, then the strategy of the human resource should be aligned with that. The human resource department should also be diversifying its skills. It should be diversifying the type of roles that can be played by its staff. It should be diversifying its portfolio of human resources according to the strategy of that organization. So that is what we mean by aligning the strategy with the strategy of the organization. Now strategic alignment, it can be at three levels. Number one is the level of resources.   Skills are something that you cannot see, that you cannot touch. That is something which a person holds within themselves as one of their abilities. So there are intangible resources. So alignment can be on the level of resources in the shape of tangible resources as well as intangible resources. Then the alignment can be on the level of processes. What are processes? All activities that a firm uses to convert the resources into valuable goods and services. So all the activities that are involved in that and that does not only, processes don't only involve the production process, they involve all other processes. For example, the marketing process or the procurement process, so all the processes that take place in order to convert your inputs into outputs are the processes of the organization, including the processes that involve the human resources. So alignment, strategic alignment can also be at the processes level. And third is the values. What are the values? Which means that what are the priorities of your organization? What are the things that you give importance to? What are the costs that you give importance to? That is something which your human resource department will also have to focus on. Or you are giving importance to quality. If you are giving importance to quality, then quality maximization is something which must be carried out by the human resource department of your organization as well. So alignment can be at the resources level. If you're expanding resources, you will be expanding your human resources. It can be at the level of processes. If you are innovating processes, you are diversifying processes, you are trying for lean management, for example, you are trying for quality improvement, then that should also be replicated and it should be done by the human resource department of your organization as well. So that is the strategic alignment that is required. And that is particularly required in a merger or acquisition phase. Whatever way you are trying to change or you are trying to redesign the processes and the resources and the values of the two merging organizations or when a firm acquires another organization, the way you are trying to change the resources, processes and values, accordingly, you are going to change your human resources on these three levels as well. So that is what it means by the strategic alignment of your human resource with the strategy of your organization. And you can do it at three levels, resources, processes and values. In order to achieve this strategic alignment, the human resource department and human resource managers of the organization, they can take various different roles. They just don't have to perform the role of HR. What do they do in being HR? They can become the strategic partner of the organization and strategic partner means implementing the strategy of the organization. Not just implementing the HR department is something which can contribute to defining the strategy of the organization as well. So management of strategic human resources and being a strategic partner means that they become a part and parcel of the strategy process, defining the strategy of the organization. The human resource department becomes a partner in that. Then it can play the role of an administrative expert. You know that the human resource issues are related with administration, administration of the people who are employees of your organization. So the human resource department will provide the right kind of administrative advice relating to staffing, related to compensation, related to performance management and how to actually administer all those processes. For example, if you want to do staffing, then how do you have to do administration? How do you have to give ads? How do you have to call people for an interview? How do you have to manage all that? That is the administrative side of the entire process. So the HR department can become an administrative expert in giving you the advice for that. Then it can take the role of employee champion because in a merger or acquisition, the staff and employees of the organization feel very much apprehensive. They are insecure. They may be very much uncomfortable with the change. And the HR department can become either somebody who is creating stress and tension for them or it can become a department which is becoming a facilitator for them, which can facilitate them through the process smoothly. For example, if there are people who are going to be laid off, if you want to fire some people from your organization, then the HR department can do proper counselling. The HR department can do job placement. The HR department can help them in their skill building. How can they diversify their skills? The HR department can also guide them if they are not required for a single skill, then can they learn a new skill that can be retained in their own organization? So they can guide them. Because the HR department is a department which knows where the skills are going to be utilized and where the skills are going to be saturated. So they can guide the employees and become the employee champion of the organization. And then the HR department can take the role of the change agent because the change process is most significant for the human resource of the organization and the change process takes place through the human resource department. So the HR department can become the agent of transformation and change by guiding the organization to manage that change effectively by developing the right type of infrastructure, the right type of leadership skills, the right type of training which is required to enhance the skills of the people who are going to work in the new organization. And there are so many more things that the HR department can do in order to become the change agent for the organization which is being merged or being acquired by another firm. So these are the different three, four roles which the HR department and HR function of an organization can take during the merger and acquisition of two or more organizations.


Thanks for joining everybody. My name is Micah Silverman. I am a senior security hacksawer for Okta. That is literally my title. And tonight I'm gonna be talking to you about ViewJS and Spring Boot, but I've kind of buried the lead because a big part of what we're gonna look at later on is bringing all this together with Jay Hipster. Now before we get rolling, I have a QR code up on this slide. I have the same QR code up on the next slide. And I have this same QR code on the last slide. So if you wanna take a picture of it or grab a screenshot, you'll be able to get this slide deck and all of the tech references that we have during the presentation for yourself. So don't feel like you need to take screenshots or take pictures of your screen throughout the presentation. Just a quick little bit about me. Like I said, I work for Okta. I'm on our developer advocacy team as our senior security hacksawer. I like to find things and break them and then hopefully fix them. I contribute quite a bit to our blog and I have referenced there a OpenIDConnect Primer, three-part OpenIDConnect Primer. If that's something you're interested in, check it out. I also write code and I contribute to a few open source projects. And the one I am most proud of is the JJWT project, that's Java JWT. I also got to co-author this book, Mastering Enterprise Java Beans, just in time for that technology to be irrelevant. Now go ahead and grab that QR code if you want, but I will show it again at the end so don't feel like you have to grab it right now. Quick little overview of my history with computer languages. I thought this might be instructive. I found it entertaining. Where I start is with BASIC in 1980. So first I want to invite you all to get off my lawn, but I started with BASIC in college. I went to my college program was Pascal as the primary language. And fortunately, a year or so in, we switched over to C in the department, which I am very grateful for because I have literally never written any Pascal professionally, although it was a pretty cool language, but I have written a lot of C professionally. In the 90s, I jumped into Perl, so my first CGI Common Gateway Interface programming for the internet was with Bash and with C, but then I switched over to Perl. And 1995 rolled around and this new language came on the block called Java and there was something about it I liked right away. I'd never dealt with an object oriented language. Prior to that, I only kind of glancingly looked at C++, but never did anything of any significance. And I jumped right into Java. So you can see from 1995 when it was released up to now I have always been on Team Java. Now pretty soon after, JavaScript came on the scene in the browser and I started working with it right away, although it took me a pretty long time to really get deep in it. And I would say around 2010 is when I really got immersed in JavaScript and became what I would consider to be proficient. Along the way we had a number of other Java technologies, Servlet, Spring, Spring Boot, I dove into those. I had a moment where I was working for a company that was a Ruby shop and about three weeks after I started there, they switched over from Ruby to Node.js and I'm grateful for that because right around 2010 I really got to deep dive into JavaScript, the good part because of Node.js. I really got to get into the non-blocking, async, you know, initially nested callback hell but then better approaches and I really got to dig into JavaScript. About two, three years ago I started saying, well, I've done a lot of backend programming. I should at least be dangerous enough or proficient in front end frameworks. I'd done a lot of jQuery, but I jumped into Vue.js. I found it very accessible. I found it pretty easy to work with and I could create reasonable interfaces and modern web spa applications. So that's been my journey. Now for the rest of the late afternoon, early evening, depending on where you are, we're gonna be talking, we're gonna be layering in this application. We're gonna start with Spring Boot to expose an API. We're gonna take a first pass at Vue.js. Then we're gonna bring Jay Hipster into the picture and once we have Jay Hipster, we're gonna work with some Vue.js components and we're gonna upgrade our security and we'll have time for questions at the end. We've got a big pile of tech we're throwing in here, Node.js, Java, Spring Boot, Vue.js, Jay Hipster, Docker and we'll use Heroku a little later on. Let's start with Spring Boot. This is probably what myself and the people in this room know the most, so we're gonna actually spend the least time on it. But we're gonna start using with the Spring Initializer. If you've never used the Spring Initializer, it's super handy. You can give it a list of dependencies. It has parity between what you can do on the command line and on the website as well as the integration with IntelliJ, so they've done a really good job of making this uniform and easy to work with. So the only dependency that we're starting out with is web so we can have a nice RESTful API. I give it a few parameters here for a base directory, a group ID, a package name, it's a Maven project. Don't hold that against me. It would work just fine as Gradle if you're a Gradle person. So let's kick it off there and I'm just gonna execute this curl command. That gives me this tar ball which I can then expand and now I'm ready to open this project in IntelliJ. So I'm gonna navigate my way into IntelliJ and I have in the progress API folder, I have a nice POM file and I can open that as a project and this will take a moment just to compile and for IntelliJ to recognize it but we have a nice open empty project here that we can run right away from our Spring Boot application. Now the first thing I wanna do here cause we're gonna build on this is to write a quick little API and I'm taking advantage of a feature of IntelliJ that if you're not familiar with it, it's super handy both for prime development for stuff that you do a lot and also if you're a person that speaks at conferences or meetups, it's really handy to have these live templates. So where I'm starting is with a live template called boot progress and that just populates this so that you don't have to watch me type and the only thing that I have left to do is to import classes where there are multiple types that would match that. Let's take a quick look at this little API. It's very simple. It is slash API slash progress and what we're emulating here is an API that's going to advance a progress meter. So it's gonna return map string. This is kind of the quick and dirty way to get back a JSON response. In real life, we'd probably want to come up with a pojo that the Jackson mapper would automatically serialize and deserialize for us but we're gonna keep it simple. It takes a parameter which is not required and that parameter is a percent value and all it's gonna do is return a map that has a key called progress and it's gonna add five to whatever percent we pass in. If we pass in 10%, it'll return 15. If we pass in 20, it'll return 25. Pretty straightforward. And the way that we manage that in here is with this optional, I really like optional and basically I do a little bit of math trickery here. If this parameter isn't present, then I'm gonna set its value to negative five and then I'm gonna add five to it. So effectively, if we don't pass in a value at all, it becomes zero. Anything that we pass in, it will come back with five more than that. About as simple as you could possibly get.  I'm gonna use a command line tool called HTT Pi. If you're not familiar with it, it is a modern curl replacement. It works really well with the REST APIs and it gives you some nice syntax highlighting and formatting that you don't get from curl natively. So I'm just gonna hit this endpoint. I'm gonna pass in 20 and I messed it up. Let's see what I did wrong. API progress, let me jump back here. Oh, I know what I did wrong. Of course, I need to make this a REST controller in order for this to be recognized as such. So I just forgot to add the REST controller annotation. This whole presentation is all live coding, so very dangerous, but hopefully very useful. Let's try that again. There we go, so I passed in 20, I get back 25. If I pass in 25, I get back 30. If I pass in nothing, I get back zero. So that's our API, pretty straightforward. Now with that behind us, let's take a look at ViewJS. Prior to this presentation, I did a global install for ViewCLI and CLI service. It's super handy, and what I wanna do here is I'm gonna create a project that uses TypeScript rather than JavaScript, and that's for two reasons. One is TypeScript is strongly typed JavaScript, which looks and feels very familiar to us Java programmers. Also, when you're using ViewJS with J-Hipster, that is your only choice. It always uses TypeScript, so you're gonna have to learn a little TypeScript if you wanna be able to use J-Hipster with ViewJS. I'm also going to install BootstrapView and Axios. BootstrapView is a view integration for the Bootstrap layout and component manager. Super handy for backend dwellers like myself, who are kind of hapless and terrible on the front end. It gives us a number of reusable components, and we're gonna use the progress meter that's built into Bootstrap, and then BootstrapView is just a deeper integration, specifically for ViewJS, and Axios is the de facto standard library for making HTTP calls from your ViewJS programs. You can use it outside of ViewJS, but it's an HTTP client library. All right, so let's get started with that, and where we're gonna start here is by setting up our Bootstrap. So I'm gonna use View, Create, Progress, Frontend. So that's gonna create the folder Frontend, and it's gonna add in a bunch of stuff, and ordinarily I might just be inclined to choose default, but I'm gonna select manually select features because I wanted to use TypeScript. Now, you do have the option of making that the default for future projects. I haven't done that just because I wanted to show you what it looked like, so I'm selecting TypeScript, and now I'm gonna accept the defaults for everything else, and this takes a moment to finish installing. We're not gonna wait for it because I cheated a little bit, and I have a preset folder that we're gonna work out of so that you don't have to watch Yarn and NPM doing its job here. So under preset, I already have Progress, Frontend, and in IntelliJ, we can just open that folder, and IntelliJ has some nice plugins and nice interface for working with View projects. It colorizes everything nicely, and it all works. All right, so here is our ViewJS app, and from here I can run, I can bring up a terminal right inside of IntelliJ, super handy, and if I look at the readme here, it tells me how to get going.  Should take just a moment. Something failed to compile. Let's see if I broke something. Oh, I think I failed to do NPM install, so we're probably gonna have to wait for this anyway. Now I'm gonna pause here and jump back over to preset. Just gonna build this tarball once more so that I have it for the future. All right, let's try that again, Yarn serve, and one of the nice things about running it this way is that as we make changes, it will automatically be reflected. It'll automatically reload so that we can do some rapid prototyping here. All right, so now if I go to localhost 8081, here is our boilerplate view JS app. All right, not a bad start. Now the first thing we wanna do is to make an API call, and we're gonna use Axios for that. Axios uses promises, and Axios can call the spring boot backend, and we're gonna have to deal with cores, cross-origin resource sharing. If you're not familiar with that, it's just a way to identify which origins are allowed to interact with our server, and it's a protection against JavaScript making network calls without permission. So let's dig in here, and we're gonna keep it simple to start with. We're gonna go into our app view, and in this component, in this app component, you can see that we have this class called app that we can start adding stuff to, and view JS has a lifecycle, and one of the lifecycle components is mounted. So I have a live template for that, and what mounted does is when this component is loaded, mounted, once it's fully ready to work in view JS, the mounted function will be run once automatically. You can see it's complaining about Axios because I need to import Axios from Axios. There we go, okay, and all we're trying to do here, nothing is gonna display, but we can look in the browser's developer tools, and we can see this in action. And you can see here, what it's doing is, it's going to get, it's gonna hit our endpoint with a percent 10, so we expect 15 to come back, and then it's gonna get back a promise when that promise is resolved, it's gonna take that response, and it's gonna output the data that we got back from that response. So let's open up the developer tools, let's focus on the network, and I'm gonna refresh this page, and if we look here in the console, we can see that we're getting a cores error, so the browser is intervening on our behalf because it knows that it's not allowed to access 8080 from 8081. Our Spring Boot server is running on 8080, our Vue.js app is running on 8081, and we haven't set things up so that it can allow that connection to happen. So I'm gonna jump back to our Spring Boot app, and I'm gonna add a little something here to manage cores definition. So I have a little template for that, and let's break this down. Spring Boot has a very rich configuration framework that can draw configuration settings from a lot of different sources, which is really great for rapid prototyping, development, staging, and production. So here I'm referencing an environment variable called allowed origins. That's an array. I'm assigning it to this array, and it's a list of origins that are allowed to interact with our Spring Boot app. So we want to be able to whitelist localhost 8081. Now down here in this web MVC configurer, we have this course registry, and we're just saying for any path, we want to allow any path that is being requested from an allowed origin. So this gives us a really nice dynamic way to set this up. I'm gonna stop it, and there's a number of different ways that we can set this allowed origins configuration. We could do it from application properties or application YAML. I'm gonna do it as an environment variable, and when we're setting it up from an environment variable, we switch from the lowercase dotted form to the uppercase underscore form. That's just by convention, and Spring Boot figures this out all automatically. And now I'm gonna give it a new origin of 8081.  And now when I go back here and I refresh the page, this time I get back a response, and I can see that the progress is 15. So now my Vue.js app is now able to make API calls using Axios, not bad progress there. All right, now we want our Vue.js app to visually represent this progress bar. We don't wanna have to always look in the developer tools in order to see our API calls being made. So let's layer that in now. We're gonna use Bootstrap View. So Bootstrap is for responsive web apps. It's really great as a starting point. Professional front-end designers either don't like Bootstrap or move away from it very quickly, but for backend dwellers like myself, it is a godsend. It's an easy to use layout system. It's got a lot of built-in components, including a progress meter, which if I had to construct from scratch would take a lot longer.  And now we're gonna work in our template. I wanna be able to show this on the screen. So where it says welcome to your Vue.js plus TypeScript app, which I can see right up here. Underneath that, I wanna be able to now show a component that has the visual progress meter. So where I'm gonna start is in the main.ts folder. This is main.TypeScript. And I wanna be able to incorporate this. And so this is gonna be TS Bootstrap. And all this does is bring Bootstrap View globally into my application. So I'm importing Bootstrap View and Bootstrap View icons. This is available because I installed Bootstrap View earlier. I'm importing some basic CSS and I'm telling Vue to use that globally here. That's the first piece of it. Then I'm gonna jump over to Vue.js and I'm gonna add in my container progress. All right, so I just added this be container tag. So this is what Bootstrap View looks like. It gives us a set of tags that hooks into Bootstrap. So I have a container, I have a row, I have a column and then the real meat of what's going on is right here. I'm showing this progress meter and I'm using these values, I'm binding it and this is part of the Vue.js data binding system. So colon value, it's gonna look in the app class that backs this Vue and it's gonna look for properties, value and max in order to work with this progress bar. Now I haven't defined those yet so let me throw those two values in, just the properties for now. So we have public, we have public max equals 100 and public value equals 20. So we'll start our progress meter at 20, the max is 100. And now this page should automatically refresh itself. There we go. And it's complaining, I broke something. That's because I haven't set up any kind of handler for my click event. So okay, fair enough, let's jump back here and I actually have a template for this piece. Let me get rid of this and now instead I'm gonna call it TS progress. That is not the one I was looking for. Bear with me a second here. Sorry, TS advanced, that's the one I want. Okay, so now I have this advanced function and I just noticed that the alignment of my mounted here is a little off. Let me fix that, there we go. So now I have this advanced handler, it gets an event, it's going to prevent default on that event, typical JavaScript stuff. And then it's gonna use Axios just like we saw before to take the current value and pass it into our API. And then with the response, it's going to get back the progress response and then we just have a little bit of a ternary here that says if the response is greater than 100, set it back to zero. So this will make our progress meter wrap and otherwise it'll just show the progress value. All right, let's let this refresh and see what we get. All right, it's not complaining anymore, but oh, there it is, I put it underneath. I meant to put it above and there it is underneath. So it was probably showing us this before. Let's just see why that isn't showing up where I expected it to. Oh, because I put it underneath. So I want this to appear higher. So I'm gonna actually put this after the image and before the hello world, let's do that. There we go, that's what I was looking to do. All right, now we have it all connected up so that when I click on advance and if we go here to network, we can see that it's calling our API and it's advancing as we go. And when I advance past 100, it resets it back to zero. If we look at that last call, you can see the response was 105. And so our ternary kicks in and sets it back to zero for us. So pretty good. Now we have an end to end app making use of Bootstrap View. It can advance our progress meter. Of course, this is not a thrilling real world example, but we got here pretty quickly, so not bad. Let's see what's next. Now what we have so far is a good building block. We're missing a few things though. We're missing security and we're missing a single integrated app. What we have right now is a progress front end and progress API in separate projects in separate windows within IntelliJ, but really it's all part of the same project. We have a front end and we have a back end. So I want security, most modern web apps need security and I want it all to be integrated into one app and that's where Jay Hipster is gonna come in for us. So I'm gonna kill these examples here and prior to this I installed Jay Hipster, so that's generator Jay Hipster. If you're not familiar with Jay Hipster, it's a free and open source application generator. It generates applications with a front end of your choice and a spring boot back end. The front end is your choices, your default choices are angular and react, but Jay Hipster also has this whole system called Blueprints to be able to add significant functionality and there's a well-supported ViewJS Blueprint that is what we're gonna use. So I installed the generator Jay Hipster, generator Jay Hipster View, that's the blueprint that we want and out of the box we're gonna have a single project that's all ready for security and where we're gonna start is using Key Cloak for OAuth and then we're gonna switch over to Okta a little later on, but let's dig into Jay Hipster first. All right, going back to my live directory, I'm going to make a folder called Progress App, this is our unified app and CD into it and now I'm gonna run Jay Hipster and ordinarily that would be enough to get going but I'm also gonna give it this Blueprints ViewJS to tell it right off the bat, I don't wanna use Reactor Angular, I wanna use ViewJS. Now from here Jay Hipster is gonna ask us a bunch of questions, I'm gonna have a monolithic application, I'm not gonna use Web Flux, the base name of our application we'll call Progress App, the base package you can see I've done this before, com, a fit nerd, Progress API, I don't wanna use the Jay Hipster registry, here's the important bit for security, so security is a first-class citizen with Jay Hipster, we have to make a choice, we could ignore that choice but I'm not going to, I'm gonna choose OAuth and you can see that out of the box it works with both Key Cloak and Okta. We're gonna start with Key Cloak for local simplicity sake and prototyping and then we're gonna switch over to Okta after. Now in real life you'd probably have a backend database, you might have a caching layer, we're not gonna use either of those for our example, I am gonna leave it as a Maven project and I'm not gonna add in any other additional optional packages. Now when we get to framework, our only choice is ViewJS cause we kicked this off saying that's the one that we wanted to use, we'll leave it as default, ordinarily I would have internationalization support but I'm gonna turn that off just to keep things simple and I'm gonna accept the defaults for everything else. Now this takes a good long while to get installed and generated and going so I'm gonna use a little bit of Smoke and Mirrors here because in my preset folder I already have this set up. So let's go to Progress App in preset and I'm gonna choose the POM XML there, I'm gonna open it as a project in a new window and here now is our unified project and the readme for it has a bunch of information about how to get going.  So let's do that just to see this in action and this is just gonna take a moment for IntelliJ to recognize that, there we go, okay. So if we look at the structure of our app, you'll notice that we have source main Java, we also have source main resources and web app for all of our view stuff and our settings. Let's fire up the back end as we normally would from IntelliJ and I'm gonna bring up a new terminal and I'm gonna fire up the front end, so NPM, oops, it switched over to Jay Hipster as it launches it. I'm gonna run NPM start, it's gonna do the web pack dance. Okay, let's get rid of this and now we have local host 9000. So now we have our fully functioning Jay Hipster app including authentication. Now one of the cool things about Jay Hipster is that out of the box, I've gone too far, I've lost my presentation but I know what I need to get it back. Hopefully it's still here, there it is. Bear with me a sec, let's get to where we were and I'll present again. All right, so one of the cool things about Jay Hipster is that it has this Docker folder and it has this Docker build for Key Cloak so that right out of the box, we can run Key Cloak in a Docker container and have OAuth security built right into our app. Now I did that earlier in a separate window so I already have Docker running, Key Cloak is already running in the container so we should be able to authenticate from this application and now we're in an authenticated state as admin, awesome. Now let's start to layer back in everything that we worked on before so that we have the front end to back end communication that we want and where we're gonna start with that is with our Java app and we're basically gonna recreate in our progress app what we had before. Now you can see there's a lot more to this basic app but just like before, we're gonna make it also a REST controller and we're gonna add in our, we're gonna add in our spring boot controller method here and so this will be boot progress, there we go and I just have to resolve some imports where there are dupes, there we go. So same API as before, that's all ready to go so I'm gonna restart the back end and now on the front end, let's start where we started with ViewJS and that is let's just get the app to be able to make a call to the back end. So I'm gonna go into web app and there's an app view and there are a couple of things that are different here. One of the things you'll notice is that we now have a nice clean separation from our view component with the object that backs it, our app component TS. This is a good thing to keep these things separated but I have my default class here and I can add in the mounted function just like I did before and I need to import Axios just like I did before, there we go and this is doing the exact same thing that it did before, only we have something really nice built into J-Hipster and that is all calls to an API endpoint can be proxied alleviating the need for us to set up cores while we're prototyping. What that means is that our ViewJS front end is running on port 9,000. Anytime the application accesses something that begins with API from port 9,000, it recognizes that that's a back end spring boot call and it's gonna proxy that for us. So this allows us to get started a lot faster and not have to worry about cores and setting our spring boot application up with all that. So now in my terminal, I should be able to see that it's reloaded and let's go take a look here at our console and it's complaining about something, let me just reload, there we go. So now we can see in the console that we're getting the response from the API just like we did before. So this is good, we have our J-Hipster app, we have security and now we're starting to layer back in our progress meter component. All right, let's continue on with that and now I wanna be able to bring in our visual progress meter component but now that we're in J-Hipster land here, I wanna expand, I wanna do it in a better way than we did the first pass through and so what I want is in between this welcome Java Hipster and this is your home page, I want to have our progress meter sandwiched in there and so where that lives in the web app is it under core home and this is the home view component. So you can see up here it says welcome Java Hipster, this is your home page, sandwiched right in between, I wanna have a custom tag called progress meter. This will make everything clean and reusable once I set up my progress meter component which I haven't done yet, I'll be able to reuse it wherever I wanna be able to reuse it. All right, now right now this isn't gonna do anything because I haven't defined progress meter and I haven't properly integrated it so let's do that next. All right, so now in the shared folder which already exists for me over here on the left, I have this shared folder. I'm gonna add a new folder to shared called progress, new directory, we'll call it progress and in that progress, I'm gonna add two new files, one is progress view and the other is progress component TS. So I'm just following the same pattern to have a good separation between my front end view and the code that backs it. All right, let's start with our view component first and I have a nice template shortcut for that already set up. And hopefully this will look somewhat familiar. It's a little bit different than where we started but the core of it is still in there. We have this progress, B progress meter tag which uses bootstrap view and we have the button and it's referencing our progress component TS file. That's where the actual code is gonna be. Now there are a couple of differences that I wanna point out here. One is while we have the bootstrap view tag here B progress surrounding it, we have regular bootstrap tags. So when you're using bootstrap outside of view JS, you work with these class attributes. So here we have the row class, here we have a column that takes up nine positions of our grid. For whatever reason, the people that made this great blueprint for view JS, they included bootstrap view but only for certain components. So here we have a mix of bootstrap view like B progress is included but over here we have vanilla bootstrap tags for our divs. Why they did it exactly that way, I'm not 100% sure but we still have our progress, our bootstrap view progress integration. So we can use B progress. All right, now we need to fill out the component side of it. Oops, I messed up my own live template. There we go. And hopefully this looks familiar to you. It's just now encapsulated in its own file in its own class. So we have this progress class. It exposes two properties, max and value and it has the same advance function that we saw before and it's using that local reference so that it will automatically get proxied. So very similar code to what we have before. Now we're very close here. We have our progress view component defined. In home view, we're using this progress meter tag but we haven't yet bound this progress meter tag to our progress component and that's the last piece of the puzzle. And to do that, we're gonna do that in our home components TS file. So the first thing we're gonna do is import the progress component that we just created. And so that's gonna be from shared. Gotta spell it right, shared. This is one of the reason I have all these live templates because I'm terrible at live typing. And this is gonna be our progress view component. So now we're importing this progress component and we wanna make it available to our home component. And so we can do that by setting it up in the component annotation here. And we're gonna give it a key. The key is gonna be progress meter. Hopefully that looks familiar because that's what now becomes our dynamic tag. And we're gonna bind it to our progress component that we just pulled in. And I messed this up a little bit. It's almost right. I need to set this up in its own components object and then this goes inside components. There we go. Let's see. And it is complaining about this shared progress, progress dot view. There we go. Okay. So now we've wired everything up to recap. We started out by expressing the ideal scenario. So ideally I have a progress meter tag that I can reuse in different places. And then we went and backfilled that in by creating our progress component, the code that backs it. And then finally in our home component by referencing that now as a standalone component and it's the progress meter key that allows us to now use that as a tag. We went through that kind of quick. Hopefully it is clear. And let's see what we get back when we get set up. Great. So there is our component and it should be completely functional. Let's make sure that is the case. Awesome. Now, one thing that I didn't point out which I will do so now is that our API is proxied, but all API endpoints also require authentication. So if we sign out, we'll now see that when I try to advance this meter we get back a 401 response because it's unauthorized. So ideally, I don't even wanna show the progress meter until we're authenticated. Well, J-Hipster makes it super easy to do that or it's kind of a mix here of UJS and J-Hipster that allows us to do that. Back in my home component, I have this vif attribute and it recognizes authenticated. What this is saying is that it's not gonna render the progress meter component unless I'm already authenticated. So we'll give that a chance to reset. So now in this unauthenticated state I don't see the progress meter at all. After I authenticate, I now do see the progress meter. Very good. All right, last piece of the puzzle for tonight is to switch from key cloak over to octa. All right, our next step is gonna be to switch over from key cloak to octa and to do that we need to provision an octa org, create an oauth to application in octa. It'll actually be an open ID connect application. Now that provisioning is made super easy with octa's Heroku add-on and so we're gonna look at that and then we'll update our J-Hipster app with some simple configuration changes. Let's take a look on the octa side of things. Now over here I'm logged into my Heroku account. If you already have a Heroku account you can take advantage of the octa add-on and so the first thing I'm gonna do is create a new application and I'll call this application let's say octa Heroku demo, how about that? Excellent. Now creating this application doesn't do much it's just a shell within Heroku but what we can do from here is add add-ons. Now there are a lot of add-ons in the Heroku elements marketplace things like MySQL and Postgres and Redis and others we're gonna add in octa's Heroku add-on and when I click provision that's gonna kick off the provisioning of this octa org and it will be preconfigured with the OpenID Connect slash OAuth2 applications that we need to wire up our J-Hipster app. This provisioning takes about 25, 30 seconds should be just about done, there we go. And now from here what is very nice is I can single sign on over to my octa admin console. So this is what the octa admin console looks like if you've never seen it before. Also I have a whole bunch of environment variables that have been created for me including everything that I need to connect my J-Hipster app to my octa OpenID Connect app. The three bits of information that I need here are the issuer, the secret and the client ID. So I've just copied those and now over here located in the source main resources config folder in my J-Hipster app is the application YAML file and you can see that that's preconfigured to talk to Keycloak running in our Docker. So now what I'm gonna do is switch over these settings by just replacing the client ID and the client secret as well as the issuer. Now once I've done that I can just restart my spring boot app and now everything I need to connect my J-Hipster app to octa is all set. What we're gonna see in just a moment I'm gonna bring up an incognito window. We're gonna see that we have an issue that we're gonna resolve very quickly in over an octa. So the way that this communication works for this OAuth flow called the authorization code flow is that we're redirected over to octa where we authenticate and then octa is gonna redirect back to our app. This is the safest way to manage authentication with an OpenID Connect app because the credentials never go anywhere but the service provider which is octa in this case. Also as a side note you can customize the look and feel of this.  The problem here is that octa won't redirect just anywhere it has to be whitelisted and so we wanna take this redirect URI that's been set up by our J-Hipster app and we wanna configure octa to recognize that. So from our octa admin console I can go over to this Heroku Created OpenID Connect app and on the general tab I can edit it here and I can add in that redirect URI as one of the valid redirect URIs and now octa will redirect to it. While I'm here I'm also gonna set up our log out redirect URI that also has to be whitelisted and so now I have that set up and I'm gonna save this and now when we jump back to our app and we go to local host 9000 this time when I click sign in I'm redirected to octa's hosted login page which again can be skinned and customized to have the look and feel of your brand. Now in order to authenticate I'm gonna go back over here to my Heroku configuration variables, my environment variables and I have a default admin email and password that were automatically set up for me and so I'll paste them in here. Now I can authenticate again. It's asking me to set a security question that's a one time operation that I need to do because it's the first time that I'm logging in and now we're back into our J-Hipster app as this logged in user and I can interact once again with the progress meter and if I go ahead and log out we still have the same functionality that we did before where I no longer see the progress meter. So pretty good. We went from zero to a separate spring boot and Vue.js app to J-Hipster layering in authentication in our single one stop shop application. Now what's left to talk about this was a long presentation so that we couldn't cover everything. Vue.x is a Vue.js library for state management. So for instance, if we wanted to reuse our progress meter component across different other components and have it show the same progress in all those components we might use something like Vue.x to manage its state. It has really great storage capabilities for data bindings. We also didn't talk about JPA or caching. Those are elements that you'd probably have of a real modern web application and we didn't talk about deployment. Now I'm not affiliated with Heroku in any way but I do really love their service. It's super easy to deploy Java spring and spring boot apps, J-Hipster apps, it's really easy to deploy to Heroku. So I encourage you especially for prototyping and demoing but even for production apps to deploy to Heroku. That brings us to the end here. I have the QR code up once again that will bring you to the GitHub repository that has this slide deck as well as links and references to everything that we talked about today. Thank you for your time and attention.


As you guys know, or some of you guys may not know this, but we're going to be hosting a $100,000 mock-gara tournament. Okay, on my stream right here October 30th, October 31st We're gonna be hosting a hundred thousand dollar mock-gara tournament. OTK is putting this thing together with Starforge This and it's a Starforge mock-gara. We're very excited. Obviously. It's gonna be great And there's been a lot of talk and whatnot and people have already started leveling One of these classic hardcore channels has already started putting together like a death compilation for People leveling in the mock-gara, so I haven't watched it yet, but it was linked to me. I'm going there I'm gonna find it real quick official OTK classic hardcore mock-gara tournament moments week one I'm super super excited to be hosting this thing if you guys are watching this on YouTube You guys can watch it on my twitch channel twitch.tv slash S fan TV. I stream everything. I do all kinds of stuff I do IRL. I do variety games. I do all this stuff You guys know the you know my core how I got started was vanilla wow private servers from the OG days You know that all that stuff all that background from years ago I'm always gonna be a huge supporter of classic wow. It's a good opportunity for us Finding ways to be able to host events and be able to like support the community is like super sick The fact that we had the opportunity to do that so let's watch this official OTK classic hardcore mock-gara tournament moments week number one Bro what oh, I'm sorry What is perp doing? What dude? Wait was that a resist on the gouge Perry the gouge I was like resist what I was so confused Perry the gouge And drop to his death to dude to be fair I don't know what it's like for rogues because I don't play a rogue, but I don't know like The rogues have safe fall at a certain point Was he just relying on safe fall or was he going for the was he going for the I thought I would hit this and survive Oh, yeah, I die like that. That's so dumb. He was going for the young death The carpet shameful embarrassing death. I should uninstall the game right now. That's how it goes, dude. That's life Okay. Yeah, look at that Clash is a she done it nice I thought jelly was like oh no, what's happening? What's happening?  Dude, what hold on? What did he what did he do? He's targeting this guy McRoot jelly was like Oh wait this bird spawns. What's happening? I? Don't even I've never seen this quest is happening. Is it oh, it's a rogue lock-picking quest. Oh No, oh No No, he's gonna get back I'm dead bro He got lost in the boat. Oh man. I got lost in the boat Do No, it says to use this item on it. I Didn't read it before you see do average classic player You know this guy's like a multi glad rank It's a multi-glad or there's a multi-glad rank on it Good, let's see. Let's see do Healing wave Like I gotta go get reckoned. Okay Play the shaman. Oh, he's going for it. He's almost at a minute. Well. Oh, no See dude, that's so unlucky, man. Oh Shit, that's so unlucky No, dude, he's going for this. Oh That's so unfortunate. Oh No, oh No, he tried the target dummy. It didn't work. He's got his whirling axe. Here we go, Sony No, oh my gosh the agro to after one hit So lucky dude I'm gonna move this up here Dude, we got disconnected with dead dude. Are we live? I'm dead It doesn't go No, three mobs on us No dude, I Dude, I heard he died. I didn't know that's what happened He got he how do you disconnect was it just like a d-sync and just disconnect No Dude for us that's That's nice. We're having a Grayson today, too Bro, what it hold on? What is this resolution? He's playing at what is this is like a This is not like 16 by 9.  Why what is this resolution? Yeah, like you're like he like took 4 by 3 and he stretched it is this as you'll see us 1.6 player like what's going on?  Okay, how do you get all this aggro okay, so they're they're in they're in Oh my gosh, is it just two of them? Why is there just two of them? Where's the rest of the group? They're doing wailing caverns. Where's the rest of the group? You've got the druid healing They're back there thumbing their nuts. What's going on and you have your back turned Dude, this is the thing man. People are so obsessed with with does he have it like is he does he not have backpedal? People are so obsessed with this idea People are so obsessed with the idea of like oh never backpedal But as a melee especially in like classic WoW where like the auto attacks are so important You need to be able to reset your facing like if you want to change the key bind from like s to something x Also with something like x right? That's one thing But the completely unbind your your backpedal is not a good idea because it allows you to reset your facing instantly and in one press To where you can still parry and block and he pumps retail, which you probably should have done You should have noticed oh He noticed that she got slept whenever she got slept Yeah, and they don't have a cleanse Oh my god 36 months as fan. Thanks for being my streamer as fan cozy as Fandle twizzlers. Thank you for the 36 months, man So he's pulling this big-ass group and a druid of the fang this group is over here thumbing their nuts This one guy is mining and the other two guys are watching him Like what is it? What else is in this group? You got the rogue? Oh, of course the rogue is picking a vein For you at a health stone. Yeah, I mean like a lot of times especially in classic WoW what happens so many times is People see somebody die or see something bad happen for somebody and it's in it Literally everybody does it but then everybody wants to critique them like they've never done that or they've never made a mistake It's the craziest thing dude I would say more than anything like the fact that the rest of the group is sitting there thumbing their nuts Well, they're pull I mean they shouldn't pull when they're doing that It goes both ways but like why are they just hanging out while that guy's getting a va in. Oh my god Chat never makes mistakes true.   Oh Close nice That was nice. Let's go. We're fine. Let's go dude and look at this man How do we see exactly how low he is? Oh? Oh shit, he goes he takes another hit 33 damage and look at this He has like a lacerate or something on him those dudes ticks for 10 health It takes for 10 health and it's not enough to kill him He might have died if he waited one more second deal.  That was fun though. That was a fun level of close, but we're fine He's a rep main see only a rep paladin can do these kinds of things man Like if you play a rat paladin, it's like you're a chess grandmaster. Okay, everybody else is checker's child Okay, they're checker's children, but as a rat paladin.   I forgot about the kick she does that was really close. That was fun though That was a fun level of close, but we're fine My god Bro do now.  I was letting him solo for honor I was literally just watching bro. I Could not do that man. I could not I just I just couldn't do that man Like I would let them solo, but if it got to the point where I know they're not gonna make it like I know I Step in okay worst on it's the same guy. This is the same guy. This is the same guy.  I mean again? It's this is another hindsight is 2020 But like when he got the war stomp off He goes It's the war stomp right here Okay So this guy is just so fast No, I wonder I wonder why He didn't try and ruin him. I don't I mean to be fair. I don't think he expected me that I would also thrashed him. Oh my gosh.  In the morning streams.  Oh, no Did he bounce?  He goes bounces off the thing. I need guys all I need to have the slightest chance is about five thousand gold Couple of epics all the best BOE's a group that will carry me through all the dungeons a group that will feed me all The loot from the world bosses a guy who will sit in camp title charm tag it How did Ziko get his name invite me and also a warlock who will summon me there when it spawns I guess if you I guess if you're not a classic main I Guess if you like yeah, I don't know About 20 rogues who will protect me in the stv arena so I can get the the trinket I Think I could do the rest on my own That's okay. Oh my god I'm dead. I got nothing see you died again.  That was so scary. I thought I thought there was no shoddy's get away from there run my little man. Oh Can I take that? No, man, where's the healer? No, no, no, no, no. He's dead. Oh No, oh no. Oh No Somebody left somebody left the group somebody left the group. Oh My gosh, somebody left they bailed. Oh Yeah, I mean he's got aggro. You got a hearth. You got a hearth. You got a hearth, dude You got a hearth Wait, what happened? They killed it. Oh They should show I'm killing it That's crazy, dude Hey, I'm gonna be honest if somebody died and somebody left the group at that point it's every man for himself I would a hearth a hundred percent. I Would align a site he got aggro. Yeah, just Like it's Dude this guy is getting railed what this guy's taking so much damage What is hitting him so what level is he look at his health bar? Well, I'm dead. Oh my wait. What oh No, no, he's good. He's good. He's good. Oh, no, I thought he got away No, my gosh, they're all stealth later everybody. No See I don't play horde so like I do for alliance all those guys are friendly So I don't even know that quest. I mean I've seen a horn do it, but I don't I don't like know it No That sucks man That sucks, I mean this is there's been a lot of talk man I'm very excited. I'm very proud of like all the work and stuff that's been done already the OTK the Star Forge Mach gara hundred thousand dollar tournament This is the biggest event in in the history of classic Wow, right? It might be duty honestly This might be the I think this is the biggest price pool ever for a while but I'm super super proud everything that's gone into it and the the guys Putting in the work behind the scenes like obviously we have like we've done a bunch of events and stuff in the past but like Specifically with wow stuff and having like the the right people working on this stuff. I'm super super happy I think it's gonna be great It's a great way to support the community like I said, I don't play wow all the time anymore I'll just you know, whenever whenever I feel like it I'll I'll run it back and I'll play some wow But I've been doing a lot of variety a lot of IRL and that kind of stuff whenever we get like a cool Opportunity like this to like be able to support the community like that. It's it's sick man So I'm very excited. I'm very proud. I can't wait man October 30th and October 31st if you guys are watching on YouTube Make sure to come follow my stream twitch.tv slash s-fan TV. That is where the tournament will be held You want to make sure you're there twitch.tv slash s-fan TV? YouTube Instagram discord reddit twitch Twitter everything is s-fan TV Make sure to subscribe to the channel turn on your notifications all that stuff New uploads almost every day streaming almost every day all kinds of crazy stuff I do literally everything from RPGs variety games IRL sports just the whole nine yards it like you want to talk about a versatility Versatile content. I probably do more different things than than just about anyone else you've ever seen so For better or for worse, but anyway, I hope you guys enjoy Leave a comment. Let me know what you think and come see the tournament in October 30th and October 31st