This is one of my favorite topics the economics of medical care and It's something I've had a long personal interest in Because my father who was a physician family practice doctor in South Carolina for his whole career and It was he that got me interested in economics because he had an interest in free market economics he was a fan of Ron Paul and that was before Ron Paul was cool and His bookshelf was full of great works on the intersection of Economics and medical care as well as many other things and he I remember had a Strong opinion about medical licensure opposed Of course and he said in One of the things he wrote That medical licensure is a mistake. He says it's only about a hundred and three years old where I live and this was some time ago and Similarly about a hundred years old in other states, so it's a very new idea when placed against the backdrop of medicine as a whole And he says if you look at it It was the physicians who wanted to remove certain kinds of competition that they had disdained for it's one of the reasons for Higher costs. It's one of the reasons that orthodoxy and medical care has been able to be so militant and stamp out so much of unconventional treatment by calling it quackery and He says I indeed believe that there is much quackery out there and pushing it off the playing field without being able to show That what they do is all that bad or all that different from what we do so I'm opening this talk with a discussion of one of the most prevalent and yet unquestioned Interventions of government into medical care and that is simply the government's ability to restrict who can offer medical services It's not just doctors but Nurses nurse practitioners Many many other medical providers who are Subject to this kind of restriction and it's a very damaging kind of restriction But if you ask people Well, what would you think society would look like if we got rid of medical licensure by the state They would say well this this would be a terrible world to live in any crank would start operating on your brain with Monkey wrench and this would this would I mean people would be dying in the streets because of bad medical care and That's I of course We don't have a whole lot of episodes of Free medical care and a kind of a modern environment to really look at to see what would things really appear to be There are some Liberty-minded physicians who have looked at this one that I'll quote later in my talk is Michelle Akkad who's written some great stuff Not a lot because he's a physician and he's very busy But he's written some great stuff that appears on the Mises dot org website, which you can take a look at later accad he spoke he's he's spoken here on occasion and And So he's he wrote an article that appeared I think about two weeks ago that that Speculated on what things might look like organizationally for doctors Would they be mostly an independent practice or would they be employees of larger medical organizations Mayo Clinic types of organizations? And so there's a there's a lot of speculation about what things would look like, but I think we We sometimes I say we In general not not so much libertarians or free market oriented individuals, but we tend to think that Without some kind of restriction on medical care, then we would be unprotected from quackery And that's not really well Born out by what we can see of the history of medical licensure in the United States I'm not as familiar with other countries But I'll draw your attention to an older article by Ronald Hammowee that appeared in the Journal of Libertarian Studies in 1979 he this is a fairly long article he goes through the details of medical licensure in the latter part of the 1800s and he says You know actually it was this episode of relative freedom in the medical profession Where doctors could go to a medical school of their choice? Medical schools that had that they were so plentiful and cheap that many many people could go into medical school and They could get them they could get medical training and The quality of their care the the satisfaction they gave to their patients was The only thing they really had to be concerned about So the government did not have restrictions of a Heavy-handed nature that it does now on who can get into medical practice After the mid 1800s there was a leftover period left over from colonialism There was a period of medical licensure That lasted until about the 1830s to 40s and then what happened Is I think very interesting the decline of medical licensure after the colonial period brought about a flowering of innovation in medical care and and the Dying off of some very harmful practices that physicians had been engaged in For many years you may be somewhat familiar with this so hammer. We says now I'll give you a link the quotation here because I Think it's important He says the condition of the American American medical profession at the close of the Civil War Was in almost every particular significantly different from that which obtains today The profession was throughout the country Unlicensed and anyone who had the inclination to set himself up as a physician could do so the exigencies of the market alone Determining who would prove successful in the field and who not medical schools abounded The great bulk of which were privately owned and operated in the prospective student could gain admission to even the best of them Without great difficulty with free entry into the profession and Education in medicine cheap and readily available large numbers of men entered practice Competition resulted not only in a proliferation of medical personnel, but in the growth of heterodox theories Arising in opposition to standard medical therapeutics Regular medicine in the early 19th century relied heavily on symptomatic treatment consisting in the main of bloodletting blistering and the administration of massive doses of compounds of mercury antimony and other mineral poisons as Purgitives and Emetics followed by arsenic all compounds thought to act as tonics in case you're not up on your medical science these are Generally regarded as and I think correctly regarded as bad things to put in your body Therapeutic regimen thus developed came to be known as heroic therapy You'd have to be a hero to really undergo this kind of treatment and certainly killed large numbers of patients Unfortunate enough to undergo treatment at the hands of its practitioners now This is I think the interesting part of this that hammer. We says Into this mix of Treatments we would regard as Fatal today came to significant alternatives eclecticism and homeopathy now I'm not advocating These these techniques today but there were some salutary results from the fact that Physicians who followed these practices could easily get into medical care set up a practice and say well rather than inject yourself with with arsenic and and and All these other compounds You can follow our advice and you know, we'll see what happens. We'll see whose Technique is more successful And they successfully competed with regular medicine and Hamoey says between 1830 and 1850 they were in great part responsible for the repeal of medical licensing laws He says eclecticism completely repudiated Heroic medicine and injected common sense into the care of the sick and the ailing Homeopathic physicians were strong proponents of fresh air sunshine bedrest proper diet and personal hygiene for Recuperation in an age when regular medicine regarded these as of little or no value Now if the alternative is arsenic mercury and other heavy metals in your bloodstream and Blistering you and draining you of your blood There's a lot to be said of simply leaving the body alone and letting it heal Using its own immune system rather than compromising that immune system in a variety of creative ways So mainstream medicine by the 1870s had benefited from these innovations You know the saying that's part of Physician training at least I hope it still is first do no harm So at least by allowing people to rest and feeding them well and getting them some sleep and sunshine fresh air They were not doing a great deal of harm now That's that's one common way in which Governments restrict innovation in medical care I'm not a particular devotee of any alternative medicine practice I Don't have any strong objections to most of them either I'm sort of agnostic on this. I'm not really a physician that listened to physicians My father was in mainstream medicine. He was not homeopath or osteopath or in in one of the other kind of alternative groups So I'm I do think medicine has been has made some progress, but it's made progress Partly because it's been subject to competition Where somebody else can come along and try something different and new without being shut down immediately by the state Now one of the other problems that I'd like to discuss here is The problem of the state having enough knowledge enough knowledge to Make decisions that would be appropriate for a patient and There's been some work on this I've contributed in a small way to this In the Journal of American Physicians and Surgeons my father and I wrote an article which I think appeared about 2007 or 2008 by the way the Journal of American Physicians and Surgeons is a great Kind of alternative to some of the Statism you'd you'd see in a lot of the other Medical journals and there's a lot a lot there Worth worth looking at there's an organization called the Association of American Physicians and Surgeons and Look them up if you're interested in this it's a great free market oriented Society of doctors I spoke at one of their conferences several years ago And it's a great experience to see these doctors that are really committed to the care of their patients and see the Barriers that the state has placed in the way of taking care of their patients and would like to see those barriers taken down So one of the things that states do Is try to intervene in the decision-making process between the patients and the doctors? Unfortunately, they cannot Have the information they need to improve upon those decisions Now F.A. Hayek whose name you've doubtless heard multiple times Already this week and previously I wrote a very important article in 1945 called the use of knowledge in society and Hayek pointed out in that article that The kind of information that central planners would need to have To make Good decisions is simply not available to them by the nature of that information. He says that knowledge Which he called tacit knowledge? Cannot enter into statistics and therefore cannot be conveyed to any central authority in statistical form Can we look at the? Interaction between a doctor and a patient and Judge that encounter judge the effectiveness of what the doctor is doing by looking at a little bit of compressed information in the form of a electronic medical record or some other kind of record one of the Criticisms that my father repeatedly advanced against The bureaucratization of medical care before his death in 2009 was of electronic medical records and This is all the rage now. You have people like Newt Gingrich who are just big fans of Electronic medical records the idea being we can take all of this that's going on with a patient Smush it down. You like that word smush very technical term into a series of numbers and checkboxes send that off to somebody from Medicare and Medicare is going to be able to make some kind of reasonable Evaluation of what's going on? And it gives this this illusion that The doctor can be held accountable by the insurance company or by the government and That's simply not the case Hong Kong and our net in a Article 2008 article on the cei.org website Say that every day thousands of physicians and patients make myriad choices from available drug options and they're looking at particularly the FDA's kind of intervention and they say basically The FDA can't have the kind of knowledge that need to have to make a decision about what kinds of substances are appropriate for a particular patient Conquered our net say that they take into account differences the physicians and the patients take into account differences in effectiveness side effects and drug interactions for each individual patient FDA scientists may know a lot about the drugs they evaluate and their average effects on thousands of users, but they know nothing About the individualized physiology of each patient on the other hand Intensively trained clinical physicians who do have a knowledge of individual patients are best able to advise them If the drug is appropriate In my American economic history class, and I'm not going to get off into that today That's not my topic, but in in my class. I mentioned the movement toward interchangeable parts in manufacturing which allowed for mass production and I'm afraid that medical care As it becomes more bureaucratized tends to think of human beings as being kind of like machines with interchangeable parts that each human being will react similarly to a given therapy and That is not the case now again, I'm not a physician, but I will refer to you to Michelle Akad's Mises daily article. I think it was June or July of last year 2015 on this Where and and also he had a paper delivered at the Austrian economics research conference earlier this year where he talked about the fact that human beings are each different and the mechanistic kind of model of medical care is not very well suited to Healing In fact, it Promotes a view of health itself. That is Akad says Inappropriate so when we try to use these electronic medical records and other means of Compressing information and sending it off to a distant bureaucrat That carries various risks. One is that the kind of coding system that is used Misses circumstantial information The fact that there are certain details of this patient's personal life that may make it difficult for this patient to Regularly take the medication prescribed in a way that will give that medication the desired effect If the distant bureaucrat doesn't know this then that is Going to detract from their ability to Evaluate what's going on maybe this it's very difficult for this patient to move around its mobility is restricted So just getting into the car to drive to a pharmacy or drive to a doctor's office May itself present certain risks And challenges for someone who is Wanting to get well So what happens is we have these centrally imposed standards by the bureaucrats who have this imagination that they They know what is going on and the doctors then if they really care about their patients have to decide Do I want to take care of my patient or do I want to satisfy the bureaucrat? And I think conscientious doctors will say I Don't want to lose my medical license, but I need to try to Help the person in front of me and Conscientious doctors will sometimes creatively bend or break the rules to help patients The bureaucrats of course know this and take great offense at this so they will create these draconian penalties To Try to terrorize doctors into following the bureaucrats standards even when that is detrimental to the patient Mises in his great little book bureaucracy, which Peter Klein mentioned yesterday in his talk if you missed Missed Dr. Klein's talk. I believe that was recorded and you go back and and listen to that But bureaucracy is as as dr. Klein mentioned one of those Shorter easier to read but perhaps underestimated books by Mises and Mises points out the governments by their nature are formalistic and rigid If you get stopped by a police officer for speeding You can you can talk To the police officer, but the police officer is interested in writing a ticket meeting a quota following the rules and bureaucrats are not incentivized to Ignore the rules. They know they will always be safe from criticism by their superiors when They follow the rules and So even if the rules don't make any sense In a given situation the bureaucrat knows if I start exercising my personal judgment here I can get in trouble. I will not get in trouble if I follow the rules So even when the rules don't make sense The bureaucrats tend to follow them The core problem here is that there's a lack of a measure of success and failure governments are not profit-seeking in the sense that we normally think of that that term governments don't have a way to measure costs and Benefits again, I'd point you to dr. Klein's lecture yesterday where he talked about that the Importance of evaluating cost in a business governments don't have that they don't have a feedback in The form of profit or loss the firm is making a profit That's like the consumer saying you're doing the right thing with those resources. You're putting them in the right place. You're satisfying our needs our wants and losses are like the The firm receiving information that they're using resources badly but they're not satisfying consumer needs as well as They could if they use those resources differently So bureaucrats who don't have a good way to assess the success or failure of their activities bureaucrats who are incentivized to simply follow rules have been multiplying This is from one of the articles that I'm Sighted earlier. I think this is the one that appeared on Mises daily last year Web addresses there if you care to take a look This is the growth of physicians and administrators in medical care since 1970 This should be a Bit shocking Now this is not the only industry where that has occurred I'm in higher education and I can say if you had to plot a similar chart or graph with Teaching faculty and academic administrators. It might look very similar to this and for not Not very different reasons We've seen an explosion in the number of administrators The cod says it is particularly noteworthy that this graph depicts the administrative workforce is shooting up in the early 1990s you can see that there For it is around that time that payment for medical services would become highly dependent on a Byzantine system of codification invented precisely to convey to central authorities in Charge of health insurance Crucial information about what is taking place in the privacy of medical offices operating rooms or hospital bedsides in 1992 with the passage of the Medicare fee schedule the coding system became mandatory and so then anytime you go to the doctor The doctor is thinking in terms of These codes how will this be reported? how will this be documented and so Typically if you go to visit the typical doctor you will find that there is a large number of staff To take care of a lot of this documentation Which of course drives up the price of medical care You will find a few doctors Who are Simply fee-for-service doctors who will say we're not going to file any insurance We don't do Medicaid you pay cash and we take care of you and if You mentioned this to the ordinary American they would they would think well, how could that possibly be affordable? I can tell you it can be quite affordable You eliminate so much of that documentation overhead and a considerable amount of risk To the doctor you can ask dr. Prince here in the front row here about how that might work He's well-versed in that kind of thing as a physician And there are a number of clinics that have sprung up to do similar things. There's one in Oklahoma I think it's called the Oklahoma Oklahoma Surgery Center Surgery Center of Oklahoma Which has gotten quite a bit of attention. I think they were featured on Stossel a year or two ago And they publish their prices on the internet For a common medical procedures their infection rates are very low Which is one way to measure surgical quality is how many patients come back with infections their infection rates They publish those two you can take a look compare quality And people come from all over To take advantage of what is to those doctors very they're very self-aware This is a this is an this is the free market at work And they are trying to do their part to take care of patients without the Without interference from the government as much as is legally possible for them to do The I'll summarize some of this Basically you can you can take certain events that happen between a patient and doctor You can put a little code on some of those events and send those off to the central planner But going back to Hayek Hayek Mentioned the the problem of a owner of a cargo ship a tramp steamer Who has extra cargo space and he alone knows that that space is there and To try to Use a central planner in such a situation to make use of this available resource would require the transmission of information in a way that the The the central planner could not gain this information In time and would not have the ability to act on that information effectively to get cargo to fill that empty space and That is that is the problem for medical care today the context associated with information Elicits meaning based on which the doctor and the patient act So if you have this kind of CPT code New patient visit EM coding level for prolonged service associated with ICD-9 code seven eight six point five oh Which is chest pain unspecified? That lacks context You get a bunch of numbers there and There's this illusion that something has been conveyed that's useful to a bureaucrat, but it's not really The only tangible effect a cod says of coding scheme is simply to require a massive influx of administrators Charged with interpreting and acting upon those obscure data signals All of this as I've said leads to higher costs There's several reasons for this licensure, which I've listed here is one of those And a licensure seems to be spreading I had a Someone contact me yesterday asking me about occupational licensure about what I thought about it And there's a there are a lot of occupations depending on your state hundreds usually of occupations that require permission from the state and Even in cases where there's not a whole lot of doubt that the customer can really understand what's being done and And there's not a lot of mystery behind the the curtain about what the service provider is doing There's a famous case infamous case. I should say of a hair braider Who at a young age maybe 13 14 15 began a very successful hair braiding practice for African-American women And was shut down even though she had a booming practice and her customers were very satisfied Maybe maybe she was shut down because she had a booming practice and her customers were satisfied because her competitors Who were licensed did not appreciate the competition and they? Got the state to shut her down It's not very hard to figure out if your hair is the way you really wanted it um Medical care is a difficult more difficult case to make because The ordinary individual doesn't know as much about medical cares as the doctor does that's not an insurmountable problem I'm not a huge fan of of Milton Friedman, although I think he did some useful work in some areas I think he did some damage in some other areas not very happy about the withholding tax for example but Friedman has a chapter in his book capitalism and freedom on occupational licensure. It's an older book, but it's It's it's pretty good on some of this About occupational licensure Boy a potty suggests that there are some other reasons for these rising costs employer provided health insurance Which started about 1930 1943 in response to very high marginal tax rates if the employer wants to pay the employee and Help the employee avoid adverse tax consequences than providing this in-kind benefit of Health insurance was one way to convey value to the employee In a tax-free manner Boy a potty also mentions the obesity epidemic and Intellectual property patents and so forth. I've got an article on Mises It's Mises daily might be on the blog last year or yeah, I think it was last year on this Case of a pharmaceutical company that raised the price of a course of their Drug treatment to tens of thousands of dollars and what are we to make of this is this an indicator that the market is broken and I argue that no the market's not broken one of the problems here is that the drug has a patent on it and It's illegal for anybody to create a close substitute For this particular chemical compound now, I'm not going to get into intellectual property. There's no time for that here, but there's There are there are serious serious problems with The pharmaceutical industry Largely because of intellectual property Rising costs are mostly due I would say to the Interposition of a third party between the patient and the doctor. I say care provider here because I'm trying to include Dirt nurse practitioners and other people that are providing these kinds of services So they begin to work for the Satisfaction of the regulators and the third-party payers the insurance companies rather than for the patient Nothing wrong with insurance But in the United States the insurance companies are Are Providing insurance for non catastrophic kinds of risks Again because this is a tax deductible expense on the part of the of the Patient they can receive these services and so they want to increase the value of these services And one of the ways to do this is to have a very expensive healthcare or insurance policy with low low deductibles and Low co-pays what that does is make the patient a very bad shopper When it comes to buying or choosing among Medical services if someone else is picking up the bill What does it matter if it's very expensive? This is called moral hazard The risk that the insured person might engage in activities that are undesirable and we I'll put the immoral term in quotation marks here because it's not I don't really see this as a Moral failing, but it's certainly an incentive to do things that are contrary to what the insurer might want and Expand the size of claims. I Had back trouble a few years ago and I went to a chiropractor about it and Chiropractor said well, I'd like for you to have an MRI So I said sure I'll do that and so he said you can call this MRI place in my town and I called got an appointment for I think the next day try that in some countries and I got a Got an MRI I Didn't really look closely at what the cost was going to be because I knew my insurance company would pick it up I've eventually got the bill and I looked at it was several thousand dollars charge of the insurance company I paid Tiny piece of that I had I had very little incentive now if I had to actually pay Several thousand dollars for an MRI out of pocket I Would have said can you get by with an x-ray? I Mean unless my back pain were Crippling which it wasn't I think I think maybe we can get by with it something else try an alternative But I had no incentive to seek an alternative now. I'd let me be clear. I don't think that in a Market system the price you see Charged to the insurance company would be the market price. I mean people get worried about this that well if we didn't have government Price controls or if we didn't have insurance that covers Everything then we would end up paying these very high prices we see on The on the bill. I don't think that would happen at all What we do see in medical care is that costs have gone up Precisely where the third-party payers are most prevalent You can see this here medical care from 1992 to 2012 Went up by a hundred and eighteen percent In real costs I'm sorry in price in aggregate prices The inflation rate going by the consumer price index and don't jump on me about the consumer price index I know it's got serious problems, but that was 64 percent over the same period physician services went up by 92 percent Cosmetic services went up at a rate of less than inflation about half of inflation 30 percent over that period Why well insurance typically doesn't cover cosmetic services Medicaid doesn't cover Cosmetic services governments and insurance companies are largely absent From the provision of cosmetic services. This would be things like Botox and and various other procedures. So We see prices are Rising more slowly in those places where third parties are Not there or are at least less prevalent We have a problem with competing standards as well medical providers tend to Follow the instructions of those who are providing the money We've got the government standard the patient standards which ought to be most important Patient might have insurance which is provided through an employer the patient often doesn't have a lot of Say over what the Insurance company is going to be although employers do want to make sure their employees are satisfied and therefore want to have an insurance company That is going to provide The kinds of services that their employees want The employer picks the insurance company the insurance company then has its own standards to impose on the care provider so there are several competing avenues of Instruction and direction going on Most of the money is coming from government and insurance out of pocket payment from the patient is a small minority of the total when we introduced the ACA the as usual misnamed act the affordable care act This Made things more complex and introduced additional mandates Not all of which made Patients better off. So the federal government requires patients now to have insurance or pay a hefty penalty the federal government requires employers over a certain size to provide medical insurance If you are working for a firm that had say 55 employees There's a good chance that employer found a way to shave off about six of those employees after the affordable care act went into place Then we have these State exchanges and federal exchanges. I noted earlier this year that one of the largest medical insurers in the country I think it's United Health Some of these medical insurance companies are backing out of markets and In some cases if you go to one of these exchanges to try to buy health insurance, you're going to find one option one Not not all of them, of course But this this is this is a significant problem if there's an absence or a lack of competition in these markets This is not going to help Patients it's not going to cut back on Costs overall Now I don't have much time left only a couple of minutes, but there's a lot of fun We can have with comparing nations. I say fun It it it's a kind of a macabre Humor you understand with looking at different countries and and healthcare and I I have to always tell my classes I am not setting up the United States to some sort of free market paradise with regard to medical care That's not at all case And you talk you talk to people who favor socialized medicine and they'll say well See see what free market medical care got you in the United States. Don't you want to be like country X? Well, it's not really free market in the United States Since I'm out of time almost I'll simply point you to some some articles I think I provided this to the Institute for posting along with my lecture Here, but Yuri Maltsev Who defected from the Soviet Union? years ago Wrote a great article about the lesson of Soviet medicine that appeared in the free market in October 2009 You can find that on Mises org and he points out the problems with countries that have more government provision more government intervention than the United States and what we see is commonly waiting lines and decreased quality of care He says in the UK Those who are 55 years old or refused treatment at 35% of dialysis centers People 75 or older rarely receive any medical attention at these centers In Canada, there's a kind of a priority scale Sometimes you'll be if you go to a Canadian clinic they'll Public clinic they'll refer you to a private sector a lot of Canadians end up coming to the United States for medical services Because you don't have to wait as long you can get those services more easily Government itself denies claims at a high rate compared to private insurance and if you look at The availability of certain types of medical care in the United States That is more readily available than in some other countries More physicians per capita more nurses per capita If you want to look at the Canadian American Comparison in some detail I'd refer you to Ronald hammer. We's talk On Mises org from July 26th of 2011 Which is titled Canadian medic Medicare as a model for the United States He's not suggesting that we should copy the Canadian system here So I'll have to stop here because of the lack of time But if you're interested in more of this, I'll be happy to talk to you during my office hours later today or Immediately after the talk. Thank you very much for your


