Nearly time To have my first proper meal for the day.    It's not for when you sit Come on, man.   So before I do head off to actually clean the outside of my car Which I'm gonna do which will make me feel very good the cap the house is relatively clean. I got a clean bedroom clean car and then I'll be bringing the real estate agent and Fucking conveyance and the bank manager Those three names I've become very very familiar with lately, so But still stressful.   I went and prepped Probably like all of today's food I prepped it yesterday and this was last night. It probably like midnight and I was thinking fuck, you know Start eating this right now like I have my god Got this little lunchbox thing Now it looks a bit gay, but inside We've got I'll show you guys We got my carbs for today.  What's up? What's the favor? What's the favor? I'm just about coming to town to a day off. All right. Yep. Yeah, all right.  I've also got Three three hundred grams of chicken breast that I've just ripped off the chicken That's in there, so I'll be using that with the rice and I also have Getting low. I've only got one tuna tuna then so I definitely need to go shopping. We are Getting to the bare minimum But that's all right. So right now I'm gonna go into town. I'm gonna meet my sister obviously cleaning the car can wait and I'll see you guys back here whenever I suppose I'm still gonna have I'll probably get a coffee with my sister. So I'm just gonna have half a scoop of this just 80 80 milligrams caffeine just to give me a give me a boost little boost and What I was gonna say is that I don't I don't actually rate the taste of gold standard pre worker I think there's too many other ingredients other than flavoring in there. So the flavor sort of gets washed out by sort of like Flavorous powder sort of thing.  So we got half each and that makes pineapple apple pre-workout BCAA Drink which I've been having Most mornings.  The flavor is awesome and you don't need too much To get that flavor because you don't want too many scoops because every two scoops that you put in has a hundred milligrams caffeine and You know, I pretty much never put more than two scoops in a drink. So put it that way But anyways guys, I am actually really looking forward to seeing my sister and Renee for lunch That's gonna be good So I'm gonna go and do that and I'll check in With you guys Later on Let's do this shit That's a um, that's that's from rich pianist videos by the way If you didn't know Ella Springs turning it on once again If you don't know now, you know man, you want blue sky every single day Not to go meet the girls biggest car park in Ella Springs Huge man Like why What are you having Why I'm gonna get some caffeine What is this Very vanilla chiller with an extra shot and so yeah I Wonder how many calories so what's your guess? It's about 1800 kilojoules Is it well, maybe not I'm sorry, but when it's on full what's what's it called again? Maybe say 1500 kilojoules. Yeah, let's see warrior jeans small very vanilla chiller 268 calories So just dropped off my sister and I'm going back to the bank my Westpac branch this time to get Statements so then I can take it back to police credit union, which is my home loan bank and Finally put together this application and send it off for good. So That's what I'm doing now Any parks?  So I will just find a park somewhere here And actually the way the way I've structured You know my banking I've kept my personal banking and my home loan banking completely separate on purpose so that You know when I am putting in applications like this And I'm not where I thought or where I need to be financially The home loan lender doesn't know So I basically show him what I want to show him what I have to show him not everything So that's how I've structured it. So I've just gone to Westpac got the statements now I'm going back to police credit union and Giving him knows he's got the contract and then everything will be sent off to the lending people And I should hear back early next week But I'm not worried. It's all G. It's all G I'm just off home. I haven't cleaned the car yet. It's gonna happen. I swear But I'm too hungry. I've got to go home and have something to eat So I did actually just check my Post office box and I got This which is a confirmation of my landlords insurance Which I set up the other day. So that'll start from the 15th of April and Settlement happens on the 22nd of April. So it's just a few days following the signing of the contract that That policy started and settlement was 30 business days After signing the contract, which I actually did by accident. So I gave myself another Another seven or eight days worth of you know leeway until settlement happens by accident I was told to put 30 days Would have actually sort of didn't realize either next week So I'm just heading home now.  I need to actually pay for this pest and building inspection. So then I can be sent the bloody Sent the report so then I can pay this 10 grand. So I'm gonna call them up now And get that paid for When my phone's charged. Yeah, I'm eating. I'm hungry Chicken and rice never tasted so good So hopefully I can stick to my plan And just eat one one of these. No oats oats can come in later. I'm freaking starving Haven't weighed myself I'm kind of scared to weigh myself. I know I know I'm gonna be making progress, but You know You never know what what's gonna come up on the scale. So At the moment when I'm feeling positive I don't need to weigh myself. I can see myself getting leaner and tightening up. So It's all good.   Do you still want An insurance quote for your contents Yes, Dave Yes, I do Uh, yeah, I got a pest and building inspection done yesterday on a property on secondary street Um, I need to pay for it so I can receive it. Okay Yep, number is 4564 Cool. So, yeah, um, what was what was the story with that? I go on the the website, is it? Cool, all right then Thank you. See you. All right. So that's that done once that comes through and I have a look at it I will give the real estate agent a call To say that everything's sweet Pest and building is done. There's no pests in my house. There's no massive cracks down the walls. There's no damp Because those things are things especially sight unseen that you don't want to get fucked over with so Everything looks good But we will know for sure In about half an hour. So I'm going to eat the rest of this just watching a Leg of the games tour by mason joes.  I'm ever gonna be able to bench that But anyways, the inspection is not going to be uploaded for an hour So I can't check it until then so it's off to the car wash.  All right, that's that part. Which one are you guys?      I'm sure you guys know by now. Sorry. I'm rambling on about it I actually it's good making these vlogs because I'm actually reminding myself of what I need to do on on particular day Uh, because shit, I've got a habit of forgetting things Whoops anyways Let's go


So you've already learned all of the different properties of a parallelogram in these videos. You're going to be talking about rectangles, so first we want to talk about what a rectangle is all of the Properties of a parallelogram hold true for a rectangle. So we already know that opposite sides are parallel So I'm just going to go ahead and mark opposite sides are parallel We also know that opposite sides are congruent. So this side is congruent as well as these opposite sides are congruent Opposite angles are congruent So we know that this angle here is congruent to this one and this angle is congruent to this one We also know that diagonals bisect one another. So if I draw the diagonals Because they bisect each other we know that this has to be congruent to this and I have too many marks here is congruent to that We also know the consecutive angles are supplementary So if we add this angle plus this angle, it's going to equal 180 degrees This angle plus this angle is going to equal 180 degrees now a rectangle has three other well actually two other properties besides these properties of a parallelogram and that is that a rectangle has So I should probably say a rectangle has four right angles and We can see that in the picture 90 degrees 90 degrees 90 degrees 90 degrees and Not only do the diagonals bisect each other, but in a rectangle the diagonals are congruent


