A little bit of excitement this morning. It's kind of fun. OK, so today we are, Guru, how are we doing up there? OK, so today we're going to finish talking about scheduling, synchronization primitives. Can you give me some tape to backfill off this? It's just a rough morning. Wow, I don't think we're going to get through all that today, but maybe what we'll do. Especially now that we've lost a bit of time. We're going to finish talking about semaphores, which was the synchronization primitive that we didn't get to on Friday. We'll have a couple of slides with advice about approaching synchronization problems and choosing the correct primitive. That's something that we're also going to cover this week in recitation. So you'll get some exposure to that. The synchronization problems on assignment one are designed to give you guys some practice in doing this. But they will not be the last time that you will confront a synchronization problem in the course of doing the assignments for this class and have to choose the correct primitive. So those are designed to give you some practice, but we'll give you some advice about how to do that. And then we're going to start talking about scheduling, which will be we've been working our way up from the hardware level to talking about context switching and now synchronization, which is one of the consequences of concurrency. And so finally now we're going to get to the policies that drive how threads are actually scheduled and what order they're scheduled, et cetera, et cetera. So this is kind of the end of our unit focused on the CPU. We'll finish with scheduling, and that will probably take us through the week. All right? Let's see if this is going to work today or not. It's just a discombobulating sort of day, isn't it? I don't know if this is on or not. Oh, that's better. OK, so any questions about the stuff that we covered last week? Last week we talked largely about synchronization, some of the problems, and then we presented locks and condition variables and walked through an example. So any questions on that stuff before we do a little bit of review and then go on? Any questions? Yeah? Can we actually use all 1.g negated? So this is a good question for either piazza or recitations, but I'll try to give a short answer. So some of the primitives that you're going to implement for assignment 1 are built on top of spin locks. That's not always a bad thing, but most of those primitives should use weighting as a fundamental primitive. There are spin locks that are required, but they're usually done so to allow the thread to safely get to a weight chain. So if your primitive spin, that's probably not a good thing. The spin locks that we give you will spin, but they'll spin, that's fine. They'll spin briefly in most cases, sometimes not at all. If there's no contention. OK, any other questions? While I do surgery on this. All right, so let's do some review. So concurrency is the illusion. This is kind of going back a few lectures, actually. Concurrency is illusion that what? Peng. Right, so concurrency is the illusion that multiple things are happening on the same time or more things are happening that could actually be happening given the number of cores on your system, right? And what's the sort of contrast to that? Atomicity is the illusion that what? I'm going to pick on people in the back whose names I don't know that well, you. Yeah? What's your name? Pal. You want to help them out? Kind of. Someone want to kind of help expand on that answer? I'll let you. Yep, back row. Yeah, so that there's a set of things that either happen or don't happen. And from the perspective of other threads on the system, something that requires multiple instructions looks like a single operation. So atomicity allows us to build up actions that look atomic that actually perform a number of different things that at the lowest machine level are not atomic. So requires reading and writing for multiple memory locations, multiple different adjustments to global state. But those things should look like they all happen at once. OK? So remember, is your programming assignment one? What are the things you have to keep in mind about the threads on your system? What are the types of things that you can and cannot assume about those threads? See, that's what I called on well. Back row. How? They may run. Did I hear an answer? I'm not sure. So they can run in any order. You can't make x, x, unless you do something about it, right? Unless you force a particular ordering, the threads on your system may run in any order. What's another thing you have to keep in mind, Sean? Right, they may be started and stopped at any time, and they may remain stopped for arbitrary periods of time. What's one other thing, Tim? I can't remember the last one. Nick, do you remember? It could be run in any order. It could be stopped and started at any time. They can remain stopped at arbitrary lengths of time. What else? I guess there wasn't another one. Sorry. That was a trick question. They can modify global state. That is true, right? OK, so right. They can run in any order. They can stop and restart at any time. They can remain. See, I knew I was going to do that one day, not necessarily by accident, but I did anyway. What's the interface to a lock? What are the two functions that we use when we use locks? Kevin? Acquire and release, right? Lock acquire, that will put me to sleep until the lock is available and lock release will not do that. I remember this bug from last year, and I never fixed it. Sorry. Lock release will release the lock and will not sleep, right? I don't know. I don't know how to. What are locks for? What are some of one of the one of the primary ways that we use locks done? To prevent dead locks. I would argue locks cause dead locks. Without locking, there can't be no dead locking. Yeah, but to protect critical sections. Exactly, right? So we lock at the top, unlock at the bottom. That produces a critical section. What's the interface to condition variables? What's the interface that you guys are using, hopefully, right now, Dan? Yeah, and what do those functions do, right? Exactly, excellent answer. Weight, weight on the condition variable until I am awakened. And signal and broadcast are the two ways that I have of awakening threats. Signal wakes up one, broadcast wakes up everybody. OK, good. What do I use condition variables for? Condition variables. A condition variable is involved with a blank, but not a blank. Fill in the blanks with two parts of its names. Sirach, condition variable is not a, it's not a what? It's not a variable. It doesn't hold any information. Thornton, what is a condition variable? What do I use it for? We'll tell you when to help them out. What is all this notification and signal in and waiting for? Why? Glad we did this review. It's been a long weekend apparently for not everybody. Is your name Dan, too? Yeah, what's a condition variable for? That's a good answer. The signal changes to shared state. It's almost as if he's looking at the slide. Exactly.  Remember we talked about two goals, thread synchronization, correctness and coordination. Synchronization condition variables are a communication primitive. Their coordination primitive allow threads to indicate safely to each other that certain things have happened. So why are condition variables always associated with the lock? On your system, when you use condition variables, the condition variable interface requires that you hand it a lock. And it might do things to that lock. It might not do things to that lock in certain cases, but it might use that lock for some checks here and there. But why? What's the lock for? Right, the lock. In what state does it protect usually? Yeah, the lock protects the variable that holds the condition or the set of variables or something about the condition. And actually, I think that we'll cover this in recitation a bit more this week. And we'll look at examples of where it's dangerous not to pass in that lock or not to have the lock. Because if you don't have the lock, the condition might have changed by the time you call a signal or broadcast. That's one of the reasons that we hold it. OK, deadlock. What is deadlock? When does deadlock occur? Sam, if you're getting close, Navya, can you help him out? OK, two threads. Sam started with one or more. You want to continue the process of clarifying the answer? Not you on a rock behind. What is your name? Yeah, so there's some. Now, what is your name? Navi, thanks. There's a circularity in my waiting graph. That circularity can be very small. It can be just one thread. But there is some circularity that's causing a series of threads to wait for each other to finish. And thus, nobody makes progress because everybody is waiting for somebody else. And that's deadlock. That means that we are stuck. What are the conditions for deadlock? There were four conditions for deadlock that must be met in order for deadlock to occur. Yeah, correct. Yeah, there has to be access to shared state. If I don't have shared state, then I probably don't have a lock. No problem, right? Josh, what's another one? Yeah, so I have to be able to request multiple resources independently when I remember the dining philosopher problem. If I had a primitive that would allow me to grab both locks at once and fail if I couldn't do that, then it's a potential solution to that problem. OK, Jen, what's another one? Yeah, and that's the one that we most frequently try to address when we look at deadlock is break in the circular dependency. There's one more, Sarah. Yeah, no preemption. I can't yank a lock away from a thread. I don't have a mechanism to do that. On your system, you do not have a mechanism for forcing a thread to release a lock that is acquired. If you had that, then you could use that to break out of deadlock. So this is good. A single thread can or cannot deadlock. How many people think yes? How many people think no? I should have asked no first. A single thread can deadlock. And we looked at a way that this would happen.  Usually happens because there's some call graph that that thread doesn't understand that leads back into the same lock. Any questions about the stuff before we go on? I think it was good to do this today. Monday is a good day for review. Some of the people like me have little thick heads today. All right. So I briefly want to talk about semaphores. Semaphores are, I would say, of the primitives that you guys have and will implement the least useful primitive. Most of the problems that you guys find yourself solving with synchronization primitives for assignment 2 and assignment 3 will not use semaphores. There's one case where a semaphore turns out to be an elegant solution to a synchronization problem that you guys will have. But so semaphores are going to essentially be thought of as shared counters with atomic decrement and increment operators. The semantics of the shared counter are that if I try to drop the value below 0, I will wait until that operation can continue without dropping the value below 0. So the values don't go below 0. That's just how semaphores were originally constructed. So there are two operations on semaphores, v and p. You can decide how you want to remember those. v and p actually are short for Dutch? I hope.  Anyway, Danish or Dutch? Because these actually were invented by someone who we've talked about in the past as part of a very early multi-programming system. Anybody remember who this fine interval was? Yeah, Robert. Dijkstra. Yes, this is a contribution from a good doctor. I mean, that's a smart guy, right? He gave us a lot of things, including semaphores with names that people struggle to remember. The easiest way to remember them is to think of p as, like, I think the word is actually proberan. And I think I read somewhere it's actually not a word. I think it's a word he made up. So they're made up words in another language, right? So good luck trying to remember them. But probing the semaphores, kind of trying to decrement the count, right? And then v, you don't really have to remember if you can remember p. OK, so again, the semantics of semaphores are if the value is greater than 0, I decrement the value in return. If the value is less than or equal to 0, I wait until it becomes greater than 0, and then I decrement it. So the idea is the value of the semaphore can never go below 0. So remember, we did a producer-consumer-buffer example on Friday. And afterwards, someone came up to me with a good question, which is they said, couldn't we use a semaphore to solve this problem? Remember, we had a buffer of fixed size. We had three conditions. The buffer was full, empty, or neither. And we wanted to use those conditions to determine whether producers or consumers would be able to access a buffer where they would have to wait. So who thinks you can do this with a single semaphore? Since nobody thinks that, I can call in anybody to tell me why not. Simon, you don't know? Do you want to think about it? Well, I mean, so the producer-consumer, so what could we do? What part of it could we do with the semaphore? So imagine that I use the value of the semaphore, the count that the semaphore is holding, to represent the number of items that are in the buffer. And when I produce into the buffer IV, I raise the count. And when I consume IP to count, that sounds nice. But what's the problem here? Well, what part of this will work correctly? So remember, I want two things to happen. If the buffer is empty, then consumers need to wait. If the buffer is full, producers need to wait. So which half of this can I do with the semaphore as I've just described? What's that? Can I prevent it from being overfilled? So here's the question. Will a P operation on a semaphore ever block? Anyone want to guess? Greg? No. The P will never block. So Simon, you want to change your answer? Which part of it can I do? So I want the buffer full, buffer empty. Which half of this can I use the semaphore for? Because when the buffer is empty and the consumer comes in and tries to pee it, the consumer will wait. So I can get half the problem with the semaphore. How could I use semaphores to solve this problem? Unlucky person. Call done. Yeah, and how would I do that? You're using the words, I'm like, why is he saying signal and weight? It's because it's on the slide. Yeah, P and V. And essentially, what do those two counts now represent? One of the counts represents the items in the buffer, the number of items in the buffer, and the other counts should now represent what? Yeah? I forgot your name. I feel bad. Alyssa? Yeah, the number of not items that are in the buffer. So I have one count that counts up from empty to full and another one that comes down. And if I use those two together, and both producer and consumer now, P and V. And I would have to think about if there's an ordering issue. But I don't think there is, because the V will never block. So the P might block the V. OK, cool. Any questions about that before we go on? I heard a murmur. It's just me, maybe. OK, so a binary semaphore is a special case of a semaphore that's restricted to have values between 0 and 1. We don't give you an implementation of a binary semaphore, but you could very easily build one. Or you can use a semaphore in a way that's intended to be binary. You can have a semaphore that, based on your code flow, only takes on the values of 0 and 1. So binary semaphores can be used as a replacement for a lock. So remember, we had this great example before, where I was getting lots of money. And I was locking and unlocking around this critical section. And I can replace the lock with P and V on a binary semaphore. This piece of code, if I initialize the semaphore to 1, will work fine. We know when the first thread enters the critical section, it'll probe it. It'll go down to 0. Other threads will block. As threads come out, they'll V it and it'll go back to 1. So this will work. What is the difference? But there's one critical sort of crucial difference between binaries semaphores and a lock. Does anyone want to speculate on what that might be? One critical difference that allows you to use them somewhat differently. Tam, you're very close. The semaphore doesn't need to be released by who? Exactly. So locks have an owner. A lock has an owner.  Semaphores have no concept of ownership. So a semaphore, anybody can P and V it. That's just how we think about semaphores. And there are cases where, and again, the one time that you may consider using a semaphore in this class, where it's an elegant solution to a problem, is one of those cases where the two different threads are going to P and V. The P's and V's are not matched within each thread. And in this example, they are. We have other examples where you might use a semaphore to force another thread to wait for something. In fact, this might be a hint on one of the problems for assignment one. And that semaphore can be used as a signal to another thread. Jeremy, do you have a question? Or are you going to answer the question? All right. So again, I think semaphores, partly because of the lack of ownership, they have slightly looser semantics of locks and condition variables. That can make them a little bit more challenging to use. As I said, most problems in this class don't lend themselves to semaphores. But there are several cases where you might find one that does. I'm going to skip this example because this is in your code. But you can see one example of how we use semaphores in the driver code for your signalization problems. OK. So we've presented you with these three tools. These tools have different semantics. And one of the things we're going to just touch on briefly right now and also look at a recitation is how do you choose when you're approaching a synchronization problem, you've identified shared state, you've realized that you have a correctness problem or you have some coordination that you need to enable between multiple threads that are going to be accessing that resource. You start to think, well, OK, what primitive am I going to use? And there's a number of different questions that come to mind. I mean, what primitive am I going to use? Where am I going to put that primitive in relation to the resources? How many resources will be guarded by a particular primitive? And this is something that will help you with it, and hopefully you'll get good at. But here's one way to think about this. So one of the first things you can try to do is identify the constraints. And by constraints, what I mean is things that should be true, things about your system that should remain true. So for example, with the producer-consumer buffer problem, a constraint might be that the items in the buffer never go below zero and above the size of the buffer. And you might also identify the fact that the constraints are, if the buffer is empty, producers' consumers can't proceed, and the buffer is full, producers can't proceed. Identify the shared state. Now maybe this should have been the first step. Figure out what is it that you're trying to protect. So in the producer-consumer example, the shared state is the buffer. That is the piece of memory, essentially, that multiple threads are going to be accessing. And your job is to make those accesses safe. So choose a primitive. And sometimes this is a step that you'll want to come back to. Sometimes a good way of approaching these problems is to choose a primitive. Think about how you would implement the solution using that primitive. And if it starts to get really gross, if it starts to feel wrong, if you start to feel like one clue that it can be starting to get gross and wrong is if you start having to create a lot of other shared state to hold information about the thing that you're trying to protect. Sometimes that's necessary. Other times it means you're not using the right primitive. This is also important, particularly when using condition variables. So for every lock acquire, there should be a lock release. Those are usually easy to get right because they're usually bracketing a piece of code. CVs are different. We looked at when we saw the producer-consumer example, we saw that the weights and the signals and the weights had to be balanced across different threads. In that case, actually, both threads both signaled and weighted. In other cases, one thread will weight and one thread will signal. But you have to make sure that if somebody goes to sleep that there's someone to wake them up when that condition changes. And usually the easy way to do this is to find the condition and make sure that when it changes in ways that are significant, there's some sort of signal or broadcast that's done. And also, again, be conscious of multiple resource allocations. This is not something that will bite people usually for assignment two. But once you get to assignment three, you will find that this will start to become a problem because there'll be several different pieces of potentially shared state that you need to synchronize. And in order to complete a request, you may have to acquire multiple locks. So then you have to start looking into how to avoid deadlock. And we've given you some suggestions for how to do that. And as always, it's a good idea to think about how different threads will interact before you sit down and start to write code. That's always a good idea. Don't get into the weeds before you have a plan, because no one does good planning in the weeds. It's not a good place to plan. All right. So any questions about synchronization before we move on shift gears? They're talking about scheduling. Yeah, many. Yeah. So with the semaphore, if you use a counting semaphore, a counting semaphore we used to refer to a semaphore where the count can go past one. If you use a counting semaphore, you are not creating a critical section. You may create a critical section that five threads can be executing in at once. But that's not how we usually think about critical sections. We usually think about them as a section of code that only one thread can be inside. And that's part of what allows us to create that illusion of atomicity. So a counting semaphore is not a substitute for a lock. It can be. But I would say use a lock. If you're using a binary semaphore as a lock, I would wonder why you're not using a lock, because a lock just gives you a little bit more help, particularly with correctness. So locks will, one of the things your lock should probably do is make sure that when you release them, you hold them. Yeah. Yes. Yes, yeah, I know. People want to do that. You can.  But I'm not going to read your code. And so if you get your locks to work and they pass our lock test and you can use them successfully, that's fine. But in general, it wasn't our intention that people build locks on top of binary semaphores. But it can be done. It just makes me throw up in my mouth a little. No, I mean, it's not a bad idea. The point of the semaphore is to give you a model for how to do the lock. But yeah, you are right. You have identified an optimization. No. Yeah, so May, that's a good question. So if your system deadlocks, particularly in the kernel where there's no real thing, there's no recourse, how many people, a lot of you have probably taken BNS class on real-time and embedded systems. So does anyone know, and frequently, especially for the Mars rover, something that you're going to send far away? So when the Mars rover breaks, it's not like a technician from Google walks into the data center and goes into the correct aisle and pushes the reset button. I mean, that thing's far away. So unless you can get a Martian on Mars to contract with who's going to maintain it for you, you're pretty much in trouble. So does anyone know there's a kind of a classic technique that a lot of these systems use to avoid this problem? Yeah, Jeremy? Well, but what if that thread gets stuck? That's the question. Yeah, frequently there's this idea of what's called a watchdog timer. And a watchdog timer on these systems is a hardware feature that will trigger or reset if you don't poke it often enough. So a watchdog timer frequently has to be reset all the time. So imagine it as a timer on your system that you can essentially set to trigger a reboot in 10 seconds. Why would you do this? Well, the reason you would do it is because if your system ever gets totally hung and nothing happens, then tech in seconds will go by. You won't trigger the timer and the system will reboot. So while the system is running, somebody has to be every 10 seconds or hopefully less resetting that time, telling the hardware, I'm awake. I'm awake. So this is a common technique that's used. A lot of hardware devices support some type of watchdog timer, especially sort of embedded systems and these sort of mission critical things. Because the idea is it's better to reboot than to be hung. Now, of course, you might reboot and hang again immediately depending on the kind of condition your system is in. But watchdog timers are kind of a classic technique to get around. It's a good question. Yeah, Brian? Yeah, OK, there we go. Very interesting. So how many people thought they'd be learning Dutch in this class? Because he's Dutch. Everything in computer science is in English, except these two things. And Dijkstra's out there. That's not true. I mean, there's clearly been lots of contributions from people outside, but I get a sense. It's a small country. They're proud of him. All right, so let's just get started with talking about what scheduling is and why we do it. So who wants to do this kind of an inductive in introduction to scheduling? So what do you guys think thread scheduling is? Go, Alyssa, front of the room.  You use this word. Maybe you call it calendaring now because you're generation Z or whatever. Wembley, what do you think it is? Yeah, I mean, that's literally what it boils down to. It's determining in what order threads will run. If I have multiple threads that are able to make forward progress, who should be allowed to use the resources on the machine? And you can actually think, when we talk about scheduling, we usually talk about the CPU because the CPU is really a time-bounded resource. But you can schedule a lot of other things. You can schedule network cards. You can schedule memory. You can schedule disk accesses. We'll talk about disk IO scheduling a little bit later because it's more fun. There's geometry and stuff like that. CPU scheduling is a little bit easier. There's a line. So scheduling the process of choosing the next thread or threads to run on a CPU or a set of cores. There's a date reference that I should have scrubbed off. I don't know if we're going to talk about multi-core scheduling. Maybe we will. We probably will a little bit. And maybe we'll get there on Friday. Maybe it'll be Monday. Most of what we're going to talk about in this class is really single-core scheduling because you learn to walk before you can fly. Multi-core scheduling is still an area of very active research. It's very interesting. And we'll talk a little bit about what makes it more difficult. But you guys can probably imagine some of the things. But we're going to mainly talk about there being a CPU and choosing the next thread to run as opposed to multiple CPUs. But we are living in the multi-core error. Here's an even more existential question. Why does the operating system schedule threads? Why is it involved? Yeah. Yeah. I mean, there's a couple reasons. So first of all, we have more threads than we need to run them on. So we have to schedule. And then also, this is our job. Like, you guys put the kernel, your system, in charge of doing this. You said, hey, it's your CPU. You figure out who to run. I'm delegating this to you. You're the boss. So we have to do a good job of this. And application performance on your system can be very heavily dependent on scheduling and other resource allocations that kernels make. So here's another question. When does the kernel get a chance to make scheduling decisions? Yeah, Jeremy. So if a thread explicitly calls yield, that's one of the reasons that we've littered some of the driver and problem code with calls to yield, because we're trying to make your system more, we're trying to force threads to give up time so other threads can run to try to expose synchronization problems. So somebody that was talking about on Piazza how they had taken a yield out of one of our tests and then their code worked. It's like, well, that's because you made the test easier. That's why your code suddenly started to work. So your code's broken. The test works. The test is trying to get in there and poke and find all your weak spots. So don't take the yields out. That's why they're there. Yeah. So when a thread starts, I have to figure out like when I call fork, I create a new process with a new thread in, or I call clone, or whatever, I create a thread in the kernel to do something. What other chances do I have to schedule threads? Particularly user space threads. This is good review. I don't know. Right, timer interrupts, and really any hardware interrupt will give the kernel a chance to run. The kernel may not decide sometimes to do scheduling. And I think on some modern systems, it's possible that the timer fires more offer than the scheduler runs. So the timer fires, we enter the kernel. The kernel just checks its watch. It's like, I'll let them run for another timer interrupt. And then we just get out of the kernel as fast as possible. There is overhead to doing that. But there's more overhead to running the schedule. What's the last time I'm thinking of? So we have threads explicitly calling yield. We have tiner and other types of hardware interrupts, yeah. Yeah, but how would I do that? What would a user space thread do? Swetha. What would I do that would cause the kernel to have a chance to potentially schedule a different thread? Jeremy. Make a system call. So there's the other case. Remember, when does the kernel get control? Hardware events like timer interrupts, which are specifically created to enable scheduling, right? Other types of hardware events like network pack, it's arriving and stuff like that. And then software interrupts or exceptions, but it's kind of a core case, right? But when I call read or write, it's possible that I will not continue to run. In fact, it's quite likely, right? Because those calls go to the disk, which is very slow, and so the kernel's gonna put me to sleep until they're finished, right? Yep, so these are the tops, right? Okay. So, and finally, you know, I wanna point out that the differences, so you'll see that, and we don't talk about cooperatively scheduled systems, right? But a good example of those can be, well, it's not even a great example, right? But the use of timer interrupts to force scheduling decisions creates what we call preemptive scheduling, right? So preemptive scheduling is this idea that the kernel can preempt or stop a user thread from running and decide to run something else, right? Have been scheduling approaches in the past that were purely cooperative, right? The kernel did not ever yank a thread, kicking and screaming off the CPU, right? It would always wait for a yield or a system call or something, and those systems potentially suffer from some fairly obvious problems, right? All right. So, we haven't really talked about yield, and yield, there is functionality that allows, so when we've talked about user threads, we've largely talked about them being descheduled because either the timer fired and the kernel decided that they had run long enough, or because they made a system call, right? But there is the ability for a thread to voluntarily say, hey, I'm good, you know? I'm done for now. Thanks for letting me run. I could run again right now, but I really don't need to, you know? Why would I explicitly make a call like this? What's the rationale behind this? Right, wouldn't every thread just always want to run? It's like, let me at it. I want the CPU, I'm calculating the digits of pi. It's very important, you know? You know, and I'm only up to five. Why would I do this? Greg, I don't know if you're necessarily free of RAM, it could, right? But what is it definitely free up? What resource does yield explicitly release? Yeah, the CPU, right? So yield is like kind of a nice thing, right? Yield can be a nice way of threads tallying the kernel, you know, like, yeah, I'm good. I don't need your help with anything. I'm waiting for any hardware stuff, but I ran for a little while, and now I'm kind of done, right? And yield, again, is this inherently cooperative mechanism, right? The only reason a thread would call yield is to, again, sort of violentarily let the operating system know that it's finished, right? There are no points for calling yield, right? But particularly when you start to think about, so again, here's another question. Why would a thread call yield? This seems like a nice thing to do, right? Mr.  But, you know, operating systems are popularity contests, right? So why would I do this? When, in what case, could this be a good thing for me? Yeah, yeah, and where might that other thread be running frequently today? Jen, maybe, I'm a user space application. What's true about almost most user space applications? GUI apps, servers, they all use multiple what? Maybe, I'm thinking about something more fun about, Tom, did you have a... So why could this be a good thing for a thread? Why might this be a selfish move instead of a purely selfless, trying to be helpful sort of thing? Yeah, Sean. I'm more thinking what could be true about the thread that's calling yield and the next thread that's about to run? Sean, they might be part of the same process, right? They've got Firefox, eight tabs open, right? You know, if those tabs realize they're out of useful work to do, they might yield to another thread inside their process, right? So just keep this in mind. I mean, not every thread on your system is competing with every other thread, right? Some of them are working together in the same process, right? So getting out of the way might mean that some other thread from some other process that I don't care about gets to run, but it also might mean that another thread in my process is trying to do something useful gets to run, right? So this can be a selfish move as well, yeah, right? What's that? Yeah, okay, good question. So remember our thread states, we had running, ready, sleeping, and dead, I think, right? So calling yield puts me into what state? It puts, I hear two answers. Well, so yield takes me from what state to what state? Running to ready, right? The thread is not waiting for anything, right? It's not, it could run, right? It could continue to run. Maybe it's just sitting there in a loop waiting for like mouse clicks or something, right? But it's saying, you know, I don't need to run, right? I'm willing to allow another thread to run now if another thread has some useful work to do. Gina, I don't think so, but that's interesting. That's a good question. You might actually, and some user space threading libraries, this call might just cause that user space library to run another thread within that process, right? So some of these yields in certain cases might not never be seen by the girl, right? So inherently co-op. All right, so I think this is a good stopping point for today, we will talk about separation of mechanism and policy on Wednesday. See you then.


