Hi, I'm Zor. Welcome to Unisor Education. Today's lecture is about energy of Nucleus. And this lecture is part of the course called Physics for Teens, presented in Unisor.com. I do suggest you to watch this lecture from the website Unisor.com. You have to go through Physics for Teens to energy and then there is a nuclear energy chapter in this. Because every lecture on this website has a textual detailed notes, which basically can be used as a textbook. And then, well, it's the course. I mean, on the website, it's the course. It has certain chapters. It has logical connection between different parts, different lectures.  It's not. This is the course, and I do recommend you to take the whole course. Plus, on the same website, you have a prerequisite course called Math for Teens. You know, Math is the mandatory part of the physics course, so I do suggest you to be relatively proficient in Math, in particular, calculus, vector algebra. That's all important. All right, so today we'll talk about nuclear energy, but I would like to start from a couple of previous lectures where we were also talking about energy. They're all related between themselves. We started with mechanical energy, which is energy of the macro objects moving or positioned against each other. That was our first kind of introduction to energy topic. Our next one was related to looking into the macro objects to see what are the smallest parts of any object, which is still maintaining its characteristics, and this is a molecule. A molecule of water is still a water, but anything less than the molecule is already not a water. Whenever we are talking about the molecules inside the macro objects, molecules are moving, and the moving of these molecules is a next type of energy, which we were talking about, the thermal energy or heat. Okay, so let's go even deeper than that. What happens if we will go inside the molecules? Well, molecules contain atoms inside, so basically any kind of a combination of atoms make a molecule. Now, there are only about 100 different atom types, but the number of molecules is tremendous, like thousands or millions. That's different types of substances we are dealing with, and now from all these atoms we can create the molecules. So, something like 100 different types of atoms combined together in different quantities make all the millions of molecules. Now, so what happens with the next level as we are going inside the molecule to the atomic level? Well, there is a chemical energy, that's the next type of energy, which we were talking about. So, as we go deeper inside the objects, the molecules, to the atoms, we are uncovering different types of energy. So, chemical energy is the energy which is related to atomic bonds. So, whenever we are breaking some molecules into individual atoms and combining into other molecules, this is the process which is called chemical reaction, and rearranging the atoms either consumes or releases energy. Now, let's go inside the atoms. This is our last movement towards the depths of the matter, how the matter actually is organized. So, what's inside the atoms? Well, the very simplified and I would say very classical model of atom is that atom contains three kinds of particles. Two heavy ones, proton and neutron, combined together in different quantities make up nucleus of the atom and electrons are orbiting around this nucleus. Now, protons and electrons are electrically charged particles, positive and negative correspondingly. Neutrons are electrically negative. So, this is the model of atom. So, in this simplified model, again model, it's not what's happening in reality. I don't know what's happening in reality, but this is a good model. It allows us to do a lot of different things which basically correspond to our experimental data. So, from only these three types of particles, at least as it was known in the beginning of 20th century, we combine them together into about a hundred different atoms. So, what actually is happening? Well, different number of protons and neutrons make certain nucleus, and then number of electrons in electrically neutral element should be equal to the number of protons, plus and minus, right? So, they are neutral. So, the only difference between all these 100 different types of atoms is the number of protons and neutrons inside the nucleus. And, obviously, electrically neutral number of electrons probably should be equal to number of protons for electrically neutral elements. Now, very similarly to chemical energy related to chemical reaction, which is actually rearranging of atoms into different molecules. Same thing with nuclear energy is related to nuclear reaction. Whenever we are rearranging protons and neutrons which are making some atoms into different atoms. So, again, we can break, for instance, the molecule into individual atoms, regroup them to get another molecule. That's the chemical reaction, and the energy is either released or consumed. Same thing here. We are breaking atoms into individual protons and neutrons, reconfigure, regroup them together into different atom, and as a result, we will get either consumed or released certain amount of energy. So, this is a general hierarchical view of different types of energy, as we are going deeper and deeper inside the matter. So, we have mechanical, we have thermal, we have chemical, and nuclear energy. All right. So, that's a good introduction. Now, next question is, well, we know, and if you don't just believe me, that there is electrical component in the construction of the atoms. I was talking about positively charged protons and negatively charged neutrons, sorry, electrons. Neutrons are neutrally charged. There is no charge inside the neutron. Now, the opposite electrically positive and electrically negative particles, electrically charged, they are attracting each other. So, this is a good question. Similarly charged, like proton and proton or electron and electron repel each other. Well, this is the nature of electricity. We will talk about this whenever we will consider the electricity. But in this particular case, this is just something which is, well, you can say, the law of nature or whatever it is. Now, knowing this, the question arises. What keeps protons and neutrons together in the nucleus if, let's forget about neutrons for a while, but protons are repelling each other. So, why doesn't nucleus just fall apart into different protons and neutrons? Why is it together, like, 50 different neutrons and 48 different protons together? They are forming a nucleus of some element. I don't remember which one. It doesn't matter. Okay. So, there is very important consideration and, well, basically physicists were thinking about this. They knew electricity. They knew that the protons are positively charged and they must repel each other. So, something holds them together. What? Well, the answer is there is yet another force in the nature. Not only gravitational force, not only electromagnetic force. There is also some other force which is called strong force. Now, why is it called strong force? Well, the answer is actually obvious because it should be stronger than electricity because the protons together, if they want to stay inside the nucleus, there must be something which keeps them together. That's what keeps them together, the strong force. So, the strong force is stronger than electrical repelling force and that's why the nucleus actually doesn't fall apart into individual particles. The only thing which is kind of different, well, it's important to put it this way. Strong force acts, if this is the proton and this is the proton, it acts between them. This is the positive and this is the positive. It actually acts on a very, very short distance. If two protons on a bigger distance, the strong force, so it's not really strong enough. So, the strength of the strong force is increasing as we are moving closer and closer and obviously decreasing if we are moving them apart. Now, the law of changing the strength of the strong force is such that on a longer distance it's practically undetectable. But in a short distance, a very short distance, very much comparable to the nucleus size. The strong force is significantly stronger, like a hundred times stronger than the electrical force of repelling from each other. So, to keep the protons together, well, and neutrons as well, because there is a strong force between all of them, to keep the nucleus together, we have to really move all these particles very close together and then the strong force will really catch them up. Because if they are really apart, then the strong force is not really strong enough and the electrical repelling would probably be stronger to force the particles to go into different directions. Alright, so, we have introduced a new concept, a strong force, which keeps the nucleus together, which means that if we want to reorganize the atom, we have to somehow break some strong forces and rearrange them into a different configuration so other strong forces will take hold. So, this is the source of nuclear energy. So, in some cases, if we are doing certain nuclear reaction, the overall energy is released, in some cases it's consumed. It's exactly the same as in the course of chemical reaction. We are either releasing or consuming certain amount of energy, depending on what exactly we are doing. So, let's just think about what exactly can happen in what cases. Let's consider that we have an atom of hydrogen. It has a proton and it has an electron and an orbit. So, this is positive one, this is negative one, and that's why the whole thing is basically electrically neutral. Now, there are different isotopes, if I can say, of hydrogen. This is a regular hydrogen. There is a deuterium of hydrogen, which is a hydrogen of hydrogen, which is a hydrogen which has neutron as well. Now, what happens if we will combine proton and neutron to make an atom of deuterium? Well, think about it this way. There is a strong force between them, right? Let me just give you an example. Let's say we have an object above the Earth and then we dropped it down. What happens? Well, at this position, it has certain potential energy, right? Whenever we drop it down, it hits the ground and it has no more potential energy. So, where is the energy going? Well, the energy will be converted into probably some kind of a thermal energy because we are squeezing the molecules of the ground, so probably they are heating a little bit or something like this. So, the kinetic energy of these pieces of the ground, which we are heating with our object, whatever conversion is, but it happens and the potential energy here is converted into other kinds of energy, which is released. It's like thermal energy or kinetic energy, whatever it is. It's released and our object is on the surface of the Earth anymore. It does not have any potential energy. Now, what happens if our proton and neutron are at certain distance from each other? Well, in this case, there is no electricity among them, right? Because the proton is positive, but neutron is neutral, so there is no electrical force in between. So, the only force is the strong force. Yes, granted, it actually acts in a very small distance, but what does it mean? I mean, whenever the distance is greater, it still acts, but it's weaker. Same thing like the gravity. Gravity on the surface of the Earth is stronger than if we will go up, let's say, 1000 kilometers up from the Earth and the gravity will be smaller, right? Remember, the gravity is actually decreasing with the distance, inversely proportional to the square of the distance between the centers. Here is the same thing. It's just not the square proportional or inverse proportional, but there is definitely some kind of potential energy, because there is an attraction between them. The strong force is the force of attraction. So, there is a potential energy. Now, so what happens if we are making them closer together, if they fall on each other? Well, there is no more potential energy, right? So, where is the energy? Well, whenever we are moving proton and neutron or rather the atom of hydrogen and add the neutron into this so that the neutron and proton will combine together because of the strong force, potential energy which they had before they are together when they are apart must be converted into some other form of energy and released, obviously, the same thing as if I will drop something on the floor, the potential energy is converted into kinetic, thermal, whatever it is. So, here is exactly the same thing. So, some form of energy, thermal energy, electromagnetic, I don't know, whatever it is, it should be released in some way or another, which means that by doing this we can actually release certain energy. So, this is a nuclear reaction combining proton and neutron together to form the atom of deuterium produces certain amount of energy. That's very, very important. There is one more very interesting thing and it's related to theory of relativity which I know we didn't go yet, but everybody knows a beautiful formula which is actually the most famous formula in physics. The energy is equal mass times square of the speed of light. So, energy and mass are always related. If we have certain particles and then we have a nucleus which contains these particles but certain amount of energy has been released, what does it mean? Well, it means that we have lost certain amount of mass as well and the mass of proton plus mass of neutron should be greater than the mass of proton plus neutron. This is called defective mass and it is indeed true. The sum of two masses is greater than the mass of the nucleus of deuterium in this particular case. So, and that's because energy is always related to mass. Since we have released certain amount of energy, used to be potential energy, now we don't have it. So, it's released in some form or another which means we have lost certain amount of mass. Now, let's think about bigger atoms. This is an atom of hydrogen and there are only like two particles inside the nucleus, proton and neutron. What if you have bigger atoms? Well, bigger atoms have more protons and if you would like to combine two different atoms like, for instance, atom which contains 15 protons plus 14 neutrons and combine it with 12 protons and 10 neutrons. If we will combine these two nucleases together, what happens with energy? Well, that's not such a simple answer because don't forget that since there are protons here and here, they are repelling each other. So, it's not so much, you know, it's not as easy as in this particular case to combine them. It's not as clear now because the energy we have to really combine whatever the potential energy these two have when they are apart should actually be somehow compared with repelling energy which is also a potential energy. If two things are together, we are holding them together using something but they still have a potential energy because if we will break the link, break the strong force, then they will just fly apart. That's a potential energy like a spring. The compressed spring has a potential energy. So, in this particular case, if we will combine them into one nucleus, they would have potential energy inside as an electrostatic repulsion. So, it looks like if we have bigger atoms, it's not really obvious whether the potential energy of the strong force when they are apart is bigger or smaller than potential energy of the electrostatic repellent when they are together. So, what's the final equation? What's the final result? Whether energy will be released or consumed depends on comparison between the potential energy of the strong force when they are apart and potential energy of the electrostatic repelling when they are together. So, the calculations show that as we are combining bigger and bigger atoms, in the beginning when we have very few number of protons, the final result will be releasing the energy. But at some moment as we are dealing with greater and greater atoms, it becomes the other way around. Somewhere on the level of iron, the atom of iron, we have this borderline when it's almost the same thing. So, lighter than iron atoms probably will release certain amount of energy and heavier will consume. What it also means that the opposite process, if we will break the nucleus into parts, if we will break the small one, we will have to actually consume certain amount. But if we will break the bigger ones where the electrostatic energy is significant potential energy of repelling and we will break the strong forces so we will let this spring which basically imitates the electrostatic repelling, if we will let that spring to go, that would release. So, the heavy atoms produce energy if we split them. The light elements produce certain amount of energy if we make them from their own parts, particles rather. And these are two very, very important processes in nuclear reaction. This process is fusion when we are fusing together and the process whenever we are breaking the big atom into its pieces. It's called fission. And both are the processes where we can use this energy produced by these reactions. So, whenever we are fusing certain light atoms, we are producing energy and it's used in hydrogen bomb, unfortunately. Now, whenever we are splitting the heavy atoms like plutonium, for instance, we are producing energy which is the fission reaction so this is where the atomic bomb, the first bombs actually were invented and later on we have learned actually how to control this nuclear reaction of fission and we use them in nuclear power plants. Using the fusion to produce electricity in some kind of power plants is kind of questionable right now. I mean, there are experimental processes but it's still experimental. Now, the fission is very much used all over the world. Nuclear power stations are used everywhere. Unfortunately, we had certain disasters. We had Chernobyl disaster and we have in Japan Fukushima disaster. So, probably the work should be done to make it much safer than they are right now. But anyway, the number of nuclear power stations is really very, very large and we can use relatively safely this nuclear energy. There are some other issues with the result of this splitting. It's not so easy. I mean, we will talk about the details, what exactly is fusion and what exactly is fission, what exactly components which are produced when we are making one reaction or another reaction. But as of right now this is an introductory lecture to nuclear power, nuclear reaction, the energy of the nucleus. That's probably sufficient information. So, light atoms can produce energy if we fuse elementary particles or parts of these atoms and the fission is used when we are splitting the heavy atoms like plutonium or uranium or whatever. Okay, so that's it for today. That's kind of an introduction into what nuclear energy is and where it stands in the hierarchy of different energies. I do suggest you to read the textual part. There are some interesting numbers about the strengths of the strong forces relatively to electrostatic ones. It's all on the website Unisor.com in the physics 14 course. So, thanks very much and good luck.


