Yeah, so I guess for the past year or so, I've been working on an open source textbook with a group of carpentries instructors. They're on the screen, including Greg Wilson, who some of you might be familiar with, who co-founded Software Carpentry and has written a number of programming books in the past. And we're currently at kind of the review phase of the publication process. And so we're really looking for feedback on the book and what's in it and whether people think it's useful and things like that. So this conference kind of came around at a really good time. So the motivation for the book's really from teaching Software Carpentry over the years. And obviously that's the model, I guess, that's used in that is a two-day workshops where you basically expose researchers to some programming best practices. And the outcome is that you hope that they take on some of those best practices and their personal workflows become more efficient. The nagging question for me, and I think for a lot of carpentries instructors is, what if we have more time than that? What if we had a whole university semester or something like that? What would we teach? How far can we progress people? And there are some university courses that have been popping up that are starting to use carpentries materials in them and things like that. And so we thought, yeah, I guess with that extra time, you could get people to the point where they weren't, you know, they're not only just able to, you know, make their personal workflows more efficient, but get them to the point where they can write code that others can easily understand, install and contribute to, i.e., writing research software, basically. And so once we kind of committed to this idea of essentially writing, you know, software carpentry of the university course, one of the first things we decided for the content is that we wanted it to be a work example, not just a reference book. And so basically in the book, what we do is we actually build a research software package from scratch. The one that we build counts the words in large text and analyzes the word count distribution. So, for instance, in the top right there is the word count distribution from our package for Jane Eyre, the novel. And so, yeah, and so basically along the way we write this package and we verify something called ZIF's law, which says that in big texts, the most frequent word is generally two times more frequent than the second most frequent word, three times more frequent than the third most frequent word and so on. So it's a pretty cool kind of research result. And with this software package, we can explore that and check whether different texts are consistent with ZIF's law. And along the way, basically, as we're doing this in the process of building this package, we cover a whole bunch of topics. So the Unix shell, writing command lines with programming, with Python, version control, working in teams, automatic analyses, program configuration error handling, testing, which is obviously a big one, provenance talking about if we were going to publish these results in a journal paper or something like that, how do we document the computational aspects of that research so it's reproducible. And then Python packaging, how do we package this up so that others can install it, how do we document it so others can contribute to it, use it effectively, all those kinds of things. And I guess it's really, on the right hand side of the slide there is three kind of characters we use throughout the story and their backgrounds there. And so it's really, I guess, thinking about training up research software engineers, if you like, from people who have come from a research background and are moving into writing software, as opposed to, I guess, the other way into research software engineering, which would be you have a computer science degree or something like that and you're getting up to speed on the research. We provide exercises and solutions and things like that. And it is kind of framed as that it could be used hopefully as a university semester course, but also flexible to be used as something for self-study or hopefully something that carpentries and instructors can take bits of it here and there to use in workshops, shorter workshops and things like that. So hopefully got some flexibility and it's not just a university kind of textbook and that's it. Yeah, so the title of it is Research Software Engineering with Python. It'll be published in early 2021 with Taylor and Francis but it's a really cool thing. They let you do it with a Creative Commons license. So the online version will still be up even when the book is published. It will still be on GitHub when the book is published. We can still take contributions, continue developing the book as we go along. And in terms of future plans for those who aren't Pythonistas, there's a small group, I'm not involved in this one, but some of the authors and some new people are kind of coming on board to start writing an equivalent book using R. So if you're kind of wanting, if you might be interested in getting involved with that on the ground for maybe let me know and I can put you in contact with the group of carpentries people that are starting to put that book together. Yeah, that's all from me. We'd love, yeah, really love any feedback at that GitHub repo before we actually publish the thing. Thanks. Thanks, Damian. I think we'll take maybe five minutes for questions. If there are any questions, what questions do attendees have? All right, we don't have any questions yet. Mark, are there questions? Sorry, I can see an unmuted microphone. Okay, I think we'll move to the next talk and then if people have questions, please do feel free to ask them at the end. So next, I will share a video from Titus Tang who is a trainer on the data science and AI platform at Monash. And he's leading the effort to design, develop and deliver data science and AI training courses for Monash researchers and students and also the wider research community in Australia. And he has a background in deep learning and computer vision with a PhD in computer vision engineering, also from Monash. So bear with me as I try to share the video of this presentation and Titus does join us. So there will be opportunity for questions at the end of the video. There we go. I think that's the one I want. And... Hello, my name is Titus Tang. I'm a training manager on the Monash University Data Science and AI platform. I'm here to talk about a collaboration in skills training and workshop organization between Monash University, the University of Queensland and the Queensland Cyber Infrastructure Foundation. I'm here representing a large group of people working on this project. My counterparts are Dr. Nick Hamilton from the University of Queensland and Mark Crow from QCIF. This project that we're working on is funded by the ARDC platform project called Environments to Accelerate Machine Learning Based Discovery. As the name indicates, the purpose of this project is to create the right kinds of environments for hardware, software and people in order to facilitate the adoption and acceleration, accelerate the adoption of machine learning in research. What I'm going to talk about today focuses on the subset of this project that looks at skills training and workshop organization. So one of the first questions we asked ourselves when we embarked on this project was how do we upskill people in machine learning, upskill our researchers, staff and students in machine learning, not just in our home organization, but across partner institutions and across Australia in general. One of our observations that we made was that each institution typically had a set of workshop content that they have created and are running on a regular basis in their own institution. To our surprise, there was a very little overlap in the content developed by one institution relative to that developed by some other institution. And so that was good because everyone had a piece of the puzzle that we could place together to form a better, bigger picture.