We've had some great guests on Tisky Sour this year, from Yanis Varoufakis to Namiki Konst, from Anna Kasperian to the late Michael Brooks. One of my favourite interviews was with Liz and Brace from the True and On podcast. They came on in July, which was the month that Ghislaine Maxwell, one of Geoffrey Epstein's closest associates, was arrested. Liz and Brace explained to me why the official narrative when it comes to Geoffrey Epstein contains more than a few hulls. That story isn't wrong, it's just incomplete. And perhaps the best place to start with where it's incomplete is talking about Geoffrey's background. Now, Geoffrey kind of came out of nowhere. He was a two-time college dropout who was hired, basically when he was a taxi driver, to be a schoolteacher at the Dalton School, which is a very fancy private school on the Upper East Side, very, very wealthy. But he was hired by a man named Donald Barr, who is the father of current Attorney General in America, William Barr. Now, that relationship aside, which is very, let's say unique, Donald Barr is also an ex-OSS agent, the OSS being the precursor to the CIA. So, you've got an ex-intelligence agent hiring this man out of nowhere, no college degree, plops him into high society. And from there, he gets hired as an investment banker on Wall Street. Now, so all this stuff aside is very much missing from the story. Wouldn't you say, Brace? Yeah, absolutely. I think just the fact that Donald Barr's son is now the person who's overseeing basically the investigation into Epstein post-mortem is astounding. Yeah, exactly. And so there's that. I mean, that's a very strange shape that makes that. But just the intense involvement of people connected to various intelligence agencies basically all down the line here is astounding. Epstein himself used to tell people that he was something like a bag man for the CIA, that he described himself as a financial bounty hunter who would, I guess, go get money that the CIA maybe gave to the wrong warlord or something. It's very unclear what happened there. But Ghislaine, when she enters his life in the early 90s following the passing of her father, who, of course, you guys are British, so you know Robert Maxwell, former labor MP, former head of a giant media conglomerate there who stole his employees' pensions, and of course, famously, allegedly, a spy for the Mossad for Israeli intelligence services, and a guy who really liked to sort of play in that world as well, a former member of British Intelligence too during World War II, where he allegedly executed a German officer, which, honestly, that's fine with me. I mean, there's a book written about Robert Maxwell calling him Israel's super spy. The daughter of this guy enters Epstein's life in 1991. And from there, he really takes off. She introduces them to all kinds of people in high society, right? Because Ghislaine, when she was younger, she grew up friends with the royal family. She has a lot of high society contacts. She went to Oxford. She gets to New York. The kind of story there is that she's penniless, but obviously not true.  And she starts introducing Epstein to people that, you know, he was rich at this point, but that he might not have otherwise known. And we'd be remiss not to mention too that Epstein's money, it is really unclear where it came from. He doesn't seem to have actually worked at all after he was basically given rights to this American billionaire, Leslie Webster's money. And so the relationship continues. Epstein kind of goes further and further up in high society. He's hanging out with the Clintons, Ghislaine's having dinner alone with Bill Clinton in New York. He's meeting basically every kind of rich and famous person you could ever dream of. And he's introducing a lot of them allegedly to very young girls. And another thing about about Jeffrey Epstein, and this has been testified about over and over and over and over again, is that all of his properties were wired up with cameras every single room. I mean, that links to one of the leading theories as well, right? So I just want to I just want to focus on that money thing just as a sort of summary in a way. If you watch the Netflix documentary, the story it tells you is that he became one of the richest men in America essentially by being charming. So it's sort of like he didn't get a degree, but he charmed someone's parent into getting him a job at Bear Stearns. And then at Bear Stearns, he charmed this, yeah, this other, this guy who owned the clothes firm to sort of give him billions and billions of pounds.  And the only thing he's got is this sort of, the story doesn't sound particularly viable to me. But in any case, you just brought up, yeah, that these secret cameras. And so one of the leading theories or the leading alternate theories about Jeffrey Epstein is it's not that he was sort of a rogue financier and was let off the hook because he was he was powerful, but his role in the establishment was to sort of involve other elites in these crimes and then potentially to film them. So the idea is it might have been a honey trap either, you know, to personally enrich themselves to blackmail people after having filmed them doing stuff, or they were working for secret services who wanted compromise on people. A lot of people forget this, but when Jeffrey was shortly after Jeffrey's arrested, right before his untimely demise in New York, the FBI when they were raiding his property, they said they found and confiscated hundreds and hundreds and hundreds of tapes, what I'm assuming were probably CDs or DVDs, or Blu-ray, God knows what set up he had, but and they were all labeled what they say is, you know, person's name, man's name plus girl's name. By the way, there has been no mention of where these tapes are or where like any of that evidence is no one has even remarked on it since no one in the media has asked any official about it. We haven't heard anything, but the fact that those exist tells us that those that the tapings or the videotapes that he was accumulating that there was a purpose there. Now you can speculate and say, okay, was it on behalf of someone else? Was it just to kind of cover his faces? Was it kind of a, you know, I think we are of the opinion that it's kind of a mix of both, where it's like you keep this because you know what's going on in case you need it later. And this is something that I hear you mention on the show is the way you value tabloids, and I think this sort of leads into an interesting discussion about the media. So this is from the son, Ghislaine Maxwell and her pedophile lover Jeffrey Epstein were both Israeli spies who took pictures of powerful men having sex of underage girls to blackmail them, their alleged Mossad handler has sensationally claimed. I suppose why the fact this getting reported in the sun potentially, you know, messes with some of the conspiracy theories, basically, is that the conspiracy theory is that the media aren't covering it because they're scared to or because they're friends with the same people or because they're implicated, etc, etc. But then why would the sun be able to publish that? Because there is, you know, there is wound up with the establishment as anyone else. So why is it only the tabloids that can put this out there? Because obviously the alternative theory or the mainstream theory is the reason the sun can publish it is because you need less evidence and they can do these sort of salacious scandal stories. So what's your explanation of why the kind of thing you investigate on your podcast are more likely to be in a tabloid than the New York Times? We actually did, I think maybe a segment on the show or maybe I just meant to do a segment on the show about how incorrect the sun was on so many different points of this. They at different points within like a four month period said Ghislaine was in an apartment in France, she was in a chateau in France, she was being moved throughout the Midwest by a crack team of Navy SEALs and I think like two or three other places. So there's been a lot of misreporting there as well. The sun in particular also is I believe owned by Rupert Murdoch. If I'm not incorrect Rupert Murdoch and Ghislaine's father Robert Maxwell did not get along very well and maybe that has something to do with it. I don't know. I think that what the thing is is like a lot of like serious reporters don't maybe feel comfortable really putting the dots together or maybe they're told they're not able to put the dots together or maybe they're sort of their training, which this is sort of the theory that I'm more sympathetic to is that the the training of a lot of these so-called serious reporters prevents them from putting this kind of stuff together because they're taught to think of this as the realm of conspiracy theory and that everything is actually much more simple than it seems and etc etc etc. That's the most charitable interpretation of it I have. Other interpretations I'm sure people can put together themselves. Particularly we value the tabloids before the Jeffrey Epstein stuff grew up. Like old page six columns we have taken we've learned a lot from them. Page six is like a sort of society column in one of our gossip magazines the New York or tabloid type magazines The New York Pose because that will report a lot of stuff like the fact that Ghislaine was seeing having dinner with Bill Clinton in New York City. We take it we learn a lot from that kind of stuff. I think too like you know we should you know remind people that I mean I don't know if they're aware of this in the UK I think it made a splash over there but there was a leaked video that came out of a American news anchor Amy Robach. It was like she was caught on a hot mic basically I love saying that hot mic where she was saying that she had the Epstein story back in spring of 2015 and that she had everything she had the accusers she had everything you know they implicated some very powerful people she mentioned Bill Clinton I believe she mentions I believe she mentions in the video Prince Andrew and you know she said that it got completely shut down by the network and we should remember that you know what was happening in America in the UK in spring 2015 okay well we were months out from Hillary Clinton announcing her candidacy for presidency for the presidency and there was a royal baby about to be born and so you've got two very powerful you know political families in their own right in different respects that have the ability to withhold access on major stories in order to get the mainstream press as we will call it not to cover stuff and that's something that literally like literally happened now do I know if those conversations happened no I don't know I'm speculating but I think you can kind of line up some things where you've got you've got a case that implicates some very very powerful people and there's a lot of you know there's a lot of reasons why those people want to keep it out of outlets that normal everyday you know Americans or you know you know any population would find reputable it's easy to dismiss the tabloids oh it's the sun who cares oh it's New York Post it's gossip it's harder to discredit ABC news or the New York Times or the Washington Post this is Prince Andrew let's take a look one of Epstein's accusers Virginia Roberts has made allegations against you she was very specific about that night she described dancing with you and you profusely sweating and that she went on to have bath possibly there's a slight problem with with with with the sweating because I have a peculiar medical condition which is that I don't sweat or I didn't sweat at the time and that was oh is she yes I didn't sweat at the time because I had suffered what I would describe as an overdose of adrenaline in the Falklands war when I was shot at and I simply it was it was it was almost impossible for me to to sweat do you remember dancing at tramp no that couldn't have happened because the date that there's being suggested I was at home with the children you know that you were at home with the children was it a memorable night on that particular day that that that we now understand is the date which is the 10th of March I was at home I was with the children I'd taken Beatrice to a pizza express in working for a party at a I suppose sort of four five in the afternoon why would you remember that so specifically why would you remember a pizza express birthday and being at home because going to pizza express in working is an unusual thing for me to do a very unusual thing for me to do I've never been I've only been through working a couple of times and I remember it weirdly distinctly but as soon as somebody reminded me of it I went oh yes I remember that I'll explain why that for me is evidence well I mean I'm sitting on the fence here but why it could be evidence that deep state is not involved because presumably if this was a big cover-up that they don't want to unravel they'd give him some good lines and you can say a bunch of things about the CIA the MI5 whatever Mossad are they that dumb that he'd say how do I how do I stop this all unraveling and they say you couldn't sweat because of the Falklands war and then you went to pizza express when you were supposed to be having sex with an underage minor I forgot about the pizza express line I always remember the sweat but the pizza express one is like the real cherry on top I think a couple things about that I would say that I would push back on the idea that there is like one single like single subject that's driving like something here where there it's like one body that's controlling and manipulating all of these moving parts I don't think that's true but I also think that you know and I hope I'm not offending anyone here but I don't think Prince Andrew is perhaps maybe the sharpest tool in the box and I would imagine that you know they know okay well he's already pretty well implicated and there is quite possibly some documents coming out next week that might implicate him even further which we can get to but you know in the same way that they kind of like let him like kind of cut him loose because the other thing to remember here too is that like the United States is never going to like like the United States is never going to indict Prince Andrew on any like that is out of the realm of possibility like it would be completely unheard of for the United States government to indict a member of the royal family like it's just not going to happen and so like I think that you know his you know clearly very bad PR team aside like the sweat argument and the pizza express it's really like shocking they couldn't come up with like a better any and literally any other excuses I could see them saying well let's just see if we can run this out a little bit maybe people can be involved in a different way right so in a way he was obviously an incredibly unsympathetic well he's both well allegedly an abuser but also potentially a victim of a wider program to get if you want to compromise you'd want it off someone who was both in a position of incredible privilege and incredibly stupid and so to get a sort of hereditary royal he seems to be the dumbest hereditary royal that would make sense so at the moment obviously this is in the news because Ghislaine Maxwell is now in custody and we're presuming there are some very powerful people who are pretty nervous about what is going to come next one of them is potentially Donald Trump because they've been pictured together he was asked about this at a press conference this Tuesday let's take a look Ghislaine Maxwell is in prison and so a lot of people want to know if she's going to turn in powerful people and I know you've talked in the past about Prince Andrew and you've criticized Bill Clinton's behavior I'm wondering do you feel that she's going to turn in powerful men how do you see that working out I don't know I haven't really been following it too much I just wish her well frankly I've met her numerous times over the years especially since I lived in Palm Beach and I guess they lived in Palm Beach but I wish her well whatever it is I don't know the situation with Prince Andrew just don't know not aware of it it's like he he employed the same PR firm as Prince Andrew very bizarre answer what's going to what do you think is going to come out though of this she's got a book cry she's got has she got video CDs I think they were tabloids reporting that she's got what she's now sort of talking about the fact that she's got pictures and videos of high-profile people with what what's going to happen over the next couple of weeks are we going to get a big revelatory moment or is it going to be a bit of a damp squib well I think I think any revelations we're going to get are probably going to come out of the unsealed depositions or the depositions that are being unsealed within this this next week a lot of the tabloid reporting on like she is these DVDs or whatever I mean if you look at the actual people they're sourcing them from they are not the most credible characters in the world so I you know I would I would well I don't want it to be true because I want it to not have happened but you know I if that is true we'll see she seemed pretty surprised to be actually picked up in the first place Liz and I were present on on on her bail sentencing call she did not seem overly prepared for what's happening right now which I mean that could be for a variety of reasons the trial is actually set for a year from now so you know in that time they're gonna do discovery and they gotta you know collect evidence and put under the judge etc etc and so I you know I'm not exactly sure how much we'll find out in that time hopefully there will be more stuff that comes out but I would be shocked if she did not have some sort of dead man switch or something although from her behavior so far it doesn't seem like she might be totally ready to push that and it may not be time to sort of push that button


