Hello, we're very happy to be there with you today. We'd rather be live with you and hopefully we might be able to in Los Angeles, right? So we're Laurent and Eric and we're going to share stories about low-level problems we face for new communities. We shared a few stories in the past about control plane challenges but today we're going to focus on what happens on nodes. So in case you don't know DataDog, we're a monitoring company that today we're not going to talk about the product. We're going to talk about the infrastructure behind the product and it's pretty large. We're running tens of thousands of hosts and dozens of clusters with up to 4,000 nodes and it comes with multiple challenges and this is what we're going to talk about today. So we have a few stories not completely related but they all happen locally on nodes and we're going to focus on that. So let's start with this first story about disappearing containers. So it started with this simple graph here when we migrated an application from a virtual machine to Kubernetes and we noticed that the CPU profile was very different which was a bit worrying, right? So we looked at the pods running this application and we discovered that several of them were in great container error, actually about 10% of them. So they were not ready and not processing traffic. We found very easy solutions to address this by deleting the pod or resetting the cubelet but it wasn't very satisfying. So the first thing we did was try to understand what this error was. So we looked at the cubet logs and basically the cubet is getting an error for the runtime container in our case because it seems to be trying to create a container that already exists according to the runtime and it's doing this a lot as you can see here with 62 attempts, right? And it gets to trying and getting the exact same results. So of course we wonder, well, who is right? Who is wrong? So the cubet believes it needs to create a container. What about containerity? So if we ask containerity, this container is actually running completely fine. The next step was to try and reproduce a problem in a test environment and we have noticed that it seemed to be related with cubelet restarts. So we did a very simple script that restarted the cubelet frequently and after only an hour, as you can see, all the pods in the deployment were in the same error. So we were able to very easily reproduce it, right? So what is this error exactly? So we went to the cubelet code and we looked for it and we found that this error is appearing in the runtime manager in the sync.function. So it seems that the cubelet wants to create this container and fails. How is this function called? So this function is called in sync pod after computing pod actions, which is basically the reconciliation that needs to happen between the pod spec and what's in the runtime. And in this case here, it seems that the results of this computation is wrong. How could that be? We looked at logs, but we couldn't find much in logs even when we increased the velocity level. So we did a very simple thing and we added print statements in the code. And it turns out it was very efficient because as you can see at the bottom of the screen, a container, the container 15, that is completely fine in the first output statement is missing in the second one, but the container is still running. So it seemed that container statuses, which has the statuses of all the containers in the pod is actually wrong. So we wanted to understand where this container status was coming from and how it could be wrong. So here is another view of the main component involved in this data pass in the cubelette. So everything starts with a sync loop iteration, which is the main sync loop in the cubelette. This sync loop receives events on channels and this event can be event from API server such as a spec change, event from the pod lifecycle event generator, which are events from the runtime and other types of events. When there is a change to a pod, it's then going to call pod workers, which are going to get the status from the pod cache and call the sync pod function, which is the function that was failing when it was calling the runtime before. So it seemed that when the status is retrieved from the pod cache, it's wrong, which triggered the problem that I wrote. So what is a pod cache? The pod cache is a cache of all the pods in the cubelettes and how is it maintained? So the pod cache is maintained by the pod lifecycle event generator, the plague, which is the component responsible for observing what's happening with the runtime, updating the cache and generating events that will then be received by sync loop operation. And it seemed that this cache gets corrupted somehow. So here's what we know. The data in the pod cache is wrong. The pod cache is managed by the plague and there's nothing in the plague that seems to indicate situations where we can get correction. So what's happening? And at that point, we were wondering, well, what is something else is modifying the content of the cache? In particular, the container status is filled, which is what's wrong here. So we looked at the code of the cubelet and after a lot of digging, we found this function, which is sorting the container statuses. And what's important here is that this function is actually sorting in place and modifying the slides. So we now have another code in the cubelet that is modifying the pod cache. It's not only the plague anymore. And so we looked at where this function is called. And here you have the sequence of functions involved. And what is important here is sync pod and syncopation, which are two functions we saw before, are actually ending up calling this sort operation. So let's go back to the cubelets to get back to the function that can actually modify the pod cache. So as we've seen before, the plague can modify the pod cache, but also the function generate API pod status that can be called in two different cases. One, when there is a pod update and one, when there is a plague event where the container died. And the problem is the handlers for this events are running in separate core routines so they can raise and which can lead to cat corruption. And here is a summary, right? You can have a concurrency between either sync pod if there's a pod update from the API server, if the container dies on the plague or during a plague release if there was something happening on the runtime. So we had a theory and we wanted to validate it. So what we did is instead of sorting the slides in place, we made a copy of it and then did all the operation on the copy. And look, everything is running now even if we restart the Qubelet every a few seconds. So we created a PR upstream and we're pretty happy because we've found and fixed the issue. I also want us to create Naya for doing all the work on this investigation and diving me very deep inside the Qubelet. So key takeaways from this is that the Qubelet internals are complex but they're accessible if you spend the time. Since the internals are complex, we're not 100% sure that our fix is the best one and that the database I described is the full one but what we know is the fix definitely works and solved our problem. And the PR has not been much upstream but we hope it will soon or an equivalent PR fixing the problem. We're a bit lucky on this one because we cut the problem in staging which allowed us to deploy to prediction completely fine, which was good news. So in this first story, we had a story about the Qubelets and now Eric is going to dive even deeper into something that's happening in the runtime itself. Yeah, thanks very much. So this one is titled Random Failures which as we'll see is a double pun on the actual problem. So the problem we saw was that occasionally we had a database crash and it was preceded by a rather puzzling log. The database couldn't open DevU Random and it was getting an operation not permitted error. And this is happening occasionally. I mean, clearly the database works most of the time and then all of a sudden it can't open DevU Random. So what's happening? If we look inside the container, everything is fine. The file permissions on DevU Random are perfectly open to everyone, to read everyone, write everyone. We don't really see why we should be having a problem opening DevU Random.  It just sits in a loop and keeps opening DevU Random and errors if it fails to do so. And very quickly we see that we're able to reproduce the problem. We get the operation not permitted message and what's more interesting maybe is that this happens every 10 or so seconds. So it's extremely regular. If we search a little bit more for logs that the Kubelet might be emitting for this pod, we realize that in fact every 10 seconds the CPU manager component is emitting a reconciled state log message. And if we look at the details of that message we see that it's actually includes a configuration for the CPU set. So I need to explain a little bit more what the CPU set is. In this situation, our pod is in guaranteed QoS class meaning that it has requests and limits which are all specified and all equal for all the resources it requires. It also makes an integer request for CPUs. So six in this example. And finally we use a Kubelet configuration where the CPU manager policy is static. Now the static CPU manager policy is there to allow requesting and setting aside a specific set of CPUs for a container and doing so using the CPU set control group. So now if we look at the flow of configuration here so in the container runtime, so we have the Kubelet which talks to container D over GRPC so telling container D what containers need to be launched, what configuration or characteristics they need to have container D in turn fork execs container shims which are per container and communicates them over time through GRPC also. And the container D shim fork execs run C to actually start containers and potentially update them again over time. So for instance, it will update the C group files of the containers. So if we follow the smoking gun through that flow and we look at container D now and we see the container D also is every 10 seconds reflecting an update to container resources. Not a big surprise at this point. We follow further down and we trace the shim. We see that the shim every 10 seconds launches run C and in particular launches run C with an update instruction. Tracing the run C execution itself we see something rather surprising on the other hand. We see that the update to control group devices section is starting with a deny on all devices and then followed by individual allows for the rest of the devices for the ones that we actually should be allowed to access. And so we found a race in effect. There's a window where for a certain amount of time all devices are not allowed and progressively some will be re-allowed until finally everything that should be allowed is allowed. But there's a definite window of opportunity here to attempt to open a device and to find that we're not allowed to do so because of the default deniable. So we found the issue. And in fact, we're in luck because the problem has actually been fixed upstream. And so we really only needed to upgrade run C here to resolve the issue. The way run C resolved the problem is by emulating the changes that would be taken on update and checking them against what is in place and only reflecting the differences between the desired state and the current state. So this was an interesting problem. We re-learned how the flow of configuration from through the runtime from the Qubelet down the way down to the container. And we learned about C group device updates as well and possibly a little bit about the CPU set. All this investigation goes to Benjamin Pinot who delved into this a little while back. Thank you very much to him. So key takeaways. It's really good to know the container runtime flow and understand it and how the different components interact. It's also important to realize that here we had several parameters influencing the overall behavior. For instance, we had pods with guaranteed QOS integer CPU requests and the CPU manager configuration for static. If any of those three parameters had been different we would not have encountered this issue. And so now I'll let Laurent dive into an even deeper investigation with the network layer of Qubeletis. We're not going to talk about how Budapest can become zombies. So this problem started with containers remaining in status container creating for a long time. And the error message was fun in our sense of fun which is, well, very weird. So here the Qubeletis telling us that it can create the pod sandbox. So it can create networking in the pod because it's failing to add it to an IP address because this address is already in use which is weird because it never happened before and suddenly it's starting to open. So address already in use. Let's see if this address is banned on the host. It's not. Can I add it to an interface? I definitely can. So nothing obvious there. So of course it could also be an IP address from a container. So let's look at network namespaces and look at IP addresses in them. None of the network namespaces have this IP address. So we've done the obvious and now we need to take a step back to exactly understand what the components are involved in this. So let's look at our CNI plugin in this cluster. So we use the LEAF CNI plugin which is basically allowing us to attach IP addresses from the underlying cloud provider AWS directly to pods and not have a novel A. So it started with an IPAM plugin responsible for the AWS API call. And then there is an IPvlan plugin that is creating the main pod interface and giving it an IP. There's another interface that is only used for communication with the host and it doesn't really matter here. What is interesting is what's happening with IPvlan. So now that we know that on this host we're using IPvlan, let's say we can create a new IPvlan device with this offending IP. And as you can see on the top of the slide, if we try, we actually can't. And we get a very clear error message saying that this IP address is already assigned, sorry, to an IPvlan device. So now I want to mention here is that the message is very clear that it doesn't make it to the cubelets because of the net leak library used by the plugin which only use the error code and not the error message. So we only have addressing use and we don't have the full detailed message which would have been helpful. So now we need to understand why your senile plugin is using this IP. If we look at the registry of IPs used by the plugin, this IP is known, which means it has been used and assigned to a pod in the past, but it's been released. But somehow it's been released, but not completely, right? Because the IP address is still bound to the IPvlan device. So we looked at how IPvlan handles deletion in this plugin. And as you can see here, we have a base code to delete the interface, but we never run it because we use chaining and in the case of chaining, the deletion call is never done. So we never delete the device. However, it works usually because the runtime at the hands of the deletion of a pod will actually delete the network namespace which will take care of garbage collecting everything. So what we know so far, the IP has been located to a pod. The pod was deleted and the IP was marked free. The IPvlan interface was not deleted when the runtime called network deletion. And so we can reuse the IP. What's important about network namespace deletion is when you delete the namespace, the channel will tell you, okay, I can delete it, but it won't actually delete the namespace until every single process running in it is done running, right? But what's important here is everything is fine from CNI and from the runtime, right? But the channel hasn't finished deleting the namespace. Now that we have this piece of information, can we reproduce? So what we did is we took a pod, we exact into its network namespace from the commands. And as you can see here, we can see here that the network namespace of this process is actually the one of the pod, right? If we delete this namespace, everything works. The CNI marks the IP has released. However, we can't reuse it and add it to an IPvlan device. And what's interesting is if we enter the network namespace of the process we created, we can still see the IPvlan interface. So we have a very good idea what's happening here. So let's see if we can find the process holding this network namespace. So what we did here is we looked at all the processes and the network namespaces and we entered them and we looked for the IP. For our process, we were able to find it. However, we were not able to find it for the IP address that was already in use, right? So that was, we have an idea, but we can actually trace the problem back to an actual process. So we took a step back because we had a good idea what was happening, but we were not able to pinpoint exactly what was the conflict. We had a few additional data points. We knew that the problem started with a node and slowly propagated to others and that regularly the problem was completely disappearing and we're starting again. So what are we looking for? We're looking at the process. We're looking for a process that is running on all nodes that is regularly either stopped or started or redeployed. What kind of process is that? Maybe a demon set, right? So we look at demon sets and we have a few demon sets, but there's one that does a lot of things and it's data log agents. So we actually were able to trace back the fact that when the data log agent was redeployed, the error was fixed. So we reached out to the team and they told us, well, we actually have a feature that is allowing us to instrument the contract and that's inside network and space of containers. And so we looked into it with them and it turned out this new feature was using a long-lived connection on a netting socket to get this information. And of course this was holding the network and spaces. And to fix that, we just had to use short-lived connections in terms of long-lived one. So the network name space could be released by the kernel. Key takeaways, interaction between all these components are complex. It's also very difficult in the kernel to understand what's happening at the networking level because a lot of information can't be found. So you need to guess a lot. And also I must say that we were lucky because we code this in staging. And also this error was made very visible by the CNI issue. But if we hadn't seen it in the CNI issue, we would have leaked network name space with unknown consequences, right? And that's it for this network debugging problem. I mean, I love networking, but I think the story that Eric is going to share next, which is even deeper because both the kernels is even more interesting. Yeah, thanks so much. So who ate my capabilities? This is the story that gave its title to the presentation. Okay, a word about Linux capabilities. Capabilities are a feature of the Linux kernel that allow us to give privileges to certain processes that are not normally privileges that don't run as root, for instance. So in the example that I'm showing here, we have the capture program that just displays the capabilities that it has and decodes them for us, which initially doesn't have any and to which I then assign a capability through the extended attributes of the file on disk. And then when I run, so here the cap net bind service, which means this process would be allowed to bind ports under 1024, which is privileged normally reserved for root. And then once it has these capabilities on the file and extended attributes, if I run the program, I see that I have this privilege now. So we wanted to use this for the API server, the CUBE API server, which we run as a pod in certain circumstances. And so quite simply in our Docker file, we set the capability on the file. And then when we run the pod, the strange thing is that it doesn't work. We are unable to bind port 443, we get a permission denied error, just as if we didn't have the privilege. So if we look at the actual process characteristics, we see that indeed it does not have the privilege. It doesn't have the capability. The permitted capabilities, the effective capabilities of the process are all zero. They're all the bits are cleared, even though we should have 400, where the value of the cap net bind service a bit. And yet if we look at the capabilities on the file system, they're there. It's what we built in the Docker file. So again, what is happening? If we think about the usual suspects, there's the no new privileges flag, we check and that isn't set. We're not using no set user ID file systems. Our kernels are booted with file capabilities allowed. And yet one interesting observation here is that since the capabilities are all clear, it means, and yet the program it ran was launched by the kernel. It does mean that the file capabilities literally don't apply according to the kernel. And another thing, we build the image on our laptops and interestingly it works. So that prompts us to look at the layers of the image that we build. And here we realize that the extended attributes of the file are actually different. In the laptop case, we see that the capabilities are encoded using a version two. And in the image built up by our continuous integration has a version three. And we also see that in the version three, there's more information. So what are these attributes exactly? In fact, now we realize that there's actually an extra option on the get cap command, which we didn't notice initially, Dasher, which causes the extra information, the version three capabilities information to be displayed. And it's in fact, a user ID, the root ID. So what exactly is this root ID? Well, in our CI's Docker configuration, we actually run it with user namespaces. User namespaces is a great feature, very applicable in this particular context where we want to run untrusted code. And so what user namespaces do is that they actually remap user IDs and group IDs. And in this situation, the kernel needs to ensure from a security perspective that if a program run in one username space, grants a certain set of capabilities to a file, you can't simply take that file and run it in another username space and acquire those same privileges. That would be an immediate security issue. So what the kernel does is that it persists the root user ID of the username space in the extended file attributes so that it can ensure that if it's run in another username space, unless the user IDs match, sorry, they will not be applied. Now, as it happens, this is irrelevant for container image builds because clearly we want to build images in one place and run them anywhere else that we wish. So we really don't want a V3 capability here. We just want the V2 without the root ID. And in this case, the fact that Docker Moby build actually persists this information, this user ID is an error. And so we developed a fix and the PR was merged upstream and we should have to fix in Docker 21. So key takeaways here, well, read the manuals. The capabilities manual page is really excellent. It contains a lot of detail, a lot of explanations and allows you to reason about what is happening with respect to capabilities in great detail. Also read the get capman page. This is the one that we missed initially where we didn't see the dash n option which would have been really useful. And finally, reproducible build. Yes, by all means, but to within bugs. So there we have it. And just to conclude then, Kubernetes does an awful lot of heavy lifting for us and all the associated software around it, the container runtimes, the container network interfaces. However, the bigger your organization grows, the more strange issues you are going to encounter and these will challenge you to go deep in your understanding of Kubernetes and the overall ecosystem. But it is extremely interesting to do so. We have maybe a strange definition of fun but we definitely like digging into these kinds of issues. We think the debugging also teaches us an awful lot about the platform and that overall it allows us to give our users a better experience because we're able to help them better because we know the platform well. And it's not easy, definitely, but it is feasible in particular because here we are dealing with open source and so we're able to dig through absolutely everything but it is definitely worth it and we find it's very rewarding. So thank you for listening, watching and we hope to see you one day in person. Again, thank you very much.


