Hi, I think we can start now. Hello everybody, thanks for coming. This is a talk about migrate and well, I hope you learn many things about migrate today. I will introduce myself, I'm Ignacio Sánchez, I'm a Drupal developer at BlueSpark and if you have any questions you can contact me by Twitter, email, Drupalore or even my blog. I'm a member of the Spanish Drupal Association and an individual member of the Drupal Association. I will show you migrating four steps. One is the which requirements we need to start a migration, which is the anatomy of a migration. After that we will see which is the migration framework itself and we finally see some performance tips to speed up our migration. Okay, let's see requirements. Migrate is in core, yeah. There are three modules in migrate in Drupal core. One is migrate, another one is migrate Drupal and the third one is migrate Drupal UI. We only will see migrate. Migrate Drupal and migrate Drupal UI is a module to migrate Drupal 6 or Drupal 7 to Drupal 8 with a button. I don't like that because you haven't got too much control, but it's very powerful. When you install migrate, first question, how many of you use migrate in Drupal 7? Great, and anybody use migrate in Drupal 8? Great. When you use migrate in Drupal 7, you have a dashboard of all of your migrate, of all of your migration with how many nodes are migrating, how many nodes have been migrating, how many are not migrating yet, but in Drupal 8, you don't see that. You install migrate and you don't see any page of admin, you don't see anything, okay? So if it's not UI, if it's not DRAS, how can I execute a migration? You need to go country, okay? There are two modules, migrate tools and migrate plus, and you have to use DRAS and Drupal 8.1 or superior, Drupal 8.2 right now. Okay, let's see an anatomy of a migration. The easiest example. The workflow is you have a source, you process that source and you have your Drupal 8, your destination. Easy. In files, we have four definitions, okay? YAML files or custom files. Those YAML files are your own custom files. And for plugins, you have PHP files that could be or core plugins or your custom plugins, okay? And you have many types of plugins, source, process, destination, builder, and ID map. Let's see the easiest example. In config install, we have the config file, article note for example. We have an ID, our ID of our migration, and you have three blocks. Source, destination, and process, okay? Source is where we take the data. Destination is our entity, and process is which file relates with what other file, okay? Title is title, ID is our node ID. Easy. And this is our PHP plugin. We need to create a plugin that extends SQL base or Drupal SQL base if we enable Drupal Migrate. And with this annotation, tell here article note. This article note is exactly the same as this. Is this one okay? We add our query as usual query. We have another function that our fill. Here we define some fill that we provide to our jammer file or our migration. And get ID's. Get ID's is how we relate all nodes, all data with new data. We configure the connection to the legacy database. Local host, old app, as usual, okay? And with migrate tools, we have drash command, okay? And we can execute migrate status, migrate import, migrate road back, migrate stop, and execute our migration. Article note, we have 128 nodes, execute that migration, status, all of the nodes are imported and we can make a rollback, okay? This is the easy example. With an article, no more fills, the easiest. And for me, it's easier than Drupal saving. We have only two files to edit and our drash commands. Too easy. But let's see the migration framework itself. The most common plugins as source plugins and process plugins. Source, we take the data from somewhere. Process, we place the data, store the data in our Drupal 8. And we have some destination plugins and if you want to see how many plugins are, you can take a look at this directory, okay? Source, here we tell SQL base, or Drupal SQL base, which database is the source. In the source, we have our plugin, article node, and the key and the legacy. Key and legacy are these places, these items of the RI, okay? We define our migration and that's fine. And in the source, which plugin will make the query, okay? As we say before, in our query, we select articles from the legacy database and these five fields. We define these fields here. These fields are promoted to, well, we see later, are promoted to process a block of the YAML file. Get IDs is where we relate the old IDs with the new IDs and prepare row. Prepare row was in Drupal 7 too. And we can modify some data and calculate some data as we want, okay? And destination is how and where we store the data. Normally, we use an entity, node, user, file, comment, normally, okay? But we can create our new destination plugins. But the common is entity node, entity user, entity comment. Need more destination plugins. Search for destination in core. And you will see many, many destination plugins. If you need to see another example. ID mapping. This is very important because the most powerful tool about migrate is this for me. You have always the information about the old row with the new row. The old data with the new data. The node 7 in our KPHP is the node 100 in our Drupal 8. So this table told this to us. And because they have a hash as Drupal 7, that could track changes between the old database with the new database. Okay, process. How we transform each field file data, okay? If in our old database we have a location object with latitude, longitude. Maybe we want to transform it to Drupal 8. We have to add a new process plugin, okay? And here you are able to map fields. Same field in both sides. Modify. Add new fields, calculate it or by default. For example, map fields. We in the query select in the legacy database the title, okay? So in our process block, this title is our column name in Drupal 8, okay? And this title is the column name of the legacy database, of the legacy table, okay? The same value. Title is title. Easy. Default value. For example, in our KPHP we haven't got any content type. We are nodes or articles. So by default we are a default value and the default value is article. Body format, plain text for example. User zero, status zero as we want, okay? Collable. It's another plugin for process. You want to call a PHP function. In this example, it's here at the time. Here you want to use this plugin. This function has to be defined if you put it in the index PHP of Drupal, okay? If this function isn't, you can call it in index PHP, you can put it here. The dupe entity. If, for example, the username could be the same in the legacy database in Drupal 8, you can't add the same user ID. So you can the dupe entity with postfix and entity type, fill. It's an example of Drupal, for example. Migration. For me, it's the most important plugin process in Drupal. This is how you use another migration in your migration. I mean, for nodes, you need a user, maybe you need a file, and maybe you need related nodes, for example, okay? So when you migrate these nodes, the user has to be migrated before. So this is the plugin, okay? You migrate 10 users and the 7 users has the user ID 10, okay? This user 10 creates a node with a node ID 11, for example. So this plugin relates the 10 users with the 11 nodes in our Drupal 8, okay? If you don't use these plugins, these migration plugins, you could have problems with rollbacks. It's very important to use that plugin. Maybe it's difficult to understand when you start doing migrations, but spend time here, very important, okay? For example, this term is a fill, but there is no here. So where we take this data? We create a new fill in our fill function. We define here the terms, and we add here the term itself. In our prepare row, we select in the table terms, our term with condition 1 or whatever, and set source property, our terms with terms, okay? Here you put this value to here, to here, and finally to the migration, to the node migration. Another example, hierarchical taxonomies, the parent term. You can use the same migration to migrate this taxonomy term, okay? This is an example taken from migrate examples that are already in code. Custom plugins, okay? I see many plugins in code, but I need a specific functionality to do that. So you can do your custom plugins. For example, in this plugin, I copy some files from our Drupal 8. Okay, we query those files, create our plugin, and this path name, this path and this name, we take it from here. And in our prepare row, we calculate this file path as to Drupal, and our filename as to Drupal, okay? And transform. I want to show you the difference of transform and prepare row. In transform, you can process some fields, but in prepare row, you can do that. What is the difference? Prepare row is executed before any migration, before you execute any migration. You do a migrate status, and prepare row is executed. You do a drash migrate import article node limit 10, and you have 1,000 nodes. Prepare row is executed 1,000 times, but transform is only executed 10 times. That is your limit, for example, okay? Transform is used when you want to copy some things that you are already doing that migration. I mean, I want to copy one picture, and I want to prepare the path of that picture, or I want to crop that picture, prepare the name in prepare row, crop the picture in transform, because you're modifying things, okay? And you do anything. Here I put an example of print, because you can debug with xdebag, your drash, or your PHP scripts, but maybe it's difficult for some people, okay? It's difficult to configure. So with print, you can see which variable or value has this variable. You want more core plugins. There are many core plugins, concat, extract, flatter, get, and more, and you have the examples all in core, okay? In core, you have many, many, many examples, a lot of examples, and you only have to search plugin and that's a plugin itself, or search for plugin action, okay? You want more. You can take a look at core modules, migrate, src, plugin, migrate, in every module, if it has a migrate template, you have many examples in colon. You can search, again, with migrate source, destination, migrate tags, really, full of examples. I learn migrate with migrate examples and core itself. And I want to give you some performance tips that, for me, are very useless, but maybe it's not your... If you have a little migration, maybe it's not needed, okay? The first task you have to ask you, do I have to migrate everything? If I have a commerce, I have to migrate every product? Yes, maybe yes. Would I have to migrate every order? Maybe I only have to migrate the orders since here and three months before. I don't want to migrate since 2006. Maybe it's not needed. Is this migration fast enough? I mean, this migration spends one hour. Is, for me, okay? I need to overperformance that migration? Yes, I need, okay. We can start by dropping indexes on every insert. If you have index, the indexes are rebuilt. So, at the start of any migration, you drop all of the indexes, and after all of migrations, restart all of the indexes. And this is a kind of slow process, but when you have to migrate a million nodes, this is very useful. Very, very useful. And it's not so much code. You have to open PHP Miami, MySQL Warbench and see which fields or which columns has the indexes. Drop it and start again, okay? Can I have some hardware improvements? Can I migrate our database server to SSD? Can I put it to RAM? In RAM, in TMFS? Can I do write change? Can I use a better CPU? Maybe, if we are in a cloud, we can change our server to SSD, execute the migration and get back, okay? But I think every database server needs an SSD. So, disable functionalities. Can I disable some modules before the migration? Maybe one that creates many hooks or do some things that I don't need. Can I disable hooks and modules? Yes, no. Incremental migration. This is very useful, but it's a bit slower than a common migration. Track changes. When you activate it, every row is hashed and stored in the column hash. So, if there has changed, migrate nodes that, hey, this node changed. I have to migrate it. Instead of migrating everything a thousand times, the same migration, okay? You can do an incremental migration of a million nodes, start on Monday and stop on Sunday, for example. I have to execute every week or with track changes every morning with these million nodes. I only have to migrate or update a thousand or 500. Maybe this is very useful, okay? More things. Multithread migration. When you execute a migration in Drupal 7, it's the same. Trash or PHP executes only in one thread. And if your server, if your front-end server has four CPUs, there are one CPU at 100% and three CPUs are either. I want to use the four CPUs, okay? There is many articles in Internet that shows you how to configure Trash to execute on many CPUs. Two, four, as you want, okay? But I use that. I name it Multidivided Migration. I don't know why, but... The reason is you have to divide your million nodes. This is an example of a previous project that I have to migrate half million nodes with no comments, no comments, half million nodes. And we break our migration in four migrations. For one, two, a thousand, a thousand to two thousand, okay? Why? Because I can execute with an ampersand of more consoles the same migration anytime, at parallel. So if we have four CPUs, I execute. I prepare my migration with three cuts of the database and execute the four at the same time. This time, the database was a bit stressed, so we have to divide in three blocks. But our migration initially took three days and with this solution took only one day, okay? It's many, many times. How can we do that in Drupal 8? We use the same plugin, CMarticle, for example, and we add here two parameters, 400 to 800, and here we take the mean is 400, and we add in the query function, and we bypass, we cut the migration. If you use this solution, it's a bit tricky, you have to take care that there are no more nodes related with between 400 and 800 and one thousand and two thousand. If the same node is used in node 500 and one thousand, you have to take care, okay? You have to see the queries very well because you can get some inconsistencies, okay? And I add here an example because I don't phone anyone here. Here, custom migration is you create a Drupal 7, generate a thousand nodes, and put that migration enable, and you can see if you execute three times this migration, you could see the three CPUs at 100%. You need three CPUs and another more for your database. You can do it in your localhost, maybe it will broke, okay? And for me the most important thing, common sense, okay? We are programmers and we use common sense for many things. Here, it's very important to use common sense. If you smell that this migration could break in some case, or we can improve in another tip, maybe we have to try. Because migration for me is a very critical process because you execute it in the final stage of your process. I mean, it can be wrong or it can spend too much time. If it spends two days in a migration, maybe you could have problems. If you prepare it for hit one button and the migration is ready, it's better for me, I think. And that's all. I think I'll be a bit quicker, but if you have any questions... You can hear me quite loud. When you were talking about dropping the indexes and restoring them for performance reasons, you had them on a pre-important, post-import function, but I couldn't see which class that belonged to when you were overriding that. Where did they live? I don't remember exactly the name of the class, but it's one of the tips of Drupalorg. I can't tell you later. I don't remember exactly the class. The other question I was going to ask is, with the strategy of having four separate migrations with different IDs for performance reasons, does that mean that the migrate maps will have separate tables and then your use of the migrate process plug-in won't be reliable? Well, I think in this tricky solution you have to store the same ID of the old database. And if you have the same ID, you map the old ID to the new ID, the inconsistencies maybe couldn't be happened because you use the same ID. I don't know if I ask you a question. No, I don't know either. Well, I'll have a think. Thank you. Thank you. Thank you for your presentation and the model, of course. I have a question about content which might have a relation to self. For example, I have a list of budget numbers that relate to some other budget numbers, but they are all in the same list. From what I've experienced, I didn't experience any problems with that, but that might be coincidental or can you tell a little bit more about how to approach that? Yeah, I think you could use two migrations. One, to migrate every node and another one to migrate this field itself. So if you have a related article, for example, I think I could use the migrate the nodes and after that another migration to related that. More questions? Okay, you can talk me in the hall if you have any questions. There is no problem. So thank you and it was very helpful for me if you evaluate this session. If you like it, if you don't like it, if, okay. Thank you.