So just in case anyone doesn't know what room you're in, you're in avoid deep herding, deployments beyond. Get other any note takers in the room?  Okay, this presentation has links in it. I do not spell out all of the links, but you can find the entire presentation already online at github.io. Yes, that is case sensitive. Make sure you get that right. If you have some, I'll give everyone a second to take some pictures so that we can get started. Okay, still seeing two or three phones, five, six, eight phones, oh dear. The DA does that, but if I have the opportunity, I will try to put a link in as well. Okay, hopefully everyone's got the URL now. I still see one person taking a photo, thank you. Okay, so you might be wondering, who is this weird person in front of you and do they really get that excited when they have a boarding pass to a business trip and do they yes, really throw t-shirts at people if you were here three minutes ago, you know that answer already. My name is Tess Flinaway, is known as Stockett Wensch, that's Wensch, not Wensch. I am the module 18 of Proflag, Proflag Friend, and four examples. And I am a DevOps engineer at a little company called 10-7. 10-7 is a full service web firm based in Minneapolis, we are now fully distributed. We are actually a remote only company. We do Drupal design, user experience and hosting. Give us a high to the wonderful people, wonderful humans at 10-7 at 10-7.com. So let's talk about deploying Drupal, shall we? Does anyone remember FTP? FTP had a lot of problems. First of all, it was insecure. It sent the password in plain text over the wire so that anyone could intercept it. You also had problems with permissions and modes.   And often when we had shared hosting, this was the only option available to us. And then Git came along and it was like the heavens opened and the angels sung and it was wonderful. All we had to do was SSH into our server, we changed to wherever the directory that hosted the site was. We did a Git pull, just pull and done. It was wonderful, right? Well, there was always something that we had to do after we did a Git pull. We always had to do things like we had to update the database. We might have had to do a cache clear. We could do all of this stuff in the web UI but it wasn't recommended, particularly for larger sites that might have timeout problems with HTTP. So you might have to get Drush involved and okay, fine. That's still pretty complicated but if it stayed that way, we might have been okay. That wouldn't have been too many steps to actually figure out but it didn't stay that way. We wanted it to stay that way but it didn't. So we do our SSH, we change the directory. You do a Git pull. Now in Drupal 8, we have to do a composer update. We have to do a configuration management import or in Drupal 7, you'll have to do a feature revert all. You'll have to do a compass compile. So you have to compile all of your CSS preprocessor files, then you do the UPDB, then you do the cache rebuild.  We want to get stuff done, not write notes to ourselves. But it didn't end there. The pain did not stop. What about grunt and gulp tasks? So third party integrations, we have to deploy a key file or any other kind of post configuration in order to make your thing work. You might be running on PHP 7 with OpCache or APC and now you have to clear that and make sure that all the stuff shows up. You might be running behind a reverse proxy caching web server and you have to do a varnish band to make sure everything shows up and it's already a lot of stuff and then it gets worse because what happens when things go wrong? What happens if your Git pull fails or your styles don't show up or you get uncaught exceptions? When things go wrong, it gets really, really bad. You may have missed a deployment step. You might have forgot to get ignore something, get desperation. You might have done Siege, Mod-R, 777, all the things and then you might need to roll back and it all culminates in deep herding. Deep herding. If anyone doesn't know what that's from, this is from a Mystery Science Theater 3000 episode called Hercules versus the Moonman. You can find it on Netflix and YouTube. So the big problem is that human beings are fallible. Good documentation does not remove human hands.  It's a code history tool. It's not a deployment tool. So we're good Unix admin people here. We're all DevOps-y types. So what do we do? We're gonna write a script. Scripting fixes everything. Scripting makes the world go around. That way I don't need to write any docs. I just write the script and I'm done. Well, there's still some of your problems, sure. You just run the script and you're done, right? Okay, well, if you don't set up your script right, it might fail on a particular step but keep executing and then you have another problem that will take a while to debug. It reduces operator errors though, right? I mean, it runs all the steps the same each time, right? Well, what if one step requires a bit of state that's external and I have to check for that? Oh, geez. So it doesn't run all of the operator system errors all the time and also writing scripts is painful. It's covered with obscure Unix-isms. Who knows what set-x is? I had to look it up four times to figure out what it was the last time and I've already forgot but it's even worse than that. When you write scripts, it's full of odd programming conventions because in Bash we don't need them fancy curly brackets. We'll just write if backwards and else backwards and case backwards. Worse than that, repeatability, to make your scripts repeatable, it adds a ton of complexity. You need to check the state first. You might have put a make directory in your script and now you have to check to make sure that the directory exists because if you don't do that, your script will fail and it litters your scripts with tons of ifs and else ifs and suddenly you're just, this is no better. This is just no better. And the problem is that scripts are like tribbles. They start small but they quickly become a huge problem because the complexity of maintaining those deployment scripts approaches application code. They're code, not configuration. So let's talk about config management. There are lots of configuration management tools out there that you can use. Tons of them, several of them have booths here at DrupalCon. The one I like though is called Ansible. Ansible is made by Red Hat. It says it's a radically simple IT automation and it is open source on GitHub. And that's a really, really good marketing line. But what the heck does that mean really? So Ansible takes three different inputs. It first takes a list of things that it needs to deploy, a playbook. Then it also takes a list of targets that it's going to deploy those to in inventory. And then it takes some variables that you define to control what your thing does. Ansible takes all of this input in and we call that the controller. Ansible then connects to a remote system over basic SSH. And it takes all of these inputs and compiles them on the fly into Python scripts. Those Python scripts are going to execute on the remote system and typically they usually invoke other utilities that are already on the system like FIO utilities, MySQL, database clients, or even things like Drash. So that's what Ansible does. It also has a lot less dependencies. It's just meet and based on Python 2. This means it works on most shared hosts out of the box. You don't have to do anything extra. The installation is really, really easy. If you're on most Unixes, most Debian based Unixes, you are going to use app get install ansible. On macOS you can use homebrew, brew install ansible. But the most popular way to install Ansible is actually using the Python package manager, PIP, not a Farscape reference. PIP install ansible in order to install the most recent version of Ansible directly from them. Ansible also tends to rely on those external utilities, but also external libraries. So sometimes you'll have to also install things like the Python MySQL library in order to work with databases. One of the big advantages of Ansible is that it's agentless. You don't need to install anything on the target server. There's no weird background daemon that's running on port 1421 or whatever the heck it is in order to do all of the configuration management stuff. It's just SSH. It's just SSH and it's just public keys. You don't have to have some fancy gooey in order to set anything up. It's just normal SSH. If you don't know how to set up public keys, you really, really should. There's an excellent type tutorial on line of docs all about setting up SSH public keys. Ansible is also serverless. There's no central puppet master server that you have to manage. Wherever Ansible is run from is designated the controller. That can be an integration server in your data center. It could be your laptop. It could in fact be the system that you're managing itself operating in so-called local mode. What do those inventories look like? These specify the targets to manage, right? And they're just a text file of IPs and host names. You ready for how complicated this is? I missed a step. I always missed a step here. There's also a global inventory at Etsy Ansible dash host slash host, sorry. Here's what an inventory file looks like. There you go. That's it. It literally is just a list of IP addresses with carriage returns. Now it can get more complicated than that. You might want to take some of your servers and group them together under a more commonly used name like you might have a live cluster. So you can use this bracket syntax to create a group. Sometimes, however, you do want Ansible to run locally without executing SSH. Just connect to the same system Ansible's working on. And you do that by passing it this variable ansible underscore connection local. All right. Ansible's also really easy to read. This is the one thing that I really like about it. All the code is in YAML. If you know Drupal 8, you know YAML. You can read a playbook. Congratulations, you are all DevOps engineers now. Also that execution is run from the top to the bottom. There's no weird dependency graph or a whole bunch of stuff that it has to figure out. No weird complex server model. Start at the top, finish at the bottom. That's it. So let's look at a playbook. So we have those three dashes at the top. That means that this is a YAML file. We're going to specify what hosts we're going to target. So this targets all the hosts in our global inventory. We're going to define some variables. We have one called hey look. It just has a variable, a string in it called a variable. And then we have a series of tasks. Each one of those can have a human name that's for us, not Ansible. And then after that it has this thing called stuff doer. That's a module name. That is going to be the component that does stuff on the target system. And it usually takes one or more parameters. And you can use those variables that you defined as those parameters. Ansible also has all the batteries included. You don't have to go and get the battery or plug it into charger. It's already done. All the modules that provide the functionality are already built in to Ansible as soon as you install it. I actually have a container that has Ansible on it. And it's only about 70 megabytes. So it's even really small too. You can find out more about all of the modules on docs.ansible.com. So let's start making our lives better with Ansible. So here's a basic playbook that's going to do a git clone. So you can see that we're using the git module. We've specified a variable called git directory. We're specifying what the repo is, where to put it, that we want to clone it, we want to update it, and what branch we want to use. Notice what you don't have to write here. You don't have to tell it does the directory exist. You don't have to tell it if it doesn't exist, create it, and then do a clone and not a pull. You don't have to make sure that you're pulling the right directory, that it's actually the correct repository in the first place. You don't have to do it a pull instead of a clone. It does all of this stuff for you. It's very expressive with a minimal amount of syntax. So how do you run this playbook? You actually use the ansible-playbook command and then you just specify the playbook to run. But there's a problem. We didn't specify where. Remember in our playbook we said hosts all, which means it's going to go to the global inventory. That would target every system we have. We don't always want to do that. What if we want to target this client site or that client site? We don't want to target everything. So what we can do is we can narrow our targets. We could actually update the hosts parameter in the playbook to target particular clients, but then we're editing the playbook every time and it's a mess and it's not very dynamic. The best way to do that is you pass the dash i parameter to ansible-playbook. Then you can specify an alternate inventory file. What's this look like when you have this all in your repository?  Inside of that you'll usually have an inventory's directory that will store all of the alternate inventory files that you have. We'll have two of them here, one for our live environment and one for a stage environment. Likewise, we're also going to create two environment-specific playbooks to do a deploy. One's going to be for the live environment and one's going to be for the stage environment. This way every environment has its own inventory and its own playbook. Okay, let's fix git deploy. So far we're using ansible, but we're still stuck with all of git's problems. When we do a poll, all of that deep hurting comes back to us. We don't want to do that. How can we fix all of those git problems? When I started to think about this, the big problem is that our git directory and the directory that the web server looks at, the web directory, are the same. What if they weren't the same anymore? Because the thing is that git deploy is like hook menu. It should be doing one thing well and not several things okay. We need to make them more specific. So here's how we solve this problem at 10.7. So we have a git repository directory and we have the directory that the web server's looking at, the web directory. When we start our deployment process, we're going to do a git pull on our git directory. Then we're going to rsync the directory inside of the repo that contains our Drupal site over to a temporary directory, the build directory. Then we're going to do all of the stuff we can do without touching the database. Our compass compiler, our grunts, our gulp tasks and all of that other stuff that we can do that doesn't touch a database. Then what we're going to do is rename the web directory to web directory underscore old. At this point, the site is offline. So we don't actually have a running site at this moment but fortunately it doesn't take us long to go back online because we just renamed the build directory to the web directory and Apache and Nginx don't know the difference. Then after that we do all of the post deployment tasks that do touch the database, our configuration import, our cache clear, our db update. And then afterwards we're finished. We actually have our site online. There's a number of different advantages to this.  It mirrors the repo. It doesn't have to do anything else. We no longer have to run git clean dash df. Also there's a lot of stuff which is ready before the site goes live.  All of those artifacts are created before we switch them over so that we don't end up under serving any user. This includes all those generated assets and so on. Also there's zero, quote unquote, downtime. Because what we do is that the directory move happens on the same disk. In Unix systems, when you move the directory on the same disk, it's a very fast operation. It takes literally milliseconds for that to actually be done. And we also do it last in our deployment process. We do all of this other stuff before we touch a database so that we minimize the number of steps that happen after we move the new version over. This way, if something breaks the build, we do have a git problem or something is down that we can't access it. We can't generate an artifact for whatever reason. Your site never went down. It's still up because we never touch the web directory yet. Only the build directory. All right, so let's add that process to Ansible. So first we're going to make sure that our build directory exists, that we're going to use the file module. It's going to have the state of directory. So we want the file module to make a directory. We want it to have that particular file permission mode and be owned by this group. Then after that, we're going to copy the files, the web files over from the repo to the build directory. So we're going to use the synchronize command. The synchronize command just runs our sync. So we specify the source directory, which is git directory. And our Drupal site is under the doc root subdirectory in our git directory. We do a desk, how we specify the destination as a variable. And we say if another build directory did exist before from say a failed build, just go ahead and delete it. We don't care. Now don't forget the trailing slash because if you've ever used our sync, if you don't specify that trailing slash at the end of source, it will copy the directory too. You want to copy the contents of the directory. Thank you, mini me. All right, now we can do the go live. So we're just going to do a move command. To do basic shell commands in Ansible, we just use the shell module. And the shell module has a few nice features in it. We can actually specify does this command create this file or directory and remove this file or directory. So this way we have a nice check that things actually are what we think they are. We've maintained state. Next we're going to move the build directory to the web directory. Second verse, same as the first. All right, so everything's great. We're back online and what is it, mini me? The old directory, damn it. I forgot about the file directory. So when we moved the web directory to web underscore old, the file directory's in web underscore old now, right? Isn't that a big problem? Now all of our files are not there. We might get permission problems and all that pain starts coming back to us. How do we fix that? We don't want to move it back on each deploy. In fact, we don't want to move the file directory ever. So how do we fix that? So here's where our site directory is. It's going to be under public HTML. And under public HTML, we have sites and default like you'd normally expect, but the file directory isn't there. The file directory's actually in the root outside of the public HTML directory. How we actually get to the file directories we create a sim link. So the sim link will tell Unix operating systems and also Apache and Nginx will know go to this directory instead whenever I go to that path. You can create as many sim links as you want to that files directory. So you don't need to worry about multiple copies of stuff. All right, this way the files directory never moves. It stays in place. How do you do that? Use our Swiss Army knife, the file module again. You're going to do a state link, specify the source directory, which is where we have the files, and then where to put the link mode and group. This is actually now an artifact. We build this as part of our site deployment. So we do this before all of those other steps, before we touch the database ever. So the files directory looks like it always existed and it was always in the same place. So what about those post go live tasks? Config import, database updates, cache rebuilds. We use the shell module again. We use the shell module, but this time we're going to specify which directory to execute all of those commands in using or change directory. So there you go. But what happens if you need to roll back after all of this process? You do all this deploy and now you have to roll back. And now your hair is on fire because you have to go and pull a database backup from who knows how far ago in order to restore things and it's a mess. So how do we create a restore point on every build? What we're going to do is we're going to keep the last site build. We already do that because we have web underscore old. We want to archive the sync directory so that we have the exact same configurations that we expect it to have. And we want to create a database dump. Now in order to make sure that our backups are going to have unique names, we're going to first generate a timestamp to know when that is. We're going to use the set fact module to create a new ansible variable called timestamp. And we'll just get that content from the date command in Unix. So now we have a variable that has the current date. Then we're going to do a config sync backup by using the archive module to create a new backup under our backup directory slash sync with the timestamp. We don't even need to specify the compression method because the file extension tells ansible what compression method to use. Then we're going to backup the database using the MySQL underscore DB module. We're going to say make a dump. Here's our login information. Dump it into this target directory with that compression and it will take care of all of that for us. So that's a whole bunch of stuff that we can do to create a backup on every single deploy. We're going to do this the very first thing. If we can't take a database backup, stop the build. We want a backup every single time because 10 minutes of panic is better than three hours of panic. But there's still a problem.   I want the server to do it for me. I want to be lazy. Sobby, if you've heard, I've been in this situation before.  And being, of course, because you're aimed to please and you have a self-loathing nature like any DevOps person, you're going to say, sure, yeah, give me a few minutes. I'll take care of it. Two hours later, their developer is wondering, what the heck is going on? Where is my changes? They didn't show up to anything. Did I do something wrong because they're a good self-loathing developer as well.  I call this Slack to deploy. It bottlenecks the testing and releasing your code because it means that an ops person has to actually go and do the deploy for you. You don't want to have to do that. It also, it makes your developer's lives hell, but it also makes your ops person's lives hell because it makes ops into a never-ending firefight. In addition to fixing stuff, you're always deploying stuff or making stuff better so that you can deploy it better the next time. And you might as well say that it's a hairstyle, not a job description. That's why we need something called continuous integration. Continuous integration is a $2 word for a $10 concept.  But because only you can prevent head fires, you require automation in order to make sure that CI actually works. So we need some CI servers in order to do this.  And then you want that CI server to perform actions in response to those events. What's that look like? Your developer does a push to the get repo. The CI server is going to receive an event from that repo. It's going to read some kind of CI rules, files, or database in order to figure out what it needs to do. Often that will mean connecting to a remote system to upload some source code somewhere. And that's what that does. That's what a CI server does. There's a lot of different CI servers out there, but the one that I happen to like is called GitLab. GitLab CI, it is free and open source and it is integrated with GitLab Community Edition. And you can get all of it from a variety of different ways. You can actually go to gitlab.com and get on the free tier. You'll get unlimited private repositories as well as CI for free. You can also download it and self-host it yourself. The installation does take a little bit of unique skills in order to figure it out. Or if you're lazy like myself, you'll probably want to put it on GitHub, on Docker, in order so that you don't need to worry about doing all of that server stuff. This is actually the Docker compose YAML file that I use to power my ridiculously named integration server. So yes, you too can run GitLab and CI on your system right now. All right, so we have our GitLab and our GitLab CI server set up. How do we get it to talk to the web server? We already know that GitLab and GitLab and CI are gonna talk to each other because they have a natural integration because they're sister products. GitLab CI is also going to need some kind of connection information in order to get to the remote systems. GitLab is also going to require, we're going to also need to know what steps to execute. And for details of GitLab's implementation, that comes from the repository itself. How it knows how to do all this stuff is in your repository, there's a file that's gonna be called .gitlab-ci.yaml. And it basically maps a repository event to a series of steps to execute. Here's what a .gitlab-ci file looks like. So we have some stages, don't worry about that. We have a job, we have a number of tags which identify what kind of stuff we're going to be doing. And we basically have our script. This is our entire deployment script and we're going to execute that when someone pushes to the master branch. This is actually a real production file that we use at 10.7. That's our entire CI script. Everything else is in an Ansible playbook. If you have multiple environments, you just create another job and you point it at a different environment. So we have different inventory files, different playbooks, different jobs for everything. How this looks in your repo?  And at the very root of your directory, you're going to have the .gitlab.ci.yaml. And that's going to tell .gitlab what to do with the environment specific playbooks and also when through the .gitlab.ci.yaml file. But what about where? Where's the connection information? We don't have that yet. We need something called a runner. A runner is the process that executes the builds and they're typically created for each individual specific project, but most importantly, they provide the connection information. So the runner is going to take several tags that match up with the .gitlab.ci file. So the runner knows for each repository which runner it's going to need to execute. It's going to have the SSH login that it's necessary in order to connect to a remote system. And it's also going to get the rest of that .gitlab.ci.yaml to get all the set files. It executes over, it connects to a remote system over SSH and it instantiates a new shell session. And from there, it can run any command that we need to. It also can clone the repository for you so that you always get the correct repository for that build. You can run Ansible and you can run other special commands after that. So great. So this is what the command looks like that had to create a new .gitlab runner. It's really complicated, but it basically says the URL is where the .gitlab server is. The registration token tells you what repository it's going to be linked to. The tags are going to be corresponding to the tags that are in the .gitlab.ci. And then there's the connection information. Now there's two different methods that you can worry about how to configure all of this. Normally you might want to have the .gitlab runner connect to the target web server and then have Ansible run locally to run your playbook. This is great for IAAS and other services like Blackmash that actually provide you a raw server that you can install custom utilities on.  Well you can run it the other way around. The runner can connect to the CI server and then Ansible can look at the inventory file and then connect to the shared server instead. This method actually works a lot better for shared hosts because the only things that need to be on the remote host are whatever commands you're going to execute and also Python. And Python is practically in every Linux distribution out there. So nine times out of 10, it just works. But we're not done yet. I forgot something, didn't I? You're sitting there, you're going great. My life as an ops person is wonderful. I can actually do some development stuff now.   Because you forgot, the database login isn't in the repository and we just deleted our old live site. We don't have it anymore. We made a new one. So where does it get that? The old axiom still holds true. We never want to put the database login inside of our repo. There's also a whole bunch of other stuff we might want to keep out. Things like API keys, cloud identity keys like an AWS IAM or maybe hash salts. There's a pedantic security argument to hash salts belong in your repository or not. All right, so even if you keep all of that stuff out of the repository, does that mean every time someone does a push, you have to SSH in and actually add all of that stuff back? What's the point? CI should be doing that stuff for me too, but I need to do it in a secure fashion. How do I do that? GitLab provides a feature called secure variables and it's brilliant. It's a unique name space per repository. So you define a number of key value pairs per repository and the values are encrypted on the GitLab server. It's really easy to define an edit because it's just done through a web UI. You don't need to worry about anything else. But how do these variables get to Ansible? Well, when the GitLab CI does a build, it exposes all of these secure variables as environment variables in the GitLab shell session. And then what you do is you chain load those to your Ansible variables. So it kind of looks like this.   Environment variables are super mega insecure. We don't want to do that in production. Are you cracked? The thing is that GitLab CI environment variables actually do work and the reason why is they're only set during the build process. They're not persistent. They also are only set for the build's shell session so that you literally have to get to the build when it's running, at the time it's running, and break into that session to get to it. And because those variables aren't persistent, there's a lot smaller of an attack surface. So you don't need to worry so much about that. All right, so our build is taken care of because every time we run the playbook, we're going to have our GitLab CI expose those environment variables for the database credentials. Those database credentials become Ansible variables and we can get to everything. But once we're done building all of this stuff, we still have to get it into sessions.php. How do we do that? Where does it get the logins? Instead of saving them to the repo, which is a bad, bad, bad idea, what we want to do instead is we want Ansible to write them for us. And there's a wonderful thing in Ansible called Ansible templates. It basically lets you replace placeholders in files with Ansible variables. And it's got a twig-like syntax. So if you know a little enough twig to be dangerous, congratulations, you can write a template in Ansible. This is how it looks like in the playbook in order to use the template module. It's the template module. You specify the source file to use as the template and the destination file, where to write the replaced variables. These can be in fact the same file. So inside of our settings.php, we now have this. We now have taken all of the sensitive stuff out and we've replaced it all with Ansible variables. We even have some sensible defaults for some things so that we don't need to worry about if we forget to enter something. All right, that's great, but we still have a problem, don't we? Because each environment now can have different templated credentials. But what happens if we need to store configuration overrides or varnish configurations or things that differ between our stage and our live environment? How do we handle that situation? What we did is we actually extended the settings.local.php concept to environment-specific settings files. So each settings file, so each environment now has its own get-backed settings as well as database log and templated out. So nothing is stored in the database and we also have all those configurations in our repo where we can manage and track them. So how do we update our settings.php? We wanna break that up into per environment files and we are just going to conditionally include other settings files per environment. You might have seen this line somewhere in your settings.php. Well, it's really easy, we just extended it out. We use some kind of condition. In 10.7's case, we're going to probably just use the directory path, creating a name like stage or live. It could be an environment variable, it could be the source of another file, it could be something else. Whatever works for you is whatever you use and then we just conditionally include whichever file that is. Now the problem is we want to make sure that those files have separate names. So when we update our template command in our Ansible Playbook, we wanna make sure that we include the environment name and because we want to be lazy and not have to copy and paste that twice, we're just going to use a variable for that. So we just have our stage and our live environment and does everything for us and it's great. But there's still a problem. So you might be sitting here after a few months of doing all this stuff and you're going, okay, fine, but now all of our playbooks are kind of similar between sites. So we've kind of standardized everything and now I'm copying and pasting them all the time. Is there a way that I can make them reusable and extendable so I don't have to copy and paste them? There's something in Ansible called a role. A role allows you to take a playbook and also some default variables and package them up so that you can reuse them again and again and again. Now I'm not gonna get into how to make a role because I've already bored you to tears already. So instead I'm going to point you to the section on Ansible Docs and how to create a role, but there's still another problem. As soon as you make roles, now you're just copying and pasting the roles back and forth and nothing is getting better. You're still doing the same thing again. How do you fix this problem? Can't I just keep all of these roles in the same place so I don't have to copy and paste them back and forth so that I just have to update it in one place because universe forbid, if there's a bug in my role, now I have to go to every single project repository and I have to go and fix the same line and that is an error prone process because I'm doing it manually and we don't want to do anything manually. We want to update it in one place and we'll have CI do everything for us. What if we could get CI to grab the roles for us and treat part of our CI as an artifact? Insert inception sound here. There's a thing called Ansible Galaxy. It's distribution for Ansible roles. You can find it at galaxy.ansible.com. How do you get some roles from Galaxy? You use the Ansible Galaxy install command and it takes one or more org-role names. Then you might think, wow, that's great but now I'm going to have to write all of this stuff in a playbook. No, you don't. I actually did for you already. You can find our roles that we use at 10.7 for both stage, remote, shared hosting, and production deployment, all online already on Ansible Galaxy and if you don't like that, you want to look at the source code yourself. Boom, it's right there on GitHub. You can get it yourself.  Now in order to install all of this stuff, we will probably have to specify ansible-galaxy-10.7.drupaldeploy.drupalbackup and you might have like five or six of these and that becomes a lot of stuff. You need to install with Ansible Galaxy and you don't want to have that in your GitLab CI. It makes it too long. You want to put it somewhere else. So we can use something called a requirements file and the requirements file is just a list of roles to install and it can be from either Ansible Galaxy or if you need to keep your deployment code proprietary and private, you could point it to a Git repository. This is what the requirements file looks like. It's just going to point to our two roles on Ansible Galaxy and now we're going to update our GitLab CI.yaml to pull those roles before it does the build. So that's a really, really, really long line test. What does that actually mean? Well, let's take a look at it and break it down. We do an Ansible Galaxy install. Because we're operating a CI, we want to make sure that every time we do a build that we're going to tell Ansible Galaxy, yes, download the role again, even if you already have a locally cached version. That way, if there's an update, it gets the update. This does incur a few seconds of download time for each individual build, but it's worth it because now your updating is transparent. You just need to rerun the build. Also, we're going to specify a requirements file with a dash R. And then just because sometimes it does happen and it becomes a very bad day when it does, if GitHub is down and your roles are hosted on GitHub, you'll probably want your CI to fall back to any locally cached version of the roles that you have. So you use dash dash ignore errors. This way, GitLab will go, oh, well, that command didn't error out for any reason. I'm just going to keep going. And it will just use the last version that's cached for your server. And now you have a happy ops person because now all you have to do is push to deploy and everything's wonderful. I want to take a moment to give some special thanks for this presentation, especially the Drupal Association who was kind enough to give me a grant to actually be here today for 10.7 for also providing me support. Also my wonderful patrons on Patreon at patreon.com slash socketwench. Also make sure to come to the Friday sprints. We have a first-time workshop at 9 a.m. to 12 p.m. We're going to have, if you've never worked with Drupal before, never done PHP, don't worry, we will help you. And if you don't want to work with PHP, there is tons of stuff that you can do to help and contribute back to the Drupal community. And there will be mentors here all day to assist you. Make sure to give me some feedback on that link or on the DrupalCon Baltimore website and you can find this presentation on github.io. Let's spread the pain around. I really need something to take my center. If you want to hear Jim, you want me to say? Okay. Okay. What the mic? Yeah, I got plenty. This one just finished. Maybe some other speaker coming up. It's a different speaker. Okay, okay. So when she gets here, you're going to plug her in and you're going to turn her laptop like this. Okay. So now she can look at her laptop. Okay. She can look at the screen. Okay. Cool. And if she wants to, she can... Okay. Cool. Cool. Okay. All right. Cool. I'll make sure you have one.