Testing testing Testing how's everybody doing welcome back to my channel this week.    And it goes all the way up to like right here Oh, I got this one. I was like 39 38. I got this one. I was like 18 17 years 20 years Now imagine what an artist can do that has a lot of experience in applying tattoos that tattoo I promise you it's not going anywhere because the way they know their setup. They know how to apply the tattoo They know their handspeed needle depth Although those little things matter the best advice that I can give you is that if you're thinking about getting a tattoo Make sure to check out the artist he'll work and if you see they're working person even better Question number two is the setup that I used to record my videos and take pictures First of all when it comes down to an iPhone, there's so advanced that you can do everything That you do on a camera on an iPhone. I mean they have similar qualities Like an iPhone has 120 120 frames per second. It has 60 frames per second 4k you can do so much in an iPhone But when it comes down to a camera The only reason that I like using that camera better is the fact that I like having options when it comes down to lenses I mean if I wanted to get a micro lens that I wanted to show that needle in action I can get a lens that can do that if I wanted to get a lens that I can be up close But still show me the whole entire picture I can get a 20 millimeter and I feel like having a camera allows me to Control my settings and I just had I just like having those options Comment down below and let me know what you like using better either an iPhone or a camera and tell me your pros and cons about this topic With that being said now I'm gonna compare how my tattoos look with my Canon 90d and an iPhone now with my Canon 90d I use a light that my fiancee gifted me in Christmas Saying the lens that I'm using for this camera is a 20 millimeter with the polarized lens That goes on it at the same size 20 millimeters And I'm gonna compare it to my iPhone that I'm not gonna be using any polarized filters No special lighting just the camera's phone the phone's camera The phone's camera. I'm just gonna be using the phone's camera I have seen a couple comments on my videos saying that That because I use a special set of with special lighting and polarized filters And that my tattoos look different than what they look like in person, which I understand that concern Nowadays we have so many applications or apps that allow us to alter the the pictures and videos And yeah, I mean it's becoming a concern in the industry because now some people doubt that a tattoo looks the way It looks and it definitely hurts all their artists that put a lot of effort into their tattoos and for somebody to question their Their work is that it definitely hurts, you know So definitely I feel like this topic is really important to address. So yeah, let's get to it Okay, so here what I'm using is my Canon 90d with a polarized lens And as you can see This tattoo healed up the way I wanted it to I use true blacks and true grays So basically what the polarized filter does it deflects the light from the middle of the tattoo to none So basically the the whole purpose of it is for it to just show the skin or the tattoo Nothing special about it. So here I'm gonna Turn it and you see that there's a glare in the middle of the tattoo Which definitely affects the way the tattoo looks now because in the middle all you see is just a white glare you see that So all it does a It deflects the light so as soon as you turn it you see that So now there's no glare in the middle now. You're able to see every detail all the white highlights are still are you hungry now? I can I can hear your stomach So This is already what maybe like almost a month healed the bottom of it and if you've seen this video comment down below let me know what you think about this video all freehand and The top here we have the chimpanzee that we did at the body our expo if you haven't checked out the video check it out It's really cool like very informative So yeah, this is already two months healed and it's Perfect. I mean the black still there's solid, you know, there's not much I can say So now I'm just gonna record a couple shots making it look cool with some with some intense music So it can look more entertaining ready So now I'm gonna start recording with my iPhone and show you guys the way my tattoos look on my iPhone nothing special just my Just the camera's phone or the phone's camera. Oh my god The phone's camera, so here it is and record dang. All right, here you go So switch over to my iPhone. So this is the way it looks See that the blacks are still there. There's a little bit of glare in the middle not too much But yeah, I mean you can tell that Solid nice But yeah But yeah, I mean other than that, I feel like it's it's very important to talk about this topic because there's a lot of There's a lot of tricks and softwares out there at this time where you're able to you know Adjust the videos and alter the pictures and it gives a false perception of How tattoos supposed to look it was very important for me to talk about this topic because I Put a lot of effort into my tattoos and I wouldn't want anybody to down my work and the way it looks in person Like it did not nothing faded Solid blacks are still there. The true grays are still there. White highlights are glowing, you know If you're looking into booking an appointment with me follow these simple steps send an email with a concept that you have in mind Placement and if you're local or out of state Include as many details as you can the more information we have the easier it is to book Please understand that due to high volume of emails We are not able to select every single inquiry and we ask for everybody to be patient So send me your craziest ideas and I can't wait to tattoo you peace