Hey everybody, Matt here for late sports cards ripping 2021 panini prison football no huddle free box break number 16 random team style here's another look at those random results way to William see at the bottom there the Vikings and Eagles leave those up for a few seconds and then we'll uh get this ripping all right here we go good luck we have flawless football one box breaks random left side serial numbers after this Sean did say he will do a backflip standing if we pull a black Brisbane maybe yeah oh geez you got a trampoline there's chuba hover rookie rookie and washington rookie disco auto diamie brown oh yeah lucis irl backflip irl backflip cox that is pink to sean watson texans to 15 and you go houston that's three of 15 almost got the jersey number kyle trash rookie and run cmc well the card's the 15 and five minus one is four four jersey number eva 11 there you go yeah exactly why roger's fun digs like we said yesterday every uh every card to eva one-on-one try hard thomas daniel hunter close your eyes of focus well apparently i've changed with time i used to refuse to pronounce that daniel robert woods blue daniel you can't spell it daniel no it's not don't be silly come on gregg or so rishad bateman rookie disco kyler quitty pay kelvin joseph rookie blue 79 there's calio herbert rookie trade mckitty rookie disco kind of gainwell rookie and damien harris red 50 set williams emet disco rookie tylen wallace tray serman disco rookie insert sam ellinger brock lesnar disco that is rookie rishad bateman and joe borough fireworks rocky sign i missed the days when we thought that was rocky sin j tupple keenon allen purple it's the 35 it sounds like what they would call like the church game like like it was a special presentation they came out with their hats like this i'm gonna come on rock you sin yeah they used to do that at my church there's rex ryan rookie card rex ryan ravens rookie something strange is afoot there marlin humphrey sante samuel junior and treyland's prism break rookie nice one box two grab up your spots for tomorrow again we have a triple case of definitive baseball uh live from the national we go live at 10 a.m eastern but triple case of definitive baseball we have another stadium club jeter random hit style there's michael carter and rob gronkowski purple purple grom 35 two former wwe champions of this rob gronkowski and brock lesnar hayden herst but we also have a mega dual case eminence football and flawless tier random teams that is rookie davis mills and prism break justin herbert nice herbert stuff and jack p order anthony bar that is rookie mac jones t higgins i almost said chad johnson 85 i get that though especially because he's in a lot of products jake funk rocky sign see a mickey nice color coming that's elijah moore and rain david johnson texans that is four of five nice one houston that'll appear nicely with a pink dish on i'll try my best mickey i'll try my best sarah jerigoff we used to have a guy that came into the chat that uh christian mccaffrey for a while we thought it was rich trolling us but the guy would always propose all these crazy trades and there was always like he was like proposing trades that included six round picks and it was like stefan gilmore was involved in every trade there's kellen mond and dolphin's rookie disco auto hunter long and then he said he worked for the nfl but then he said he wanted to buy into a break but he had to get his furnace fixed and it was f u r in u s spurn us nick balton there's davante parker red yeah you guys you guys missed out back in the day when it was like it was like a wild west with no control in the chat davante smith mcchub larry roundtree and jaylon waddle rookie fireworks japontae williams rookie theon lockdown no gray there's drew sample blue 79 fryer muth and rookie variation dwayne escrid skirt warner have you guys seen uh american underdog no it's scourneck purple to 35 it's a Kurt Warner movie oh no oh dude it's so good by his story jimar jefferson rookie disco yeah i bought it on amazon yeah all right last box we gotta pick a rookie this year that i can make funny nick name for we're eventually not gonna be up like opening 2021 stuff all the time so every year we gotta find we gotta find somebody the one yep the nick name my favorite rookie to pull is back in 2017 it was taywan taylor for tennessee titans that is lions rookie otto levi on wuzareke getting good at it now look at this look at you nailed it it's kyle van noi blue who's that levi oh or oh taywan taylor he's tj hawkinson that is davis mills merchant disco lamie brown quite freany javon holland and vaughn miller purple 35 there's jamar chase rookie bangles and jamar chase rookie variation bangles nice one it's tom brady kylan hill and kylan hill rookie blue ron dale moore to sham watson bonnie rice derrick brown blue zayden collins denzel ward there's rock lezner craig newson matthew stafford austin eckler sorry disco just inhaled some uh prism docs montray stevensson and new recruits traver lorenz disco rookie insert excuse me i guess i could have not pointed my mouth right at the mic there sorry about that if that was loud jaylon camp johnny smith rookie tray serman there's chad johnson red 50 elijah molden rookie red 50 and last pack that is rookie jaylon waddle and leviska chanel jr height that'll do it for the boxes thank you everybody appreciate it we have flawless football coming up next