Thanks, Russ, for a very nice introduction. Hello, everyone, as Russ mentioned, I am Andrew. I am previously famous, as I still say, famous is a wrong word. I am the author of South, famous, yes, and of course of the now-released 1.7 Django migrations and a senior software engineer at Eventbrite, where I am sort of on our architecture team doing database stuff and sort of general difficult design decisions and things that are sort of, very now I guess, to what I've been doing in Django. So what this talk is about is essentially the history of South, what it came about, how it developed, and then what became of the 1.7 Django migrations. And more importantly, how those migrations were developed, sort of what the design decisions were, how they're implemented, and sort of the pitfalls and the issues that I came across. I want you to come away from this talk with an idea of like how that stuff works and not be scared of migrations. It's one of the biggest injections of new code into Django in the last couple of years, I think. It's mostly very clean, which I'm very proud. It's a little bit complicated. There's some stuff in there that is very computer science-y, which means it's very difficult to understand sometimes, but I'd love to try and explain to you and get some of the ideas across. So as Russ mentioned, I have been to every Django con in the US. This is me at the first one looking very young and slightly scared of a stage. And in fact, I believe everyone I've been to, given a presentation on migrations, or nearly thereabouts, I have put out the first slide deck I ever did on speaker deck view. This will be on my website after things. You can read the URL. It's a very short, eight-slide deck, but it's interesting how that first slide deck, I'm at first introduction of South, is very similar in some ways that we have today and different in others. But after all this time, after the past seven or so years of doing migrations, I've concluded that they're pretty good. This is my only conclusion, really. There's not much more we can say. Some people complain, some people like them, but in the end, people seem to really like migrations. South became sort of integral part of Django. It feels like, oh, you know, every tutorial went, you need to install Django and then you need to install South and then you can keep going. And for a long time, South was sort of like, you know, it was still not being competitive. It was the only player in the field. Then people were like, why isn't it in the docks? Why isn't it officially supported? And then finally, as you've learned, it's now 1.7. But how did that kind of thing come about? So I had to sort of step through the history of South here. So South was initially launched in August of 2008. It was launched in fact from the second to the right window of this building here. This is the stable block in Cornbury Park in Oxfordshire, which is a very lovely place to launch code from. I was working at the time for an agency called Torchbox, who are sort of small development agency in Oxfordshire. And they have, for some reason, offices in a country estate. So this sort of fits the British stereotype. It could be down in Abbey, like it's a British stereotype. Like, I launched my code from this wonderful country map. It's a fantastic kind of thing. So the first few versions were launched from there. And they were sort of made for a single project. At the time, we were making a very simple sort of CMS for a customer, I'll say simple, moderately complicated. And previously at the company, the method was, we have a directory full of SQL files. We run the SQL files and we just sort of keep the number in our heads. That then improved to, we have a column with a number in it. We run the numbers bigger than that number, then update the number. And then at some point, we sat down and me and Nick Burch, my colleague at the time, said that sort of thought we want some sort of more formal system to do this, some kind of better system. And out of that, South was born. Curiously, Simon Willison, who was also working with Nick at the same company the year previously, launched almost exactly the same month, I think, demigration, which was sort of his version of that, and looks shockingly similar. So I think Nick had influenced both of us on that. But in the end, demigrations was my SQL only and that sort of was one of its demises on that front. The other competitor at the time was Dragon Evolution, done by a wonderful, very old Russell Keith McGee. It was, I used it certainly for a couple of years before I wrote South. It was quite popular at the time. I'm not sure why it fell out of popularity. It did. It was in some ways sad to lose competitor because as you can see, if you look at the times, my releases grew further and further apart as sort of the pressures of having other things didn't keep up with me. Now that's all of the early years. South at this point, before South 0.4, there is no auto detection. You call South and you go, hi, South, dash, dash, add field, this, dash, dash, add, model, this, dash, dash, remove, model, this. And then I believe it was migratory that came in with the idea of sort of auto detection and storing state. And then I summarily nicked that from them and put it into 0.4 of which I thank them very much for coming up with the idea and a decent implementation too that I could sort of heavily borrow from. But so South as you know today probably appears more around 0.4 than 0.1. 0.1 migrations, I believe, still run on 1.0. There is still full backwards compatibility which I'm very proud of. I think only I have migrations from the first few versions that really exist anymore. But so 0.4, 0.5, you start seeing things like different operations and the auto detection gets a bit better. It sort of becomes more of a thing where you can simply go change models, run sort of schema migration and then have migration. That's fantastic. And then sort of as we get to 2009, 2010, we approach stability and very optimistic me, but this is four years ago. In the short term, South 1.0 will be released, says Andrew of 2010. He's very wrong. He doesn't realize it yet, but he's very wrong. This is a period where sort of South becomes pretty much what is required of it, mostly by the community. There's a lot of issues, a lot of missing holes, but it's good enough. Like the big horrible bug reports that are coming in, people generally sort of work around other issues and it's not perfect, but it does the job. And then sort of between 2010 and 2013, there are no releases, there are no major releases. I quote sort of the long gap. Part of this is that at that point, I had left university, I was in the world of work, I was freelancing, that's reasonably high stress. And then finally in May of 2013, at JangoCon Europe, or thereabouts, I released 0.8, which essentially just a collection of bug fixes and a few new features that accrued over the years. At the same time, roughly I launched the Kickstarter, which funded the remainder of the work until this day. So I asked for two and a half thousand pounds. I got, as you can see here, almost 18,000 pounds. I'm very grateful to everyone who contributed. Many of them are here. I've shaken at least a few of them by the hand. If you gave, please come to me. I would love to congratulate you again. This essentially funded the work in Jango. The idea of this was that I could go down to three days a week at my job at Lanyard. I could then work one or two days a week on Jango and get the work done. And then rather than having it done sort of a mysterious timescale, we could approach that almost, almost being paid to work on it. Like there's a guaranteed time. You can have this sort of fixed time. It's not only write code, but review bugs, communicate with people. As many things Russ was saying about having a Jango Fellow, like I experienced a little bit of that is having like a set amount of time for a week to do this kind of stuff. It's absolutely invaluable for this. And then sort of, again, there was sort of a long period of me working on Jango migrations. And so I wasn't working on South. And then a couple of months ago, or I think it was last month, 1.0 was released. And then of course, yesterday 1.7 was released. And that's sort of the culmination of all this work. Jango, I'm sorry, South 1.0 is essentially just 0.8.4 with one extra change, which is a way of having migrations that can exist alongside Jango migrations. So basically, South now looks for a South migrations directory by default, and then falls back to a migrations directory, meaning you can ship a third-party app with both South migrations and with Jango migrations, which is a big part of our sort of upgrade plan. But of course, why did this come about? So in 2010, in the same blog post where I write, oh, South 1.0 is going real soon now, I also write, for at least, people have been suggesting to me that South should be in Jango Core. And by people, I mean like Jacob Kaplan-Mott and other core developers coming and saying, Andrew, the thing I'm doing, should really be in core. I'm going, mm-hmm, and it's walking away. It's like, just terrified of the workload that might involve. So the idea for this sort of new version of migrations in core, I mean, it has been building since before this point, but certainly since this point. And at this point, I have, let's say I think, five years of South bugs and South issues. And like, as a maintainer, all you ever see from a project like that is the issues tracker, essentially, or the bug report mailing list. And so, your life is pretty much nothing but a continuous stream of issues and bug reports, where you basically have become convinced your software is absolutely terrible. And then you come to a conference, and we go to, oh, it's great software, we're learning, and we go, that's fantastic. And then suddenly you're like, oh wow, I actually like this stuff. So conferences almost, one of the reasons I come to them is that, it's a nice to get a more realistic snapshot of who's using Django and what they're doing than sort of the much more self-selecting thing you find on issue trackers. So at this point, I was thinking about, how do I structure this? What's the kind of thing they do? So the initial plan I had in 2010, and the bug post I'm outlining here, was I would have two different components. So I was very keen that the sort of situation, the environment that South grew up in, that of competition, that of sort of different ideas would persist. And so I was like, okay, the common parts of migration's frameworks, in particular the schema backend, where you abstract things like adding tables, removing tables, changing fields and things, that you should extract those out across databases. Like Django already does this for queries, using the ORM. We should probably extend that and do all the difficult work of like, well, how does Oracle add indexes, or how does SQL Server remove unique constraints? And map that into a common part of Django called a schema backend. And then also add some ORM hooks. So the key thing that South does, when it's doing different versions of models is that different migrations, it versions the models. So when it does auto detection, it has this big joint dictionary at the bottom that you'll see in a bit, if you're not familiar with it, because you probably are. And then from that, it makes brand new, well, brand old versions of models in memory and then runs migrations on those. So it reflects how things looked at the time you made it. And so Django didn't really support this.  And so my goal was to, okay, let's remove that module. Let's make, let's have Django have proper sort of first class support for having coexisting model versions and have that kind of stuff in there. And then at the same time, separate of this, we'll have south too. And south too will use as underlying APIs in Django and then build a better user interface and better migration handling on top of it. So that sounds good. But of course, at some point the conversations move too well. While Django core at some point, we'd like to slim things down. So Contrib.localflover was a good example of this being moved out. We also think that things that are essential to web development should be in there. Like Django is a batteries-intuitive framework at some point. And so the plan kind of changed to, well, let's just roll it all in. And so the two components there, the migration handling and the user interface suddenly sort of roll into Django. And then, so this is the kickstart at this point, I very optimistically proposed that I would backport the same kind of migrations to 1.4 through 1.6. The code for this does exist. It is shockingly slightly functional. South too, at least in its native state, I should probably release it just for interest, is an automated source port of Django source code to 1.4. There's a whole load of regular expressions, a whole load of mappings that takes the source code from migrations, transforms it through certain things and dumps it in a South two directory with certain sort of helper functions to make it work. And manages to run migrations to 1.4. I have no idea how it works.  I was probably fine, just try and run. And because it falls over with all the complex stuff, it is fascinating, awful, at some point I'll show it. But of course, how I'm suggesting that kind of fell on our side. So the revised plan was to focus on my work on Django 1.7 and unfortunately, I couldn't deliver South two. The sort of aforementioned South 1.0 migration path is the new suggested solution. You can have both proper South migrations on these weird sort of secondary ones that South two would have and 1.7 ones and use the full power of both frameworks. So if you wanna write rule code or rule Python, that is an option to you on both of those. It is a higher burden on maintainers of third party apps. I realize this, I'm very sorry. If I can help you write these things, please come and ask me because, you know, I am happy to help people port stuff over to 1.7 if that makes their lives easier. But with this new plan, you have sort of Django containing all these different parts. So it's not really moving South into Django. Like a common narrative is like, oh yes, Andrew is just moving South into Django. This has been a very common misconception over the last couple of years. Instead, I am adding migrations. It is a brand new framework. I say about 5% of the code is from South if that of the new stuff. A lot of the ideas are from South but it's entirely rewritten pretty much. And so it's not just a simple source port. It's been a lot of work of redesigning how migrations work, improving some of the design stages in the South failed on and then changing sort of the core sort of structure of how migrations work and making them modular, making them reusable as we're seeing a bit. You can take half of these components and use them yourself separately from Django migrations. I did have a keep that separation that you saw on that initial slide of my initial plan there. Django still separates the idea of schema changing from migration running. If you want to, you can just use the schema editor and never touch the migrations library. So, for example, if we're doing an IATN framework that needs a column to every language, we have you covered now. You have a supported Django interface to changing schema in a reliable fashion in transactions. Like that is there, that is core code, you can rely on that. If you want to, and I suspect you probably do, want to use a full migrations framework, we have that too. You can swap out parts if you want to. If you have a very custom big company problem, you can probably swap out one of these parts to do just what you like. That's the adaptable way it's meant to be working. So, I'll go through these different parts. I'll just write them briefly and there's more detail in the next few slides about them. So, the schema editor is what I called the abstraction earlier. It's the piece of code that takes the idea of modifying databases called DDL, that's called data definition language, and adds a schema editor to every backend in Django. You can do connection.schemaeditor, you get one of them, and it has methods like addModel. It has methods like addField, addField, removeField, changeUniqueToGear, all this kind of stuff. And so, if you can call that and do things. The second cool thing that's sort of separate from that is fields can now be deconstructed. I'll show this later, but what this means is that you can take a field, sort of say a char field or a foreign key, and you can ask it, how are you made? You can take that field and get it into a serializable format where you can recreate it again a second time. Before this, you couldn't take a Django field and serialize it. There are model instances. And most of the things they have were stored in instance variables, but some of them weren't. The way South did this, so South, I think, point one to point five, actually read the source code of your model.py file, parsed the line out of your model, then checked out where it will fill a bit and took that part, which is horrific, but works surprisingly well, as many things can do in South. They're not well implemented, but they worked. And then later on, South gained a whole load of rules about, well, if you see a char field, you do this, if you see this other field, you do this. And then if you were sort of a custom third-party field, you could implement a method called Southfield triple. And what that is, that's essentially what Deconstruct is.  And Deconstruct is just that formalized. So all the core fields in Django have this. It is now a requirement in 1.7 for third-party fields if you wish to work with migrations. However, there are plenty of docs that have do-its. There are some examples in those docs. And if you're inheriting from a field inside Django and you haven't made any changes to the keyword arguments, you don't need to do anything at all. So again, if you want to help with that, just email me or Django Dev and we can help out. But that's one of the few sort of imposed requirements on third-party apps in 1.7. Finally, the sort of the O&M hooks I mentioned in that first slide back when I was doing the separation, now model options into apps. So you can now make models living in different worlds. And so in particular, the app loading stuff in 1.7 changed what we used to call the app cache to sort of more an app registry. It's a much better formalized concept. And so now you can load models into different versions of apps, of app registries. And so what the migration framework does, it makes a different app registry for every point in history, as I'll show you later. And so we can easily have like 40 different versions of a user model and address the right one, have the right foreign keys, point to the right places every time. Migrations themselves are much more complex, of course, they're much more moving parts. There are roughly separate into operations, which are the abstractions around the individual schema editor methods, things like add a field, remove a model. Those are still operations, I'll show you those in a bit. The loader and the graph are this sort of way of abstracting out, you have these files on disk, what do they mean? How do the dependencies work? How do I resolve stuff? How do I plan migrations? That's covered in that section. The executor simply takes a plan from the loader and the graph and just runs it. So it basically takes a list of things to run, loads them up, runs the operation. If it fails, it rolls back the transaction if it can. If it works, it prints okay and keeps going. The autodetector is the most complex part, arguably. This is what takes your current model state and the current migration state and sort of intelligently compares them and writes out full migrations. That's improved a lot since South, but we'll see that in a second. And then the state is the final part and state is a very clever thing where rather than working directly on versions of Django models, what migrations does is it works on a sort of much stripped down version of them called state. And because the way operations work, they can work on state very quickly. We can run through from nothing to your end state in hundreds of migrations in a fraction of a second because we're not doing model objects. We're just changing to chain dates. Like state is nothing but a couple of classes and dates. So we can run all that stuff and that's a much easier way of doing it. Let's show here. So the first sort of key cornerstone concept here is operations and state. Now, these two kind of go together. Operations, as it says here, are a declarative representation of model changes. If you look inside a new migrations file, you'll see a big list of operations in a list. All it's saying is, hello, as a migration, I am this operation, for this operation, for this operation. In south, you have two methods. You have forwards and backwards. But what operations do is they abstract away the concept of those two ideas. Because obviously the backwards is simply the reverse of the forwards. So operations know how to work both ways. Operations additionally know what changes they represent without doing database calls. An operation, you can say, here's a state. What does your new state look like? So you can do a quick in-memory change of, well, I end up adding a field as a model so here's the new version of the model you get. And then you can render those out to different versions we'll see in a bit. And so what it sort of looks like is you have this thing where you have a state, an operation takes it to a new state. And internally in memory, migrations is keeping a state for every individual thing between operations. And in fact, a migration is nothing more than a sequence of operations. So you can see here that I've said migration one, migration two, that could be one migration. And in fact, this is how the new squash migrations command works. It takes all the operations, it just concatenates them, it optimizes in a way a bit and then there's a value migration from those ones. So you can see that in fact, migrations are now more of a generalized framework or closure for operations in a sort of specific concept. You could actually do away with them technically but they're therefore sort of useful reasons so you can address things by name. These are the operations we currently ship with. There's quite a few of them as you can see. The most important ones that you might not know about are run SQL and run Python at the bottom. Those are operations that you can manually put into a file like migrations are meant to be writable. Please feel free to edit them, they're fantastic, good for that. And run SQL, you give it some SQL, it runs it, not very confusing. And run Python looks basically like an old south method. It takes, you get two arguments, you get a app, so it's like the old URL object and you get a schema editor and you can do whatever you like. So run Python is for data migrations, it's for really complicated changes, it's for things like adding stored procedures, it is too complicated, stuff like that. So you have all the power of the old stuff if you want it but by default we have a much more simplified migration format that's much more understandable and much less prone to manual error of missing certain different things. The schema editor, as I mentioned before is this sort of abstraction over the DDL and then databases. This is pretty easy for most things, Oracle has a few niggles, SQL server has a few more niggles, unfortunately SQLite, while a fantastic database, does not have support for altering tables. SQLite, I think you can drop tables, you can add columns, that's it, you can't alter columns, you can't drop columns. And so Django and South both have a full emulation layer where if you ask two things, something SQLite can't do, we make a new copy of the table, if you want it, we copy the data over, we leave the old table and rename the new table to the old table, all in one big go. And so if mysteriously your SQLite migrations are really long, it's probably because we're having to emulate the functionality SQLite doesn't have. In general, we shouldn't be doing heavy migrations on SQLite, it's meant for embedded systems or quick development, don't do serious, don't run production on it please, it's a single access locking database, it's not great. The other thing to mention is that schema editor takes Django models and fields. So South's version of this called DB took table names and sort of more, it took fields as well, but it took table names and column names, whereas this takes field names and models or objects. And so it's a bit more high level and this actually gives us more power to know, well, they passed a foreign key, so while it's called something, it's actually got column of something underscore ID, whereas South has all these sort of things like, if it says underscore ID, it's probably a foreign key and sort of weird exceptions, sort of trying to work around this stuff. Using it's very simple, so this is a very simplified example of how to do a couple of changes. It's a context manager, so you can just do with connexional schema editor as ed, create model author, add field, book author, foreign key author. So as you can see here, the first one is making new model, I just pass in a model instance. The reason we have version models is that I can give them the correct version of author in the migration framework for this. And then the second one is adding a field, so you pass in the model, you pass in the field name, you pass in a field instance, and that's it. And then again, the field instance here would come from a deconstruction, which is, of course, this bit. So deconstruction is this new thing where every field is deconstruct and it returns you the arguments you pass to double underscore in it to do place itself. It doesn't have to return you ones it was made with, as long as the things it returns you give you the same kind of field. That's the requirement is that basically it's a clone without having things like copy or the copy module and things like that. So using it's very simple if you want to use it. You just call deconstruction a field.  The first thing is the name of the field in the model. So this is field.name on most field instances. It's none of this example, because this is a field not parented to a model. So, but it would normally be something like author or height or something like that. The second one is a fully qualified path to the field. So as you can see here, this is Django DB models char fields. If you're a custom field, this would probably be like myapp.fields.customfield or so on. And the third argument is positional arguments. We encourage you not to return these because they're much less possible across versions of your fields that changes. But if you have to have them, they're there. And the fourth one is keyword arguments. As you can see here, this char fields spat out the one keyword argument I put into it so I can take these things, I can do in it of that class with star, args, double star, keyword, args, and it reconstructs itself. And in fact, this is also a really useful way. We think you're using it in Michelle Petuska's not yet merged composite fields work because he needed to go to clone fields. Django doesn't have one of those. At least not the one that was properly, but this is one of those. And so even his work is using this kind of stuff now. The graph is this sort of generalized idea. If you know graph theory and mathematics, it's a directed graph. It is non-cyclic as well. So cycles are bad. And it's sort of an in-memory representation of both the structure of the graph and several methods for traversing through it. Most importantly, the leaf nodes are basically the most recent migration for every app. If we see more than one leaf on an app, it means that you have merged two branches. So the nice thing is that Django migrations can, because they have explicit dependencies on their parent inside the same app, they know when they've been merged. Because it says, oh, there's two apps that point to the same parent. Oh, that must be a merge. And then it can immediately quit and tell you, ah. It also has root selection, which gives you the first migration of every app. That's how it decides where to start. It has planning. So you can say, I want to get to these four nodes and it will give you an exact in-order set of migrations to run to satisfy dependencies to get to there. And of course, loop detection. If you try and load in a set of dependencies of the circular dependency, it will just go to circular dependency and quit with you and showing you the cycle so you can break it. The auto-detector by default will not make circular dependencies. This has been most of the release blockers for the last three months. It turns out that following keys and proxy objects and custom user models will get delayed to a very difficult. But essentially, in turn, it looks like this. Like this is a particularly complex one for a small example, but you've got three apps here and a fourth app that's called MyApp, OtherApp, App3. So the leaves are all the zero zero ones. So the leaves are the top ones on each column and then the roots are the bottom ones. And as you can see here, like if you wanted to apply OtherApp2, you've got to apply like a good, basically all the migrations in that tree first in a certain order to get to that point. And so the loader and the graph will tell you these things and more importantly, they'll load them from disk. The loader also loads from the database. It sort of goes into a table we have called Django migrations and reads out the applied set of migrations and it uses that to inform this part of the graph. A useful feature that isn't illustrated here is that there's also support for having migrations that replace other sets of migrations. So if you want to shrink down again, so you've got like hundreds of migrations, you can merge them all into one and then declare this one migration replaces all of these. And then the loader will intelligently swap in and out. So if you're midway through that set, it won't swap it in because you can't be halfway through a migration. If you are below or above the set, it will swap it in and reduce the tree down. So it's very intelligent to sort of give you that stuff and the commands squash migrations make those files for you at least to a limited extent. Hopefully in 1.8 we're gonna get a better version with better detection, but it's a good start and in much better than Souths, blow everything away, run fake zero and everything and start again. The auto detector is the most complex part of Django migrations and the one that I've rewritten at least once during the beta phase of Django. So the basic thing here is it takes two different states, your current project state, so state can have a thing where it says, hi state, make yourself from Django from the current models, it's very simple. And then it takes the final state for migrations branches. So it sort of runs through all the memory, it goes up, here's a state and then it compares them. And then from that it outputs a set of operations and a set of migrations and dependencies between migrations, all that kind of stuff. One of the problems is that there is a very complex dependency set between migrations. In initial Django and SyncDB in 1.6 and below, Django just makes all the tables in one big transaction and then declares foreign keys as well. We'll do them at the end. And so it can sort of get away with a lot of stuff at that point. Because migrations forces you to have these separate componentized things and you can run them whenever you like, we can't just leave foreign keys till the end as it were. Like the end might not be for another couple of weeks in that case. And so we have this very rigid dependency scheme where we go, okay, we have this foreign key points to here and this foreign key points to here. So you have to run this migration first and this one second and this one third. And it gets more complex when you have circular rings of foreign keys. Like say I have two apps that foreign key to each other. How do I do that? In the old stuff they'd be made at the same time but if they're in different apps, one comes before the other. And so the audit sector has to split that into make this model, make this model of the foreign key and a foreign key to this model. So it sort of gets a sort of cycle, like a non-cycle thing like this. And so that's sort of the difficulty here. The sort of brief way it works is that we take a very dumb diff. We sort of take the two states, okay, here's a set of models that have changed which is like an intersection of ones that exist. Here's one that's been removed, set difference. Here's one that's been added, another set difference. Here's some fields that were changed. And then we take all those, we dump out a raw set of operations, not any order, just a generalised order onto a big list in the audit sector. And then the operations themselves have individual dependencies. So things like a foreign key will say I depend on the other end of me being created. Or things like having a model will say I depend on, optionally, my same name of me being removed first and things like that. And a big bit of code goes through and rearrange everything to try and satisfy the constraints and dependencies. It pretty much always works now. There are some very edge cases that are either bugs or some cases aren't supported because of custom models. And you end up with this sort of nice set of migrations that are in dependency order with defined dependencies that spit out. There is a whole talk on how this works. I will give at some point. If you really want to find some nasty code, it's beautiful code, but also hard to understand to work on, that's the base to go and look. The optimizer is another complex part of this. The optimizer takes a set of migrations and returns you a smaller set, hopefully with the same effect. It can just return you the same set and go I can't do anything with this. It urns inside of caution. But the idea is that when you're squashing migrations and also during audit detection, which is very verbose, like audit detection outputs a add field for every foreign key. And then the optimizer comes along and says, well, you've just got add model, add foreign key, add foreign key, add foreign key and squash them into one add model with foreign keys. So what it does, it sort of takes your list of operations, sort of a big list of things in order, and it steps over them pairwise. It goes one, steps over them like this, then two, steps over them like this. And then if it finds a pair that matches certain patterns, so for example, if it finds an add field and a delete field, okay, those two, I know I could optimize a way to nothing if the names match. If it finds an add model and an add field, it goes, oh, those two can also, like those two are on the same model, I could optimize in a way if I could try. So here, let's say the green one here is an add model and the red one is an add field. So it's going along, the middle one is like, oh, it's add fields on the model, we don't know that. And it's like, oh, okay, this is two pairs that we could potentially optimize. So it's like, okay, then the models match, the field is not already in there, that's good. And then we have to look at all the intervening operations to make sure we can pass through them. So for example, if my add field is add a foreign key to a model and the middle one is create that model, I can't push the add field through the creation of a model, it won't work afterwards. And so there's all these checks, like, well, can I push through the individual operations? And if it can, we can replace those two things with one and then restart the thing again. It keeps looping and looping until it has no result and then returns. This is always not perfect, it is on the side of not reducing because that's a safer way. We know what was there work before. It can fall over on very, very, very complex stuff, but I've not seen any bug reports for a couple of months, so it's probably pretty good on that one. But nonetheless, this is somewhere that could do with an improvement. If you're very good at optimization stuff, please help me with this bit. I would love to have it optimized, I'd be even more intelligent, even better at optimizing. There are some things that just misses that it should be catching. The final part of this in terms of design is a brand new format. I'm sure many of you are familiar with this. This is, I'm not sure what that's like, size one font. If you can't see it, which you can't, the top section there is the actual concept of migration. There's a forward and backwards method. I think it's just, yeah, it's just a create table. This migration is making one model. That's all it's doing. You have this tiny, tiny bit of actions at the top and then this giant chunk of frozen error at the bottom. The reason that's there is that what South does is for every single migration, South dumps the entire historical state of models serialized into a big DIT. When we want to load that stuff back up again, we go, okay, let's read the DIT, load it into memory and then go from there. This is what the new format looks like. Notice it's much bigger. You can see it from back of the hall. What we're doing here is we say, well, create model. That's what we're doing. Don't repeat yourself. Don't have all the stuff at the bottom. The key thing we can do here, let's go forward there, is we have in memory running. What happens here is that we can take a state and we can apply the migration operations in memory to these states and then end up with the results. And we can have models at any point in history and we can run from those. And so we don't need that big DIT anymore. We can just derive that DIT from all the previous operations in history. And it's almost as fast too. That's a fantastic way of doing it. So I'll quickly go through how the two commands run. Two main commands are make migrations, which is the old schema migration, data migration commands. The reason it's got the pearls that make migrations will make a migration and all its dependent migrations. So you can parse that app name. It will try and limit itself. But if you have a migration that needs another migration and say off or use or something, it will make that migration as well because it knows that it needs the dependencies. South would give you a migration and get everybody like, it's not gonna apply, good luck. So it didn't have a dependency resolver. Migration is does. So what it does, it takes your two states, pass them to your detector. So basically the number two there is going and getting a state from disk. Number three is getting one from the project. And then it takes them, it auto-text them into a big list. It optimizes them so it has a much shorter list. And then it passed them to a writer. And the writer is a small class that can take a list of operations and write out a Python file in pretty decent like indented nice code that you could understand as a person rather than just a big lump of stuff. Migrations are meant to be human readable and human editable as well. Migrate then takes those different things. It passes them to, it sort of goes to the loader and says hi, load migrations, loader goes to the disk and finds the stuff and brings it out again. And then it gets a big list of migrations. It runs through them one at a time, has a transaction, then runs the operations individually. The operation is actually just called the schema editor individually. And then once it's all done, there's a thing called recorder, which I haven't mentioned here, but it's very simple. It just says, you know, it has methods like, multiple is applied, multiple is unapplied, what's been marked as applied? And so it just says applied, applied, applied, apply. And we store that in the database individually in multiDB too. So if you've got more than one database, you have to run migrate on each individual database. On the plus side, the database routers to do now have allow migrate, which is on and by the operation. So you can individually turn on and off migration to different databases. So sort of the thing I want to address here at the end is what went wrong? Like the design is fantastic and wonderful, but like the real juicy bits here, what was like, ah, for like three months there. So the first thing, and the thing I really don't like, and no sort of rut here who may have been involved in this, is swappable models. Now for those who aren't familiar, I imagine you are, swappable models are when you can replace, in this case, only this model one is auth.user. You say, okay, auth.user, it's actually now this other model. And inside Django, all the foreign keys repoint, all the constraints repoint, or like if you try and get the model, it just turns into your model, which is fantastic. Except for dependency graphs. So normally, this is fantastic. The problem is, that has a setting, and the setting is outside of migration. So depending on the setting is, I can just change to this, and then it just goes crazy, and then I run like this, and it's just, ah, I don't know.  And so the problem is like, the dependency graph with this setting changes at runtime, and there's no way of telling what it was before. Like, we can't even tell those error, because like, as far as Django is concerned, the previous history is gone. There's no reference to it. Like, we didn't know it used to be a different setting. And so in the case of auth.user, we have a few workarounds in Django that support this stuff, and we generally do a pretty good job, and if you point dependencies at it, we try and resolve them. But you can still get loops out of the auto detector. If you auto detect with one setting, and then change it, then there's no guarantee the resulting migrations are cycle-free in dependencies.  So the problem here is that we still run SyncDB apps, and the code still exists until 2.0. And so manage.migrate just runs the old SyncDB code first, and then runs migration second. This is fine as you've got foreign keys between apps that are in different sections. So the choice was, do we not allow you to have foreign keys from migrated apps into unmigrated apps, meaning that we'd have to run migrations first so that they were there for the other way around, or do we not allow keys from unmigrated into migrated, meaning we had to run unmigrated first? The decision we have is that you can't have foreign keys from unmigrated apps to migrated apps. This is a little problem because we moved all of the core contra-baps to have migrations. So if you depend on those, you need migrations, so about that. But on the plus side, this is much better for the way forward. We, like, if it was all the way around, then it would be this horrible thing where you had to bring in one app with this corruptural project. You couldn't do any changes at all. It's a little annoying, but adding migrations to an existing app is very, very trivial, even easier than it was in the south. Like, there is, I think this much documentation on the page, like, add a migration, and then Django auto-applies it, because it knows a bit, like, Django reads it, says, oh, there's some great models in here. We've already got those tables, and marked it as applied, so it does that bit for you. So you can just ship a migration, in fact, 1.7 ships with migrations for every core contra-bap. When you run migrate, they'll auto-apply themselves the first time, because they know that they're already there. And in fact, when you run it in 1.7, at 1.8 even, which is sort of the current dev trunk, you run migrations, and it sort of auto-applies, and then improves the length of your email fields and users, it sort of, it fixes all the old, like, all these low-number bugs we couldn't fix for ages. We now ship migrations to what stuff in core, so that's fantastic. Test persistence is another one, and particularly on MySQL. I'm not a big fan of MySQL. Test persistence in Django, we promise you that between every test, you will have the same starting state. In particular, the data you loaded at the start will always be there. That was great with the old stuff, where SyncDB, all you could do was load stuff in initial data, so we just replayed those. With migrations, you have data migration, so you can make stuff whenever you like, we can't even tell what happens. And so on things like Postgres, where we can roll transactions back, we go, okay, apply the test, roll that transaction. Apply the test, roll that transaction. But on MyISAM, and things where you can't do, and transacting test cases, we can't do that, there aren't any transactions, we can't roll it back. So what we do, huh, is, after we migrate the start of your test run, we then dump data into memory, a copy of all the data from the migrations, and then we load from that for every test after a flush. So it's a little bit slower. Notably, the tests are three times slower when it turned on, but it turns itself off in Django Core for things that don't need it. But if you're having issues with test persistence, those are now our setting and tests you should turn on that says, I actually do want this, I don't want this, to sort of tell Django to speed up or slow down as required. I perhaps was not terribly professional and didn't read the docs when I was doing migrations. I forgot a few meta options. I forgot all with respect to Existed and had to add it during the beta phase, and a few other ones, but Django has a lot of sort of like slightly odd meta options of like, oh, we have this thing where you can just make foreign keys be orderable, or this other thing where, you know, so a lot of the options had to go through and add a second run of like, well, we need to support this, we need to support chaining this stuff and different attributes as well. And finally, proxy models were the last thing. So proxy models are this thing where you can have a model, but it's a proxy to another model. And it has no table of its own, it has no sort of, it has no, it's nearly an extra code method, it's basically an extra sort of object. And so to migrations, they're basically worthless. Like they don't have a table, so they don't have to do anything with them at all. But you can foreign key to them, and so we need them around to sort of point foreign keys out and sort of just say, you point at that empty thing and be on with it. And so I had to go through it and had a separate set of things that said, well, if this model being added has proxy true, then skip all of this database part and then just leave it lying around. And that's sort of another sort of, the gotchas that I forgot about. Like, you know, I had assumed, during the development of this, that proxy models would be useless because you couldn't, they weren't in database stuff with them, but I forgot you'd foreign key to them. So, you know, it bears in mind that you could think about all the things Django offers to start with. And, but we're there. This slide was written before we released 1.7. I'm very glad it's still, it's actually in date now, I'm presenting it. 1.7 is out now, it has migrations. Please use them. Please report any doubts as you find them, but like, I am pretty confident in the quality of this release. But we have gone through a very painful, like three, six months of bug reports and fixing and really sort of hardening that stuff up. Like, migrations are fantastic. I hope you will use them. I hope that you upgrade to third party apps to use them. If you need any help, I'm always around, like I'm an IRC, you can email me, you can email Django developers. I want to sort of get this painful transition period of going to migrations over and then we can all live in the wonderful future of migrations. Thank you very much.