Welcome to another edition of RCE. Again, this is Brock Palin. I have again with me Jeff Squire from Cisco Systems and OpenMPI. Jeff, thanks a lot for your time. Hey Brock, how's it going? Alright, you can always find all of our old shows at RCE-cast.com. Also, you can subscribe from there. There's an RSS feed, link to iTunes, you know, use your favorite podcatcher to check anything out you want to look at. Today, though, we have a guest. A guest from an organization has been on here before, and he's going to be talking about some Python stuff. So Stan, why don't you take a moment to introduce yourself? Hi, I'm Stan Siebert. I'm a software developer at Continuum Analytics, and I work on the the Numba team. Although my previous career, I was a particle physicist working on Neutrino and Dark Matter experiments, but I was also a big Python and GPU computing advocate, which sort of led me back into a software engineering. So, you mentioned that when we're talking about Numba. Can you give us a quick overview of what is Numba? Yeah, so Numba is basically a Python compiler. It's designed to compile Python functions, so you may be familiar with other Python projects that take your entire program and try and optimize them in some way. Numba is a little more specific, and we'll let you take a particular function and say, I'd like this function to go faster because I'm only going to use it with certain data types. I'm only going to pass in arrays of floats or that sort of thing. And then what Numba can do is analyze the function, take this extra information you've given it, and generate machine code that does just the thing you want very quickly. At a higher level, Numba is really its goal is to try and help you in your Python programming, if you get to a point where your Python is not fast enough and you need some kind of sort of smooth way to speed it up, we want you to be able to keep working in Python and not have to switch languages out to C++ or Fortran, or do other switch Python interpreters entirely. We're trying to give you a smooth ramp from your initial prototype to a faster version of your program. So how did the Numba project get started? So actually, Numba was originally started by Travis Oliphant, who you've had on the show previously. One of the main founders of NumPy was actually trying to find a way to write specialized functions for NumPy. He was trying to do some element-wise calculations, and he wanted to generate functions that were as fast as a compiled language. And so he actually went and discovered that there was some old Python bindings to LLVM, which is a fairly standard compiler toolkit. He resurrected those LLVM bindings and then started building NumPy, which was sort of designed for a very narrow thing, but then he started hiring more people to help him expand it into a general Python compiler framework. Okay, so are you doing code translation, you're turning it into C and then sending it to a normal compiler, or what exactly is going on here? So what's actually going on is it's a runtime compiler, so it's not like GCC or something where you run it to compile your program. When your program starts up at either the point where you define the function or you could decide manually later to take the Python bytecode, and then it translates it into the LLVM intermediate representation, the LLVM IR, and that is fed into LLVM, which is another project that does all of the generation of machine code and everything. So we never pass through C or anything else. LLVM kind of looks like a high level assembly language. So in a sense, NumPy is acting as a front end and LLVM is acting as the back end of a compiler tool chain that you can run in the middle of your program. So LLVM is probably best known as part of clang. It's not normally known as a runtime compiler, so how slow or fast is this the first time you hit something? It's not too bad. Again, because NUMBA lets you target specific functions, you don't have to compile a whole lot of code often to make your program run faster. You can identify a couple of critical functions, target those directly, and then you can be generating this code in less than a second for a reasonable size function. And then that overheads only really when you start up, and then for the rest of your program, of course, you are just directly running the function you already compiled. All right, so how did you pick LLVM? Because like Brock said, this is not what it's typically used for, although LLVM has been used for more and more interesting things over time. Like you said, mostly known for clang, but has been used in some other offshoot projects. And do you work with some language people who kind of suggested that, or where did this all come from? LLVM, I think, became a really easy choice early on, because it's a very modular system. It's really a toolkit for building compilers. And that's what we wanted to do. And we didn't want to have to figure out all of the optimization passes in the whole back end. In some ways, LLVM proceeded clang. And so LLVM was being used for a lot of academic compiler research, but has now become, with a lot of commercial support, is being used for clang, obviously. A lot of other companies have adopted NVIDIA. NVIDIA's compiler tool chain for their GPUs now uses LLVM and AMD is using it, and a lot of other places have picked it up. So actually, one of the advantages to NUMBA using LLVM is now we get access to all of those other architectures. NUMBA can compile code for the GPU, which is, I think, one of a huge point about NUMBA that separates it from similar projects, is we can target both the CPU and the GPU, thanks to using LLVM. Actually, let's dive down on that point there, because that's an interesting little bit there. And I am fairly ignorant of GPU stuff, so forgive me if I ask something really silly. But targeting the GPU is one thing, but then you also have to add additional stuff to move the memory back and forth and handle the registration and things like that. So do you have additional code in NUMBA that handles that kind of logic when your target is a GPU? Yeah, so when we add a new target to NUMBA, we include both some driver-level stuff that lets you manage the device, open up a connection, move data to it. In some cases, NUMBA will move the data for you. You often, as a first pass, don't have to worry about that yourself. We'll copy it over and then copy it back. Sometimes you want to control when those copies happen, and so you'll use the device API basically to say, OK, now I want you to copy it, and then I'm going to wait to bring it back until I'm done with my whole calculation. But that's sort of a little bit of infrastructure around the core LLVM piece, which is shared quite a bit between the CPU and GPU targets. A lot of that is a similar code, thanks to the LLVM abstractions. So what if I wanted to, instead of using it as a just-in-time compiler, actually kind of say I know I'm going to run something many, many times. Can I kind of save that compiled state? Yeah, so we have a tool. I would say it's not quite ready for primetime, but we have been working on called PyCC, which is jobs to do exactly what you're describing, and it's certainly on our roadmap to flesh that out so that you can take a file of Python code and say, I want to compile this to a compiled module that I can load into Python later and just call and not have the compiler overhead. But right now, pretty much the most of the use cases for Numba have to be runtime compilation, which, as I said, for a lot of projects you just don't notice. There's enough other stuff going on. You're not compiling your whole program, but certainly we want to support libraries of standard functions that people write and want to just reuse over and over. Now, you said earlier that it took the Python bytecode. Which is it, or does it do both? Can you take both just scripts and parse the ASCII or maybe the Python interpreter does that for you, or do you only read Python bytecode? So we read the bytecode because at runtime, once you've read that the ASCII function basically in, the Python interpreter converts it to bytecode immediately. And so at runtime, the thing we have access to is that bytecode. People have done code generation where you generate a Python string, and then you ask Python to convert that to some bytecode and then you can hand that off to Numba. But we don't want to re-implement a Python parser, but that's already built into the interpreter for us, so we don't have to do that. Gotcha. Now, when, again, here's some ignorance of Python itself. When Python generates the bytecode, regardless of whether it's in the separate compile step or at runtime, does it do anything like what LLVM does itself or is it pretty much just a straight translation? It's a pretty simple translation. The bytecode is all of the different constructs you have in the function get turned into a sequence of bytecodes. The bytecode is really just there as an interpreter convenience, that it's easier to write a fast interpreter that deals with bytecode as opposed to a more high-level construct. And since that bytecode is what's really sitting in memory when you load a Python function, that's where we start from. So what about Python kind of keeps an address to... I'm thinking about data structures and kind of moving from the Python world to handing it off to this LLVM world where this compile thing is actually running. How much effort is involved there? Does the user have to be aware of any of this? I think the users who get the biggest benefit from Numba right now are users who are already accustomed to using NumPy, and NumPy being a standard array package for Python that has become the bedrock infrastructure of really most scientific computing in Python. NumPy already stores your data in a nice efficient machine representation. It's the same way you would store it in C or Fortran just with a little extra metadata about how the arrays laid out. So if you're using those kind of arrays already, which you probably are if you're doing some kind of scientific computing, we can directly use those arrays right in Numba. There's no need to translate anything. We just know how to reach into a NumPy array and get pointers to the data bits we need to use. So that makes it pretty easy if you're already starting from NumPy arrays, which you probably are if you're doing some kind of major calculation. So that leads into my next thing actually really nicely though. So can I use NumPy on any code or does it kind of have to really only work well if I'm using NumPy arrays? So there's a couple of different levels there. Our goal is to make it so that it will at least work on any code. You may not see a significant benefit on some code, but we don't want it to ever do the wrong thing or just fail. For example, it is possible if you're writing a function. I mean, as I mentioned earlier about type specialization, one of the key bits of Numba is in order to generate fast code, it has to know that you're only going to use a specific set of data types with the function. You might have a function where we can't do that inference because you could be calling out to plotting libraries and all kinds of things and have arbitrary Python objects floating around, but if in the middle of that function there's a loop over some fixed data type like you have a NumPy array that you're looping over, we can actually extract that bit, lift it out and compile that to fast code while the rest of the function is in some way still in the slow path. So there's the slow sort of Python object mode, which is at least the same as Python but not really much faster, and then there's the faster native representation mode where we try all of the language constructs, we try to make them as fast as we can, but there are of course certain limits. If we can't figure out what the Python code would do or it's something we don't support yet, you'll actually just get an error back that says we can't compile this. So this is going to show my ignorance of another package here a little bit, but you just mentioned that stuff, so the JIT that comes with R by default only does loops, things like that. So is that kind of like the focus? Is your focus in on where you're kind of iterating over stuff and can you tell to only do that? I would say in number, loops are the focus because from a practical perspective that's where you're going to get the most win. We can take a large range of functions and turn them into efficient machine code, but if the function doesn't run for more than a microsecond, making it faster probably doesn't help. It's usually the core bit of your code is something you're going to do a million times and that's often in a loop, and so loops become practically the right place to focus, but we don't restrict the compiler to just loops. Now that being said, when you detect a loop in the bytecode and you give it to LLVM, you're just relying on LLVM to do whatever it's going to do to optimize that loop, like unroll it or whatever it does. I don't remember my compiler's class very well, right? You're not trying to precondition things. You're just identifying good spots and giving it to LLVM. That's mostly true. We do have to do a little bit of work to make sure that we're preserving the Python semantics. We want to make sure that that loop behaves the way it does in Python, but for the most part it is a pretty direct translation to turn that loop into something. LLVM is fairly low level, so it ends up looking kind of like assembler, in some respects with jumps and all sorts of things floating around in there. Then yes, and we rely very heavily on LLVM's optimization passes, which have been written by compiler experts who are great at this stuff to do things like unrolling or generating SIMD instructions to be able to auto take advantage of the nice vector hardware in CPUs. We can get the advantage of that too in Numba. Okay, and let me jump back just a little bit too. You've mentioned a couple of times that there is restriction on the types that you will try to optimize in things like that. Why is that? Really, performance optimization. Once you've gotten your program so that it's not doing useless work, to get more performance really is about specialization. It's about saying, although in Python being a very dynamic language, you can send in a basic Python function, you can send any object in that as long as it implements all the methods that are going to get called on it, the duck typing approach basically, it'll work. That's more general than most people's code is actually in practice. In order to specialize the function to generate machine code as efficient as Fortran, we have to tell Numba that you are going to in some ways limit yourself to just a few types. You can decide what those types are and you can have more than one. You can say, I'm going to have this function work for double precision and single precision and all of those things, but you're not going to be able to use this function with some type someone else made up without recompiling it. That's really what it is. The specialization is how you get the speed. Okay, so if I had to... Oh, I'm sorry. If I had to crassly classify the types of speed ups that you're getting, it's number one, because you're taking it away from byte code and turning it into native code, and two, you're further optimizing that native code. And when I say you, I mean LLVM is doing the bulk of this work here, but it's really two things, turning it into native and then optimizing that native code such as loop unrolling, SIMD, blah, blah, blah. Is that an accurate characterization? Yeah, I think that's pretty close. The translation, the turning it into LLVM is where we use our type knowledge to say, oh, if you're working on these types, I can generate LLVM that only does the thing I need, and then once I've generated that LLVM, the optimizer in LLVM can do a whole lot more work for us. Do you do a first pass? Sometimes when you run a compiler, you just say, I could vectorize this, but it's too short, so I'm not going to bother doing it. Do you do anything like that? We don't really have to. We let LLVM make a lot of those optimizations. It's got pretty good optimization passes to be able to generate multiple code paths if it needs to to handle long and short arrays, that sort of thing. What would be some good rules of thumb? If I'm a scientific programmer and I'm getting into this whole scientific computing with Python world, what are some ways that I can write my code quote-unquote well that would work well with both numpy and numba and things like that? I would say step one is to absolutely make sure you're using numpy. That right there will maybe speed up your code enough that you don't even need numba, but I would say it's a prerequisite to being able to make good use of numpy. So start with numpy, get familiar with it, make good use of it. Second thing is to get familiar with profiling tool.  Because numba doesn't take your whole program, you want to tell it to focus on a specific function. You need to know what the functions are. I am personally always surprised when I see what the actual bottleneck is in a program. So you want to start with that profiler. The profiler will probably identify a couple of functions that do a lot of work on arrays. Certainly if you have anywhere where there's... Numpy does a lot of stuff, but sometimes you end up having to fall back to writing a manual for loop. That's exactly the place where numba is going to help you a bunch is to take that for loop and to turn it into machine code. So just out of curiosity, you mentioned that if you use numpy itself, that might be enough to give you enough acceleration that you don't need to use numba. What would be an example of something that does need the acceleration of numba? That numpy is not enough? Yeah, so if you start with numpy, that's often good enough. But where numpy can fall down is if you have a complex expression with arrays where numpy has to make a bunch of intermediate arrays to store partial results. If you're adding a to b and then multiplying by c, it has to make one intermediate array in the middle of that calculation. Whereas a numba version of that function doesn't necessarily need to do that. That's the point where switching up from numpy to numba can be a big performance way to save on memory allocation that can eat up a lot of time. Okay, so how much time are we actually talking about here? Like what's kind of speed ups are you kind of seeing when people use numba in these cases? So if you're starting with a pretty solid numpy program, we're talking a factor of a few, depending on the complexity of your expressions. If you've gotten to a point where your algorithm requires that you iterate over a numpy array individually, because there's just not a numpy function to do the operation you need to do and you have to do it loop over every element, that could be a factor of 100. So that's why I say if you find yourself having to do element-wise operations on numpy arrays, numba will be huge for you. If you're already getting good use out of numpy, numba may still help you by a factor of a few, depending on precisely what you're doing. So I want to quickly touch on something. You said first you got to figure out those hot spots and you got to run it through a profiler. What profiler do you normally use when you're looking at applications to figure this out? I usually use the C profiler in Python. It's just a module called C Profile. It's a function profiler, so it'll tell you which functions you spend the most time in. That's a, since numba is a function optimizer, you want to look at the function level. I've also used something called KernProf, which is a line profiler. It'll actually look through and assign times to all the lines in a file, which is nice if you have a longer function and you want to know which pieces. Those are often candidates to pull out into a function that you then hand over to numba. Okay, so let's say I've gone through and I've done that and I found a couple of hot spots in my application. What do I need to do to say, hey, numba, lift this part out and compile it and things? So if you already have, it's pretty low level. We're working on adding higher level constructs to it to be able to help you in other cases. But at a very low level, if your function already has a for loop in it, the minimum thing you have to do is add a Python decorator. You can import from numba, a jit decorator that you put above the function. And when you do that, numba will, the first time you call that function, look at the data types that you pass in and compile it for those data types. There are sort of more advanced versions of the time, no, really, I'm just going to use these data types, compile it when my program loads. Don't wait till the first call. That's the very base level. You may find that that's not enough. You may then have to go in, or if you have a function that's doing array operations that we can't directly accelerate, you may have to unpack those array operations into the set of for loops that would manually loop over the data in the order that you want and do the calculation. So there's sort of two stages. One is to just try reusing the jit decorator and then two, you may reorganize the function a little bit to make it more obvious to numba what you're trying to do. Okay, so you mentioned that decorator, so I assume that's part of numba. What exactly do I have to change in my Python to say this function or this loop I want numba to work on? Yeah, so what you do is you, at a very minimum, you import the numba package and it includes a Python decorator called jit, j-i-t, that you can just put above your function that you want accelerated. And what that will do is the first time the function is called, it will inspect the data types of what you called it with and then optimize it for those data types. It's sort of an automatic jit. There are more advanced uses where you can say ahead of time, these are the types I'm going to pass in, compile it when the module loads, don't wait for the first call. Beyond that, you may find that the initial jitted version of your function is not quite fast enough and you actually unpack. You may be using some numpy operations directly that you have to unpack into some for loops at this point. We're working on fixing that and do the looping manually with the right sort of calculation and storing data where you need to store it. So that you may have to rewrite your function a little bit, but the first step is really just to hand it to the jit and see what happens. Is there, is it ever going to be easy enough that a number would just kind of figure it out if I import the number package and I don't decorate my code anywhere, it's just going to say, oh, here's a loop. You seem to only be passing these data types. I can, I can work with that. I don't know. I mean, it may be really long term. I think that often that's not very helpful because most of the time you would spend compiling would not be useful because you're not going to call all the functions in your code a whole bunch. So it's certainly this, I mean, one of the things that Numba is doing differently than a lot of other tools is what you're kind of thinking of as a tracing jit. It's very common like in your web browser where the runtime inspects the code as it's running and sees where the hotspots are and then calls the jit on your behalf. I can imagine Numba actually being part of a bigger tool like that, but it would require instrumenting the interpreter to be able to inspect what's going on at runtime. So I can see Numba being a component of that kind of a bigger package. Do you ever see like functionality in Numba just being into Python interpreter? It would be nice. I think Python is undergoing kind of I mean, if you look at the space, there are so many compiler jit kind of related projects. I think we're undergoing in some ways kind of the transition that JavaScript did in the browser speed wars where people are saying, you know, just because it's a dynamic language doesn't mean it has to be slow. And so I think we're currently in the stage of exploring the space in a bunch of different ways. And I think as it becomes clear what's successful and what's not, things may settle down and we may see things moving into the standard interpreter. Okay, so looking at this from that perspective that this is an exploration and research and things like that, what is some negative knowledge that you've learned? What are things that you have learned that don't work or either, you know, in the lab where you get feedback from people saying, hey, you did this feature and it's really not working out the way that I want it to. I mean, it's hard to accelerate. I mean, we focused very heavily on array related work because that's very common in scientific computing and it's also a lot of low hanging fruit. There's a huge huge speed ups potentially for array work. A lot of cases where you have in some ways more individual object manipulation and that sort of thing, those can be harder to accelerate in something like Numbo where it focuses on functions where you have control spread among many different functions each doing a little piece of the calculation. It can be hard to pull all that together in something architected like Numbo to speed it up. There are other JIT approaches like things you see in PyPy and that sort of thing can work. What is PyPy? Oh, sorry, PyPy is a completely, is a Python interpreter that incorporates a JIT inside of it for your whole program. So the PyPy is trying to solve similar problems to Numbo but does it in a very different way. Numbo is designed very consciously to live inside of the standard Python interpreter so that it can use all of the standard extension modules and things that you have already available to you in the standard Python interpreter. We don't want to replace the entire interpreter in Numbo. So Numbo, I only heard about it recently from a Python conference and would you call it production ready? Is it something that's safe to use today? It's not going to write your code into anything that does not give you the expected result? I'd say it's ready definitely for I'd say advanced users, early adopter types. Some people are using it in production and I think that's the kind of thing you have to evaluate case by case. The fundamentals are pretty solid. Where we run into trouble with people is that there's a lot of the Python language out there. It's a very flexible language and so not all things can be handled by Numbo. We'll tell you we'll generate an error and say sorry we can't compile that and so what I tell people is really they need to try it out and one thing I want to emphasize is actually we love hearing about people's use cases. There's so much of this space to cover to do something first and so when people get on the Numbo users mailing list and let us know what they're doing that really influences our decisions about what to work on. You've been using the word we a lot. Who's involved in Numbo? Numbo has a number of developers here at Continuum Analytics. The lead developer is Sue Kwan-Lam. We also have Jay Bork, Oscar Vielas and Antoine Petraux who's actually one of the core Python developers working with us this summer to help us expand Numbo's capabilities and be able to get more more Python working in it. We don't have a whole lot of external developers and that's something we're actually focusing on this summer is improving our developer documentation to help people outside of the organization understand the innards of Numbo and understand how they can contribute and add functionality to it. Now just out of curiosity I asked this to a lot of based types of projects and it is purely a curiosity question but I'm always fascinated by what version control system do you use and why? We use Git and honestly I think most people's answer to that is because of Git Hub. I'm you know I probably will get yelled at for this but I personally don't like Git. It just never has fit in my brain properly. I'm a big Mercurial fan but Git Hub in some ways is the killer app for Git and so you want to have access to developers and make your code easy to get to. Git Hub is a great way to do it. So what's coming into future for Numbo? What's the upcoming features and things you got coming? Our big push as we solidify this low level compiler base is to be able to ask the question what higher level constructs would help people write faster Python especially in the scientific and data analytics world. So one thing we have been prototyping and working with is what we're calling a deferred array object. It's basically something that looks just like a NumPy array but it doesn't do the calculation as you work with it. Part of the problem that NumPy has is every time you do an operation it has to give you back the answer immediately even if you're just going to take that and feed that into another calculation. So the deferred array object waits until you get to the end, looks at the whole operation you did and then asks LLVM to optimize that and then does the calculation. And we think that that will help people write array code, a code that looks like you would write with NumPy or Matlab or that sort of thing so it's nice and concise but has all of these compiler benefits and generate stuff that really is as fast as Fortran. That's a big feature on the horizon. We want this Numbo array to work equally well on the CPU and the GPU because we have the compiler infrastructure to target both of those. We want this, which we think will be huge is that you can then take this and say okay now that I've got this working I happen to be sitting in a computer with an NVIDIA GPU I can just flip this and say okay now target the GPU and my same code should just work on the GPU. So one thing we forgot to ask before is actually what accelerators are you currently targeting? So aside from the CPU backend we have a pretty well established one for CUDA so that's NVIDIA's GPU programming environment basically. We have in progress one for OpenCL so that would be needed if you want to target an AMD GPU and that's pretty much what we've got cooking right now. The CUDA one is definitely, you know, as production ready as the rest of Numba is the OpenCL one is very experimental but we're certainly open to other adding more. I think OpenCL and CUDA cover the majority of stuff out there. Things like Xeon5 would be fantastic. We don't have the resources right now to do that but we would be very open to doing that kind of thing. Okay and finally what's the license on Numba? So Numba is BSD licensed. It's the much like much of the Python world. So it's open source. It's pretty permissive. There is, you may run into a product called Numba Pro. That is a closed source sort of enhancement for Numba. The Numba core is open source and will continue to be open source. There are some value add stuff that we put on there that we sell to some customers. The core and actually fairly recently we were excited to be able to take the GPU part which was originally proprietary and move it into the open source half of Numba and so that's something we would like to do more of in the future as well. Quick question. Is Numba part of the commercial version of Anaconda? The Numba Pro? Yeah although I mean Numba Pro is separately licensed I believe. I don't know the details of whether or not if you buy the commercial Anaconda support or what that comes with. The Anaconda distribution itself is free. Okay well that's everything so Stan thank you very much for your time. Cool thanks. It's great to talk to you guys.