n. We have a bicycle area down at Dickens Park and that's not very far from where these kids are anyway. And so I would like to see if we can make a compromise to see if we can make a compromise and give the kids agency in what they're doing, but also this is a big liability issue too. So that has to be discussed and we have to see if that's possible. Anyway, so that's what I would like. And also I would just want to say to everybody who's out there, it's tough. I know it's getting very tough, but just be patient, be strong, be patient, be courageous and know that we're all doing the right thing by taking care of each other. So this will not last forever. We are holding off on the demolition. So it's an opportunity to have that discussion. Yeah. All right, cool. You have anything? No, I just wanted to clarify that we're, as stated earlier, we're gonna deal with this in the fall. And so in the meantime, we're gonna work with them. So the activity on Friday is not going to occur. So that was a conversation that David had. Anything? No comments, Mayor. All right, we have a motion. Council Member Pat, do adjourn. I'm really glad I have a job on this council. It makes me feel so important. It is important, very important. The future is big. All right, moved by the Council Member Martin, seconded by Council Member Pat. All in favor say aye. Aye. Aye. Aye. All in favor say name. All right, passes unanimously. We're adjourned. See you guys later. Bye. Bye.


With all the work you've done over the years and all the people you've worked with, actors and actresses, is there anyone that stands out in your mind? I must say that Ted Knight lived right in the same block that we did in California. And I saw more of him than perhaps you would with other actresses. I thought he was brilliant and kind of chic. Not Rodney Dangerfield. It's him. We're all going to get laid. But Ted had to play a real smooth opera. You know, he had to really do it right. You know, that stuff, very good stuff. I love it. Frankly, Mrs. Keelemson, the shark, the land shark. When Jaws came out, it became a huge success in the hip. And I wrote Jaws 2 before they didn't film. That was the name of my sketch, basically. Jaws 2. And it seemed to me that what might make that work if you had a shark on a land shark. And he was sort of dumb. But, on the other hand, his victims in their various apartments were also sort of dumb. So, you know, Mrs. Keelemson, who? Dr. Collins. What, who? I'd say Candy Graham or something like that. Or she'd say, oh, Candy, I'm the ghost of the door.   And I laughed every time I got, I got in that shark costume and weighed, and just made up the stuff of Mrs. and the captain and all that. I was, it was hard for me not to laugh, because I thought it was pretty funny, too. I heard that Three Amigos was a big favorite of yours. Oh, I loved Three Amigos. I'm glad you got that out.  We have to guess which one. No, uh, yeah. Gee, that was fun. What made that so much fun for you? Why was that? Money, the money. Did you live a lot in your movies? Were you allowed to live a lot? Yeah, I was, and I liked it. Well, particularly Fletch, was pretty much all about living. We had a plot, and so long as we followed the plot and the blocking, they pretty much let me go in Fletch, and it was a lot of fun to do that. And their example is that when I'm walking down the hallway in Fletch to my apartment and my strangers in my pants, strangers in my pants, and I'm saying just to myself. But it just happened, and I'm sorry I can't sing right now. But it was one of those things that was funny, got big laughs, and I can't imagine why I did it. It's just sort of the way I am. So, I hope that's an answer. Are you excited about the new playhouse? Yeah, John's going to show it to me. I am definitely going to show it to Chevy, and we're going to do it again. We're going to do this again at the new playhouse, and Chevy, you're going to love it. I've got to tell you, and you all are going to love it. So good. Thank you very much.