Let's grab that right there. Hi everyone. Hi. Hi, and congratulations. Thank you. Congratulations on Monumental Exhibition, Chicago Architecture Biennial, 80 Artists, 11 Sites Across the City, titled This is a Rehearsal, and I thought that's a place we could start because that's an idea that's important to both of us. I think it's really an excuse just not to be done with the show. But no, I think this is rehearsal, it really came out of my collective floating museum's practice, which also comes, thinks about like Margaret Burrow's founding of Disabled Museum in her home about kind of community influenced, like, design practices. So coming in with an idea of a willing to change the direction of that idea or form of that idea based on the input as it comes in. So I think we brought that into the Biennial, and also wanted to think about points of entry. So this is a rehearsal, kind of takes some of the tension out of having answers and sets the ground for play, which can also be research, which also can give us space to try some things out and not be the authority. So we kind of, the people that we invited, the architects, designers, community, participants, we saw them all as contributors. We kind of went with that prompt, and it took some of the edge off of kind of quote unquote delivery of timeline biennials, some of the ethical issues of pushing a show versus how it engages with community. And sometimes your partner's timeline isn't the show's timeline. So what can be done in that time? How is this useful for you? We know what the biennial needs. They need a show. They need a, you know, certain things, fine, we'll figure that out, but how can we also figure out, you know, how our community partners kind of do. So this is what we were talking about outside, you know, maybe you can talk a little bit about down in the public. Sure. I want to pick up on that thought you just concluded on that the exhibition space is this sort of temporary window into seeing the work that's often confused with what the work is, but the work actually took a long time to get there and continues after. And the exhibition is this frame, this sort of temporal frame where you get to invite audiences to sort of peek in. And in addition to being this sort of temporal frame, it's also a spatial frame. So the idea of a rehearsal is something that I started to work with before walls turned sideways, but really try to operationalize it there. So making an exhibition about the prison industrial complex at the intersection of mass incarceration, my first question was like, what does it mean to think about those questions within the space of the museum? And thinking about the ground on which the museum was built and sort of begin to undo the ways in which that relationship is also related to the relationship of the prison or the institution of the prison. And thinking about then as a ground that is open to sort of practice, perform, imagine, stage different conversations about how we could enact Angela Davis's statements. What does it mean to turn a wall sideways to make a bridge? And thinking about that space as a temporary physical space where we can examine that possibility. And so then moving into counterpublics, we're working in public space and shifting that idea over there. So if you all aren't familiar, I was one of five curators invited to come to St. Louis to organize a response in relation to the city. St. Louis is an incredibly complicated space. And thinking about the physical ground there, it is the space. I've been calling it the gateway to dispossession. It's the space in which all US soldiers who fought in the plain wars west when St. Louis became the frontier, all of those soldiers went west and dispossessed native peoples and made paved ways for settlers. It is also what I also called the edge of the south. It was a space in which communities fled to or through on their way to places like Chicago. So it has an incredible history of like black legacy and also displacement. So thinking about those multiple spaces, thinking about how do you make a public art exhibition that doesn't restage an occupation? Or doesn't, can evade surveillance? And I know that some of these kind of operations of the city, how public space operates and then how do we not replicate those systems? Something you're thinking about too. I mean, to answer that, it's like, how do you make a public exhibition? You invite the public to make the exhibition. We often think about not for, but with. It was like, we have a kind of a cookie buying, you know, we flew around and at least my partners did and they came and I said, man, so many of these architecture buy-ins are really dry. Like it's just a, it's like a thesis on a wall. And that's, that's, that's kind of like great, like for like insider baseball. But it's like, that's not really, that's one community, right? It's an architectural community, which is an important community. But it's also important to think about points of entry. If you're really thinking about how to bring in different types of knowledge, different types of experiences, you have to open it up a little bit. So it was really important for us to like curate things that were fun, you know, like tiny desk, like we love tiny desk concerts, right? Like, you know, but at the same time, you know, it's like, but the office space, the cubicle culture in design actually had a massive impact on architecture, right? So it's like figuring out once again that level playing where you can bring people in so they can have dialogues and then build things beyond. But also kind of going back to the speed of trust, right? I mean, we've seen what happens with like things like the Olympics when it comes into a place and they do an event and then you're left with the infrastructure, that communities have to figure out what to do with and they're just kind of gone. So we really didn't want to curate a show that did that. We also have the benefit of being a Chicago based institution. So we merged our mission of partnering in all of our like city sites. Like, number one, there's no off sites. There's city sites, like we have the downtown sites. We have sites in Inglewood, sites on DuBond. And really understanding those sites and our partners' interest in looking out for that. So we're not going to like team you up with an artist or an organization or funding that's going to pull you down at the end. So that was one of our goals from the outset. So we're still, some of these things are still in rehearsal. We're still working through them and we'll continue working through them beyond the exhibition. So we're having fun, also fun. Like fun's kind of cool. Like we like to have fun, like, you know. Well, I appreciate you just naming that sometimes these biennial experiences are dry. They're pretty dry. And then I think the biennial, triennial phenomenon I was trying to contend with was I'd been to too many biennials that had taken me on a treasure hunt for trauma. Right, right, right. Yes, thank you. So you're new to a city and then you're investigating it through this exhibition map and being led on an artist's journey that takes you to an incredibly terrible history that's like then I made a project. And then it was, and then that was addressed and we're going to call it reparation or reparative. And so I also want to avoid that energy. You're welcome. So, yeah, so I think what I did instead was think about the geography of the space. It's a confluence of rivers. And I thought about how those rivers brought people down to those spaces and how what a return could look like. What an unbuilding or a return could look like. And that led me to invite four artists that were related to St. Louis via the river. So like Jean-Quick DeCie-Smith and I had long conversations about how St. Louis was the departure point for the French to get all the way up to Montana. Or the Missouri River that connects Chinupas people down to St. Louis or X being Kishota from Louisiana. And then bringing Anita Fieldson from Osage back to her ancestral homeland. And then also thinking again about that question not, how do you not restage a occupation using public art? That's where like sound, plants. Chinupa did an amazing augmented reality project that I'm happy to show you all how to use. Reimagining, or actually it's a performative action that invites the buffalo back to St. Louis. And that sets in motion a conceptual shift that makes us a series of questions. What do we need to do to make that happen? We'd have to unlock the Mississippi. We'd have to water the prairie. We'd have to, and then it kind of builds out from there. So not getting mired in the trauma but kind of opening space for bringing visibility to things that have been erased and then also finding possibility. You know, one of the things that comes up a lot is audience, right? And I think different spaces have different ecologies and operate differently. One of the things, one of our partners was Erica Allen and Urban Growers Collective. Any Urban Growers Collective in the house? Okay. But we went down there and we had a press tour. And one of these questions was like, oh, like if you don't know, it's a great for those that aren't aware of Urban Growers. Look up Erica Allen doing some amazing work. Has a huge team, but the site we're specifically talking about is kind of in Southeast or Park District land. And it's just an amazing site. When you meet her, she's just like walking through the garden, just like eating leaves and like have some leaves. And then I'm like, no, we're actually doing a digester, the biggest in the world. And it's the biggest three-story building. And you're like, wait a minute, the farmers? Like no, it's, she's a rock star. She's amazing, brilliant. So the question was like, oh, it's a community garden. Yeah, like, well how does the community accept the garden? And she's like, that's a weird, weird, weird question. Like we are the community, I don't understand. Like there is no like this kind of exchange thing. Like we serve you, you get something. Like it's just very, you know, and kind of changing how we think about that. So when people ask about audience, I'm like, yeah, you're welcome to come or not. Like I really don't care one way or the other. It's great, you miss out or you come. It's not a show that's the work being done. And the audience are the producers, right? Like the producers are the audience, you know? Like so that's the type of thing. And it has multiplier effects that not only hit that community, but many others. With the Floating Museum, I always say we don't actually work with community at all. We work with the people who work with community. And by giving them resources, highlighting their work, then that has multiplier effects on the communities they serve. So yeah, just, I mean, that's some of this, like when we talk about a biennial. I mean, we'll move beyond a biennial and just get to the work. The biennial's an excuse to highlight something.  But how does it, how does the work move beyond? And I'm actually more interested in the allyship that we built through this process, the knowledge base of how to move across the city, the resources, the municipalities' needs and interests and know how, and then internationally, how we can make that benefit Chicago and how Chicago can vice versa benefit those international partners. So all the people that were selected were strategically selected, not for the show, but actually beyond the show. It's building a web. So I think that's what it can do. Yeah, you're also reminding me of some things that we've talked about in our conversations. How these large-scale exhibitions are also opportunities to keep asking. To like, well, you wanna fund an exhibition? Great, how about we fund something like rematriating this site? How about we fund an interaction with changing, like just replacing monuments or reinscribing ideology, changing conceptual frameworks and how part of the work that we're doing, I think, as curators is being in touch with policymakers, being that sort of middleman between audience as people and then leveraging in favor of people. No, exactly, it's been interesting moving from someone coming to Chicago 20 years or so now or back to Chicago 20 years or so now and just kind of like seeing how like it all, one thing leads to another, leads to another and being able to still be in dialogue with those first kind of collaborators from the beginning and kind of building this like really city-wide international family. Yeah, it's been a real magical experience. So people are like, how are you so calm at the bar? And I was like, yeah, because I have fun. So I think we're at time, but I know that we forgot to introduce ourselves. Yes, I'm Fahim Majeed, I'm an artist curator, one of four co-directors of the Floating Museum, which is now a thing. It wasn't a thing originally, it's just an idea. And also we were invited to curate the Chicago architecture, the fifth edition of the Chicago Architecture Biennial that just recently opened at 10 different sites all over the city. And I'm Risa Palau and I'm a curator and art historian. I live here in Chicago, but don't work here in Chicago. So I was one of five curators coordinating the second Counterpublic Triennial in St. Louis. Do that in reverse.