Hello and welcome to this session. This is Professor Farhad in which we will discuss section 1031 specifically when liability is involved in the transaction. So before we start this session I want to make sure you understand what section 1031 is. Please go to the prior session, actually prior two sessions and one of them I explained section 1031 like kind exchanges and details. Then I work an example, a comprehensive example. In this session we would look at liability involved. In a non-taxable exchange transaction a liability assumed by the taxpayer is treated as a boot given. What does that mean?  That house comes with a mortgage. Simply put the bank has a mortgage against this house and let's assume the mortgage is for $100,000. There's a $100,000 mortgage attached to that house. You agreed to buy my house so when you buy the house guess what the mortgage comes with it. So how much did you really pay for the house? Well you technically paid $400,000. Why? Well you paid me cash $300,000 and you took over my liability. I'm no longer have to pay $100,000. It is as if you gave me $100,000 it's as if you gave me $100,000 I went to the bank and I paid the bank off. That did not happen. All that happened is you took over my mortgage. It's the same thing. I'm no longer responsible for that $100,000. Well that $100,000 that's liability assumed by you is a boot to me. So it's technically as if you paid me a boot in terms of cash. So when someone assume a liability and that's basically that's the basic idea. Now let's keep going. Before we proceed any further I have a public announcement about my company farhatlectures.com. Farhat accounting lectures is a supplemental educational tool that's going to help you with your CPA exam preparation as well as your accounting courses. My CPA material is aligned with your CPA review course such as Becker, Roger, Wiley, Gleam, Miles. My accounting courses are aligned with your accounting courses broken down by chapter and topics. My resources consist of lectures, multiple choice questions, true-false questions as well as exercises. Go ahead start your free trial today, no obligation, no credit card required. If the other party assumes the taxpayers that the liability in this case represent a boot received by the taxpayer. Why is this important? Because in a section 1031 exchange when boot is involved it might trigger again. As previously mentioned when received by the taxpayer the boot triggers again recognition to the extent of the amount of the boot. Let's take a look at this example. Andy and Nick exchange office building the property given by Andy had an adjusted basis of 80 and a fair value of 95. Well if it's 95 minus 80 we have a realized gain of 15,000 so far for Andy. In addition it was subject to a liability of 12,500. Well we have a liability of 12.K on this building. That was transferred to Nick. So Nick took over this liability as if Nick paid you an additional 12,500. On the other hand the property given by Nick has an adjusted base had an adjusted basis of 75, fair value of 82,500. Now we're looking at Nick minus it's 82,500 minus 75 so Nick had a realized gain of 7,500. Now determine the amount of gain and loss realized and recognized. Well we already computed the realize for both party and Andy would have a recognized gain. Why? Because Nick took over the mortgage 12,500 there's a boot and the gain recognized as the lesser of the boot or realized gain the boot is lower. Yeah let's take a look at it. The amount realized by Andy is 15,000 the gain realized by Andy. In addition the liability transferred to Nick is considered a boot received by Andy and I told you would would choose the lesser of 15 and 12,000. Now let's take a look at Andy's Nick situation. Nick realized gain is 7,500 computed as the difference between 82,500 and 75. Nick did not receive any boot therefore should not recognize any gain it's as simple as that. Determine Andy's and Nick basis and the properties they received. Well Andy's basis and the in the receive property equal to the fair value of the property which is 82,500 minus the amount of the third gain. Well remember we had realized gain of 15,000 of which 12,500 was recognized therefore the third or the non-taxable portion is 12,500 therefore we'll take the fair value of the asset received minus 12,500 which will give us a basis of 80,000. We could also compute this using the code approach starting with the adjusted basis of the property given up the adjusted basis for the property for Andy is 80,000 minus the fair value of the boot received because that boot received is taxable well that's it it's taxable so it's going to bring us to 12,500 plus the gain recognized which is again the gain recognized on the boot which is going to give us also 80,000 so 80,000 80,000 this is the code approach. Now let's take a look at Nick as far as Nick the basis equal to the amount of the fair value of the asset received 80 95,000 and the total amount of gain realized we have to do what not realized realized but not recognized which is 7,500 so the fair value of the asset received is 95 minus the third gain with the third the full 7,500 which will give Nick a basis of 87,500 we can do the same thing with the code approach adjusted basis of the property given up by Nick is 75 the adjusted basis of the boot given and he gave a boot of 12,500 well that's equal to 87,500 which is the same thing as the fair value method. Now let's take a look at another example Tom and Jill exchanged their investment properties in accordance with the following terms Tom transferred a parcel of land with an adjusted basis of 103 fair value of 140 again the difference between those is a realized gain for Tom Tom's land is subject to a mortgage of 20,000 that will be assumed by Jill so Tom has a mortgage will be assumed by Jill Jill transferred a property with an adjusted basis of 91 and a fair value of 130 again the difference between those two will be the realized gain for Jill the property is also subject to 10,000 which will be assumed by Tom so notice they both have mortgage on their property and they're they're taken over each other's mortgage okay determine the amount of gain realized and recognized by Tom and Jill let's start with the realized the amount of gain realized by Tom is 37 which is the difference between 140 and 103 the amount realized by Jill equal to 39,000 which is 130 minus 91 already kind of covered this now in this question we have to be careful both both parties are assuming the liabilities on each other's behalf so what do we have to do we have to net them out and see who's assuming more liabilities so think of it this way think of it this way first Tom has a land that's subject to a $20,000 mortgage and Jill has a land that's subject to $10,000 mortgage simply put a Jill is paying off 20,000 Jill paying let me just write it down think of it this way Jill is paying 20,000 and Tom paying 10,000 what do we have to do we have to net them out and when we net them out we find out that Jill paid an additional 10,000 so really Jill that's really paying the boot and Tom is receiving the boot okay because we have to net them out the party receiving the boot would recognize again for the lesser of the gain and the gain realized or the boot received so already determined that Tom will end up with the boot of 10,000 now given that the liability is assumed by Jill equal to 20,000 while the liability is assumed by Tom equal to 10 Tom is considered to have a boot of 10,000 because he ended up with more assets under those circumstances Tom would recognize again of 10 because the realized the realized gain for Tom is the realized gain is 37 so of that 37 what's going to happen 10 will be taxable now and 27 will be the third or non-taxable for now the third and Jill will recognize no gain why because overall although Tom took over 10,000 but she took over 20,000 therefore it's we net them out okay determine the basis of Tom and Jill in the properties they received from the exchange Tom's basis equal to the fair value of the property received which is 130 minus any deferred gain how much gain did we defer 39,000 at 27,000 of gain as I told you because 10,000 was taxable the total gain was 37 as a result the basis is 103 Jill's basis is the fair market value of the asset received of the property received 140 minus any deferred gain she deferred 39,000 none of her gains were taxable therefore her basis is 101 one more topic we need to discuss section 1031 and that's time requirements okay does the transaction have to happen simultaneously not at all the taxpayer has 45 days after giving up his property to identify a like kind replacement so you have 45 days to identify it I found this property this property is a suitable property as a replacement okay then the identified property must be received by the taxpayer within the earlier of 180 days after the taxpayer transfer his old property so from the date you transfer your property you have 180 days to get the new one or the due date the one that comes earlier the due date include an extension of the income tax return covering the year in which the transfer occur or before the due date the earlier of these two we would look at an example let's assume Ray owns a commercial building in the in the center of the city he would like to expand his business and interested in buying his neighbor's garage to use as a storage for some inventory and believe it or not my friend going through the same transaction his neighbor wants to buy his home to expand his business so it happens that's that's a real example his neighbor agrees to sell the garage that had an adjustment of 20,000 and a fair value of 85,000 provided that Ray can buy him a like kind replacement property for the same value so the neighbor said okay I'm willing to sell you but you have to find me I don't want the money find me another property and I will you know close the deal the deal was made and the garage was transferred on August 15th so it appears that they that they that Ray secured another property for him by the end of August Jad Ray's neighbor identified the replacement property of 85,000 so we did replace we did identify within 45 days we want to make sure we close the deal now and informed Ray that he could acquire the acquisition was completed October 12th and the property was transferred November 1st so you have from August till November 1st I would say this is one less than 180 days does this exchange qualify for the like kind exchange treatment and the answer is yes Jay identified the replacement property less than 45 days following the transfer of the original property in addition the replacement property was transferred within 180 days following the transfer of the original garage which is way earlier than the due date of the income tax return so we are in good shape as a result what would happen is this jad would realize a gain of 65 which none of it will be taxable it will be deferred what should you do now as a CPA candidate enrolled agent or student go to far hat lectures and look at additional resources multiple choice through false exercises that's going to help you do better prepare for your exams or for your classes this is an important topic section 1031 like kind exchanges the third gains the third losses don't walk into the exam without being comfortable with this topic good luck study hard and of course stay safe