The National Return to Work Strategy aims to make better use of data and research to drive continual improvement. We have a lot of evidence available to us now that tells us where we can better support workers with work-related injury or illness. But there are opportunities to know more, share more and do more. Over the life of the strategy we will build on our data, increase our knowledge and learn from the actions we take so we can continue to make a difference. To get involved, download a copy of the National Return to Work Strategy at safeworkaustralia.gov.au


So, thank you very much, Ian, and excuse me, but in this case I will read the text that I prepared just to be in time. And I tried to introduce the session and what we thought about it, what we thought to discuss and to do. You already read the abstract of the session and we will read it very, very shortly. Reading from a fast that is throughout history that we run and see what we did while we were given, society and their relations that require somehow also to be presented in a less direct and straight way than normally with the thought image of the Mediterranean. And communications was globally enhanced as soon as possible and the entire community developed networks with each other in foreign hubs or hubs. This was crucial for lips in the relation of the university, cultures getting in contact with other white businesses in different areas of the structures coming to have relations. The first intervention of age emerged when we were digging in the lead from the age period in which people would intensely move their ideas, technology, and objects to spread. Through time, the Mediterranean sea acted either on a barrier or a facility or exchanges, conduct, complete power, new warriors were continuing to trade at some height. First up, and there is the recent idea of pirates and other things going around. The traditional excitement was experienced over a constant communication processes asked for a weather for proper analysis as communication was never and even in the beginning. Local communities made decisions as to which war and objects adopted that or reject and how to react to good activity. Bordering regions were also proximate sites, sometimes showed drastically different levels of non-business contact. This agency and decision should be dependent on a variety of period processes of innovation and connectedness. Reflecting the normal situation within a shared seascape, how can we explain the activity? The aim of the session is always to measure acceptance of and resistance to outside influences within Mediterranean coastal settlement and their immediate hinterments. With an open time frame, but most of the communication has to do with the name from the age. So, we have obviously problems of sampling of the approach to a record. In phases in which they are not even distributed or known, and our knowledge is dependent on, say, their sampling problems. We face difficulties in understanding whether specific parts of a manifestation of use in a population because of tasks dependent upon the archaeological record itself. Or because it is the effective reflection of specific behavior and notion of communication. Communication may be contact, but not diffusing. This fact is pointed out by some extraordinary monuments, such as the impressive start of Altar and Montevideo in Sardinia, which could be a reflection of fireway easterly grabbing attacks, but may as well be the result of local processes without any particular complex monument. Then, as archaeologists, we may refer generally on to pottery. This is not strictly made in rena, because I will show you something about northern Italy. But as soon as the record seems safe enough, the distribution of raw materials and objects, their technology and shape or typology, have been seen as one of the most immediate markers for communication of all the intellectual specific contacts. In the typical case of Pots, such a widespread product of great and poor Islamic societies, underlying the fact is more or less explicitly the idea that emerges continuously that Pots are somehow people or that Pots bring messages from people to people. In Italy, we find there is somehow relevant situation in the connections, for instance, between southern and northern Italy during the Middle Middle Ages, when Pots related to the celibate productions of southern and central Italy were found in two specific areas of northern Italy, that is, Emilia and Algevala in 13. Apparently reflecting specific communication. They show formal affinities, but seem to have been normally produced, and therefore should not correspond to the trade of their contact. The directional contact could be connected to a movement of female persons across wide spaces, apparently associated to these Pots in the tombs of northern Italy, or to the presence of shared costumes or weakness. Anyway, the communication seems oriented in a directional way, excluding other communities present nearby. And that when we come to the Mediterranean, and to situations like during the late Bronze Age, in one of the most intense phases of communication, through the Mediterranean, the mass of data available brings consistency to the existence of differences in communication, even between close by sides. The presence of specific spots, with abundance of Mycenaean pottery, are the easiest way to describe the types of contacts, both commercial ones involving the possibility of exchange of Pots as goods and as by-product of exchange, that these containers for their traded content, or they may be, sorry, by-products of exchange, that these containers for their traded content, or they may be also collateral events of exchange, sorry, collateral events of exchange being left or gifted in order to support and facilitate trade. And more complex fact that culturally very interesting is the local production of Pots. Sorry. I wanted to go back. I'll go back. The local production, and more complex cultural interest, in fact, is the local production of Pots, typical of the other end of the Mediterranean. The interpretation of these behaviors more often the transfer of population remaining stuck to their edits or their adherence of the cultural group to the system of beliefs of the other. The first case that we invoke, is that people moving and remaining attached to their original cultural behavior for the handmade burnished ware or burnished ware in the G.N. and Eastern Mediterranean as a transfer of people from Italy or the Balkans to Greece and Crete. But it is probably assumed also for the local production of Sardinia shapes of pottery in Sicily in the single side of the continent. The second case, that is the adoption of an external tradition, is generally invoked for the start of the local production of Italomycinian pottery in southern Italy and in Sardinia mainly, but also in Tessaly, like at the Castanas and near Cessaloniki. Even if some authors have also suggested that this could reflect instead of relations from the G.N. to a marginal part of the G.N. world as part of the late Elabic third sea turmoil. The differences in interpretation reside in the quality assumed for the pottery very often, where it is a beautiful and cultural impressive manifestation it is easier to find proposals assuming a writing force from the supposed to superior tradition on to the less sophisticated. But it is also a factor of spread and the incoming tradition derived from another Catholic shows a more even distribution into the landscape being documented in a multiplicity of sites and likely assumed by multiplicity of people it is seen as an acculturation fact more than as a massive income of population. Therefore an even communication would be mediated by specific transition information whose most relevant and pervasive aspect would be the transfer of information to the worlds that is equal. Social factors driving communication the crucial point is that communication far from being a factor of expanding as a wildfire is instead more often nucleated and transferred through the social power. There are social factors of contact and border that negate communication. The existence of directional communication is the mechanism here in every narrative about movement and contact such as in the Odyssey by Homer which is a clear case for uneven communication. The opposing factors of alliance and contrast direct the consolidation of such contacts and the definition of borders or may do with constructing both bottom up and being also directed at the top bottom. The top bottom consolidation is typical of hierarchy social systems for instance with vertical chain structures driving relations through leaders acting as a different nurse and linking through peer-poly interaction. The bottom-up relation can act fairly well in a scarcely hierarchical structure as a fracture in the traditional system mainly in open social environments. A trial will ribbon some children societies with experience white bodies acting a corporate way and possibly open to contact and communication in contrast with other groups inside the society. Anyway, this question is much, much complex and we need more details and I hope that these can come also from the communication that we will have even in this state. So, what I wanted to remark is that also other models have been involved. One of the models that has been for instance involved by Annalia this is theory for that I will return to this in my communication project folding communication apparently during Lake Aladdin 3C with CC and the Oregon Islands which were instead before had an area of very intense communication with the EGM has been seen as a model of reaction and rejection for an in a traditional cultural historical frame of interpretation she's so direct she'll not contact between by saying and promoting politics inserting in the militant hubs political centers of Sicily as forward by consolidation of this policy with strong nationalization and then crisis and cultural political and the population of foundation that learned in the end of the day fracture of communication. So, these kind of processes are just some of the examples that I can see in terms of what we can really go on discussing today what I want to remark just to end is that communication hints at the existence for me, at least in videos or for Ian that we should see in the discussion of specific groups which are involved in communication and of socially defined groups furthermore the idea that communication is a widespread and homogeneous factor is more often than not an illusion and one should seek in any case for the socially relevant groups that stay behind the apparent communication the ways contact is spread may have plenty of things to say in terms of the complexity of the societies involved within that through this idea of how communication is spread and managed and organized and defined by the contact between groups we can really understand something about the complexity and the structure of the society more open and open up or closed and stop open or what else So, this was my maybe a little bit confused the interaction but I hope that can help you to understand what we did mean when we spoke about uneven communication that is we have not to assume as a general fact that communication is like a wildfire spreading all around a single point of contact So, please