This is going to be very different from Lex's approach. My background is traditional data processing. And I came into this through the Semantic Web side. We've been doing some work in health care using AOL and Prodigy and understanding what Semantic Web could do in representing information, particularly health records and health terminologies. And we had been trying to get what I call an enterprise engineering practice off the ground. And we had not been able to find any tools to do what we wanted. And when we came across, as I went through Prodigy, I found that it wasn't doing what I wanted to and stumbled on Semantic Media Wiki. So it's about three years, I think, that we've been working on this. And what we're finding is that from a pure data processing approach, forget about documents, forget about office systems, forget about those. Just from a pure data processing, this is an incredible platform for developing tools. So I really want to give you an example of one of these through managed knowledge capture. And this is the process by which you gain the knowledge in the structure that you want, rather than getting all the documents and trying to retrofit the structure into it. We're a small company. We do mostly federal government contracting. A lot of that has been in the health care, in the security and privacy area as well. So as part of the sort of enterprise engineering, and this is a very informal definition, it's really enterprise architecture and the transformation process put together. So when you think about these two areas, you can't really separate them. There's the as is and the to be. But maybe your to be is following your to be is following your to be like week by week by week. So your transformation process and your target architectures are intricately connected. The two areas for this one's an operational area. And these are the things that you have in the enterprise, the actions that are taken, the processes. And you have operations management tools. So if you're manufacturing, you've got manufacturing systems that manage the state of all the things. You see what the thing and may take decisions as to what has to happen. The transformation process changes the process. And you have methodologies such as business re-engineering and the IT system development lifecycle. And you have transformation management tools. And they're slightly different. And in your methodology change, you're going to make a tooling decision. And the tooling decision is very interesting because it's got a lot of problems. So what is the problem? So the current transformation tools are aligned around with departments and teams pretty much. So you've got your project management tools. You've got architectural tools. You've got sharing tools like SharePoint and so forth, which are office systems. The cross department and team collaboration is left to office systems. So we're trying to do all this coordination with emails and meetings, many, many meetings. And as you see in the development lifecycle, in the scrum, the agile process, and you've got scrums, and then you've got scrum of scrums. I've actually seen a scrum of scrum of scrums. And you can just imagine what happens to your calendar in this process. If you've experienced this, it just fills up. And you're just going, oh, it's top of the R. I'm going into the next meeting. And so what's the need? We need oversight, visibility, and exception alerting. And we need it across this visibility as these systems that we're developing interconnect and are dependent on each other. So you're seeing these dependency chains are becoming pretty critical and you need to see them. This is not to stifle the innovation. We talked about that yesterday. You need the bottom up processes, but you need the oversight mechanisms that figures out, is something wrong? Is something totally missing? What's happening in the white space? The tool integration has not happened. So you can buy Best of Breed, and we've seen this Best of Breed paradox that says, OK, I'll go and buy the best project management tool and the best architectural tool. And of course, they all work together. Well, they don't. And so you get changes happening in one environment, not being reflected in another, another component added to the architecture doesn't feed into the project plan. And you can't see that it was missing from the project plan because there was no mechanism for detecting it. Most tools in this area really just support crud on complex data. You really look at it. You're feeding the stuff in. It's complex. And you get reports out and you get nice visibility of it. And the ontology is hard coded. Yeah, you can vary it. You can do extensions to it, but it's pretty much hard coded. And you can't go past the area that it's designed to work in. So what does SMW do? And I'm kind of focused on this because coming from the data processing side, this is the stuff that I can relate to. It allows an independent ontology model development. So we can define a model that covers the project plans, covers the architectural components that need to be built, the teams, the people in the teams, who is assigned to what. It supports tool building. I want to talk about this, that the platform isn't the tool really. Yes, you can do some basic things with the tool, but what you have to do is to build the tool on top of it. And so you're going to take an ontology or a model and you're going to build a tool that captures that knowledge and represents it back. The tool development is fast. I think that most people have understood this. And I want to talk about what this does in the market positioning for SMW. The language is feature rich. You go into the parser functions, look at some of these. It's very rich. The query, the ask function in SMW is incredible. So it's based on Sparkle, very, very powerful. The developers can almost be business analysts in this. I'm not a programmer. I've done programming. I don't do it anymore, but I can handle this. And this means that you can actually take the development above the platform into the SMW area and with some training. And there's a learn curve associated with this. But once you get over that, the language, the platform language, the Wikitext Plus is extremely powerful and very fast. What are the limitations? So we're struggling right now to find out what can't it do?  I came out of an area called model-driven architecture. Has anybody heard of model-driven architecture? Yeah. Championed by the object management group, I was part of the launch of model-driven architecture. We had actually developed some of these techniques in the banking industry at the beginning of the online banking, internet banking. Cindy, I thank you. We actually did the, I was with a previous company. We did the integration for Wells Fargo Bank for their online banking. And this was all model-driven. And it generated payload structures and so forth. Anyway, there was a tool that came out from Spain in about 2004 about model-driven architecture. It was called a lever nova because it was developed by a resort. It's now called Integra Nova.  You pushed the button and you got the app. And Gartner evaluated this. And they found that it was 23 times faster than a traditional Java or .NET development environment. SMW looks similar to this. The company, IZEARTH, we spent three days taking this product apart. And it worked. But we were in the contract programming business. And what this was going to do for us was to drop the pricing so dramatically that we could never actually recover the revenue. And we said, we're going to be real quiet about this because we don't want this to take off. And this is part of legacy, the reaction to a disruptive technology. This is a disruptive technology. SMW looks the same. I wish we could get a productivity benchmark. Maybe we could ask Gartner to do one. But I think that it's around anecdotally, some people know how fast this is. Yes, Mark? So I deal with one client that 10 years ago, they had hired a developer, a consultant, to build something for them, a library sort of thing, and to train other people with. And it didn't use, they were building on a Microsoft platform. So he took two years and still had nothing to develop, to deliver. Meanwhile, the head scientist, one of the senior scientists, said, oh, I can do this on a wiki. And he did it in a weekend. That's right. That is the anecdotal. I found this once I got over the learn curve. The learn curve, so figure out where the documentation is and all that sort of stuff. Yeah, you're able to get, I was able to do my prototypes. I'll talk about the prototypes in a minute, like two or three days to get a prototype working. And there are some people here that are more fluent than I am who could do it in an afternoon. So the productivity is absolutely incredible. And, but as we look at a cost reduction, you'll look at the market factors here of our cost reduction. If it was 10 times faster, what's this going to do and who benefits? The client certainly benefits. The vendors do not. So this basically starts to undermine the programming revenue and those sorts of things. So one part is cost reduction is another is revenue cut. And the market dynamics are interesting. I believe we're on the brink of a new computing generation with this. And I think it's a combination of fourth generation language. Yeah, it's still tech space, but that's all right. But you can put the front ends in front of it on top of semantic web. And this looks like it's very significant. The market forces need to be considered, particularly open source that doesn't have a lot of money. This is an issue. So competing against legacy products that have a lot of money to market. And we're in the early adoption stage, I think in the pre-CASM, if you look at the Jeffrey Moore model of adoption. Let's talk a little bit about the knowledge game. We really need this to manage knowledge. Two reasons. One is a learning and one is a factory core. And if you look at most way information is put together, whether it's in the book form, book forms typically are learning oriented to learning. They may have a strong index, which allows you to get at it for information recall. But these are the two things. The value of knowledge is eroded by chaos. So as we see that this knowledge being gathered in documents and so forth, so we get this chaos that then happens. And we're into what Lex is doing with the search engines to try and recover the order out of the chaos. So that's a recovery mechanism. But we can actually do this upfront by actually organizing the capture in the first place. There's a resistance to share. Competitive postures within organizations, job security. I've got all the knowledge therefore I'm an essential player. Therefore I'm not going to share this because then that dilutes my value. How do you get cooperation? Voluntary groups. I'm very interested to hear how NASA's dynamics is working. Voluntary groups and top-down mandate. And these are not exclusive of each other. Authors need privacy. We're starting discussion. I think we're going to have an ad hoc discussion this afternoon about confidentiality and what we need in the wiki area. But particularly authors need privacy while they're doing their drafting. If you're working on something and you haven't submitted it yet, you need some privacy on it. You need to be able to get the whole strength of supporting tools to help you so you're not offline. You want to be online, but you want to have that privacy. And the status of knowledge collection needs to be visible. How much are we actually collecting? Who's doing it and how far have they got? So I'm actually going to talk about a particular prototype. But these are the prototypes we've been investigating. Most of it's in the IT transformation tooling. You can call it IT for IT. But it's kind of interesting. There are reference models in this area. Security and confidentiality is one. We're going to be talking about that. Portfolio program and project oversight. This is a big one. This is a major area that large organizations, particularly federal agencies, are having a lot of difficulty with. Infrastructure configuration. So this is all the knowledge. Enterprise architecture, working, relating to systems. We've done work with the Department of Defense, with DODAF, using SMW, health informatics platform we've done. And for an operational tool, we actually built an electronic health record in SMW. It took three days. So this is the sort of thing that we're talking about. So here's the one to run you through an example. This is a US federal program called CUI. And CUI stands for anybody know CUI? Anybody know what you're sending? There's some NASA folks, I think, know about CUI. It's a federal program to manage controlled, unclassified information. And it came out, it was an executive directive to the executive branch. It has widespread implications. It's coming into compliance requirement now. Federal agencies have many systems. The systems need to be evaluated to see whether they contain CUI. And if it's present, then the security controls implementation needs to be assessed, remediated, and there's regulatory reporting that they need to make up. So what we did was to work a tool prototype for capturing the knowledge about each system in an organization, like an enterprise. Some of these federal agencies have 1,000 systems. This is quite easy to see those sorts of volumes. So the logistics of managing the capture of this is a challenge. I put this in last night because we had this discussion about UML and an ontology. Who was a great pointer somewhere? No? Lex. Lex? You didn't lose your honor. Oh, sorry, I didn't realize it was yours. Thank you. So this is an ontology. It's a low-level ontology. It's lower levels and upper-level ontologies around. So this is talking about, really, the categories that you're going to see. Here is the system. The system has applied controls. Here are the controls. The controls come out of SRM is the security reference model of the federal enterprise architectural framework. So these concepts come from existing documentation. So the system can have sensitivities. And the sensitivities have links to handling practices. And one of the interesting piece of the handling practice is that it has an authority. That authority points to a US code or a code of federal regulation. And so these structures are all knowledge that's actually built into this program. So you don't need to invent this. It's all there. So we imported all this stuff into semantic media wiki so that in the data capture process, you can see exactly if you apply this sensitivity, then it will give you this handling practice. And this handling practice applies to certain government organizations that the system has a point of contact. There's an applied control. The control goes up here. And here is a little interesting thing. You probably can't see it from the back. But the applied control is actually a sub-object of the system. So as you actually make the connection between the system and the control, there's more detail that's applied here. It's like the recipe model. It says, OK, what are the things? Well, it's got a planned. It could have a control plan date. It's been implemented. And there's some description associated with how that control was implemented on that system. So that's all sub-object. And it says, here's has sub-object. So it's taking me to the properties. And these are the names of the properties. And this is the roadmap for building it. And I put this diagram. And I import the diagram. And I put it in the model.   So here's the knowledge and capture cycle for this program. This is mermaid too. And I'm very interested in mermaid, particularly the sequence diagram. But the sequence diagram isn't complete enough yet to take into production. There's an online site called websequencediagrams.com that has a commercial service of mermaid sequence diagrams, which has got the full implementation in it. It is free. There's some extra bits that you have to pay for. But pretty much it's a full UML sequence diagram implementation. So what we've got here are assessors and points of contact. The point of the assessor basically issues the questionnaire for the system. So we've identified a system. They issue it. And it goes, they create a page for the system. And they assign the scope to points of contact. So it says, who would be the people? And they can choose. Who are the people who are going to actually fill this in? And so they apply it to the point of contact. Then the point of contact up here selects the questionnaire that's in scope and changes it to draft. From being issued, changes it to draft. The moment they change it to draft, they now own that page. That page can't be seen by anybody else until they've actually submitted it. So they then do this. They enter the sensitivity. They can enter the plan controls. The moment they enter the sensitivity will come up with a whole lot of supporting information. And when they submitted it goes now into the assessor's side, the assessor can see the submitted questionnaires. Is it accepted or not? If it's yes, it's accepted and it may expire and may have to be refreshed. If it's not accepted, it needs completion goes back in the cycle. So this is a very simple cycle for collection. Here's the scope focus. Talked about here where the submission states issue draft submitted accepted needs refresh. The user scope privileges. This is not a hard security mechanism. This is a focus mechanism. We don't yet have a full implementation for access control that will give us what we want. We'll talk about that this afternoon. They, but it gives them privileges to questionnaires they can edit. Questionnaires they can see with the grouping. We'll talk about the grouping in a minute. The user has a role. They're either an assessor or not an assessor. All this can be changed. This is all above the platform. This is all implemented in the SMW artifacts. The rules control what the user can see or edit. They can only see questionnaires content within scope privileges. We intercept the queries. So when you do an ask, there's an intercept filter on that. Does the user have scope for this? And that means it will only produce the list of the things that they have scope. Now, I had a terrible problem with this originally. I thought this would be great for putting concepts, putting it into concepts. Oh, I can just say, here's a concept. Does the user have scope privilege? And then I found that the concept cached the decision. And when you changed users, the new user got the privileges of the previous user because it was not updating and refreshing current user. And so it was like the worst nightmare for privacy. So I expanded it out. So they can see the questionnaire status within scope and so forth. These are the kind of rules that are programmed in it. It's a soft security. It's not, we know that if you transition across because you've got some dependency from one program to another, we're gonna let you do that and go across, and you're in a program that you might not have privileges for. It's better for you to see that than to sort of stop you and say, there was some dependency, but you can't see where that goes. And so there's some decisions that have to be made on these rules. Here's screenshots now, because this is implemented. Here's our property has submission state. And here are the allowed values for it. And I've got some sample dummy systems in here. Department of Agriculture System One, the Fish and Wildlife Service, which was my favorite, has got a system. And National Park Services got some. And here you can see, this is generated, this is SMW generated, just looking at the property page. And here's the issue draft accepted, draft and submitted type of pieces. Here's our user. Guess where we're going with this. Okay. So here's Fox Mulder. Here's the user page and we've put a template into the user page. So here are the scope privileges. So template with everything is managed with page forms. Don't do anything except with page forms and there is no free text anywhere in any of these pages. All fielded, 100% fielded. So you can define when we're questioning, does the user get to choose this or does somebody else get to choose this? Don't know yet. But the first approach was to say, it's a scoping focus for the user that they could choose what to do this but we may put it under another level of control a little bit later. So they might have an agency scope which means they can see the whole of the agency. That means they can see the progress that's going on with all the questionnaires in the agency or the segment which is the administration or department or a system scope. And they need a system scope to actually edit the questionnaire. So that's how you give somebody permission to edit the Fish and Wildlife Service System one. And here's the role assessor. Fox Mulder's not an assessor. And here's the intro page. So when you go into the system, the first thing it does is to say, it's your dashboard. Nobody else says it's your dashboard. And who are you?  So there are point of contacts that might not be users in the system. Here's your total sort of view of the metrics. It's got one questionnaire which is in draft. And here's the link, the questionnaire. It's, of course, the X file, so we know where we were going with this. And it has a security marking, INSL, which is an intelligence national, I'll see it in a minute. And here are the revision users. Here was the last edited. So you can see this information. This is really a duplicate of the same. So as you go further on, here's the questionnaire. Here's what it is. It's in draft. Here's the intelligence national security letter, which is the security marking that's been assigned for this. There's no implemented or planned controls yet. So it's in partial development. But the moment you put this in here, it's come up with the knowledge of saying, wait a minute, this sensitivity is a handling practice and it described the US code that is the handling practice for this.  And there's the marking level on the right. So... That it gives you the link to the tool. So in order to edit something, you need to get to the form page and that link is controlled with the access control. So if you're able to edit it, you get here. If you don't, it'll say you can't. So here's the point of contact. Here's the control, and this is standard page form. And then when we go to the controls, we go to another level of the form. And I'm gonna show you, and here's the submission state. It's in draft when you want to submit it.  Here's the more interesting piece to this. I put myself in here. I've got actually agency scope in here. And I can see some things that I was actually doing, but I can also see the status of the questionnaires in scope. And you'll notice here that I can't open these. I can't open these to see them, but I can see who the revision contract is, where they are, and when they were last edited. So this is giving you visibility of the progress. You know, there could be a thousand of these. So it's giving you visibility of the progress as to where the forms are. So kind of in looking at this, there's some positioning that needs to be done for SMW. It's not a tool out of the box. We think that it's a really good candidate for enterprise engineering tool development. You saw some of the prototypes that we've done, and actually these prototypes start to merge together. That's why the ontology is so important. Once you describe a system, the systems in the knowledge base, you want that system to be reused in all the other aspects associated with it. And so the ontologies will start to merge together so you can actually see development on systems which are going to remediate a CUE situation. In other words, you have to implement the controls. That means there's a project going to be spawned up on that system to put the controls in place. I'm very interested in this adoption question of where we are. I believe this is disruptive. It tips the balance of make-by in this tool area. So you can go and buy a tool and then you try and integrate it with something else or you could make it. And you were never able to think about even building one of these before. But with this productivity change, and when you were able to get a prototype in place in three days or five days or whatever it is, this is a whole new game. And it basically changes that balance. We talked about a threat to existing tool vendors. You're gonna get a lot of resistance here. This is not, you know, this is understandable. There's a potential large expenditure displacement. Potentially can happen here. There's a lot of money at stake. But the money that's gonna be saved, I think, is on the customer side. And I think that this combined with the productivity analysis of where this is could actually drive some of the adoption. It needs a strong marketing message. The marketing message has to come from the tooling solution, not from the platform, I think. The platform can be an umbrella, but the real thing is you're going to build something, a tool, and it's gonna be branded and it's gonna merchandise that way. And the message is a low cost to development customize. It provides a holistic ecosystem cross-organization. This is a different thinking from putting different systems in, different parts of the organization or for different functions. And I think even the multi-wiki situation is one. And I've heard that discussion here about, wait a minute, you should sort of try and get one wiki. And so this is, how do you get this cross-organization when you have these dependencies that go on? Flexible ontology. There's almost nothing you can't do with this. And the customization potential, you can go into a customer and look at their methodology and build the tool to their methodology. And that's very exciting, that's different. So, trying to catch up with our timing here. In conclusion, there's a large number of tools that exist which are CRUD. And they're against complex information structures. That's really what ERPs are about to some extent. So CRMs are exactly the same thing. All they're doing is storing the information, the complex information about the relationships. So CRM is a potential tool. The modeling tools are there. The project management tools are there. And I think we've been talking about the comparison with some of these tools. The cross-tool integration, we've talked about that. There's an opportunity for a homogenous platform but the marketing position needs to be established. And the scale is from text. We talked about a questionnaire that was heavily fielded but the questionnaire might not be that way. It might have a whole lot of text. So it's not limited to that but the management process, you've seen how that can actually happen and how you can administer and keep track of where your completions are. So if you have a thousand systems and a thousand questionnaires out there with a thousand people to contact, how do you keep control of that? And that is my story. Does anybody have any questions or? Yes, Rich. You said this could be implemented today with existing technology. What I showed you I've implemented. Okay. Yeah. So then my next question is, so many organizations sort of have or there's a fractal relationship between the model that you've described and then that pattern repeats within the organization. So at an agency level, you could apply this model and then within an agency, you might have branches. Yes. The branches would have their own granularity to this. Yes. So do you think that this could, this security model could replicate as it goes from, you know, as it scales from the top level entity to the micro entity? Yeah. I think some of the governance mechanisms could do that. It could be hierarchical. In other words, as you, we talked a little bit about the approvals for the individual to get access. And those approvals certainly can be, we didn't really talk about how to do that. That could be done centrally or it could be done granularly at the level of down through the organization. The ontology is going to change. If a different part of the organization's dealing with a different part of the ontology, then they're going to have different, that's a different piece. But the security model is probably, it's flexible. I think you could implement it with a central control. You could distribute the control down through the organization. Was that answer your question? Yes. Yes. Yeah. Hang on, hello. There you go.   Well, I... Oh, and actually, I tied in with that. What are the, you said the competitors are other tool builders and so forth. You know, what kind of software were you talking about? Well, we've talked about SharePoint and SharePoint is a file sharing environment. But you could be talking about the best of breed project management, Primavera, Oracle P6 Primavera, for example. You'll be talking about the IBM rational suite of tools. Some of them just, you know, diagram draws, but the underlying information that they carry is something that can be projected. And we've done this, used this instead of system architect, for example, in the DODAF architectural area. So, but you can't just say here's the platform and here's Wikitext, go for it. You can't do that with the users. You've got to present something that the average user with a page form can actually build. So it's taking the platform with Wikitext Plus and building it into a tool that the users can use. That's the difference. So it's in the eyes of the user. Is this a tool or is it a technology that somebody else has to build into a tool? And that's the difference. No more, and I'm standing between you and lunch. So, thank you.