Hey guys, today we are going to talk about rice, the enemy of diabetics.  They love rice. I love them. They love rice. Sometimes it creates a conflict. So, I found some solutions for you guys. Let's get started. Alright guys, so everybody loves rice, almost everybody.  That doesn't happen.  Well, guess what? They lie. So, I'm just kidding. Or they hide information. Let's put it nicely. But the bottom line is, rice tastes good.  Now, personally, of course, I'm not a diabetic. I hope when I say, of course, I can be diabetic. It's not that, you know, I don't have to be, but I'm not diabetic, but definitely I have to watch my own carbs myself. Otherwise, guess what happens? I have diabetes in my family. A lot of people do. And if you just live your life freely without any concern, caution, you can be there and join the rest of your family. Now, what do I do? Personally, I don't eat rice and everything, you know, but I love the rice alternatives too. And when I eat rice, I keep my portion very small, not going on heavy on the rice. And I'm very active, so it doesn't bother me.   That's the problem with people, especially in America.  You know, everything is not drive through, tend to COVID-19, nice even worse, nobody goes anywhere. Everybody is sitting at their home. If they want to go eat, they just go drive through, they're eating their cars. What do you expect to happen, right? But there are rice alternatives now. Rice versus brown rice is something that a lot of people ask questions about. Well, to be honest with you, brown rice versus rice doesn't make a huge difference. You know, like the regular rice has a glycemic index of 80. So, it tends to spike your blood sugar and rice is something kind of dense. So, glycemic load is high with that. Remember, we always give this watermelon example where, you know, watermelon has a very high glycemic index, which can spike your blood sugar, but the carbohydrate in one portion is small because it's mostly water, right? If something has a lot of fiber and water in it, it's unlikely to spike your blood sugar, although they're sweet, just like the watermelon. If you're having one slice of watermelon, that shouldn't be a huge deal. But with the rice or anything heavy like bread that's dense, you can tell it's like, you know, mass without much water in it, definitely can spike your blood sugar. So, the rice, for example, and the glycemic index is up there is up to like 80 or so with the regular rice. And brown rice is around 68, 65, 68, something like that. And a lot of people doesn't understand what the glycemic index is about. So, basically, what we are doing here, you know, when they do glycemic index studies, they give 50 grams of sugar to someone, and they compare that 50 grams of something else, whatever that is, in this case, like rice maybe, and then see how much the blood sugar spikes, right? So, you don't have to sit down and, you know, re-experiment everything, so that's why they have these guidelines. And this is on a regular individual, you may be a little different, but it's a good thing for you to compare. So, for example, regular glucose, like pure sugar, that's 100, that's the gold standard. Now, if the rice is spiking your blood sugar, if the glycemic index is 80, that means that it is close to pure sugar and only 20% less than the sugar. So, it will spike your blood sugar. Even the glycemic index of things like that are down to 50, that doesn't mean that it's not going to spike your blood sugar. It can. If you have no insulin in your body, or if you're super insulin resistant, anything can spike your blood sugar, even with the low glycemic index, but it shouldn't be as bad as something that has high glycemic index, right? So, in this case, you know, you can say that, okay, well, rice will spike my blood sugar, because the glycemic index is up there at 80. We typically recommend, you know, below 45, 50 glycemic index if you want to have carbs. The brown rice is up there, too. You know, 65, 68 is really not that great. Now, what are the other alternatives? And again, you can find a lot of things that I'm going to talk today down in the link below. I have an affiliate link, so if you purchase those products from Amazon or anything else in that regard, I will get a tiny commission, and I'm not really after that, but if you're going to purchase it anyways, you can definitely support us. I don't mind that. So, having said that, let's move on to what are the other things that you can do.  There are a couple of things. Now, if you are really looking for rice rice, the best thing you can do, the number one thing that you can try is shiitake rice. There's sometimes called miracle rice. Again, you can find this on Amazon in the link below, but that has no carbs whatsoever, so you can eat. It's like a free food. And if you want to put your food or anything on top of your rice, that shiitake rice will be great, and most people don't even realize that it's not real rice. So, that's number one. Now, it doesn't have any taste, by the way, by itself. It goes with the taste of whatever you put on it. So, that's a good thing. Now, if you are looking for a different taste and some nutty flavor, you can definitely go for something like barley. There's something called pearl barley. You know, that has a lot of fiber in it and some protein in it as well. It takes a little longer time to cook. For things like that, there are high in fiber, these grains that are typically very high in fiber that may take longer time to cook. The problem with the rice, yeah, you can cook it in 10 minutes, and that's because they rip off all their fibers and stuff before it comes to your table. That's why brown rice is a little bit better, but still not that great. But things like pearl barley is minimally processed, and you can use just barley. You know, that's not processed barley as well. You just need to use a pressure cooker that, you know, gets the job done fast, otherwise it may take you a long time. Same thing with the oats, right? If you don't use a pressure cooker, that's going to take an hour versus sometimes my wife will make that great steel cut oatmeal in five minutes in pressure cooker. I'm like, that's great. You know, what else can I ask for? Before I forget, I want to also mention the glycemic index of barley, which is 28. Again, that doesn't mean that it's free food, but it means that it's going to spike your blood sugar much less compared to the rice, which has a glycemic index of 80. So pearl barley is another one, quinoa. Quinoa is a great glycemic index. It goes down to 50, and it tastes great. It's an acquired taste. It goes well with a lot of things. So definitely give it a try to quinoa as well. By the way, remember, I had a video about worse vegetables, and there I was like basically smashing potato. Potato can have a glycemic index of 110. That's like the worst thing ever. So let's move on to rice cauliflower. So if you're a fan of cauliflower and if you like that already, you can just buy the cauliflower rice and that has like a super low glycemic index and super low carbs. That is something else you can consider instead of rice. And again, if you have these things in your kitchen in your hand and you easy access, then you will make it. So as of today, go buy these things. And sometimes the reason I'm giving you the Amazon link also is you may hate Amazon. It's a big capitalism thing, and it kills the small businesses sometimes. That's all true, but at the same time, it's a good thing that they created this super convenient thing where a lot of things you cannot find in a store, you can find an Amazon. It's in your door in two days. I mean, I'm guilty as charged. I use Amazon a lot myself, but all these things, it's just in your fingertips. You can just buy it, have it ready, try it, make sure you have good recipes. YouTube has a lot of recipes for these different rices. So make sure you check them out and have a nice meal. Try that tonight. Give me your comments. Tell me how it felt, how you liked. Not everybody is going to like everything, but give it a try and whatever it takes to keep your blood sugar down. Remember, try different things. You don't have to be even a diabetic. I try shiitake rice myself. I try shiitake noodles myself, and that's perfectly okay. You don't even have to be a diabetic. So just be open to different tastes. These things are eaten, consumed in Asia, in different parts of the world. Why not? Give it a try. You don't have to travel all the way to China to try these things, or Taiwan, whatever. Give me your comments. Make sure you share this video and have a great day, guys. We'll talk to you in the next one. Remember, we have a lot of videos that are all about diabetes and overall health. So watch them, educate yourself, and be empowered. Talk to you later.