Or definitely, it's not because our genes have become weak, we have become weak, because we have become weak, the next generation will be weaker, unless they really strive. There is substantial scientific evidence to show, within a single generation the genetic structure of a particular family or whatever can deteriorate, there is enough evidence to show that. Of course, it can always be revived, but will revival happen is the question. When you're going to have an electric car to drive from your sitting room to bedroom or you drive your bed wherever you go to the office, please, may happen. Maybe you drive in your bed to your office and work there and sleep there and because everything is touch of button or touching buttons also will go away. Probably, if you verbally say it, everything will get typed and all the work gets done. And you don't have to use either your body or your brains in any great length. Definitely in a single generation we can fall dramatically. I think it's happening at an alarming rate. If you look at the children today, simple things that all kids would be capable of when we were growing up, today is like circus for a whole lot of children. Only very athletic ones can do it. I was speaking to a group of very elite group in Chennai. Today these young couples and others who are very well-to-do and in industry and thing, they all pride themselves that they are all doing fitness, they're walking on the treadmill, some of them are cycling and of course they all… all the ladies wearing zero size whatever stuff. They think they are fit. So I asked them a simple question. Suppose all you guys are walking on the street, if a tiger came or a flood came or something happened, how many of you can just climb this tree and save your life? How many of you can do this?  They said, yes? Then that means what? This is not fitness, you can only walk on treadmill and wear zero size by eating only salads. If you eat anything more, you'll have indigestion. This is not fitness. You think you are fit if you look trim and fit into a particular kind of thing, no. The very stenosis of life within you have become weak. I know this very well because I find it's almost impossible to initiate, I would say among the people that I meet, there may be people in rural areas who are capable of this, but among the people who come to us, ninety percent of the people are unfit for any kind of strong… any kind of strong Kriya Yoga because they don't have the body to do it. They may have the wish to do it, but they don't have the body to do it. Their… their fundamental physical structure, they may look okay, they may look reasonably fit, they can walk, they can do things, but they're not fundamentally strong within themselves. The basic structure is not very strong. That weakening is happening dramatically. And as these technologies make you do less and less, both in body and brain, I think it is a… it's a very serious affair, very, very serious affair. It is the survival. Probably that is how we will decimate ourselves, not by bombs or fire or ice or whatever. Probably we just kind of pitter out that we won't have the strength to exist by ourselves. And I don't know, right now I know a whole lot of people beyond eighty-eighty-five are on kind of different types of life support. This need for life support, the age at which life support is needed, I'm just thinking I'm… I don't have all the facts on this, but I'm thinking in fifty years time, if we continue like this, the age at which human beings need life support may come down dramatically by ten, fifteen years than what it is right now. And that is serious weakening of human structure. And the next generation that that generation reproduces will definitely inherit that. And the genetic structure, if it weakens over a period of time, it's definitely of concern. So one of the things that we need to do, the reason when we set up the yoga center in America, we set up a thirteen-hundred-acre ashram. Everybody said this is crazy. Sadhguru, we must buy twenty-five acres next to Atlanta and do the ashram. I said the ashram, the purpose of the ashram is not just to have a center and meditate and whatever, it's to regenerate life. I'm not just saying one ashram is going to save this, but it is needed in many, many places this needs to happen that we have to go back to the land. We have to live with the five elements, we have to be exposed to the earth, we have to be exposed to the sky, to the rain. These things need to happen without being in communication with all the five elements, without being in communion with all the forces of life. All the forces of life are not just within your body, it's just all over the place. Without raping with it, without confronting it, without every day being in touch with it, life doesn't happen strong. We need to live strong. That is the purpose of yoga, not just being frail and eating vegetables and closing your eyes, that's not just that.