Okay, so I'm going to turn off the lights again. I think for I'll leave the back on unless you guys find it So We're going to talk about a number of different Interesting imagine that I pull up in our session At it imagine that I have a variable That is one to ten and y that is And the one and so I want to do the correlation between them Function and are that we we used yesterday as core And it gives me a perfect negative correlation if I want to take a look at the help for core question mark And it'll allow me to use different methods I can do for x y Experiment and it will also give me a correlation of minus one There's a beautiful function called core dot test Will allow me to not only generate Correlation of minus one and shockingly perfectly inversely correlated numbers or highly statistically significant And this will allow you to generate a p-value for your correlations. It's telling you this is significantly different from one Let's talk about a couple of other topics statistical analysis So two others one something that's very common now. It's growing in a Ask I noticed some people are getting a bit tired. Do you want a coffee break now? So we've got another 15 20 minutes something that is a growing importance The 10,000 genes and their sensory has to have of their data application bias But you can't do anything at all for it You can just say okay, but you won't know exactly how to challenge


He moved to Duke in 2003 and he is now Chairman of the Mathematics Department there. His main research specialty is in long-time behavior of stochastic systems and stochastic behavior of fluids and so on. He's a great authority in this subject and he turned his attention, starting with an undergraduate project about four years ago to the probabilistic aspect of gerrymandering. And he's turned this into, well, what can I say, a second career. I mean, he's doing something that I think we all should all really respect is taking his mathematical expertise and applying it in a social realm that is sorely needed nowadays. So I want to introduce Jonathan Mattingly. Thank you very much for coming. Thanks, Ray. So I really want to thank Ray for this invitation above all because it's really nice to see him again. We don't see each other enough. And it's also nice to come back to PCMI. I was a graduate student here longer ago than I would like to remember. I had the bad luck. I was one of the few years it was in Princeton instead of in beautiful Utah. So I got to sweltering Princeton instead of up here in the mountains. So I've always been confused as a mathematician. I've always had secret lives where I did very applied things that just interested me and then I would start feeling uncomfortable because I hadn't proved a theorem in a while and then I'd prove a theorem and then I'd start feeling uncomfortable because I couldn't tell it to my parents and they didn't care except that I was happy because I find it's tough working on that theorem. So maybe this is kind of finally coming out of the closet to some people who haven't seen me parts of my secret lives before. And this one has grown to be much less secret than any of my other secret lives. So what I want to tell you a little bit about is some work that did start with an undergraduate thesis. Ray stole one of my punchlines but it might as well get it out there from the beginning. It was kind of trying to understand how to quantify gerrymandering. And there's a story about how that all got started and I'll tell you at the end. Kristi Vaughn was her name and she did an undergraduate thesis with me and then she went on and she's now a PhD student at Princeton in the Applied Mouth Program there. Look for her name. And in a way the subtitle is maybe what I would think the title is revealing the geopolitical structure through sampling. But I could have also maybe, does this work? Yes. I might have also called this how a nice mathematician like me ended up in court. And I, it's a true story and this did land me in court and I'll explain that in a minute. And I should say that I have a whole team, many of them undergrads and some of them graduate students, some of them post-docs and the main person who I've really increasingly done this work with is Greg Herschelog who's a kind of senior research scientist now at Duke. All right, so what is gerrymandering? Here's the definition. To manipulate district boundaries to favor one party partisan, that's partisan gerrymandering or class that's often racial gerrymandering, to change the outcome, to gerrymander the results. And this goes back to, this term at least goes back to a political cartoon in the Boston Gazette in March of 1812 to critique a set of districts that Eldridge Gary's party, not Eldridge Gary, not gerry, if we mispronounce it now, but we say Des Moines anyway so it doesn't really matter. But it comes from Eldridge Gary who's the governor and he was a signer of the Declaration of Independence so there's actually, follow him on Twitter, he's rather irritated that he's remembered for this and not all the other great things he did, he tweets about it regularly. I don't know who's running his Twitter account but he has a Twitter account so if you're bored, go follow Eldridge Gary on Twitter. This is really not working very well, let me see if I can turn this around, maybe I can get a little better connection, nope, did we go Technicolor up there? Yep, okay, we're back, all right, so partisan gerrymandering which is really to favor a political party versus to favor disadvantage of a particular racial group which is what historically has happened in at least the last 30, 40 years is really having a moment right now. There are estimates that the Democrats need 7 to 11 percent majority to win a majority in the U.S. House of Representatives due to gerrymandering. I should say it has a long history, it's not one party or another, at the moment Democrats are out of power in many ways so it's more affecting them but there are many cases where the Democrats gerrymandered situations so it's really a bipartisan question, I really want to say that. My take on this is very bipartisan, I try to come at this from a kind of a research point of view but informing political discourse nonetheless. There are three cases, one I should have updated not currently so Wisconsin, Maryland and North Carolina all were in front of the Supreme Court in various ways. They decided Gil which was the case versus Whitford which was the case in Wisconsin in some ways. They decided that they didn't have standing which is a political term which means, legal term which means that they didn't have the right to bring the case. If I see a car wreck and the car hits someone and then I decide to sue the car, the driver of the car, I don't have any cause, I wasn't the one hit with the car. The person who was hit with the car has to sue them and that's kind of what happened here. The Maryland one was sent back to actually go to trial and the North Carolina one which actually went to trial didn't make it to the Supreme Court quite yet. It was delayed due to some health issues of one of the judges but that was sent back to the North Carolina court to have an updated opinion so it wasn't decided. They did not decide on the merits of the case, they just decided update your opinion based on what we've already said and I should say that the North Carolina court's case is exactly the case that I went to court in. So I was an expert witness for common cause. There was a case common cause versus Rucho which is representing the state of North Carolina and the legal women voters versus Rucho and those two cases were brought together and I was an expert witness in the case in North Carolina and I actually was the first witness called, it was nerve wracking and I testified for almost three hours so you can ask me more details about that afterwards. There's also a case in Pennsylvania and that was decided that it was found the case of partisan gerrymandering and the Pennsylvania case was based on the Supreme Court on the Constitution of Pennsylvania and so there is no appeal to the Supreme Court. It's just, that's it. So the Wisconsin one was at the level of the state legislature, the North Carolina and Maryland one are the ones at the level of the House of Representatives and I should say that the North Carolina case, it was declared that it was a case of political gerrymandering and that was the first time there had ever been a federal case that declared a map, a set of redistricting a gerrymander politically and the work, that testimony, I mean what I'm going to explain to you here is the work that we did that went into our testimony in court. All right, so I'm going to explain to you what we showed the judges. And then last, I do pick up at the end here, this is, so just before I came here, this Wednesday in fact, the common cause had to submit a brief and they were discussing, they were asking us, you know, more questions about our work. It's all out there in the public but you can read about it. We have a blog which I'll point up to in a minute but it was relevant. So this is still ongoing. We're still waiting to see what's going to happen. All right. Wow, okay, there we go. Did it skip more than one? No, okay. So here are the cases laid out. So common cause versus retro, that's the North Carolina one. Gil versus Whitford, that's the one in Wisconsin. North Carolina and Covington, we also actually worked in that case a little bit and there's been a lot of places you can read about our work but there's a link down here at the bottom which is this quantifying gerrymandering website which I encourage you to go look at if you're interested in hearing more about this because we have a little blog post that are very digestible and I think a lot of them are readable at any level. All right, so, okay, so I'm going to probably have to give up on this. There we go. All right, so the story. It's a story about democracy at the end of the question, at the end of the day, right, it's a question about we all raise our hand to vote on something, somebody counts the votes and we make a decision and it's the method, it's the procedure that we use in our country to do that. And that procedure is somehow trying to read the will of the people by looking at a vote. So the basic idea is that every person gets to vote and each vote is counted hopefully only once. And the real question I want to ask is, is that enough? Thanks for laughing. If each vote is counted once and only once, is that enough to make it a fair election, all right? And let's go back to the definition of gerrymandering. Notice that there are two words in red there, to manipulate or to change the outcome. So there's some idea here that we knew what it should have been, right? We need some kind of null hypothesis. We need some normative idea of what we're considering a change against. And that was really the question that we started talking about, Christy Von and I, and that was what interested us. So let me show you a famous example. By famous I mean the normal thing, it was from Wikipedia. So if you look on the far, I'm borderline dyslexic, so I was about to say right or left and I had no idea if I was right or wrong. That side, if you look over here, you'll see a fictitious state, right? So it's a 10 by 5 grid and each of these boxes is a precinct, let's say, or let's say just a person, and they vote for the red or the blue party. And there's, what, two-fifths of the people in this state are voting for the blue party and three-fifths are voting for the red party, right? And now here's a bunch of districts. Let's say we decided we needed five districts to represent this state. And let's make up different districts. So here are three different districts, districtings. In this one, red wins three and blue wins two. Okay, that jives with the fractions, right? But in this next one, red wins everything. But in some ways, we might have said this one looked like a better districting than that one. And then this one, red only wins two, red only wins two, even though red has 60% of the votes, all right? So you see that I've never changed a vote. All I did was change how I drew the maps. And you start to worry a little bit about maybe that being maybe more important than how people voted as to the outcome. So this is a lot of story about North Carolina. That's where North Carolina is, for those of you who don't know. It's a diverse state. It's a purple state. It has lots of different areas. And here I have the 2012 districts that were used in the 2012 House of Representatives elections. They're colored, each color is a different district. There are 13 districts in the state of North Carolina that 13 representatives sent to the House of Representatives in Washington to be among the 435 representatives. And this redistricting was declared a racial gerrymander. And you might look in and say, well, of course it is. Look at these crazy districts, right? And here are some other crazy districts. Some of these are from Maryland. Some of these, I think, are from Illinois. So some of these are Democratic gerrymanders also. So the question is, is gerrymandering about oddly shaped districts? Does it have something to do with geometry? Is there something about the shape of weirdly shaped districts? Not necessarily, it's the right answer. So as a test, I mean, when somebody does this, they're setting you up, so play along. So here are three redistrictings. We're back in Sesame Street. Which of these is not like the other? One of these does not belong, if you're on your LSAT. So which one doesn't belong? The top one? The top one doesn't belong, right? Well, it turns out, if you're interested in using these for elections, the top two are the same and the bottom one is different. And that's part of the story I wanna tell you today. And I should tell you what these three maps were. The top one was the map that was declared a racial gerrymander. The bottom one was the, the middle one was the one they then replaced it with. That was then used in the 2012, 2016, excuse me, 2016 House of Representatives elections in North Carolina. And that was the map that was declared a political gerrymandering. And declared illegal based on that. And then it was that decision that was vacated by the Supreme Court two weeks ago, three weeks ago and sent back to have a new decision written. And if you're doing your math, right, we redo our redistricts. We remember how it works in the United States. We have a census on the powers of 10, right? On this years that end in zero. Then right after that, we reapportion the House of Representatives and we redraw districts based on that. So the 2012 was the first election after the reapportionment after the census in 2010. And now we're 2018 and every single map that we've used in an election in North Carolina has been declared illegal. Every once in a while I wonder if someone's gonna decide make the case that all the laws that have been passed in the last eight years in North Carolina should also be declared illegal since they were, anyway, for another, another conversation. So I think I wanna make the point from the last slide, let me just make that point, that if I'm right, if I convince you that the top two are the same, it doesn't have anything to do with the shape, strange shape districts, that's not the point. Well maybe it has to do with shocking results. And this is actually how I got interested in this. So here's a bunch of elections, some of them Democratic, some of them Republican. Let's look at the top one, North Carolina. So 31% voted, whoops, something's wrong there, the numbers got flipped. Oh no that's right, 50% voted Democrat and 48% voted Republican in the 2012 elections, 49%. But yet the Democrats won four seats only. The Republicans won nine. Yeah, something doesn't look right, I agree. Look at the Maryland case. Maryland, 63% voted Democrat, but 87, over 87% of the seats go to Democrats in Maryland. Right? And so that struck me as odd. I heard a speech, I heard a talk, and my student and I, Christie, who were interested and we were actually trying to do something different, we got interested in the question. And more to the point, if you look to dive into this one a little bit more, I don't know if you can read that very well, if you looked at the most Democratic district in North Carolina, it had 78% Democratic vote. And the least Republican had 63% Republican vote. Most Republican, thank you, most Republican, he's keeping my toes, the most Republican had 63% Republican vote. And they were saying, well that's clearly wrong. There's clearly been Democrats packed into this most Democratic district, but then my mathematician alarm bells went off. I said, well, how do you know that? I mean, could it just be where people live? Could that be very natural? How do I decide that? Right? Okay, maybe that's 78s too much, but maybe 70s just fine? I don't know, where do I, how do I figure that out, right? I mean, it's like you take a whole bunch of numbers between one and 100, pick five number, 10 numbers randomly between one and 100, and they take the maximum. Not surprisingly, the maximum is much bigger than the mean. Now we're near 50, right? It's much higher. It's called order statistics, go look it up. So, I really can't drift from this. All right, so, you know, kind of what, you know, is this some red flag that we should be worried about? You know, if not, what is the signature of something being gerrymandered? If it's not a wiggly, scraggly, districting, what is it? How can we get at that? So, the U.S., we live in a system which is not proportional representation, right? We have this idea of individual localized districts, which are well, which are, for good reasons also, right? This idea of local governance. And our states are not homogeneous at all. Here's North Carolina. This map is population density. So, Charlotte, Raleigh, Durham, Chapel Hill is the one to the far right. The middle one is Greensboro. The blip over to the left is Asheville. Down here is Wilmington. And they all have different political perspectives. It's not just urban versus rural. This is county by county, 100 counties. What pres, the presidential vote in 2016. So, this rural area right up at the top was very blue. And I live in that very bright blue boxes there. And I grew up in the slightly lighter blue box down at the edge. Yeah, go ahead. Yeah. Yeah, that's true. We'll come back to all this later. Actually, we should, I want to make sure I get to the end, but I really want to hear all your questions at the end because it's, all this does is raise questions. So, keep thinking about the questions. Let's see, here we go. So, how do we quantify gerrymandering? How do we do it in a way that actually takes into account, doesn't dismiss this natural, this inhomogeneity of our states? The fact that there's this geometry of our states. The fact that there's this population, this geopolitical geometry of the state. How do we take that into account? And, whoops. Yeah, well, when is a map fair? What is a map typical? Is that the same thing? Is that a mathematical sleight of hand I just pulled? So, what if we drew the maps, the districts randomly? Right? Rafe outed me as a stochastic dynamicist. So, you know, I do stochastic spatial processes often, stochastic PDs, stochastic homogenization at times even. So, you know, what if we drew the districts randomly? What if we drew them randomly without regard to party representation, right? Without regard to anything that was partisan. And what if we looked for the likely behavior, the typical behavior of an ensemble and we played that off against what happened in a certain map? Could we use that as a normative way to detect when something was a skew? A little bit of a pun intended. So, could we create a null hypothesis without any information about partisan, that was not influenced by partisan data? And that's really what we set out to do. There's a lot of groups, so we've been doing this for a while, there's a lot of groups who've kind of, who've done it for varying amounts of time. Joey Chen, Jonathan Rudin at Stanford in Michigan, Wendy Cho, a group centered with Ben Fightfield's thesis at Princeton, and Alan Fries and Wes Pegdon and Maria have a really nice theorem that ties into all this and Wes has actually testified in court also. So, in the short time, I'm really just gonna tell you the story that we did, but it's definitely, there's definitely resonance with things that various people have done in various directions. All right, so. And one thing that's important about our work is we really try to think about a set of kind of a principled method of drawing redistricting. That we can really, that all of our assumptions are clear and out in front, so that they can be discussed openly. All right, so, this is what we do. We say, let's draw a random redistricting and there was some guidance for this in North Carolina. There was a house bill that was passed through one chamber of our legislature, but not through the other one, so it never became law, but various versions of it have been introduced over time by both the Republicans and the Democrats. And it lays out the following criteria. Districts should be equal to within what, a tenth of a percent. Districts should be reasonably compact. It actually goes a little bit farther than that and has some wording about that. You wouldn't call it a definition, but it's not as far from, it's closer to a definition than what I wrote there. They have to be connected. Territory has to be contiguous. They have to comply with the Voting Rights Act, and so North Carolina was under section, was not under the main section, but the lesser section of the Voting Rights Act, but you wanted to protect yourself against lawsuits, and so what that means in North Carolina, about 22% of the safe population is African-American, so that means you need about two districts that the African-American population has a reasonable chance of affecting the outcome of the election. That's the current legal standard. I can say more about that if you want. And it also said explicitly, you should not take into account incumbency. You should not take into account party affiliations. You should not take into account demographics. So with the exception of the Voting Rights Act, that's all the other criteria in nonpartisan. Since African-Americans vote heavily democratic, especially North Carolina, that almost is a surrogate for being in a democratic party, but the Voting Rights Act forces your hand there, so you want to do it in a very leisurely way. So, where's the math? So, what I have is a 13-color POTS model, and what does that mean? So what it means is I have a lattice, and at every lattice is a precinct, and so I have all the precincts, and I have a map from each precinct to the number one through 13, which is the district that it's in, the color, if you will, for the statistical machinations in the room. And then I have an unusual energy, energy that tries to measure whether the populations are equally distributed, or energy which tries to decide a surface energy that tries to decide if they're relatively compact, a county energy, because there's something in the rules in the Constitution of North Carolina that says you should not try to split counties because they're seen as political constituencies that should be left whole, and then there's some energy that tries to make sure you're adhering to the Voting Rights Act. Lower scores are better, so these numbers, these different J's, we call them scores, they're energies. Lower the energy, the better, the lower the score is better. And then what we do is we build this Gibbs measure, we build a probability distribution on the space of all redistrictings, okay? So what that really is, is saying that we're gonna pick districtings randomly according to this probability distribution, where the probability of picking a certain redistricting goes up as the score goes down. So the lower the score, e to the minus, the lower the score, the higher the probability, okay? And so it tries to pick redistrictings that satisfy the principles that we've put in. And you can debate about what principles we put in, so we, at one end, give you a methodology for thinking about this and then open the door and say, let's decide what principles we should put in this score function. So here's one of them. Here's the equal population. So what you do is you take the population of each district, n goes from one to 13, you add it up and you look at the square deviation from the ideal population of a district, which is one over 13, the population of North Carolina at the moment of the census. And that comes out to be this number, right? 733,000 something. All right? And so you sum this up. So you really have this point in 13 dimensional space and you're measuring the square distance to it of your map. And you try to lower that dimensionality. Then you also have the compactness score, which is actually, this number is reciprocal of something that I didn't know. They used in actually in political science, but the mathematicians, you guys will recognize this as the isoparametric constant of each district. So you take its perimeter squared divided by its area, and this is older than the hills, right? This goes back to at least Dido, right? Carthage. So there's, this is a room full of geometric measure theorists. Everyone should be nodding, right? So we have the perimeter squared over the area. And of course, that's minimized by a circle. So this wants to try to make it compact if we can. So we add up the isoparametric constants for every one of the districts. And we say, let's minimize that to try to keep it compact. We consider some other energies, but this one we like the best, other compactness energies. All right. So the recipe is, first we determine a compliant random redistricting, all right? Then we count, so we do that by sampling from this distribution. Then we count the number of votes in each new district that we just formed using some historical election. So we take the House of Representatives race in 2016 where we had the votes in each precinct. We add them up in each of our districts, and now we have a winner in each district. And we record that. We also record how much they won by in some statistics. And we do that over and over again. And we did that almost, the data we presented in court was 24,000 different maps. We actually checked it against 120,000 different maps that we generated to try to benchmark our scores. So you do this over and over again. You get the idea, you do a loop. So you take a map you've generated, you run an election on it, which is an actual election with the actual votes that people cast. Now we're making a lie. We assume that if you vote a Democrat, you stay voting Democrat. If you vote a Republican, you stay voting Republican. That's not always true, but you can check the results by using lots of different elections and see if it's sensitive to that. Okay, and the way we sample step one is we use a Markov chain Monte Carlo algorithm, Metropolis Hastings algorithm that dates back to right after the Manhattan Project. All right? So it's the cornerstone of machine learning and Bayesian statistics in many ways. And the way it works is the following. So here's Iowa. This is actually Iowa. These are the precincts in Iowa divided into four districts. So each of the colors is a different district. We first identify the edges in this graph which are conflicted that go between two different colors. Then we pick one at random, that one, and then we choose a direction and we flip the color across it. There we go, we flipped it. Yeah, got it? And we keep doing that over and over again. Okay, if you do that, it doesn't preserve the measure. You have to do a step. You decide whether this move is accepted or rejected. That's the Metropolis Hastings algorithm. There's a Wikipedia page about it. You can read about it. It's not hard. It's just some elementary probability. Why it works is a little trickier, but it's nothing hard. I teach in my undergraduate probability class all the time. And in fact, if I have a little moment at the end, there's a web app that I'll run which will show you this in action. My partner, she's a fantastic D3 programmer and she whipped this up in a weekend when I was trying to do math.  All right, so this is not working. There we go. Here's North Carolina, about 3,000 different precincts. 3,000, yeah, 3,000 different precincts. There they are on the map. And so we color them each based on this and we generate them. So here's one of the maps we generated. Here's another map we generated. Here's another map we generated, another one. So this is just the first couple of maps in our atlas, our ensemble of random maps we generate. All right, so, okay, so what do we do with that? So let's go back to the story. So remember, we had these three maps I gave you at the beginning and I claimed one of them, these, the top two were more like the bot, more like each other than the bottom one. So first of all, let's see what the distribution this gives. If we run it with the 2012 elections, this is the number of seats the Democrats won. First of all, notice, it's not one number, there's a distribution. It should worry you a little bit with only those criteria, I'm able to get four or nine Democrats elected. I mean, that hardly seems like the votes actually matter if I can go from four or nine using the same number of votes just by changing the map. Here's the 2016 election, a little bit more Republican, three to seven, okay? Yeah. Are these are compliant? Yes. Yeah, we actually threshold after the fact to make sure that none of these are too egregious, okay? So we'd really put a little indicator function against our probability measure, but. All right, so let's go back to those maps we cared about, there they are. And here they are on that map, on that thing. So the two that were at top are these boxes down at four and at three. You see, they give the same political outcome. And the judges map, so I didn't tell you what the judges was, it was this bottom one, it was called the Beyond Gerrymandering Project. So an elder statesman, he probably hates it when I say that, of North Carolina Tom Ross, former president of the University of North Carolina System, came to Duke after he stopped being president and of North Carolina, University of North Carolina System and he was interested in Gerrymandering. And so he got together a bunch of extremely respected jurists, most of them retired Supreme Court of North Carolina judges, many of them former chief justices, half Democrat, half Republican. He said, let's follow this rule, this bill that was proposed. And they sat in a room, I watched them, I went to the meetings, and they argued with each other and they came up with their map and they voted on their map and they accepted their map. It was a map that had people from both parties who decided it was a simulated bipartisan redistricting commission. Their map's not so bad. It does a pretty good job, okay? And that's kind of my normative, that's my piece of reality injected into my mathematics. Here's a whole bunch of different elections. Governor 12, U.S. House of Representatives 16 and they're ordered by how Republican, so the percentage on the left is the global vote fraction for Democrats. So the top ones are more Democratic, the bottom ones are more Republican. Notice, so this little blue histogram is what you get when you take my ensemble 24,000 maps. The green dots are the judges. Notice they kind of track the peak. They shift along with it. So if the public opinion changes, so does the outcome of the election. These other dots are the maps that the legislature made. Notice the outcome never changes almost.