Hey, what's up folks welcome to another show and tell I'm no airways This is Pedro as and we're hosting this week's show and tell Everybody's welcome to join in if you'd like to be a part of the show you can click on the link in our discord chat room and we're gonna take a couple minutes to welcome everybody and You can take about three to five minutes to share your project How's that is it so good? Yeah, let's go ahead and start off with Liz Okay, I'm gonna bring Liz in hello Liz and special guest Winnie She's having a very exciting night because there's a lot of lasers here But this week I worked on a project kind of called a cutie pie MIDI friends So Sandy with now I posted up on Twitter this concept of like doing a really small circuit to do MIDI TRS conversion So basically you can take in MIDI over USB and then send it out over TRS So basically makes it so that your hardware sense can now get MIDI stuff from your computer So we expanded a little bit did one for TRS a TRS B and also classic din 5 so Yeah, and so the code's all written in circa Python And it's just point-to-point wiring like really simple And we did that so that it could stay nice and small And yeah, really simple just to really low value resistors On the data and BCC and ground and then you're ready to go Yay, all of our retro MIDI sense can now rejoice in the in the late 90s now with USB I got myself a microcorg and that one just has den 5 and it's like ah I need this other converter box and like the converter box no longer has a driver that supported for my Mac OS So this is gonna bring that back to life. So we'll use this thing again And I I did test it with my microcorg actually coincidentally Since I have and it has a couple broken keys at this point because I've had it Oh, since I was a teenager and it's seen So now You can do MIDI don't worry about the hardware keys. Yeah, and also The world of TRS MIDI is very interesting and just that like it can be TSA is now the standard But there's a bunch of devices of TRS B and you can't tell just by looking like which one it is They can have to there's luckily there's resourced online to check and I link that in the guide But it's literally just swapping two signals. Oh Excellent. Oh, so it's turned into like what USB is now the second gen to 3.1 So many flavors, which one is the fast one? Oh, man Awesome, thank you so much. All right, we'll check in with you next week. All right. All right. Hey Okay, next up. We're gonna check in With Jeff Jeff Welcome to my basement. So if you Watch the new products you might have seen this board that Adafrit is stocking from Pimeroni called the servo 2040 and it's got the RP 2040 microcontroller and connections for 18 different RC servo motors and they said well, we have source for Arduino and for Micro-Python, but with circuit Python you can't run all 18 servos yet So Lamar deputized me to add that and I've just got four here But you'll notice they're hooked to the very first connector in the very last connector So imagine that there's the full 18 servos and I'm just gonna hit the reset button here and Everybody is gonna start going So this support is in the just released new alpha version of 730 for you to try out It is best on the server 2040 because it's got these great connectors But it will work with any board that's based on the RP 2040 and that's kind of what I've been up to And I learned about servo motors and made this kind of janky little bracket just to show them off And now I need a project to put them in because otherwise. I'll just sit around so Your ideas on discord what I can do with these core servo motors, please. Yeah before the show We were chatting and saying I bet when Phil B. Here's that sound He automatically thinks of like ears moving and tails, which I think that's the project right there Just have like two tails and like Well, I don't necessarily see myself as a person who should have had a tail, but I definitely I love the challenge though for like you did the flapping wings. You did the wings. Those were quite the thing So haven't yeah, we really ran out of servos. So it's like how do we get ears plus tail plus wings Yeah with this guy you can do 18 which that is a whole heckin lot That's like doing like the mask and like having the eyebrows and like whatever yeah twitch stuff Yeah, and there is an external power input so you know when you go beyond what you can do over the USB So yeah, I think it's a pretty nice little board. Of course everything circuit Python runs on it It's in the 80 fruit store. Of course. It's in the timer on the store. So awesome. Yeah. Yeah Well, if you've got another minute, I have an update in my project that I think I showed last week So I brought this little badge and I was looking at it and I thought well I've got these screws still visible on the front because I base this off of the laser cut but I use the The threaded inserts so on the back There's just nothing visible from the fasteners and I'm like well, why don't I move that? around so that the fasteners are on the back and The front is just this beautiful pristine thing. Well depending how good your first layer is and Then the other fun thing on the Adafruit blog they had this QR code generator that This isn't showing up. I'll drop the picture in our discord again This is a blinker QR code that links to circuit python org and in person It just it looks like a picture of Blinka with some little staticky bits on it. It's a really great QR code generator So, yeah, I'll drop a couple links in the discord. I have not posted up the design for this yet This design is posted on my thing averse and on my printables this design will probably go up after pycon Yeah, and I'll share some links over in the discord. Yeah And there's one thing I was gonna say I forgot dang it. I'll shoot was about the pie game. Oh, yeah. Yeah Yeah, the qr builder look works really good even like a teeny tiny little poach is a postage stamp when you posted it on the slack I just did a quick test in the oh and take it on right away. Yeah Super surprised because I didn't have the window maximized or anything. It was just a tiny little thing in the corner and So cool. Yeah, whoever did that. It's amazing. Thank you for sharing that with us All right, cool. I think that's gonna be it. Thanks for the short show. Cool. Well, thanks everybody awesome projects But don't go anywhere. I ask an engineer comes right up in like Right, yeah As I've heard we'll have some more special posts. Yeah, can't wait awesome. Maybe it'll be you Jeff I'll be away for a little while soon.