Hi everyone, Joe for Jasper's case breaks.com. Happy Saturday. We've got 2019, 2020, Panini encased basketball coming at you. Full case break, eight box. Pick your team number three. There's the fresh case right here. And a very big thank you to all of these folks right here for getting into the action for buying your team straight up. We appreciate that and we appreciate you spending a bit of your Saturday evening with us. And you saw a lot of R&B right there. So we did have a big, giant, 18 team random number block randomizer, which I've posted in a separate video, but there are the results right here. Thanks everybody. Now there's probably gonna be a pile of non numbered cards in this, I think. Maybe some base cards that are not numbered, but we'll randomize all of that as one lot to one person in that group. Now there you go. Dodge is limiting the damage here in game four. I'm a big fan of this stuff because it has those cards already graded for you, which I love. A lot of people are like, oh man, PSA, BGF's too expensive, takes too long for me to get my graded card back. This eliminates that waiting process. You can get a graded card right in your hands pretty quickly. So we're gonna set these aside right back here. You can see, actually let me flip this camera this way. So you'll see the graded cards right there and we'll do them all at once after we go through all of those cards, right there. So that's the autograph on the bottom, okay. So Bradley Beale's gonna help us out here. Behind Bradley Beale is Zach Levine. 165 out of 199. I like that graded label design right there. I think that's a cute touch. And it goes to the Bulls, Bulls Five. Bulls Five is gonna be for Robert Runkle. Tramont Waters, 136 out of 199 for the Celtics. That'll be for Boston Six. Two men with that one. And behind Bradley Beale is gonna be Bruno Fernando, scripted autograph, 20 out of 99 for the Hawks. Atlanta Zero is for Chen. There's Bradley Beale right here for the Wizards, Wizards Nine. Behind Mark Asall is Carmelo Anthony, Trailblazers, 87 out of 99 for Portland. Portland Seven, Nick Benningfield. We got Luka Donchich, Luka Donchich Relic 144 out of 199. Mavs, Wayne Stock got the Mavs straight up. We got Wally Zerbiak. Two out of five, Wally Zerbiak. For the Timberwolves, picked up straight up by Steve Locke. There you go, Steve. All aboard the Big Hit Express. Woo-woo! Here's a top 10 pick. Mark Asall, 87 out of 99 for the Raptors. Adam Kaye, separate from the number blocks. Am I a fan of Matthew McConaughey? Sure. I have nothing against Matthew McConaughey. He's got a fun voice to do. Yeah, Adam's right. You can do the whole alright, alright, alright thing. That's always fun. I guess I never really thought of him too much after his acting role. I enjoy him as an actor. He was good in that space movie, Interstellar. I thought he was good in that. I think he's a good actor. He was in contact. Remember, young Matthew McConaughey in contact? He was a, he was Chumo O'Keeke. He did the alright, alright, alright movie. He was in Dallas Buyer's Club. 160 out of 199, Chumo O'Keeke. I like that movie, Jeremy Schioclas with The Magic. I did not see True Detective. I've never seen that. I'm sure I'll like him in that. But A Time to Kill, good, I always love good courtroom drama. I thought Time to Kill was pretty great. There's Matisse Hyble 10 out of 25, Sixers, Josh Poosh.  I guess I never really thought of him as a personality after that. He seems pretty non-controversial, right? Is he? He hasn't gotten me-tuned or anything like that. Seems to be a good dude. Seems to be a lot of likes in Hollywood. Alright, behind Chris Middleton is- Whoa, John Morant! 46 out of 49, scripted on-card autographed John Morant for the Grizzlies. Grizzlies are a number block team. Grizzlies six, Kim Soo Min, woo! There you go, Soo Min. Look at that. 46 out of 49. How often do we see on-card John Morant autographs? I feel like that doesn't happen too often. Or do we? I don't know, but there you go. Nice. There's Chris Middleton right there to 35. Bucks six, also four. Soo Min. So there you go. Yeah, I got the number 12 inscription in there, Norman. I like that too. That's pretty strong. I was just marinating inside these encased case boxes here. And we still have the graded cards to go. Maybe some Zion in there. I did not see Lincoln Lawyer with Mr. McConaughey. I'd like to see that. He was also in... I just learned this yesterday. Matthew McConaughey was in Angels in the Outfield. He was an outfielder. Behind Deandre Aitton, got Brandon Clark. One, two, three out of 199. Goes to Brian. And we've got Kevin Love in Case Relic, 31 out of 99. Cavs one is gonna be Nick Stober. And the autograph here is world champion, Talon Horton Tucker. He gets a ring. Seven out of 25, good for him. Charles Wilson with my Lakers. He's an interesting young player off the bench. I'd like to see him kind of develop into that. I don't know if he's gonna get starter minutes anytime soon. I mean to be awesome if he got starter minutes, but I'd love to see him get a little bit of, if he's like a 15 minute, a night guy or something like that. Put some some meaningful minutes, play some good defense. I really think there's gonna need young players like that. There's Deandre Aitton. Sun's nine is gonna be for Brian. All right, four more boxes and we'll do all those in case cards right over there. Don't sleep on this in case basketball, folks. We got another case in the store. Check it out. And I'm sure Instagram Live at Jaspy's Wrakes. Instagram Live has personals of encased as well. So check that out. Both jaspy's.com and jaspy'scasewrakes.com. 83 out of 199, Lamarcus Aldridge. Ryan Harold and the Spurs. We've got Magic Johnson. Eight out of 10, two color jersey for Charles and my Lakers. Game war material right there too. That's pretty cool. And the autograph is for the Pelicans. Lonzo Ball, eight out of 10. So brother might be in the league next year. Brother might be a top three pick. So that's zoe eight. Corey with Pelicans eight. And there's Darius Garland, 30 out of 35. That is for Chen. Well, I don't know. I didn't do break number, did I do break two? Or did Sean do break, Sean Jaspy do break two? I don't remember a Zion. I think that was our first John Morant too. LeMetal Greter than Symbol Lonzo. There you go, Max Muncie. Down, down, down, down, down. Nice. To second. That looked like it was out. All right, so Runkle's keeping track. No Zions yet, two Jaws. Remember how terrifying Jaws was? Both the shark movie and Jaws the Bond villain? John Morant's much friendlier. Clyde Drexler, 004 out of 149. Jersey for Portland. Portland four is King. Oh, that's Dave Roberts running out there. There's Carl Malone, 27 out of 149. Jazz seven is gonna be for Nick Benningfield. And we've got notable signature, 18 out of 25. That's this guy. That's this guy. Oliver Soria with the Kings. And there's Boyan Bogdanovic, 73 out of 99 for the Jazz. Jazz three, Brian Croft. All right, two more to go and then we'll do all those graded cards. That's, well, we got that John Morant. That was a pretty big hit, but is that an indication of what could be in here? I mean, they don't really plan it that way. It's all random, but it's still. All right, behind the Montessess bonus is Bowl Bowl. Jersey, 86 out of one at 99. Denver, Ryan Gomez got the Denver Nuggets straight up and we've got Matisse Tybal, piece of his jersey, 18 out of 199 for Josh Proust and the Philadelphia 76ers. Doc Rivers out there, right? In Philadelphia, new coach. Can he unlock the potential of that team? And the autograph down here is Nikhil Alexander Walker, 38 out of 99. Palakins eight, Corey. I wonder, there's a bonus seven out of 10. The Pacer is seven. That's gonna be for Christopher Peterson. Mr. Wings out there, Philly Fan. He has to, he says, we're hoping, we're hoping so. There's a little, that team looks excellent on paper. Mr. Wings, if you can find a way to kind of keep Joel and Beat healthy, figure out how to unlock Ben Simmons is, you know, he's Ben Simmons has a huge ceiling, but a coach just needs to unlock his talent, you know, and have him work within the context of a team. It could be an interesting project there for Doc Rivers. Give him a season or two, you know, two, three seasons maybe. There's Miles Turner, 172 out of 199. Pacers, Christopher. DeMonte Sabonis, Pacers, Christopher Peterson. 91 out of 199. Man, we've got Keras Leverg, 71 out of 99. There's your another team. That could be really interesting. Brooklyn Nets, Kurt Disser with the Brooklyn Nets. I don't know, they could be super interesting. Got Keras Leverg, got a Din Whitty out there, I think. You got Jared Allen. You got a healthy KD, a healthy Kyrie, Steve Nash running that team. A lot of potential there. 90 out of 99. Kevin Love, Cavs zero. Lizzie Alchen with that one. All right, here's the moment we've been waiting for right here. Look at all the graded cards, good luck everybody. I see a nine, five, 10. Oh, Renfro goes yard, but we got a Zion right here though. I've mixed emotions right now. Nine, five, 10, Zion Williamson in a Hunter Renfro home run. So what's that Zion number two? 13 out of 25, what a case. Brian Croft won that spot in the number block and gets a Zion. Nine, five, 10. Already graded for you, congrats. Nine, five, oh, these are good grades here. Nine, five, 10, Chuma Okiki, 64 out of 99.  All right, then we've got an eight, five, 10 of Brandon Clark, Dual Relic and Autograph that is seven out of 99. Nick Benningfield with number seven. Well, not anymore Rex, not feeling so good right now. This is another nine, five, 10 or nine, five, nine.  You gotta get inside the lines there a little bit. 76 out of 99. Wizard six is gonna be Suman. We got a nine, 10. It's Tyler Hero, nice. That's a low number there, 10 out of 10. Tyler Hero, two color, Dual Relic and Autograph from Miami. Miami's a number block team so that goes to Miami zero, Chen with that one. We've got a nine, five, 10. Goga Batadze, 56 out of 99. Pretty nice for Christopher Peterson and the Pacers. Two more to go. We got a nine, 10 and it's Jordan Pool. And that is 69 nice out of 99. So that's Warriors nine and that's Ryan Croft. And the last one, good luck everybody. This has been an excellent case. Thanks very much everybody for getting into this. We've got a nine, five, 10 to click. Got a lot of nine, five, 10s in this one. It's Rookie Seiku Damboya. That's a solid one right there. There's the nine, five. There's the 10. There's his Autograph, Dual Relic and Auto and the number 45 out of 99. Detroit five, no, Detroit was picked up straight up by Matthew Stubblefield. Nice one, Matthew. There you go, nine, five, 10 Seiku. And there you have it ladies and gentlemen. What an excellent break. A lot of nine, five, 10s in this case. And of course the Ja Moran and the Zion Williamson. Those guys are pretty nice too. Thanks for watching. Thanks for breaking with us. I'm Joe for jaspeakcasebreaks.com. More in the store, check it out. And I'll see you next time for the next one. Bye bye.