Hi, this is Nonviolent Peace Force here today in West Darfur, in the locality of Kerenik. We're in a nomads community about 9km away from the town of Kerenik called Rusi. And Kerenik is a town that a couple of months ago was attacked, it's the 5th time since 2021 that it was attacked. And about 200 people were killed, many homes were destroyed and many people were displaced was the largest town in West Darfur called El Janina. In July of this year, Nonviolent Peace Force conducted its first outreach mission to Kerenik locality. The team visited Kerenik town itself, the site of the attack, as well as three nomadic Arab villages in the surrounding areas. The NP team engaged with community members, community leaders, government authorities and humanitarian actors. Yeah, going to Kerenik West Darfur was not an easy ride. Reach out for each isolated community, the trust is important. And during the training in Galala, we were able to earn the trust. How did we do that? I would say it's all about human interactions. Working with the community, sharing a meal, tea, coffee, listening to their stories without judgment make the difference. Even during the workshop, our team enhanced the relationship with the community, including the community leaders. I am sure community felt that effort of nonviolent peace force to protect the community. So Galala community in Kerenik locality welcome us and protect us. I feel that human relationship is magical. So we deeply believe that relationship building is key to access the community. NP, using its nonpartisan approach, recognized the importance of working with all members of the community. Rather than target just the displaced non-nomadic communities, as has been common in the humanitarian system in recent years, NP has chosen to devote equal attention to both sedentary and nomadic peoples. In fact, it was a good meeting and they immediately introduced us to the community and introduced us to the community. After that, they agreed and they worked together. So all the community at the time knew that NP is what NP is and what it does and what it offers. Indeed, the previous material is the building of peace, or it is the power of peace. It was really the most pleasant of many of the visitors because now people are in a need to move from the stage of war to peace and this requires institutions to address the issue that people need such as the building of peace or the process of transformation from war to peace and indeed the response of people and the process of transformation to peace. Since this first mission, NP has now established firm enough contacts that the team can feel safe moving between villages, moving between nomad and sedentary villages, using our relationships as our means of security. The team has been travelling regularly to Karenek, building relationships, gathering protection concerns and devising strategies to seek to address some of the protection concerns that communities are raising. The Karenek region has witnessed the events in the last period and after the events, people's lives changed from the life of the year to the life of the war, from the life of security to the life of security and indeed there were difficulties in the face of the citizens here from all the sides, the market was closed and the roads were full of security threats because of the security challenges in the neighborhood and indeed they were trying to be more secure in the national security system and also there were some cases such as the NP, the work of the NP because of the fact that the second conflict between the community happened and indeed the NP was the cause of this problem and indeed now there has been a connection between the Karenek communities and now there is a gap and security concerns and all the things are good. There are a lot of challenges for the human work in Darfur, especially in the west of Darfur. The society is expected to provide financial support, distribution and distribution, as well as protection and other support, but the MBI is completely different from what people expected. It provides self-sacrifice, so that people don't need to be supported. If the peace is achieved, there will be no visitors, there will be no refugees, there will be no guards, and there will be no protection. So the MBI is a targeted program and we hope that the organizations will continue to support the society. What the reflection of what they told us is that the access to the nomad communities has not been happening by the other humanitarian who are working in a humanitarian field. But NP makes it to have access very simple because they say the approach that NP is giving them is really catchable.  It is reflecting their normal life. It's not about the luxury, it is about how they examine it. How they examine those tools. So the NP protection tools are completely different and they told us, this means NP, if NP enter any place, it will make...