So just to start off, I'd like to get a show of hands. How many people primarily use WordPress as developers? And then how many are primary business end users? OK, just trying to get a feel how to spin this talk a bit. So they already made an intro, so I won't bother going through my own intro. So my talk is thinking out of the box themes. The whole point of it is kind of as a marketer and someone who sells web design, I tend to have to make the argument of why someone should use a custom built theme over just buying a cheap theme out of a theme forest and running with it. And a lot of times you can have performance and other things, and so I'm kind of going to go through that. So as you probably also know, there's no shortage of pre-made themes. You've got 100 sites selling themes. TemplateMonster has over 1,200 themes right now. ThemeForce is like somewhere around $11,000. So you can go buy a theme for $50 and get your site going. So there's nothing wrong with that. It's quick, it's easy, it's, as you saw, a flu buy. It's quick and easy. It's the proverbial lipstick on the pig. But a lot of times those themes don't know what you're building, so they give you the kitchen sink. So that makes them often bloated, and it makes them fairly slow that ever shows up. So why do we care about a fast site? Because people like speed. They want a fast site. They want to get there. They want to get their content. They want to move on with their life. And slow kills. It affects your SEO. It affects your conversion rate. It affects the ability to make money with your site. So a few years ago, a couple of different sites did redesigns, and they did a performance test. ShopZilla did this. They found that when they reduced page load time from six seconds to 1.2 seconds, they increased page views by 25%. And more importantly, they increased revenue by 12%. So that's quite a lot. Amazon and Walmart also did this redesign back in 2015. And they attributed 1,000 millisecond change in speed to 1% change in revenue. When you're doing $1 billion in revenue, 1% is a lot of money. But most people, you're not building sites that are doing billions of dollars in revenue. So what does it matter? Well, next month, Google is going to start using your mobile site speed as a ranking indicator. So if you don't have a fast site, you're going to be sad, Keanu, because it's going to affect your ability to be found. So like I said, I've had this conversation with clients trying to convince them why they should do a custom theme. So I was like, OK, let's do an experiment. So what it is, it took a popular theme off of Theme Forest and I rebuilt it from scratch. Just to take one of their sample sites, rebuilt it to say, OK, here's what you get out of the box. Here's what you get looking the exact same. What's the difference? I'm just going to quickly see if I can jump over. I'll just show you the out of this. I'll bring this over to this, or maybe I just don't know what site I'm on. I think I'm actually over here in terms of, yes. So this is a theme. It's called Bridge. It's available on Theme Forest. Fairly popular. So it's fairly nice, fairly basic. Nothing too crazy, right? The about us, same thing.  No sliders. I've made 2018 of the year of no sliders, personally.  And they're terrible to deal with and responsive. So I've made it the exact same. Exactly. So I've said 2018 is the year of no sliders. So I just can't see the other tab. Here we go. This is my version. You can see the brown's a little different because it didn't make accessibility requirements. So I fixed the accessibility colors in it. But it just can't see where my cursor is. It looks about the same. Still got your little JavaScript counter. Still got your stuff, right? All works. Same little JavaScript effects. Everything like that's still working. It took me about a weekend, like 16 hours to recreate from scratch. So the tools I'm using kind of test is webpagesptest.org and Chrome Lighthouse. If you're not familiar with Chrome Lighthouse, it's a built-in feature that basically lets you test your site for performance on mobile. So it'll give you a perceived speed index. It'll give you your accessibility score, everything. Right in Chrome, you just open the developer tools, go to Lighthouse, and you can just run your test on your site. And it'll simulate connecting with a slow connections and everything. And webpagesptest, for the tests, I ran nine tests out of the Dulles Center. And I also tested the site running on a high-performance AWS instance and a GoDaddy shared hosting, just to see what the difference is. And surprisingly, the GoDaddy shared hosting performed very close to the AWS. But there's other problems with the GoDaddy hosting other than just speed. But I was actually really surprised that the speed was close. WordPress, I followed fairly standard best practices, installed WP cache, lazy loading images, SSL certificate HTTP too, just trying to get the basic speed things that anybody can do done. So at least everyone's starting at something that everybody can do even with an out-of-the-box theme. So once again, here's the original theme. Like I said, it uses Visual Composer, has about 95,000 sales right now on ThemeForest. And it's got a 4.7 out of 5 rating from 4,800 ratings. So it's a fairly well-rated theme. And it sells fairly well, 95,000 sales, right? And then I rebuilt it using Advanced Custom Fields and Timber, as the developers are familiar with it. It basically gives you the closest you can get to an MVC framework in WordPress. And I built it on Foundation instead of Bootstrap, just because I'm more familiar with Foundation. I like it a little more. But performance-wise, Foundation, Bootstrap, they're on par. There's no real differences. And in terms of if you use it straight out of the box, it's probably a 10K difference in size for a default build. So anyway, we're going to go into the results, the actual experiment. The out-of-the-box theme had a page load time of 5.1 seconds. The custom version, 2.6. So if you're trying to hit that magic three-second load time on a desktop, that's right there, Google Lighthouse, 19.2 versus 6.2 seconds. That's a lot, and that's their mobile test. And that's what Google uses for doing their mobile speed testing. So how do we get two themes that look visually similar to have such different performance characteristics? Come down to two main things. Payload size and payload complexity. So payload size, the actual size of the files, everything. And the complexity is the number of files and the time it takes to render that page with those files. So if we look at the out-of-the-box theme, it's 2.5 megabytes for the home page. My version was 930 kilobytes. And then in terms of requests, the out-of-the-box theme had 115 requests. To the server, I had 34. So you can cut down a lot by knowing what you're doing. Because one of the things with an out-of-the-box theme is they don't know what you're building with it. They give you everything. And especially visual composer. Visual composer has a lot of JavaScript dependencies. That's where you get 115 requirements or downloaded files, because no matter whether or not you're using a plugin on the page, it's loading the JavaScript. With Advanced Custom Fields, I can create my own blocks and I know what JavaScript is going to be needed on that page and only load that JavaScript. So basically it comes down to building yourself a well-tailored suit. So let's go a little deeper into the payload size. So 2.5 megabytes of content kind of breaks out this way in what's being served. The custom wasn't much different, actually. Like in terms of ratios, but the size is a lot different. And so as I was building the site, I noticed that it uses only three column types, four column types, like a full width, a six column grid, and then a five and a seven. So why am I loading all the whole bootstrap grid? I will just use a mixing, create those three column types. It's now only have three different designs, right? And then I just create those options in Advanced Custom Fields. I want an even split. I want a 60, you know, 70. It's a golden ratio split with a bigger on the left and a golden ratio split with a bigger on the right. I also optimized a little bit of size of the CSS because I used a flex base grid and it's using older version of bootstrap, which is a float base grid. So you do save a little bit by going down a flex box. And then the JavaScript weight, once again, they had 550 kilobytes of JavaScript by 230. And this is unminified. Or sorry, that's a minified thing. And that's, you know, I wasn't even trying. Like I said, this isn't a weekend. Like, you know, like this isn't even trying hard to make it smaller. And once again, they don't know what you're building, so they give you everything in a theme. I know what I'm building. I only pulled the JavaScript libraries I need. I run through the template in Advanced Custom Fields. I say, oh, well, you're not using that block, so I won't start with that JavaScript. You can even do it if you wanted to with the CSS. You could totally componentize it and just say, I'm only learning these CSS files. Had a little bit of a larger HTML weight in my version. Not much was like 3K. But image size really changed. It had 1.6 megs of image versus 609 kilobytes of images. So because once again, I know what the max column width I have set to, I can make sure I'm never serving an image bigger than that. So when an image is being dumped into a full page width, I know, OK, well, I'll go 1,600 pixels and I'll be the maximum size I'll serve. 2 column 1, well, I know the maximum width for a column is never more than 800 pixels. So never serving an image more than 800 pixels. Same thing with only those three column in there. I know it's never going to be bigger than this, so I set my maximum width. And then if you want to get really complicated, you do responsive images.  And a lot of themes I find, even to this day, don't use responsive images. And then now the payload complexity issue. So because you're loading a lot more JavaScript and you're loading a lot more CSS, it's taking a lot of time longer to render your pages. When I did my CSS audit, that's the difference in the amount of rules between the out-of-the-box theme and my theme. So the time to render a page is drastically different. You're serving 11,000 rules that are all being ignored. I don't need 506. That's a crazy reduction in complexity. So how does this affect the bottom line? How does this affect the bottom line? As a website owner, as a business owner, how does this speed affect your bottom line? So go back to our Google Lighthouse score, right? 19.2 versus 6.2. Google has a tool called Think With Google. In it, they have a mobile performance calculator or a mobile cost impact calculator. It'll be basically putting your site load speed at mobile and you put in what your average visitors a month are for mobile, what your average conversion rate is, and what the average deal size is. And I'll tell you how much money you'll gain a year by speeding up your site. It's got a slide where you can say, if I speed my site up to this site, I know how much money I'm going to get. So I used our values from the experiment. So I took these from these values from a client. So they're getting 5,500 mobile visits a month. Their average deal size is $5,000. And their average conversion rate on mobile is 0.1%. That's the amount of extra money they get by speeding up their site from 19.2 seconds on mobile to 6.2 seconds. That more than covers the cost of the extra development time to develop a custom theme. But you think, OK, well, I'm not a big company. That's not my average deal size. I'm doing e-commerce, all right? So here's another kind of average site. You're doing, say, 1,500 visits a month. The average deal size is $150. And your conversion rate is a little high, because it's a lower price point, right?  So that's one of the best business cases for it, depending on your, yeah, all right. But there's other effects, right? SEO. So page speed, once again, it's an important ranking factor. It's becoming more important next month. And one of the better ranking factors is time to first byte. Less complex site, you're going to have a faster time to first byte. So in any SEO strategy you implement, the first thing it will do is they will audit your site. They'll audit your speed, and they'll audit your text to code ratio. Once again, with a smaller payload, your text to code ratio is better. The out-of-the-box theme comes in at 5% text to code. So it's mostly code. The custom theme came in about 20%. So you have a much better code to text ratio. It's something an SEO expert's going to look at when they're looking at your site to do SEO. User experience, so once again, faster site, happier users, better conversions. And then you get, this is like the actual out-of-lighthouse. So this shows your perceptual speed index of the two sites. That's how fast it feels. And if you look at the difference, the out-of-the-box theme feels twice as fast.  So once again, faster response, happier, your perceptual speed index is 8 versus 79. You can't compete. Accessibility is another issue, which previous talk was talking about. And a lot of the themes on ThemeForce right now aren't accessible. Color contrast is usually wrong, and sometimes you can't fix certain color contrast issues. I find a lot of times I'll implement a custom or out-of-the-box theme, and I'm fighting it. I've got to use important tags everywhere. And as a front-end developer, no one wants to use important. But where's this one they've already used before? That's it, right? And then after, yeah. And part of that comes down to you because they're using Bootstrap out-of-the-box, right? And Bootstrap 4 is much better. Bootstrap 3 was a very hard, and Bootstrap 3 was even worse, for having to override styles to customize. So in accessibility, the out-of-the-box theme scored an 83 out of, in Google, mine scored 100. Because once again, I build from accessible from the ground up whenever I can. And a lot of that comes down just the way the icons are rendered because they'll use icon fonts or whatever, or I replace those icons with SVGs and inline titles and so that makes it a responsive color choice once again. Like I said, I darken the brown because it didn't meet contrast ratios. And then there's a long-term security and maintenance benefit. When you buy these out-of-the-box themes, they have a lot of plugins. And you're basically putting your long-term maintenance in the theme developer's hands. Because so you buy a theme with Visual Composer in it. WordPress gets updated. This is actually an issue I'm going through with the site client right now is WordPress gets updated. It breaks the older versions of Visual Composer. You update the new version of Visual Composer because you have a license. It breaks the theme. So you can't update this client's site without rebuilding, say, 100 pages. And they don't actually break the rules. Yeah, exactly. And then there's other plugin dependency. Like you are now dependent on other developers to make sure you can update your site. Because a lot of them, they're not as critical as I would be in terms of what plugins they use by default. So once again, like core updates or plugin updates, it breaks the site. And you've got to roll back. And that means you're using an outdated version of WordPress Core or using an outdated version of a plugin just to maintain the site to be usable. And while with a custom theme, like a good developer you have a relationship with, you keep them on maintenance contracts. And they'll make sure it's moving forward and keeping up to date. And a lot of times with a custom theme, you're not doing as many crazy things. So a lot of those plugins, a lot of those security holes are coming from interface things that they're doing. But if you're using my ACF, it keeps up to date. It doesn't break. It's fairly good for backwards compatibility.  It won't break it. And so once you build all of them together, it's, oops. It went out of my last slide. That's OK. It's 100% counterweight-approved. So I thought I'd just open up to questions. Because I know this is kind of a dense, crazy topic. I can do with that foundation probably pretty quickly as well. I use foundation more in terms, because I just want to get it done in a weekend. I haven't retried it. Like I know that, because even with foundation, I didn't use the mixins. So I didn't use straight foundation. I just like, OK, I need these three column widths. I will just create custom classes with those three column widths. So I reduce the size a lot there. But yeah, totally you could make it a little even a lot smaller if you went with. I know that two seconds is considered a very long time for a mainframe to respond. And now we accept two seconds as an acceptable time for a website. Yes. Yes. Two seconds is the bare minimum. You sort of get impatient. The line of God is the norm of time. Yeah. But your average page size right now is about two megabytes. And you saw mine was 930k. And it looked exactly the same. There's people with the same size. Yeah. Anybody else? It's more history. Like I said, older versions of Bootstrap, you had to do a lot more important tags and things to override default styling. And so I just started using foundation because it needed less of it. So I was doing a lot less overriding with older version of foundation than I was with older versions of Bootstrap. So I'm just more comfortable using now foundation than Bootstrap. But both, like I said, I've checked performance stats on both and size stats. And they're within a couple of k of each other and a couple of milliseconds of each other. Their performance is pretty close. Most of my clients now are on maintenance contracts. So we're maintaining their site for them. But the beauty of advanced custom fields is that they can't do custom layouts. And realistically, most of the time, once you've sat with a client and worked through their content, they're only using three or four variations on a block. So even with using something like Composer, you can give them those pre-made blocks and give them shortcuts anyway. But with advanced custom fields, I'm like, pick one of these five blocks and use it. And then they don't have as much option to balance it. Yeah, because it's not their job to design the site, right? I will give them, here's the best way it's going to look. Use these. There's a lot of sites out there right now. Oh, sorry. So he was asking if there are any recommendations for sites or things to help develop themes. I also like, I've been promoting a lot, is Canada Learning Code. So Ladies Learning Code, if you just need a good introduction, basic introduction to theme development or even writing HTML, CSS, their introduction to HTML, CSS, and their introduction to theme development is a really good starting point. Canada Learning Code, it used to be the Ladies Learning Code program. And it's one of the best, in terms of the way they teach, I've taught a couple of their courses. I've mentored a bunch as well. And I find it's one of the best beginner intro courses to anything. And I tell most of my clients, if you're going to be managing a website, take their intro to HTML and CSS, because it'll at least give you enough knowledge and enough confidence that you can at least talk about it intelligently if you do need help. And their WordPress theme one is actually very good as well. But on that, it's CSS tricks, Lidia.com. They're all really good. Linda, that's what it is, yeah. So anything else? Yeah. What are you doing here in the site from the ground up? Are you routing it through WordPress? Are you using WordPress whatsoever? My usual, well, yeah. So am I building the site from the ground up using WordPress or am I writing it through a press? My usual workflow is I start with a content map and a content outline from the client. I build them wireframes based on that. In HTML, I do in browser. I then style it and give them static HTML mockups. So it's responsive the whole way. And then I turn it into a theme at the last step. And that's kind of a fairly standard way, I think, of working for most developers. And you just kind of keep building on it so that way you have client input at all stages and you're not kind of here's something and they're like, oh, we don't like that at all. So, yeah. So there, can you still make use of the WordPress? Can you still make use of WordPress plugins? Yes. So with that theme, she was asking if we can use a regular WordPress ecosystem. And yeah, with that, normal short code stuff works. Everything works with advanced custom fields. You can dump any content in. There's usually a plugin you add to help with search for it. There's a advanced custom field search plugin that helps just to make sure your full text search is working. But yeah, you can copy paste any short code in and install any plugin and it'll work. That's the other benefit of it. Go ahead. What do I use to check my themes are up to WordPress standards? For me, I just I've been doing it long enough that I don't do too much checking anymore. And like I said, I use Timber as a base. And what Timber does is gives you a templating language. So you're using mustache or twig, yeah, as your basis. So it's just feeding your variables into a twig template parser. So that way, once again, your visuals are separated from your business data. And the other thing I like about Timber is that I never have to write a menu walker because they have them built in. Yeah. Yeah. All I've done for the last 10 years is I've got piles of stuff, and it's good, and it's raining. But you know what? And I thought, OK, maybe I'll get a theme for it. A lot of themes, you know, everybody says that's the one that we need. But now that I'm listening to this, I'm thinking, you know what? If I do that, maybe I'll have to backtrack a little while and start again and do whatever. Because I will get wiser. And I'm going to get involved in this. But maybe I should be talking to someone like yourself or another person who just provides this service and then just slowly work from there as opposed to starting with a theme like it's already with, say, an old box. What do you suggest to a guy like me who has content and who's going to get re-involved? And I think fairly largely, but I think it's a, you know, what do I start with? So the question is, as a content developer, someone already has a large content repository and they want to update their site, should they buy another box theme and just re-skin it, put the lipstick on the pig, or should they talk to a developer? One thing I can tell you is a lot of the cost in developing a new theme is the discovery portion. So it's figuring out what the client likes and how the content works. Like I said, I put that theme together in 16 hours. It's because I knew what the content was going to look like. And like I didn't have to do all the discovery kind of thing. Okay, do I want red buttons or do I want blue button? Like all that back and forth you do with a client, that little, to figure out what they like and what they don't like. And one of my recommendations is to clients when we're doing rebuilds and they've already had another box theme. Like, okay, if you're happy with this theme, we will rebuild it as a custom theme, updating it slightly, saying, okay, well, we'll use this as a starting point. We'll update to new coding standards. We'll update the styling to be a little more modern, but we won't change too much. Because like, you don't want to totally change your site. You don't have a site. Okay, yeah, the best thing is talk to a developer, see what they'll charge you. Because like the price difference is significant, right? Like, building a site from an out-of-box theme and finding the size. You're looking at two to five grand is what I would charge using out-of-box theme. But as soon as you go to custom, you're looking at 10, right? Because there's a lot more back and forth in the discovery section, right? Trying to figure out what we need the site to look like, how the content needs to lay out that there's a lot more back and forth there. So, yeah. But that's why I bring up the testing tool.  So, you know, you can make a decision, right? Right, and for most people, I'm like, do the out-of-box theme right now. Start somewhere. Because it's better to start somewhere with something slow than it is to not do anything at all and then just move on when you can afford it. What theme is it? What theme is it? What theme is it? What do you do? Somehow you take water and you jump on something. But, yeah, and that's it. And a lot of times, that's what I'll do for a client is I'll just walk them through. I'm like, look, if you can't afford me, I'll happily, I'll take a couple hours. I'll look at your content. I will give you some suggestions. Because a lot of times I'll give a price to a client and they'll go, I can't afford that. And that's my cheap price. So, I'll go, okay, look, I will take an hour or two. I'll look at your content. I will give you a bunch of, one of these three themes will probably work for you. Six months later, they come back and they go, I can't get through. I don't have the time to deal with this. Right? Because it's what the, yeah. You're making money, I'm happy to start. No, but that's it. Is it like a lot of times, I'm like, I can give you themes to use and say use this theme, but like there's still a certain amount of design knowledge and tool familiarity need to actually be productive with it, right? Like, you can sit there, yeah. Yep. Yes. With it, yeah, number five. And I really don't know what's gonna happen when five comes out. Yeah, I don't know what's gonna happen with those things. Yeah, I really, I can't find any documentation on what their upgrade strategy is. So, that tells you one thing about Visual Composer right there. Like, I can't find any documentation. What is your plan for WordPress five with blocks? I haven't tested doing the blocks yet as a, like a speed test. As a developer and a designer, I'm looking forward to it just because moving to a component-based model is, where design is moving anyway, so it makes sense as a designer and developer to do a component-based graph QL thing. So, yep. One private couple of other things that these blocks, is the dual-multi-cation of this. I like MVC personally, that's my thing. I like to keep my code separate, so that's just me. In terms of, like I said, I like to do, yeah, I like Foundation. Use Webpack out of the box for its front-end build. Other than that, like I'll do stuff because I'm on a Mac, I'll use CodeKit sometimes just to let, just have a gooey for it. You know, most times I just develop and map and push it to a dev server. And right now, my big problem with WordPress is it needs a better migration process to migrate from dev to thing. And it needs draft, it needs draft changes because clients like, they wanna make a change to your page but they don't want it to be live yet. Once a page is published, it needs a staging, so. For just a speedy impact on WordPress, like, of course it's a separate request of a different server, but is there still advantage from doing that opposed to packaging that in with your CD? With the CDN, you're gonna get, you might, oh, sorry, we're asking if using a CDN when using a framework is beneficial, it can help. But I find with HTTP2, a lot of that paralyzing of requests it negates that CDN ability, like that benefit you used to get other than you're getting the latency benefit, which, because you're serving from a closer server. But I find even with jQuery loading from a CDN, I'm like, I'm surprised at how often it's not cached on a user's browser. So I just, like I said, I just run all my servers with an SSL certificate, HTTP2, and paralyze those requests. I find that's usually enough to, you know, compensate for any speed difference. So, anyone else? Back to the, on reducing the amount of, let's say, CSS, JavaScript, do you know of any good cross-reference tools that will tell me what CSS is used for this? There are a couple of tools, they'll scan your site and find your unused CSS that you can run it through. Try and remember what they're called off top of my head. And they'll, like, but they will, there are a couple of tools that will run your JavaScript and CSS. And you just, there's even a couple of webpack and gulp-based ones where you can run it from the command line and it'll run through your templates and your JavaScript and look for CSS, like, for classes and see if they're used or not. Yeah, I can't think of one off top, I can't think of a tool off top of my head that'll, like, look for even frequency of use. Yeah, yeah, and there's three instances or four instances or whatever, so you can see if you should refactor and, yeah, I can't think of anything else on my head, but, good. So the question is, if you have a client who already has an out-of-the-box theme and they want you to mitigate any speed issues, would I tell them to start from scratch or would I actually try to do something? I would try to do something, because there are things you can do, like, because a lot of times these sites won't be running on a site with an SSL certificate and HTTP too. So I'm like, okay, well, let's first step, let's upgrade your server to Apache 2, put an SSL certificate because what that'll do is with, I don't know if you're familiar with HTTP 2, it will paralyze requests. So in a traditional HTTP one model, all your requests happen one after the other. Under HTTP 2, anything from the same domain can be served in parallel. So that means instead of waiting for the CSS to fully download for you to let down the JavaScript, it's downloading in parallel and that does a lot. A lot of times they won't even be running a cache. So I'll run a caching plugin and just, you know, WP cache runs a static version. That does a lot. There's not a lot, like, if you already have visual composers, not a lot you can do to reduce its JavaScript footprint other than combine and minify, like run a plugin to combine and minify, which, you know, it also helps. Like, there's stuff you can always do to speed it up, but, well, HTTP 2 will only run, the problem is, yes, HTTP 2 will only run via secure connection. So you need the SSL certificate to run Apache 2.4. Mine was ACFS. Yeah, yeah, because I've upgraded all my servers to run on, use Let's Encrypt and just run a free SSL certificate at least. It never works well, yeah. Like, MAP does not even, like, you always get a warning that it's not secure even though you're running an SSL certificate and self-signed and, yeah, go ahead. So do I use a separate program to minify my images because I got the size? There are a couple of decent plugins that forward press that, like, Image Optimum for one. Is it Image Optimum? There are a couple, Smush It will do your image compression, but I find a lot of it is uploading properly compressed images to begin with. So I do a lot of education with my clients on how to save images out of Photoshop for the web. And just, because it's one of those things, with the plugin, it's just gonna apply bulk compression, which, you know, every image is gonna be different and, like, ahead of Image, you may want less compression because you want to look better, right? So I always kind of do a lot of education and training with the client saying, okay, when you save it, use a save for web, watch Slider and see where it breaks down and see if you're happy with it.  So they're gonna be a little bit less tolerant of compression. Yes, yeah. Sorry, they're in there, so would you? Yeah, I think there are a couple of plugins that will respond, sorry, asking if there's an easy way to deal with themes that aren't using a responsive image. And I think there's a couple of plugins that will mitigate that. Yeah, but it still, it tends to usually deal only with what's in the content field. And so depending on how the short code processes that image, it doesn't do it. And that's, so you're kind of out of luck. You'll create a zip file. Yeah. Sorry, which one? PageSpeed Insights? Yeah. When you run that, it'll give you all your report. Yes. And it'll give you all your things.  But like I said, I tend to recommend a much more hands-on approach. Only because, like I said, I deal with a lot of clients where the image is really important. Like, I have clients who run art galleries and things like that. So the image quality is important. So anything that does like a bulk. Like compression doesn't work. Yeah, but yeah, like if quality isn't as big an issue, where you can get away with slightly lower quality images, anything like a small shirt or using some of the bulkly downloads images and optimizing for you is good to use. So, but it's on a case-by-case basis. So, okay, any other questions? So, asking how I would optimize an image? Generally, I will save for screens out of Photoshop. And then I will adjust the slider and look at the quality difference because it'll give you the side-by-side of, here's the original image, here is the optimized image.  And then, like other, there's the basic thing, it's just making sure you save the JPEG as progressive. Helps. Things like that help. There's a couple of tools for the Mac. There's an image-optim plugin, which you can just drag and drop your images in, and it'll do some basic compression to pings and JPEGs. It's called image-optim. I find it's really useful and it doesn't add too much artifacting. So, ones like that help. I just don't know if there's a PC equivalent for it. Which resize or crop tool? Asking if I resize and crop in the media library if I do it. I do it all from my desktop. Because of that way I know exactly what I'm getting. Like I don't trust the, I don't trust, you know. Theme image users providing. Yeah. Are you still allowing them to do that? Well, I don't stop them from it. I don't stop users from doing it the way they want. I will show them, here's what I think is the best way for you to do it. And like, if they're like a startup or like they're not image dependent. I will show them, yeah, like just use the, you just use the in browser tools and use these tools because I know they're not gonna notice the difference. But when I'm talking to a client as a photographer or an art gallery, I know that the quality images is paramount. So I'm like, okay, here, use this tool, try to get your image size to like try to get your head images down to say 150K or what, like I try to give them even size, like, you know, play by year, like look at the image and look at the quality image but try to hit these size targets. Just to get, so they have a, at least the baseline. Cause, yep, that's time, I guess. I can, yeah, yeah, yeah. But also like a white image versus a, a image with a lot of black is gonna compress differently because white is 255, 255, 255 it's still, it's a bigger number than zero comma, zero comma, zero and you'll see a different compression ratio between an image that has a lot of black and an image that has a lot of white. So, yeah, the color value actually matters. So if, I'm happy to talk after I'm getting, I'm getting the, the, the old.