So, in today's lecture, I will give you a brief recapitulation of what we did regarding the evaluating the scattering cross section for diffraction of neutrons. We have started, we have started with the Fermi-Golden rule and then we went ahead and calculated a fkk prime which is a scattering amplitude from either a single scattering object or an assembly of them. So, today I will go ahead and using the same formalism, I will show you that for neutrons we have something called coherent and incoherent scattering cross section which is not there in x-rays and I will explain to you why they are not there and then I will also go for a comparison between x-rays and neutrons because extra diffraction is the most commonly used tool by researchers in any field of condensed matter be it physics chemistry or material science. So, we will do a quick comparison and show you what are the similarities and what are the dissimilarities between neutron and x-ray diffraction. Please remember till now I am doing diffraction that means I am just trying to get the structure of a material using neutron diffraction. Now we will go to the lecture proper. So, as I indicated, so recap and calculating coherent and incoherent scattering cross section for neutrons will be a starting point for today's talk. So, earlier also I had written that for a rigid lattice rigid means physics concept wise this is a lattice which is 0 degree Kelvin. So, I have a regular arrangement of atoms but they are rigidly fixed at the sides. I will come later what happens when you come to finite temperature. So, this rigid lattice I can consider as a sum of delta function potentials at site RL and acting with a scattering amplitude BL with the neutron. Now, this delta function justification also I had given if you remember I said that the VR the scattering potential first for a single nucleus it is delta function because the nuclear potential is infinitely narrow or almost infinitely narrow with respect to the wavelength of neutron. So, lambda is much much greater than the nuclear radius and when I consider a lattice where the points are fixed in space like this they are fixed in space then this each point is a delta function and I can write now the VR is a sum of such delta functions and I wrote sum over all the lattice points. This was the potential offer by the entire lattice and if you remember my scattering amplitude f k k prime means the neutron when from an initial wave vector k the final wave vector k prime was given by by this and d sigma by d omega is equal to f k k prime square modulus square and you can see this the m by 2 pi h square in f k I have to cancel them in potential I have put as constant term 2 pi h square by m now with this so let me just repeat the last equation and we showed you I showed you for a rigid lattice because for a rigid lattice I will be replacing the p at the v by sum over delta l l prime and k k prime goes to k k minus k prime is equal to q so it goes to sum over l b l e to the power i q dot r l for the rigid lattice it becomes a sum over all those delta functions and the delta function gives you k prime k is equal to because e to the power i k dot r was the incident wave function and the outgoing wave function its complex conjugate was e to the power minus i k prime dot r so these two when I put here it gives me e to the power i q dot r delta r minus r l ultimately this along with the b it this integration becomes sum over l e to the power i q dot r l and v also has this b part so this is what I will do for the scattering amplitude called Goubert so this is what it was and d sigma by d omega is the square of that and v as I defined and k prime v k is 2 pi h square by b l e to the power i q dot r l where q is equal to k minus k prime as I derived for you so now the system is in some initial state which is not just its momentum but the scatterer here I have to consider the distribution of the isotopes and also distribution of the spins why because because one is that nuclear spin and neutron spin whether they're parallel or anti-parallel the value of b changes also it changes from one isotope i to another isotope j they are distributed all over the crystal and we assume that the nuclear spins are g-oriented it's a very reasonable assumption because it's difficult to align all the nuclear spins and so at any instant the nuclear spin can be either parallel or anti-parallel and the isotope is also randomly distributed and is signified by the assumption that isotope is randomly distributed of the sites independent one isotope position is independent of the other except statistically it is just given by the probability once I say that then now imagine your system is in a state lambda sigma spin an isotope and the final is one of the lambda prime sigma prime states so I can do a summation over all possible initial states when I do a squaring of it then what I have actually was I showed you d sigma by d omega was the modulus square of f k k prime so modulus means f k k prime and it's complex conjugate so it comes out like this so now I have to do a summation over the final states over all the initial states I need to take the probability of all the initial states then then you have complex conjugate this and I have to square this whole thing this is my scattering amplitude but you need wavelength you need solid angle I'm sorry you need solid angle in this summation I have summation over lambda prime sigma prime I have a summation over lambda sigma now you see I will just write briefly I have lambda prime sigma prime something lambda sigma sorry okay and then again there will be lambda sigma then then again one more bracket it will come from there and then lambda sigma then ultimately will have lambda sigma so now I can play with this and I'm slightly wrong here I'm sorry one second I have to slightly wrong say some over lambda sigma then here it will be lambda prime sigma prime lambda prime sigma prime then lambda sigma yes now here I have a summation I have a summation over lambda prime sigma prime and I have over the final states so this is a projection operator why let me just explain to you in more details suppose I have a state function psi in quantum mechanics now I want to know what are the components in these states lambda prime sigma prime component of this so I can write it like this this bracket gives me the component of psi along lambda prime sigma prime and this is a complex conjugate of that component of that if I call it the probability amplitude a that this sum over lambda prime sigma prime is nothing but is a summation over all values of a star a which is nothing but the sum of the probabilities over all the final states and that must be equal to one because if I sum all the components of a wave vector along this this is just like if I have a vector in three dimensional space if I sum over the thetas in all directions for that all the direction cosines if I add up that is then it will be cos theta sin theta sin phi and sin theta sin theta cos phi if I square the add them up it will be cos square theta plus sin square theta will be equal to one it is the same thing in the wave vector space and that's why we put lambda prime sigma prime lambda sigma if I have if I consider transition probability to all the final states they will go to one so now I remain within so I have put this probability equal to sum equal to one I showed you why so now I have the scattering cross section per unit solid angle is given by excuse me sum over all the initial states e to the power i q dot rl minus rl prime that came from the potential which is delta r minus rl there are two parts of it there are two dummy variables l and l prime so it comes over sum over l l prime and that is averaging over sigma lambda sigma lambda that means I have to average the value of bl prime bl bl prime star bl over all possible initial states and states of target and neutron so in this case this brings a difference between neutrons and x-rays because scattering cross section here it depends on the spin and the isotope whereas if you let us consider you are looking at diffraction pattern of x-rays from aluminum just as an example aluminum or nickel or type or any other method now aluminum has got a charge cloud which scatters so aluminum has a charge cloud which scatters and has a nucleus in this case in the diffraction experiment my interaction of the neutron is with this one the nucleus and the x-rays they are getting scattered from the charge cloud and you see the charge cloud if I consider a if I consider a lattice of aluminum their same charge cloud everywhere if does not depend on the isotope does not depend on the isotope or spin so that's why in case of x-rays we don't have any averaging process whereas in case of neutrons we do have an averaging process which we will be using to calculate coherent cross section and incoherent cross section I will do the mathematics now but before that let me tell you the cause of this fluctuation is that in case of neutrons first the nuclear spins are not oriented and the neutron spin can be either parallel or anti-parallel to the nuclear spin and then the scattering cross section is different so is the cause of the isotopes the scattering cross section varies from isotope to isotope and you have to take an averaging on that also and that gives me an average scattering cross section and the fluctuation around them before I do the mathematics that is the biggest difference between neutron and x-rays diffraction now let me go ahead and calculate it so as I said that there is an averaging involved between the the initial states for bl bl prime so so here this is the average value so the average value if I take sum over all possible spin orientation as one then is all possible initial states p lambda lambda bl prime star bl lambda so I have to do the averaging over all possible random isotope and nuclear spin distribution so now let me try to write down this average value so now I have this at the l prime side the scattering cross section is bl prime and its complex conjugate is bl bl prime star and this and I am doing an averaging over all the possible in states that which is also have to put the this I'll come to later so now in this averaging let me show you write down this as this is the average value let us say now when l is equal to l prime then these two are same and what I get is that l equal to l prime so both of them are same so for l equal to prime I get b square and I have to average over that average over that when l is not equal to l prime then you have to do the averaging separately because our assumption is that two sites are uncorrelated so far as their isotopes and spins are concerned so I can do the averaging separately two independent values can be averaged independently that's clear mathematics so we have what is known as this is also give me an average value b average star so ultimately I will have b average average and square of that so I have two values when l is not equal to l prime and l equal to l prime and with this I find I get b square average and b average square so now what I can write actually excuse me so the sites are not correlated so the averaging is just separately this thing so now this summation was this averaging was there now let me write it down in an interesting way so I will write equal to these are tronica delta I have written this averaging as b average square plus delta l l prime b square average minus b average square I want to show you what I wrote actually this is equal to b average square b square average when l is not equal to l prime and when l is not equal to l prime it is b average square these two statements I have absorbed in one expression so now you see when l is not equal to l prime this term is zero and I have b average square so that means distinct sites when they come into picture this averaging I have b average square and this part is not there and when l is equal to l prime then this is one so b square average minus b average square these two cancel and I'm left with b square average so there are two parts in this averaging b average square and b square average so now please know that now my scattering cross section is sum over l l prime l l prime b average square when is l is not equal to l prime then I get a term which is b square because l is not equal to l prime so in this summation l is not equal to l prime e to the power i q dot rl minus rl prime so my d sigma by d omega scattering cross section per unit solid angle has two parts when is when l in that summation when l is not equal to l prime I have e to the power i l is not equal to l prime to b average square and another part when l is equal to l prime I have b square because l equal to l prime in this term then it is b square average minus b average square and sum over l equal to l prime so it will just give me n number of that is sides in the crystal now please note that q dot rl minus rl prime so this is the distance between the l and l prime side and this q is the transfer vectors this has got an angle dependence angle dependence and look at this term this does not have any angle dependence because there is no q which is 4 pi by lambda sin theta q is equal to it is magnitude and the direction is dictating what is the value of q dot rl minus rl prime this has angle dependence and this does not have any angle dependence so this is the term b average which dictates diffraction and this term it does not have any angle dependence this adds the background to this thing so now after deriving this now you see so that's what I wrote here so this part is the incoherent part because it does not have any angle dependence and it depends on the fluctuation around the mean b square average minus b average square is the fluctuation around the mean value of the scattering length at the side and the average value of the scattering length at the average over all the isotopes and spins gives me the diffraction term