Welcome to ITU Telecom World 2018 here in Durban, South Africa. We're very pleased to be joined in the studio today by Dr Amani Abu-Zaid, who is commissioner for energy and infrastructure and tourism and ICTs as well for the African Union. Dr Abu-Zaid, thank you very much for joining us in the studio today. Thank you. Pleased to be with you. Now, I'd like to start off by talking about smart digital development. What does it mean to you? Smart digital development, it used to be, I would say. It used to be adopting new technologies, implementing new technologies. But as you may have heard in some of the sessions here in World Telecom, these worlds are becoming almost obsolete. Why? Because it is now the present. It is the way of life and it's no longer. Our life is becoming a smart life altogether. So, in a nutshell, yes, it's adoption of technologies. Yes, it's the implementation. However, as I said, it's becoming the norm and I must say, Africa particularly is exceptionally positioned in that sense. And the innovations that we see everywhere in Africa, the implementation and the rolling out of fantastic programs. In various sectors, using these new technologies is very encouraging and positions the continent very high in the world. Some of them, of course, are the pure invention of the continent, like the mobile money, for instance, and the applications that we are seeing in our countries. Amazing. Also, for our development path in the continent, our countries are no longer following the traditional path, no longer following the development trajectory that was used by others. Since the 18th century, we are creating for ourselves, we are forging and inventing for ourselves a new trajectory path and this trajectory path definitely goes through and by the use and implementation of these technologies. Let's focus on innovation. What innovation do you think is going to be the most transformative in the fourth industrial revolution? It really is difficult to say to foresee. Things that happen and the changes happen so rapidly. But as we speak, in the last years, if I am to single out one innovation in Africa that transformed the lives of many and the economies of many countries on the continent is mobile money. Why? Because we know that most of our economies are informal economies and traditional banking, not everyone is banked in informal banking. So what we are seeing through the use of mobile money is fantastic. You just mentioned that I am also a commissioner for energy. It is helping us with energy. We see solar panels implemented and the payment has always been an issue done through mobile money for instance. Gender empowerment has always been an issue on the continent. Now many in the former sector are women and the use of mobile money is empowering them financially as well and empower them as individuals as well. So that's in the past. Starting where we are now and in the coming years I would say of course artificial intelligence. If we are not quick enough on the continent to prepare ourselves for what's coming, we may have difficulties. But the intelligence news, I'm sure you heard his excellency the president, Arama Poza, in his opening speech mentioning that there is an African commission headed and led by the South Africa to prepare Africa's response to the Fourth Revolution and I'm sure that AI is going to be prominent in this report. So how in your opinion can governments provide a healthy climate for investment in digital development? First of all the word investment. Investment in any sector requires a healthy environment for investment and the healthy environment for investment requires a clear vision, requires clear regulations and laws, stability. I mean that's what attracts generally an investment. All our countries without exception on the continent are working on various reforms to make the economy healthier and more receptive and welcoming to investment. This is one. Now when it comes to ICT particularly, it works also with an ecosystem. Ecosystem meaning that it's in need of, because of its space and nature, it needs innovation, it needs different kinds of risks. So what's the happy news is that across the continent we're also seeing the rolling out of incubators for technologies and startups and technologies. Africa has more than 300 of those incubators, which again is an attractive element for investment in this sector. Our educational programs across the continent are gradually also introducing and promoting digital literacy, which is important again to create not just innovation but now the users of this innovation because at the end of the day investment also is seeking profit. So by creating the need and the literacy, you create the market for this investment to be attractive. Now where is the role of the African Union comes in? We do know that one of the biggest challenges for investment in Africa is that many of our economies on the continent, we have more than 50 countries, are small economies and may not be as attractive to investment as we wish. So what we're trying to do is, in integrating the continent and all these great initiatives that were led by the African Union is to create also an economy of scale that is in many ways attractive for investment because you create also a large space. I am also in charge of the free trade, sorry, the one market for the transport, the air transport, microlead is in charge of the free trade area and the other free movement of people. We're trying to create this momentum and all these activities that bring together the continent in addition to a large number of infrastructure projects, energy, the energy programs that we have across the continent led by the African Union have also for purpose also to serve the ICT because ICT also needs energy and in creating these large markets and creating the infrastructure, both the physical infrastructure but also the soft in terms of rules, regulations, harmonized policies across the continent. All of this creates the dynamics and the proper attraction for the investments. Let's talk about digital adoption. What measures do you think should be taken to encourage digital adoption such as local content, government services, digital literacy which we talked about a second ago? Of course, I mean by having more local content it serves our people in two ways, to be able to adopt the technologies and also to contribute to the technologies and I'm happy that across the continent again we have very good examples of this. It starts also with learning the algorithms, learning the digital literacy and as I said, I mean we are all in all countries, you will find it everywhere. Digital literacy is speaking up. It needs everyone's attention, it needs everyone's contribution because at the end of the day it's not a luxury that we are providing to our citizens, I mean to Africans. Digital literacy is a must. All the services, the whole world is moving now using the ICT and we cannot be and we are not being left behind and we should not. So it is our role and duty to ensure digital literacy is happening and once it happens it also depends to the large youth population that we're having across the continent. It's wonderful and it's really heartwarming to see how they pick up and excel in adopting and inventing all these new apps and applications of the new technology including the local content. Just to give you an example, the Miss Dick, it's a competition that we have made for girls for the use of ICT. This year Miss Dick created an app, she's from Niger and it's an app using Hausa which is the local language to seek help in case of emergencies. Fantastic, fantastic. We need more of that. Absolutely, I couldn't agree more. And in terms of the value of being here at ITU Telecom World, what's the value for you here? First of all, I'm here wearing of course the hat of the African Union.  As African Union we've always attended the ITU and we see it as a fantastic gathering bringing together the, of course, the professionals from the industry bringing together the general public the UN organizations, the officials. So it is important that in such events we all talk to each other judging by the number of panels, the heated discussions that we're having. This is how you get the new ideas. This is how we also identify opportunities and challenges. Now my humble self is my first time to attend ITU World Telecom and I couldn't be happier for us as Africans that this is the first time World Telecom has been held in Africa. I'm extremely happy and proud. I mean, South Africa is making us all proud as Africans. Just the first two days the opening ceremony was amazing. The rest of the, I mean since then all the panels and the events have been happening seamlessly, organization-wise. The welcome of our people in Africa is, you know, the usual legendary welcome so I'm very, very happy both at the personal professional level to be here in South Africa to be here for World Telecom. An event that I'm sure that people will be talking about for many years to come. Thank you very much indeed. Thank you very much. Thank you.