Welcome to JSA TV the newsroom for tech and telecom professionals. I'm Jamie Scado-Cutaya of JSA and here at the Chorus Communications Lounge at Channel Partners Evolution. Joining me here is Mr. Danny Boushadeed. He's the CEO of KoloTrack. Danny, welcome to JSA TV. Thank you, Jamie. Thanks for having us on here. Oh, it's our pleasure. And I'll tell you, you have a wonderful website. I was really intrigued by your unique offering to the community here. And to say again, we're here at Channel Partners Evolution and there's certainly a buzz about your new powerful and free, shall we say, tool called DCI Track. Tell us more. Sure. Yeah, we're very excited about this. This is a long time into making. We've been developing the software for nearly three years in house. We didn't want to just go out into the marketplace and plug some applet on top of a Salesforce platform. So we own all the source code, which I'll get into how powerful that is to actually have that capability.  And in fact, we can do a lot with it, which we'll get into later in terms of integrations. It's very robust and it basically allows Channel Partners to research, compare, and source data center for structure services. So that includes co-location, managed hosting, connectivity, cybersecurity services from over 400 providers worldwide. And it allows them to build a comprehensive RFP on behalf of their clients up to there's over 500 data points that they can actually build into this RFP and then put it out to bid and all of our contractual vendors that we have direct agreements with worldwide will start bidding for their clients business. It's really powerful. Brilliant. And so tell us a little bit more about the reach of DCI Track. How many service providers, COLO, cloud providers do you have loaded in? Absolutely. So in total right now and it's still growing, we keep signing up new vendor, strategic vendors where it makes sense. We have 423 direct agreements with vendors worldwide that cover the whole gamut of data center infrastructure. So that includes wholesale co-location, retail co-location. 200 of those providers provide cloud, any kind of virtualized data center for structure that's all built in. And then as of the last 18 months, we've been building an ecosystem within there of cybersecurity vendors. And we've got 26 and growing. So that covers every aspect of an organization's cybersecurity requirements. And our Channel Partners, I'm sure, are being constantly asked by their clients about security services these days while they can come into DCI Track and build a cybersecurity RFP. And that specific tool we want an award for at the Channel Partners show just this past Vegas for best in show, for best new product. And I feel like your ecosystem there in DCI Track really follows the trends of the industry that we're seeing globally. Obviously, cloud security, but really the key players that make it such a pertinent ecosystem community for going forward. And then the technology that was really interesting to me when I was on your site was about the intelligence that, and you spoke to it a few minutes ago, but can you tell us a little bit more about how you built DCI Track to be smart? Absolutely. So one of the things that we decided to do is not to rush to market with some application. Again, that was kind of patched onto an existing platform like Salesforce or CRM. We built this thing from the ground up. The architecture on the back end is SQL-based relational database. And then the middleware and the front end is built completely with RESTful APIs. And the meaning of that techy stuff is that we can integrate this into any of our Channel Partners existing systems. We can private label it. We can private brand it for any of the applications. We can customize it for their own needs. In fact, we've got three partners right now that were beta testing specific private branded versions of DCI Track for them and their Channel Partners to push down Channel. I love it. Love it. So if I had Salesforce, for example, you could do a direct API? Absolutely. You can integrate your applications into your Salesforce, into HubSpot, into any of your whatever CRM. Because that's basically the name of the game right now is if you build it with that kind of RESTful API technology, you can easily plug and play into any existing platform. And that really allows your partners to control their own deals, their own leads, the nurturing of those leads. I can see how it would be a fabulous thing. Yes, absolutely. We're not here to take away the glory. They have their own clients. They want to impress their clients. They're here to make sure that they do that. So does this mean your Channel Partners are on their own now, if you will, when it comes to managing their deals? So how hands-off is it? Great question. And so when we went live with it, a lot of our existing partners started calling us up and say, oh, is that it? Now all of the full service that we've been used to from Coltrack for 19 years, is that now gone and we're going to self-service? Absolutely not. We're not going anywhere. In fact, we keep ramping up our Channel Back office. We're here to support them full service as we always have been on any deals. If they need us to do all the hand-holding that they need, we will still do that. This just gives them an additional layer of empowerment that if they have the competency in-house and they just need the tools and they need access to all of our vendors, they need the quotes on demand, they can do that absolutely on their own or they can anytime bring us in onto a project. And Danny, I just love having folks like yourself, CEOs who take pride in their work and you're glowing about the benefits of your company and your platform. And I love that. It's infectious. So looking into your crystal ball, what's coming up for Coltrack in 2019? So we've got a bunch of enhancements planned. Some I can't talk about yet. There's a lot of people that follow us that try to mimic what we do. But some of us are still in covert ops. But some of the things that I can talk about is we're going to be integrating it by the end of the year into our accounting system, which will give all of our existing channel partners visibility into the entire life cycle of the deal from a commission management standpoint so they can actually track from where the vendor pays us and when they're supposed to get paid and how much they're supposed to get paid and if there's any issues with true ups or commissions, they can see that. So that's going to be another really powerful little layer. So really marketing, sales and finance all in one and just brilliant. Complete end to end deal management. All right. Well, if you want to know more and I'm sure you do, where can our viewers go? You can go to www.dcitrack.com to learn more about the software and register for the software and test drive it. And if you want to learn more about the company that is behind it, that's just Coltrack.com. And like I said, we're in our 20th year in business and we're there to support our partners throughout the whole process. Wonderful. Danny, thank you so much for your time and your insight. And thank you viewers for tuning in to JSA TV. Happy networking.