To start things off, we'll look at the relational model itself. What's called a relation is composed of both tuples and attributes. In common parlance, though, we call relations tables, and tables are made up of columns and rows.  So, here is an example relation, an example table. It's a table with data about planets, so we'll call it our planets table. And it has four columns for attributes about planets. First, there's the name, there's the distance from the sun in miles of that planet, there's the length of a year in Earth days for that planet, and then there's the length of that planet's day, how long it takes to rotate expressed in terms of Earth days. Each tuple in this relation, each row in this table, represents one planet as represented by these four attributes, the name, the distance from the sun, the length of the year, and the length of a day. Be clear that here at the top of the table in dark blue, those are just the headers for the columns. That's not actually a row. Now, a key thing to understand about the relational model is that the order among the tuples, among the rows, is not a part of the data. As far as the relational model is concerned, the rows aren't in any order at all. They just happen here to be written in this particular order. Because of course, if you present a table, you have to show them in some order. But as far as the relational model is concerned, the fact that Venus here is listed first and Mars is listed last, that's just happenstance. If we mixed the rows up and put them in a different order, it would still be the same table with the same data. Likewise, the attributes of a table, the columns, those don't have an order either. So the fact that we have the name column first is just happenstance. We could put it second, we could put it third, we could put it fourth. It doesn't matter. We could present these columns in any order and it would still be the same table. Another way of thinking about this is that this is a planets table. So each tuple here, each row here, represents a single planet. And what makes up our definition of a planet is these four pieces of data, a name, a distance from the sun, the length of a year, and the length of a day. Our table though contains some number of planets and amongst those planets, there's no concept of order. Each row is just one more planet. And likewise, the attributes that make up each planet, well those don't go in any order either. These are just four independent facts about each planet. Now in the relational model, when we wish to retrieve data from our database, we want to retrieve some data from one of our tables. That's what we call a query. And when we query a table, we don't necessarily want the whole table. We maybe only want certain rows and certain columns. When it comes to picking columns, we just specify the ones we want by name. When it comes to rows however, we use a predicate, some test condition, to filter for the rows that we want. So when we query our planets table, we might filter for say, the rows in which the distance from the sun is greater than 100 million miles. So that leaves us with Uranus, Neptune, Jupiter, Saturn and Mars. And say that in our query, we don't want all the columns. We just want the length of the year and the length of the day. Well, we just specify those by name. And this is the end result. This is the result of our query, which notice looks very much like a table, because it is. It has columns, specifying attributes, and then it has some number of rows. So this is actually a very important concept. Any query always returns just one table. The question then is, well, what if I want a query that brings in data from multiple tables? And well, yes, that's actually possible. But doing so will involve what's called a join, where you take more than one table and combine them into one. And in your query, once you've joined tables together, you can then again select for columns and also filter for rows by a predicate. So first though, how do you actually join tables together? Say we have these two tables, a cat's table and a dog's table. The cat's table has three attributes, three columns, name, wives, and hair length. And you can see it has three rows. So it's effectively a column with three cats. And then the dog's row simply has two attributes, sex and name. And it has two rows, so effectively two dogs. Now, if we prefer what's called a cross-join of the table's cats and dogs, this is the table that results. This is what we do when we match up every row in the cat's table with every row in the dog's table. It's taking the columns of both rows and matching them in all combinations. That's why we end up with six rows, because the cat's table had three rows and the dog's table had two. Three times two is six. When you pair up everything in a set of x things with a set of y things, the number of pairs that result is x times y. So if, say, the cat's table had five rows and the dog's table had seven rows, then the result from the cross-join would have 35 rows, five times seven. Also note that this table has all of the attributes, all of the columns, of the original two tables. And also note that I've labeled each column with the table from which it originates, which is important here because we have both a cat's name column and a dog's name column, and those are two distinct columns. So just to state this all again, when you cross-join tables A and tables B, you're taking each row from table A and matching it up with every row from table B. So the number of rows you end up is the product of the number of rows in A, the number of rows in B, it's just the multiplication of the two, but the number of columns is simply the sum of the number of columns in table A and the number of columns in table B. So this is what's called the cross-join. There are also, though, what are called inner-joins and outer-joins. And inner-join, very simply, is the same deal.  So here we've performed the same cross-join from the same two original tables, but then we filtered to keep only the rows where the dog's sex column value is female. Now, at this point, you're probably a bit skeptical about the utility of joining tables together because in this example, we've taken really what are two totally unrelated tables, and the joining of two unrelated tables generally doesn't really produce useful results. If we go back, though, and tweak our example tables just a little bit, here changing a few of the names of the cats. And once again, we do the cross-join. Well, now with an inner-join, we can filter by a predicate that is possibly useful. Here we're filtering for all the rows in which the cat's name value equals the dog's name value. So we're ending up with a table that lists names which happen to be shared by both a cat and a dog. Still not the most compelling example in the world, but hopefully you can begin to see how joining tables together might be useful. Now, the last kind of join is what's called an outer-join in which we take the inner-join and then after we filtered out rows, then we add back in any row from one of the two original tables that is not present in this result, in the filtered result. And these rows we add back in, we match them up with null values. So here, for instance, is the same inner-join we just did but made into an outer-join. And whereas the inner-join left us with just two rows, this outer-join adds back in a third row with the cat-fluffy matched up against null values in the two dog's columns. Why does the outer-join do this? Well, recall in our original tables we had three cats, fluffy spot, and princess. In our dog's table we had two dogs, princess and spot. And both of those two dogs, princess and spot, were included in the result of the inner-join, so the outer-join doesn't need to add them back in. They're already represented in the table. The cat-fluffy, however, the inner-join was missing that, so the outer-join adds it back in. The inner-join left us without that row from one of the original tables, so we add it back in, but then we match it up against null values in the columns from the other table. In this case, the dog's table columns. Now, there are actually three different kinds of outer-joins. There's what's called a full outer-join, which ensures inclusion of all rows from both tables, both of the input tables. There's what's called a left outer-join, which ensures inclusion of all the rows from just the left table, which is to say if we write A outer-join B, the so-called left table is A, because it's the one written on the left. And conversely, a right outer-join ensures inclusion of all rows from just the right table. So if we A right outer-join B, that's ensuring inclusion of all rows in just table B, not A. In common parlance, we usually don't say left outer-join or right outer-join. We just say left-join and right-join because the outer part is implicit. There's no such thing as a left inner-join or a right inner-join or a left or right-join of any other kind. They're always outer-joins. For a full outer-join, you can't drop the full part. You have to always say full outer-join. When it comes to inner-joins, and I should say also cross-joins, when it comes to inner-joins and cross-joins, they are both always commutative and they are associative. And commutative recall refers to an operation where it doesn't matter the order of the operands. So if you write A inner-join B, it's the same as B inner-join A. Just as A plus B is the same thing as B plus A. An associative operation recall is one in which when you chain a succession of these operations together, it doesn't matter in which order you do them. So if you wish to inner-join together A, B, and C, or cross-join them, it doesn't matter if you join A and B first or B and C first. Or for that matter, we could join together A and C first and then join the result of that to B. Because inner-joins and cross-joins are associative, it doesn't matter. Outer-joins, though, are a different matter. While full outer-joins are commutative, left and right outer-joins are not. So A left outer-join B is not the same thing as doing B left outer-join A. And when it comes to stringing multiple joins together, outer-joins of any kind, full left or right, are not associative. So when you write A outer-join B and then outer-join the result of that to C, that is different than first joining B and C together and then joining the result of that to A. So in short, with outer-joins, the order of joins matters in a way that it doesn't with inner-joins. A final thing to note about joints here is that it's actually possible to join a table with itself. So here, for example, we take our 2 by 2 dogs table and join it with itself in a cross-join.  So that's all the gist of what you need to know about joining. There are a few more interesting things, though, we can do in our queries, such as, say, filtering four distinct rows. In other words, getting rid of duplicates. In this table, for example, we have two rows where the values in each column are all the same. It's two cats named princess with six lives and long hair. If our query filters four distinct rows, then these two rows consolidate into one. In other cases, it may be useful to consolidate columns that only match in certain columns that aren't total duplicates. So here, for example, if we group on the name column, we're consolidating duplicate names, leaving us with just a name column. Since we're grouping on name, it doesn't make sense to include the other columns because the values in those other columns might be different. The hair length, for example, we have three princesses that are getting consolidated into just one princess, but two rows with the name princess have long hair while the other one has short. So the question is, well, if we had a hair length column here, what would it be? Would it be long or short? And the answer is, well, neither would actually make sense. We have conflicting values. It is possible, though, to group on multiple columns. So if we group on both the name column and the hair length column, then we get back a table with the name and hair length columns in which the name and hair length together form a unique pair. So we have two rows with the name princess, but one has the hair length short and the other has hair length long. Likewise, if we were to group on lives and hair length, we'd end up with a table with the lives column and the hair length column with two rows with a lives value of six, but one with hair length long and the other with hair length short. When we group columns it's then possible to use what are called aggregate functions. An aggregate function produces an output value by taking in all the values to get grouped together. We can then produce these output values to produce totally new columns, columns which aren't in the original table. So here we have a table of car inventory specifying a car make, car color, and then the quantity of cars with that make and color. So for example the top row here says that we have 15 blue Toyotas. If we were to then take this table and group on the make column that leaves us with a table of three rows, Toyota, Ford, and Honda. What's new here is that we're using the aggregate function sum to produce a second column and the sum function is taking the value from the quantity column and what the sum function does as you might imagine is sum together all the values from that group. So the Toyota group here has the quantities 15 and 10. So you add those together and you get 25. The Ford group here has the values 3 and 20 which you add together and get 23. And then the Honda group here just has the one row so it's just the value 9 added to nothing. So we just get 9. So you can see how this is useful. Given our table of inventories of car make and color we've gotten a table that tells us how many cars we have in total per make. For another example we're taking the same inventory table but we're grouping on the color column and we're using the max function instead of sums. We're taking the max of the quantity and what the max function does is it takes all the values from the group and it returns the largest one. So in the blue group we have the quantity values 15 and 9. 15 is the larger so that's what gets returned. In the red group we have the quantity values 10 and 3. 10 is obviously the larger so that's what gets returned. And then in the green group there's just one value 20 so the max function just returns 20. I should state at this point if it hasn't been obvious but these two functions these two aggregate functions sum and max only work on numeric values. It wouldn't make any sense on say a string value like Toyota or Ford. Now last thing to say about aggregate functions is you actually can use them when you don't do any grouping it's just that it treats the whole table as a single group. So here if we query our inventory table and tack on a sum quantity column notice the value for that column in every row is 57 which is the sum of all of the quantities together. Now aside from that one exception the aggregate functions always work on groupings of rows. There are non aggregate functions however what we might just call value functions and also we can use a number of operators to produce new values. So here for example we have a table with widths and heights and in querying this table we're tacking on two columns. One which is the multiplication of width and height together and another column which uses the square root function to get the square root of the height. So in the bottom row here for example the width times height column has the value 16 because the width is 2 and the height is 8. Multiply this together you get 16 and the square root height column value is 2.828427 because that's the square root of 8. So again what's going on here is we're using operators and functions provided by the database to produce new values, to produce new columns using values from other columns in the same row. Now the question is why do I need my database to do this stuff for me? Can't I just get the data from the database and then do the operations myself in my own code? And the answer is yes you can. The issue though is whether or not it's done more efficiently for your purposes in the database or whether it's easier to do it in your own code which is more efficient. Depending upon exactly what you're doing that answer might change. Generally I would say it's better to let the database do as much work as possible because the database is generally optimized for doing these sorts of things on large sets of data. Does this always hold true in all cases though? Well it probably doesn't so you'll probably find there are cases where you're better off doing the work outside the database. Now I did stress that in the relational model the order of the rows of our tables is not a facet of the data. If you take any table and you mix up the order of the rows it's still the same table. Of course though when our applications query data from the database and we get it back is this result set a bunch of rows. Quite often we want those rows in some kind of order because say we're going to present them in a certain order like say alphabetical or something. So relational databases actually do allow us to request our queries to come back in some certain order. Even if the data itself as stored in the database has no order when we get it back when we query it then we want it in some order. We want it to be presented to us in some order. So for example here again we have our table of cats and if we want to query this table but get it back in some certain order we specify which column we want to sort on. In this case we specify the lives column and we specify whether we want this order to be ascending or descending. Ascending very confusingly and ask backwards means that the values get larger as we go down the table. So as we descend the table the values get larger. It makes no sense. It's totally backwards. But we say that the values are ascending in this order because from the perspective of the program making the query and getting back the results you know in our code we get back this list of rows. And in the list we want the first thing to be the smallest value and we want the values to ascend to get bigger as we read through the list. So that's why it's called the ascending sort because the values as we go downwards they get bigger and so as we go from left to right from first to last in our list they get bigger. That's why it's called ascending. A descending sort as you can imagine is the precise opposite. The values get smaller as we go down the rows as we go from the first row to the last. And the last thing to say about sorting is you don't have to sort on just numeric values. You can also sort on text values. And as far as text is concerned values lower in the alphabet, later in the alphabet are considered greater values. So if you do an ascending sort on a text column that's effectively sorting alphabetically. A descending sort would be reverse alphabetical.


How do you get to a million dollars in revenue with your consulting agency? You're coming in, you're going after the right clientele, you're getting 30 customers paying you $2,800 minimum a month. $2,800, you're giving them a contract, try to get them to pay upfront for a year. You reach them by finding them on Instagram. I recommend you find an attractive friend just like pharmaceutical companies to DM them. Go after cosmetic surgeons, dentists, doctors, lawyers, people who one client is high value. You can start out by just doing their TikTok, YouTube shorts, and Instagram reels and Facebook shorts. And then over time, you can evolve and charge them more to do their email marketing and SMS marketing and take over their website. If they want to grow even further, you can add another service where you do their Facebook ads and you take a percentage of what you spend on Facebook.