Welcome to Your Orientation. I'm Agent Max Lombardi. I am your instructor on account that my legs broken and someone in personnel hates me.  So, let's start with the basic mission.   They are receiving a similar briefing in room 67.  Anyway, some of use is gonna be retrieval like me while others are gonna be containment. You might even switch around sometimes. Retrieval generally is preceded by investigation by Intel. Intel who also have coffee and donuts. In case you're wondering how far the budget stretches.  On receipt of this, dearth of information, you will go out to exotic locales where you will be forbidden from stopping and having a drink or conversing with locals what aren't trying to kill you.  An agent much higher on the food chain than you will go and talk to people for the purpose of figuring out what's going on. Do not envy this agent. It goes wrong. He's in the worst possible place. Anyway, once he gives the go ahead, the rest of the team comes in and takes out the skip as quiet as possible. Skip, by the way, is what we call said anomalous entities. I'm sure I don't need to tell you where it comes from. Now, sometimes skips don't come along so quiet as we would like. I mean sure, maybe it's a nice inanimate object that don't hurt no one. Or some guy who don't even want to go around free if he's hurting someone. Most of the time it's something easy. But sometimes it's something that really don't want to come along quite like. And it has the means to enforce its wishes. So apply stronger coercion. Ideally, Intel will have figured out what this skip can take and you can proceed directly to enough firepower to knock a loopy. Ideally, we would have donuts and coffee.  Now at a certain point, it looks like you're gonna have to choose between catching the skip and coming home on your own two feet. Who here is willing to die rather than give up on the mission? One, two, three, four. Okay, you five, fail. Count on what some dingbats will tell you, the latter is actually the preferred option. Capturing skips is the name of the game.    And it comes down to a life or limb decision.  If that don't work, you shoot it again. Because 99 times out of 100, shooting will work if you do enough of it.  You do it when you gotta. We aim to bring these things in whole and intact.  So that was the basics of retrieval. The rest of you were gonna be involved in containment. Now containment is in some ways easier.  However, there are some complications. First off, the skip might be watching you too, depending on how smart it is. That means it's got a better idea of what we can do. It gets out, it's gonna know what the uniform means and who's likely to be armed. It's also gonna be pissed. Ideally, it is more pissed of the guys in white coats sticking needles into it. But it might remember it was your buddies who rolled it up and brought it there.  And suddenly you're dealing with five or six skips instead of just one. Now, they might just start fighting among themselves, but you're gonna have to go in the middle of all that to break them up. And they just ain't gonna play along. Also, remember how I said, most of the time, retrieval is going after something harmless? Yeah, you don't get that luxury. Sure, some of the skips you guard and are safe, but some of them will rip your head off and scoop out your brains.  This is especially true if you're at one of them single skip sides I mentioned, because they don't put them kind of resources to work to watch the f***ing vending machine. So that's life as an agent for ya. Questions? You with the glasses and the turtleneck? How weird? Well, I once saw a guy have his bones turned into jelly. Grape jelly. Yes, they did test. They all came back grape. Not weird enough? A guy with a bus cut. Shoot. Who decides what we go after? Generally, it'll be a side director in charge of retrieval. Ultimately, it goes up to the O5 council, but they're really more into general strategy than day-to-day operations. Okay, you with the messed up piercing? I don't know where the s*** it comes from. It's Intel's job to figure that s*** out. Please refer back to my previous statements on Intel. Red shirt, third row. Health benefits? They're great if you come back alive. We've got the best doctors on the planet. If it's possible to get you back on your feet again, they'll do it. Yes, you in the back. With the duck. The upside of the job? Well, for one thing, we get paid pretty good. For another, if we don't do the job, the world will probably end. That ain't a joke. Seriously, somebody has to do this job. Don't you wanna live to see tomorrow? Good choice. Okay, Tavi, what's your question? How do you get in one of the groups with the coffee and tonuts?  Okay, the skinny twerp with the goatee. Clef? He's a researcher slash agent and slash. I don't know what the f***.  The rest are also bull s***, but maybe based on something that kinda happened once if you squint. In any case, you ain't Clef, so don't get any ideas. When you've been around a while, then you can start thinking about emulating him, except you'll be too smart to. Okay, the dame by the door. The monkey. That's Dr. Bright. He's armless. That being said, you got a taser. He has genitalia. You do the math. So that concludes my briefing. Since you've been so good, I arrange to get punchin' cookies.  End of file. To learn more about the SCP Foundation, subscribe to SCP Orientation today and turn the notification bell on so you don't miss any of our videos.


Well, school is back in session at a former Bemidji Elementary School. The schoolcraft learning community has bought the old Deer Lake School campus back to life over the past few weeks and tonight celebrated with a special open house. The charm of the former elementary school remains with a new twist on learning. A second building was added to the campus that houses the sixth, seventh and eighth grades. For schoolcraft employees having an official home had been a dream come true and the response has been tremendous so far. It's been incredible and in fact a lot of the neighborhood families have reached out to us and Deer Lake alumni have reached out to us to talk about how great it is to see kids back here and all along that was kind of one of the things that was important to the Deer Lake property owners that this building be used as a school for its intended use was to be an elementary school and we're very pleased to be able to do that. There are currently 200 students enrolled at the Schoolcraft Learning Community's new campus.