Bill Walton here, as a volunteer ambassador for the California Department of Public Health. Our California Department of Public Health has created this special interest license plate to support cycling as a way to stay physically fit. Your purchase of your California bike plate will promote cycling as a physical activity, create safe places to ride through cycling advocacy, support earn-a-bike programs for children in need, and conduct safety and share-the-road education programs for drivers and cyclists. And you can make it all happen by going to calbikeplate.com. Riding a bike is good for me. It's good for you. And it's good for everyone. And everything. And what better way to get what we want and where we're going than by riding our bikes. This is a no-brainer of the highest order. We have serious health challenges. Air quality, obesity, respiratory issues, and life's congestion and stress. Riding a bike helps alleviate all of these problems. You can do something about it. Besides just riding your own bike, please go to calbikeplate.com. Be a part of the solution. California is the greatest place on earth. It's home. Let's do things to make it better. And to make it right. Calbikeplate.com, where dreams come true. Clean air, reduce congestion, good living, and riding our bikes. What could be better?


Awesome. How's everybody doing today? Good. Awesome. Awesome. Let me talk about a topic that is really dear to me. I've been working with this type of system for the last year and a half and after going through a lot of the pain points and growing pains of iterating through a project using other methodologies and other theories, this is really just a big relief. So, let's dive into it. My name is Joshua Giauea. I'm a senior front-end developer at a company called Code42. We created a crash plan, a software called Crash Plan, which is basically an endpoint and backup solution for enterprise customers. Some of our big clients are Microsoft, Nike, Georgia University is one of our clients actually as well. Hello. Come on in. Feel free to connect with me. I'm on LinkedIn, Joshua Giauea, or you can email me at yo at jgdesign.com. All right. This is what we're going to cover today. What is modularity? How do you achieve it? How do you get there? How do you define it? Why change your approach? What are the benefits of not creating templates to represent designs handed to you by your designer? The process, so when you start thinking about developing modularity, you have to first start with the design process. So, we're going to take a look at atomic design, which is a concept created by Brad Frost to break your design up into more consumable and reusable chunks. I'm going to demo the website we created for Code42 using the strategy. I'm going to show you the admin interface and the rendering and why it's beneficial. And then I'm going to get into how do you implement this in your workflow today. We're going to go through some code samples and also have a repo up that you can pull down and get started with it right away. Talk a little bit about Gutenberg. I'm not going to get too deep into it. Essentially, with the new advent of Gutenberg and the core, this strategy is really going to play nice and I'm just going to kind of cover why I think that is. Legos. You guys remember these things, huh? Great. These little blocks can create almost anything from a boat to a ship to a plane to whatever you can imagine. And this is the kind of way we want to start thinking about development is how do we make these blocks that we can implement in all these different designs using these different content patterns to execute a cohesive design pattern. I just want to throw this in there. I'm from Minneapolis. This is the Mall of America. These things are huge. I mean, there's three stories tall. It's just it's amazing. But when you think about us creating blocks or us creating modules, we're building things just as big as complex as these things that they build here. We're just doing it in code. So if we can break that down in more consumable chunks, it's awesome. Atomic Design. Atomic Design is comprised of five distinct parts. And those parts are atoms, molecules, organisms, templates, and pages. Templates we're all familiar with as WordPress developers. But we want to start thinking about scaling back from the template and how we can take a look at a design and say, I see multiple reusable parts throughout my template. Let me break that down into a chunk that I can pull in and pull from at any time. Here they are again, just kind of outlined. Atom, molecules, organisms, templates, and pages. Let's take a real world example. See what that looks like. Here we have Instagram interface. You got the atoms are broken down into iconography, typography, thumbnail images, and a molecule is comprised of two or more atoms. So when you start seeing two atoms that could go into a design piece that can be used to represent an organism, now in the context of design organisms represents one Instagram post and everything attached to that Instagram post. All the information and content you need to know about that post. In the design, in the development phase of it, we refer to this organism as a module.  We're going to break this down one more time using a familiar UI. I'm sure you guys have all used Yelp. I consider myself a foodie, so I'm always on Yelp. You got to cross-reference some of the stuff, though. I don't know that I can trust all the reviews. So right here, we see we have some atoms just broken down into smaller chunks. That creates this molecule. And there's a lot of power in this. There's a lot of power in understanding this. But I believe the real power comes in to when you understand where to start and stop an organism or create a module. Because see, now this module has been repeated throughout. And this organism has been repeated throughout. And what's nice about this is if you do it correctly, you can omit some of this content and still get a good design layout. So if it doesn't have a comment, I could not display it. If it doesn't have a rating yet, I could not display it and still get a good design flow. Just a couple more examples of where these atoms and molecules play out. But you can start seeing that if they developed each one of these as templates, they'd be repeating themselves a lot. They'd have to do it again in this view, right? They'd have to recreate that molecule in this view. So modular design is comprised of two patterns. Content patterns and display patterns. A content pattern is a solution to a reoccurring design problem such that you could use a solution many times and never use it the same way twice. So going back to my previous slide, a Yelp listing with a comment or not a comment. Those are two different design problems, but they're being used differently. So that would be a content pattern. And the display pattern describes a specific rendering of a content pattern. So this is taken directly from the Yelp style guide. And you can kind of see it just kind of reinforces the point that I just put across which is we only need one module, one organism to display these different content patterns because not much has changed or added throughout this. And if you start thinking about it this way, you'll have a lot of reusable components. Here's just some more examples of that same content pattern. And again. So what are the advantages of moving over to modular design methodology or atomic design strategies? You don't repeat yourself. You don't create a template that is, you know, main template one, no sidebar, main template two, with sidebar. You don't need that. You start using chunks. And in fact, we only have one template. It's called page. And all it does is loop through the modules. But we'll get into that later. Dry code, not repeating yourself. Another big advantage of this from a development standpoint is you can ship your markup for your module and your SAS file for your module, keep those interlocked. And that way, when you start a new project, you can always pull from your old module library. You're not starting a new, more collaborative and iterative process. Code 42, when we embarked on creating the new website, all we had from our design partner at Zeus Jones was wireframes. Normally, during this phase of a project build, there's nothing really you can do. Just have a wireframe. You don't know if it's approved. You don't know what's going to change. You're hesitant to get into the development part because you know you'll be changing something or something's going to change. So with this process, what it allows you to do is start to set up the data, right? I knew that each module was going to have certain content or certain fields mapped to it, so I could set that up. And what that allowed me to do is pass it along to my content editors and let them play with it. And then they start to see, oh, actually, we might need another theme or actually we might need another field, right? And so I can iterate through that process with them and they can iterate with that process with the design and we can all continue to work in tandem. So when we finish the project for Code 42, they do a lot of marketing and they create a lot of landing pages and I'm sure you guys are all familiar with landing pages. They vary slightly depending on what they're trying to convey as a company and normally there's dev interventions for each one of them. Each one of them has slightly different content and they need to develop her to edit, pen, change that content and change the look and feel. At Code 42, we have produced over 500 landing pages without any dev intervention, so the content team has just run wild with it and they have so many different layouts because of the module library of more than 20 modules that it doesn't look stale and it all looks fresh and new to the user. So yeah, just some gifts kind of reinforcing what I was just talking about. All right, let's go through the process here. The first thing you're going to want to do is identify patterns and you can do that right away when you get the wireframe. You can start seeing, oh hey, that's a call to action button. Oh hey, that's a slide image and you can start to think about how are we going to represent that in our admin interface. You're using advanced custom fields. I'm sure you're kind of already acclimated to the way you would do that with advanced custom fields. If you're using some other field management plug-in as well, you can just start mapping those things in your mind or also just start developing those things and then categorizing the patterns. Right, so it's a design pattern or a content pattern. So this is what I was referencing earlier. This was our first look at what Zeus Jones was creating for us and we were able to start developing at this point once these wireframes were approved. So if it's a content pattern, it's probably going to be an advanced custom field or a field plug-in of some kind or if you roll your own meta boxes, that as well or if you're already experimenting with Goodingbird, that's probably a block. Design patterns, we handled our design patterns using SAS. If you use SAS or if you use straight up CSS, doesn't really matter. But when we use SAS, it made it easier because we could use a naming convention to map each one of the modules to each SAS file that it represents. So this is the way it broke down for us. I guess my slide is a little off here, but these atoms turn into this slideshow, turn into this module or organism for us. And then the page templates iterating through each module. So we've got a hero CTA module right there. That's a primary text module, slideshow module, three-up module. And you can start to see if you reconfigure some of these modules, you start to get a whole different layout. So this is the way we organize our SAS. The atoms we kind of thought of as color typography and iconography. The molecules, that was some more themed layout and utilities overall. So padding margin, how are we wrapping these things? How are these atoms sitting in a div next to each other on top of each other? And then organisms. And they were represented by a SAS file for each module. I think I'm going to get into a demo now. Let me pull it up real quick. Alright, so I created this little test page using our modules. And remember, we want to solve multiple content problems with our design. And so the application of our corporate website at Code 42 and this WordCamp, they're two totally different applications of content. But I was able to create something with the modules that I believe represents the content. We'll just take a look at what those modules look like. So this is a hero CTA module. And through other modules we found that there were different conditionals we wanted to add throughout the process. So are we going to use a background image or a background video? And then we also put themes around a lot of the modules. So if it's a light theme, the text is dark. If it's a dark theme, the text is light. And there's some different color changes that cascade due to those overarching theme styles. So that's what a hero CTA looks like. But one of the big powers of using this strategy is the ability to just drag and drop content. And this is all done with advanced custom fields flexible content. So we can take a look at what this page looks like or not. Let's see if I can get it better on the page for you guys. Alright, so we're able to add that content to these modules. And I feel like it conveys information about this pretty well. So I think we accomplished what we're trying to do there. We had two different content problems and we solved them with one design solution. I'm sorry you can't hear me. So we had two different content problems and we solved them with one design solution. Better? No. Can you recap the content problems that you were addressing? The content problems that I was addressing? Well one of the content problems was for us at Code 42, our corporate acquisition site. And the other content problem was how do we display content that is in line with this conference. So how do we accomplish this? We use get template part. I'm not sure. So show of hands familiar with get template part, use get template part. Okay, it's a built-in mechanism in WordPress that allows you to pull in smaller chunks of PHP. If you're familiar with get header or get footer, it's kind of that but for your page content. I actually did the demo. So to achieve this, what do we need? We need advanced custom fields. We need flexible content and we need this thing called a module loop and it's very easy to achieve. So I get this template part. It's called module page and at which point I find out if my custom flexible field modules has rows. If it has rows, I find out if get fields exist because that's important. You're not going to be able to get the fields without that. And then we call a function called module loop. What the module loop does is it takes the name of that row, which is your layout. And so in the hero CTA context, it'll be hero CTA, alternating row will be alternating row. And we say this is the name of our row in advanced custom fields. We need a corresponding module file or template part. And we got to do a string of place on that. What we don't have to advanced custom field by default does an underscore and we named ours with a dash. So then we call a function called the module and all that's going to do is locate the template and render it. So just goes through, make sure it's not empty. When we pass that parameter, it locates it. It knows the module name because we just gave it to it. And then the false parameter is so you can load multiple modules on the page or else it would only require once. And after the first module is loaded, it would no longer load. We throw a fallback in there to get content if these modules don't exist. That way the user will always get something and that's always better than nothing. So if you guys want to get started today with this application, this theme using advanced custom fields, the module loop, and I base this theme on Sage theme. So if you're familiar with that, it incorporates grunt and I think it's a good starter theme. You guys can go here and download this repo. Another thing I want to talk about and how many people are familiar with AFC dash JSON, the folder. Okay, so this is another big component of this is there's something you can do when you have advanced custom fields, which is define an ACF JSON in the core of your theme. And what that does is it writes all of your fields that you've defined to JSON. And why that's important in the context of this is if you're sharing modules with different developers or you want to reuse the modules across different projects, you can automatically get to field definitions by just sinking in the back end of your WordPress admin. And you don't have to rewrite those fields every time. So that's what makes that powerful. One more thing I want to talk about, which is Gutenberg. So how many people here are familiar with Gutenberg? Have you guys nice? Nice, good, good. Have you guys used it at all? Delta block? How many people built a block? Okay, okay, cool. Yeah, that's awesome. That's awesome. So this concept of modular development or atomic design is going to play very well in the future of WordPress. And the reason being is because Gutenberg breaks each one of its blocks down very similarly to what I just showed you. And you can configure and reconfigure. Another powerful thing about Gutenberg is you have reusable blocks. Now, what a reusable block is, it allows you to find a block somewhere, anywhere in any post or any page, and then access that later. Anywhere and change it at any time from any poster page. So let's just say it's a call to action. And it's for the main WordCamp US page, and it's in a sidebar. And this week, it's Atlanta, and next week, it's wherever. And they want to change that and they want to change on every page, which is represented, they can do that on any page. So it's a very, very powerful tool. That's pretty much it for me.  Yes? In relation to your ACM workflow, you build flexible content. You build each module as a separate field group? Are they all in flexible content? Great question. Great question. So we did do it all in one. But if you're using version control, it really becomes a problem. There's almost a merge conflict every time you try and merge that monolith of ACF JSON. So what we ended up doing is we create a field group for each module. And then we name space, or we name that as a clone. And then we clone it into our repeater. And that way, it makes it a lot more manageable. I read this book, and the modular loop that you're using. Is that something similar to how to create a field WordPress? I guess what I'm trying to say is, did you take the way that he created it, the way that he's using it on systems that are not WordPress, and utilize their own WordPress system? Got it. Yep. Yep. So our question is, Brad Frost has an implementation of how to use or loop through the organisms in another application that isn't WordPress. She wants to know, did I pull from that in creating this solution? The answers, no. I didn't pull from that. However, looping through a bunch of modules is probably a well-known application of how you would reach that. Any other questions for Josh? Josh, are you going to have your slides posted anywhere online? Yeah, they're actually online, so I could tweet that. Do you have your Twitter handle up anywhere? I'll tweet it from my handle. I can tweet it on the Word Camp in Atlanta. Yep, perfect. Awesome. Yeah, thank you.