Hi everybody. My name is Ben Caro. I'm here to talk to you about quick prototyping and continuous integration using LXC and Puppet. So just a little bit of background. My name is Ben Caro. I'm a release engineer at Mozilla. The things I work on day-to-day are all of our version control systems and primarily the hosting of these things. If you're familiar with Git or Mercurial, a lot of our build systems and a lot of the people who contribute to Mozilla have to check out code from these every day. And these things take a while to scale and they're actually pretty intricate in the way they're set up. So yeah, we do all of the version control systems you've probably ever heard of, including some you haven't, simply because we don't tell the engineers which they can and can't use, which means we end up supporting all of them. So just to give you a bit of background on this. So the way that the infrastructure at Mozilla has been done since the dawn of time, and for that it means 2001 to 2014, is that everything has been deployed with some kind of configuration management. Most recently it's been Puppet. That's what we're using now. We're very happy with it, so that's what we're sticking with. But the problem was that we didn't really have a documented environment for what everything should look like and we didn't really have a target. We just had a Puppet base class, which is like a set of rules and packages and things that you should apply on every host. And then past that all of the people, all of the infrastructure engineers developed their own modules and the way that they did that was kind of ad hoc. So if they wanted to do it a particular way, even if they weren't very familiar with Puppet, they could go and code up a module and submit it, and if it ran, it worked, and that's great. There was no real peer review, there was no real documentation on things, and that got us to a certain point, but once we had modules that were bigger, this created a very big problem for us. So we wanted to frame the problem first. So the problem is that developers and upstream projects needed a way to be able to replicate our production environment. So if we have a problem, let's say with Git on our Git server, and we wanted to go to the Git people and say, we have this problem with Git, we understand it's a scaling problem, this is the version of code we're running, and here's the entire system that goes with it. That way if we have a problem with it, we can send it to them and they can easily replicate the problem, and they can add their own tools on there and start debugging it in ways that we can't even imagine, and then they can help us solve our problem for us. Additionally, we wanted a way to make the development environment for our developers really close to production. So what normally happens, and you hear this a lot, which is kind of like a fight between sys admins and developers, is that developers will code on their laptops, which usually means it's running OSX or something like that, and production is going to be something like Red Hat Enterprise Linux, and these two are very different when it comes to some packages that a lot of, when it comes to libraries that their applications are using, and this ultimately results in the developer saying it worked on my machine, why doesn't it work in production?  So we had a couple of requirements for it. We needed developers to be able to bring this up by themselves without having to read through pages and pages of documentation and understand many things that quite frankly they didn't really care about. We also wanted it to be really public and shareable and reproducible so we can just give it to anybody, even if they're not affiliated with Mozilla, and they can recreate it to see if this is something they want to deploy for themselves or for their own company, or if it's something that's not really right for them. And it needs to be as close to production as possible. So we looked at a couple of different options. When you think I want a development environment and it's not my laptop, you automatically go to a virtual machine. So that's exactly what we were thinking of. So we looked at virtual machines on workstations and they had some problems. So things like KVM or VMware worked and theoretically they would allow you to match as close to production as possible. But the problem is generating these images and giving them to people is really expensive and it takes a lot of time. And it's not something that people want to go check in and no one wants to go grab a new nightly and have to download 800 megabytes to their laptop and then set it up every time there's a change. It's just not workable and it's slow. You can only run a few of these at a time. If you try to start more than two or three virtual machines on your laptop, you'll find out pretty fast that it's just not something that scales very well. So we looked at what about doing the same thing but in the cloud. And this does work in itself as a problem where you're not going to set your lap on fire and kill your hardware faster. But the problem is that you need to be connected to the internet to do this.  And for some people like in Kenya, some of our contributors in Kenya said there are no cloud providers there and so they would have to deal with the latency over to Europe or the U.S. And that's just not workable for them. In addition, this kind of defeats the purpose or it makes it very difficult to be able to share these images with contributors because they're stuck in our Amazon instance, for example. And that means that we can't really share them besides sharing the AMIs. And that means that we're telling the other developers they have to use Amazon that way too. So we started looking at a couple other things. So specifically we started looking at container solutions. And these have some problems but they have some really great advantages too. The first one we did was all right, this is kind of the bare container option. The one in the Linux kernel that's popular these days is called C Groups. And so we tried looking at C Groups and using something called Copy On Right Images which is kind of a lightweight way to be able to take these AMI-like things, these images and copy them without using more space and doing it in a very efficient manner. The problem is that these are really hard to use and so teaching developers how to do this would take days or at least hours of their time and it would teach them things that they quite frankly don't care about. The problem is these Copy On Right things that make it really convenient to use aren't in the standard Linux kernels.  And one of the drawbacks is that it's Linux only.  We also looked at using Docker and we created a solution probably about a year ago and Docker has matured quite a bit since then so some of the reasons we didn't use Docker before have now gone away but one of the really bad problems that it still exhibits is it doesn't really clean up after itself.  So we didn't end up doing that. If you like Docker files then this is totally a solution for you but with our infrastructure we wanted to run public code and Docker files are, you can use them kind of like configuration management. Basically Docker files are a way to describe how you want this Docker container to be set up and they have things like run the shell command or put this file in this place or set this environment variable which is cool but it's not kind of in the same realm as a full configuration management system like Puppet. Additionally it's Linux only but you can also give an API to developers. That's one of the new features that makes this pretty cool nowadays. In addition we also looked at VMware vSphere which is VMware's cloud offering so you can think of it as like a VMware's private cloud like OpenStack or like a private EC2 cloud, something like that. And it works, the problem is that we couldn't really use this and still be able to give accounts and access to all of this infrastructure to people outside of organization just because there's a very real security risk there of giving them access to these infrastructure machines and they could essentially run whatever they want. There's no real system in this for being able to limit their permissions. Additionally it's not really open source and it's expensive and it's still in beta status and as far as I know from our infrastructure team it hasn't worked out very well for us but we're still trying it out. The last couple ideas we had were EC2 and I touched on this a bit earlier and you can spend a bunch of money and get really fast VMs or you can spend a little money and get some slower VMs and that's totally a solution and it's very easy and developers are very comfortable doing this simply because you can go to aws.amazon.com and click around and make yourself a VM and if you have an image that matches production then this is going to be really easy for developers to bring up. So we have this around and it's still a viable alternative and we support it. The problem is that you can't do offline development and you have to create like another system for your volunteers to be able to go get these images and install them on their own aws accounts and that might not be something that they have the money for or something they want to do or it might not even be legal in their country. So we decided on this last option called LXC and Puppet and LXC I'm going to get to what it is in a minute but the features that it has is that devs need access to a Linux host. It's Linux only and it allows us to really closely match the environment that we have in production and it allows anybody with access to a Linux machine to be able to set this up for themselves which was really valuable for us and what we were really seeking to do. So what are containers? Containers are what you can consider an operating system level hypervisor just like a computer level hypervisor, something higher level would be like a virtual machine where it's emulating a keyboard and it's emulating a network device and it's emulating a hard disk and all this stuff. With containers you don't need to worry about that. It's done inside the operating system at a lower level. So you can think of it as one kernel with multiple user lands. So you can have your one kernel running on something like your laptop here and then you can have a SUSE running in a container and you can have Red Hat in another container and you can have three Red Hats running if you want to test something crazy. Doesn't matter. And there's two real solutions for these. One, they're both in the Linux kernel. One is called C Groups which is what I mentioned earlier and the other one is called OpenVZ and I'm going to talk about both of these in a little detail next. C Groups, they stand for control groups and it's been a feature of the Linux kernel since, I think, five years ago. So it's been in there for quite a while and it allows resource isolation. So it allows you multiple user lands but you can set memory limits, you can set how many CPUs it has, you can set a whole bunch of other limits, you can freeze things and you can do this for a single process or you can do it for a whole system. And what I'm talking about today is doing this for a whole system so you're creating virtual machine-like things inside of your workstation. If any of you are familiar with CH Root, it's kind of like that but it provides a few more advantages, like you can have real network interfaces and you can limit other resources and it creates different process and user tables.  So that's kind of C Groups. The other container option is OpenVZ and I'm not going to talk very much about that but this used to be the leading container option at the Linux kernel. There's a lot of the cheaper web hosts or shell hosts out there that you can go buy shell access from. I still use this. It was never really part of the Linux kernel, it was always an out of kernel catch set but it was really popular because it existed long before C Groups and it had better isolation, so it had better isolation so your containers theoretically couldn't talk to each other any more than they could in C Groups and these companies still use this and they're very happy with it and they don't want to change but there's never many contributors and no one's really working on it anymore. So LXC, which I'm primarily talking about now is a set of convenient scripts on top of C Groups so it allows you to do things like create, stop, start, and destroy and it's not really adding any features to LXC but it's making it a heck of a lot easier to use and it's making it something that your developers could use if they wanted. It also has some other options like cloning so if you have a container that you really like and you want to make a clone and try to do something on that you can just do clone, you can freeze it, none freeze it similar to virtual machines and then execute, which is the command at the end there actually allows you to just execute like a single Apache process or something like that and this is really useful if you don't want to bring up an entire system but you just want to run one single process. The way that handles the creation of these containers is through what are called templates and these are basically, I'm going to get to those in a second but they're basically shell scripts that describe how to install a system and what it should look like and these can handle complex resource set up so you can have things like three network interfaces in there or you can pass block devices or you can pass video cards or something else like that into these containers. So comparison to other kind of dev environment strategies like VMs that we talked about before is this is a lot cheaper and you don't have to be shelling out to EC2 every time you want to create a test environment or you just want to try something out. This is good because it's part of the vanilla Linux kernel supported by our vendor which is Red Hat so if we have a problem with it we can either like file a bug with Red Hat or we can post something to the mailing list there's a mailing list and IRC channels for LXC or I mean we can just ask an LXC and pretty much all of the core contributors are in there and no matter what time of day it is someone's going to be in there and they're going to be happy to help you out. Some of the problems are that it is less flexibility so like I said with containers they're really Linux only so if you're on Mac or Windows or something else you're going to need to run a virtual machine to get to these things which is a problem but it's something that our devs can work through and it's entirely in the vanilla Linux kernel so you don't need to go poke around you don't need to recompile your kernel in a single package on a Linux machine and then you can start playing with this. Some of the reasons you might want to choose something else like Docker is that you really want the portability of Docker files they're very easy to understand they're just in one documentation page on Docker's website and you can read it in about an hour and even if the only thing you know is shell scripting you can understand this and get it to work for you and that's really cool but like I said it still has a problem of cleaning up the old instances that it kind of leaves around there's no real documentation on that but if you join their IRC channel and ask around they'll give you this big long shell script that you can run to fix it for you and it's useful if the developers aren't running Linux as a primary operating system because this has an API that you can talk to instead of just running all these things on your local machine you can just set one up for everybody on your project or at your company and they can just start using that now I'm going to talk a little bit about the configuration management so done with that let's see for now and now we're talking about things like a puppet or chef or ansible or salt can I just see a set of hands who's dealt with configuration management here before in one of these okay good that's a lot of people who've done configuration management before I'd like to see that this talk I'm not really focusing on like hardcore features of puppets so even though this uses puppet this is going to be very easy to apply to whatever whatever tool you've used before um so this is just a basic pattern in puppet so we have a class called Apache and we wanted to do Apache things so we say we have a package it's called HTTPD we should make sure it's installed and then there's a file that's a config file for Apache that tells it what port it should listen on things like that and then we have the service and we make sure it's running and that it's going to start when the system starts and we call this very simple pattern package file service and you see it a lot whenever you do configuration management the last line down here line nine basically it's just an ordering of things so we should install the package and then we should install the file and then the service that's just a puppet thing because puppet can sometimes do things out of order and so building on that a little bit we have higher level classes some people call these bricks some people call these meta classes and it's basically you're describing what you want a machine is how I try to look at this so we could have one that says web server or database server and this might have multiple classes in it so we have a web server here a class web server we make sure we include the Apache package and other nice things to have on a web server are like the Nagius checks that it should be running to make sure that the web server is actually up and operating correctly and LogStash to be able to have the logs be pushed out to somewhere where we can go read them later and then line 6 and 7 down here are what puppet calls the node definition so basically it takes a host name or in this case a regex so it starts the new line and it looks for web and then any set of numbers and then .dc1.example.com and it says to include the web server class and that's going to include the Apache class, the NRP stuff and the LogStash stuff all in that and you don't need to specify each individual component there and this is really useful in just describing machines so the way that we actually use these puppet commands the way we use these puppet classes getting back to LXC is we throw these in the templates for when we create these machines when we create these containers themselves the way that the LXC creates script works is it creates this golden image that lives in varkash LXC so if you want to install like Ubuntu trusty and you type LXC create dash t trusty it will create a master copy that lives in varkash LXC trusty whenever you want one after that it will just use that pre-compiled one that way you can speed it up and it gets really fast if you do copy and write stuff all of these scripts are written in shell they are executed whenever you run LXC create I wrote some custom ones to be able to match our production environments more closely I'm going to show you what one of those looks like I think in the next slide but these are just some of the things that you can do beforehand so in here you can sell some packages if you want more packages in your base image or you can apply a puppet base class if you just have like a base class and you're going to use this in a lot of different modules that you're developing you can pre-install puppet certs if you want this stuff to talk to a puppet master or one of these things it's really cool that I'd like to talk a bit about later is you can create multiple containers with each LXC create command and that's going to be really powerful and I'll tell you why in a bit but this is a little big but this is kind of what it looks like and if you're familiar with Bash there's just two functions here there's one called download sentos and it just sets a couple things here like the cache directory and these are the packages it's going to install so this is kind of a base level sentos system so you have your package manager and some files and then puppet so it creates the folder and then if the cache exists it just copies it in there otherwise it runs yum and and installs to that place and one of the other things ah ok one of the other things we can see here down below is that ah ok did I go back? yeah sorry about this, apply puppet down here basically it's copying our puppet module that we wrote into the correct place for puppet to go consume it and then it's running library in puppet which is a tool that allows you to create dependencies within modules so like if the module that I wrote depends on other modules I can have it just go automatically and then install them to the right place and this is really valuable if you have infrastructure that requires a bunch of modules that you didn't write and you need to make sure that they're in the right place it also keeps them up today which is handy and then this little puppet apply command down here is key and this basically just says apply the hgweb class that I've defined and let's try this out and see if it installs and runs correctly and that sort of thing improves CI a lot like if you're using Jenkins or Travis CI some of the problems are that when you're using it for infrastructure things like this sometimes the last puppet run can affect the puppet run you're doing now I mean Jenkins likes to make everything live in its own directory but there's nothing that really stops it from affecting the system outside of it and that can be really bad when you're applying these sorts of things to it so one of the things that LFC helps is that it gives you a vanilla system so that every time you make a change and you want to test it and you commit it and you want to test it and make sure everything works correctly is it's applying it to a vanilla system every time so that way it doesn't matter if it doesn't matter what you push last you're guaranteed that it's not going to affect this run it also allows you to do multiple isolated environments and that basically means that if you want to test your package on let's say <IP_ADDRESS> and Red Hat 5 and Red Hat 6 and CentOS 5 and 6 you can do these all at the same time on the same system without having to worry about them interacting with each other and that's also really valuable for us because we have a lot of hosts that run Red Hat 5 and 6 it also has a much faster turnaround time compared to virtual machines because you don't need to wait for virtual machines to copy you can basically just copy an LFC container takes maybe 5 or 6 seconds this is a virtual machine which can take minutes at a time and then destroying them is also expensive and they're because they have to do all the virtualization stuff they actually run slower to boot and this allows devs to easily reproduce the CI environment so if they submit a job and it fails and they read the build logs and they don't know why and they need a little more information historically that's been really difficult for them and they haven't been able to get the same environment to be able to produce the same build errors but using this they have the exact same environment because the environment that they're developing in is the environment that continuous integration is running in as well so that makes CI a lot more handy for us this also improves prototyping because it allows you to test your new code on the production OS you don't need to test it on your laptop and then give it to the IT people and hope they deploy it and then hope it runs the same on their machines as it does on yours because yours and theirs already match like I said before with the CI it allows you to do this in multiple environments so if you think this thing is going to run in many different places you can test them all using the same way more than one or two won't really overload the host like with virtual machines if you try to build all of these things and test them at the same time on your laptop you're going to have a bad time and what is this programmatic creation of faux production environment it's difficult with VMs right what it basically means is that when you have like a big system of like let's say you have like a web server and database server and a load balancer and the traditional way of testing that for a development environment is you just have one virtual machine and all of these things run on it the problem is that the configuration between these has to be different than production just because they're all running on the same host so some things might be listening on local host some things might be listening over Unix socket or something like that but with this with containers they're actually running on like a Linux bridge which is like a virtual network and that way they're communicating on a network the same way they would be communicating on a real network of these things were in production so our development offering so what are we giving to the developers to be able to have them like set it up on their laptop and start coding and bringing it up to speed so we're giving them these LXC templates that we wrote to be able to just deploy we're also giving them Begrant files to if they want to run, I mean if they have an Apple laptop these Begrant files will allow them to create a virtual machine and then run all of these containers in the virtual machine so they can do it even if they're not running Linux we chose to do master with puppet simply because maintaining a master was kind of a pain and it doesn't really buy you any extra features unless you're doing some really advanced stuff and we created templates that we put on our wiki so if another project inside of Mozilla or even outside of Mozilla wants to set this up for their own project then they're able to just rip off our templates and change some names and change module names and upload it to their own site and that's great they're I mean the creative comments license so everybody is free to do that some of the initial impressions that we got when we deployed this thing is that the LXC CentOS template is really new it's only been in there since 1.0 and 1.0 has only been released for I think about a month and a half now but hasn't been released for that long so this is a very very new thing and it's obviously not in CentOS and it's not in REL but it is in Ubuntu 14 the newest Ubuntu the trustee release so if you're using that then you've got it already although you're probably not running the CentOS template if you're running Ubuntu there's still none for Red Hat 6 if there's anybody from Red Hat in the audience I would love to figure out all the lights with thing issues that deal with setting up Red Hat containers it's got some kernel audit grumbles so sometimes depending on what you're setting up you might have to tweak one little flag to get it to work and this was kind of difficult for us to figure out but we eventually got it and now everything is good and these operations are really fast so your developer can do these and it's not the classical type make and then go get a cup of coffee and come back and then see if it worked and then actually just sit down and get within a few seconds a completed compile or a failure which is really valuable and it wastes a lot less dev time than it would otherwise so the productivity enhancements are that things are fast all these operations that happen like I said before are fast and then we can almost we can let developers have something that's really close to the production environment that we run as well because we're running Red Hat for all of our servers that are in production and because Red Hat requires licenses for all of the machines we can't really give people those machines because we would just be burning licenses but we give them sentos and that's close enough they can run the same binaries and they're close enough where we haven't really found that many problems with this before one of the things this does it allows faster turnaround time so we don't have to worry about developers developing on a different environment then we have to test it in production and then maybe something broke so we have to have this feedback going back and forth about what it's going to take to get this thing in production and the holistic testing is what I was talking about earlier where we're spinning up multiple containers and then having them talk over a virtual network so it simulates an entire like it simulates an entire system instead of everything just running on one host and this is really valuable because instead of testing each individual part you can just go to the website and see if the website loads and for the website to load it has to go to the load balancer and it forwards that to the web server and it has to grab a bunch of stuff from the database connections and then how am I doing on time okay cool and that way because the website returns successfully you know that the database server is up you know that the web server is running and you know that the load balancer is configured properly so this is kind of one of the case studies that we've done this is one of the projects that I did Mercurial which is the primary source control that we use for almost all of the Mozilla software so if you ever want to check code out and build Firefox you have to install Mercurial and then do Mercurial clone Mozilla and then you can build Firefox so this is really really busy because we have a big build environment that checks this thing out so we have to have like a whole set of machines and they have to be configured just right and there's different types of machines depending on the activity that goes on so the infrastructure for these a couple of the things we have SSH hosts so whenever a developer wants to push something new they connect to this SSH host and then push their code out likewise the HD web hosts if you go to htd.com and they hit these hosts and they host they basically just host the website for everything and we have mirrors so we have a lot of stuff in AWS and we have a lot of build infrastructure in different data centers so when these build machines want to go check out a copy of the Firefox source code they talk to one of these mirrors if there's one locally and we do that because it is a lot faster and we use a lot less bandwidth doing this because it's already local there and deployment of all these things is just handled in one big puppet module and so you can say include mercurial web head and then it will go install all the things from the web head subclass so we have continuous integration working on all this code so whenever I check in a new commit if I want to change a setting in mercurial it's going to I'm going to check it into Jenkins and Jenkins is going to start a job and then it's going to install LXC or it's going to set up container it's going to set up actually three containers for all of these and then install everything and then run a couple tests to make sure it works correctly and then it will tell me in IRC if something is broken or if it completed successfully and using this we can get kind of a good expectation whether it's going to work in production or if we should try to hammer it out further and make it work better likewise if it ever fails then we can we can get devs to come by and ask if it went wrong and then we can give the code to maybe some upstream and the communication is done on IRC so every time someone submits a job Jenkins says a line in a channel and whenever a job completes Jenkins says whether that line is completed or well it says if completed and it says whether the bill failed or it worked correctly so in review before we had little to no testing it was kind of a wild wild west in terms of all of our infrastructure and how it got deployed and to get access to a staging server so if you wanted to test some code before you deployed it you had to file a bug and someone would need to go manually create a virtual machine for you and set up a bunch of stuff in DNS and DHCP and then they had to give you explicit network access and a user account and then you could SSH in and try your code and if it didn't work and you needed a new host you had to file another bug and then you would need another human to go and do all these things for you but now you don't need to do that you can create it for yourself which is really cool and now we have some teams that are taking these templates that we wrote this documentation and deploying it for themselves so that they don't need to bug IT anymore and they can be much more self-service and things happen a lot faster and they have a much more standardized environment some people are choosing to use EC2 instances just because they're comfortable working in that space it's fine we also support that so yeah some further reading on this there's linux containers.org which is the official site for LXC and there's some great blog posts one of them is by a guy named Stefan Graber and that's a tiny URL for him and he has a whole set of blog posts starting from like an introductory tutorial to some of the more advanced features he might want to do and there's Planet Mozilla which has a lot of things IT related especially related to LXC so if you want to see what we're up to you can just go check that out and you can ping one of us on IRC if you're curious or something like that I'm Ben, I'm B. Carroll on Twitter IRC if you ever want to get a hold of me can I open the floor up to questions Hi, I'm curious to know how here how did you model this development environment for Firefox for ARM builds not the Firefox for mobile but it's for ARM builds for open to ARM builds that's a great question and I'm glad you asked that so these the C-groups in the LXC stuff we're doing isn't necessarily limited to x86 so we can also do these on ARM builds and that way we can actually set up some builds for Android and we can build on Linux for ARM and we can build other things using the same development machines that way we don't need to buy more embedded machines and fill a data center with more of them Does that answer your question? Yeah, but the host has to be an ARM machine right for that Yeah, the host has to be native, otherwise you can go through QEMU but then you're doing emulation and it's much slower Okay, thanks As I said you are using LXC create the native commands or any other like Libbert or something for creating containers or how you're doing that So if you want to create containers without LXC you know there are special file systems in the Linux kernel so like sysfs to go tweak system things what you would do there is you would cd into like slash sys slash c-groups and you would make a directory and then you would echo things into these special files that exist that aren't really files and then doing that you can execute a process and you can change things like the cpu limit and things like that and then after it's done to destroy you would have to go like remove the directory The question was like you are using the same commands as LXC create and LXC all those commands or you're using any other like Libbert related like libraries for creating your containers while setting up your environment So if I understand you correctly are you asking if we like lose functionality by doing this instead of raw c-groups Yeah I think that we aren't really any of the features that we're losing with this we never really used to begin with but if you know of some that might be helpful to us I'd love to talk to you about it Thank you You mentioned that with Docker you need a lot of cleaning to be done How does it go with the LXC that you use do you not need any kind of cleaning to be done cleaning for the files that are remaining Yeah So like your question like was with Docker I mentioned all the cleaning that had to be done but with LXC is it the same thing So with LXC it doesn't really clean up after itself either you have to go like do LXC destroy and then give it the container name and do that The difference there I think is that with LXC even though it's manual it's very easy to do but with Docker you have to run a couple commands and then there's these hashes and you have to do like a bash for loop over this list of hashes What about Vagrant LXC like does it still work Like it is not LXC is not officially supported by Vagrant but like there's a project called Vagrant LXC but there's some glitches like I don't know about LXC support in Vagrant exactly I do know that there was a blog post on the Vagrant blog very recently about getting it to work with Docker and so you can use if you do Vagrant with Docker and you're not on Linux it will create a virtual machine for you and set all this stuff up I'm speaking about like having LXC as a replacement for virtual box in Vagrant like not like creating the Linux for like this is like it's not officially supported by Vagrant but like there's a Vagrant LXC project but which is not greatly documented so last time we spoke on this like I think like one year back so any update on that like Vagrant LXC having LXC as the base machine Yeah, so with LXC as like talking directly with Vagrant Yeah, originally Vagrant only supported virtual box and it's something they've tried very hard to rip out and make it like universal so you can replace it with many things and LXC was one of them but as far as I know they still have some virtual box isms in there Okay, so I haven't really looked into that for a couple months now so I'm not sure what the latest on that is Okay, we're going to discuss one later then Hey Hi My I mean it's something like just a casual question So is it what kind of a school of concept you come up with like I want to go with a docker or a Vagrant or an LXC so how do you benchmark it when you come up with a POC so I mean like you hold some benchmarks right let's take Okay, this gives me this output so I go with it so what kind of a rules or tips which you can give from what a Mozilla does in the real time. Yeah, so like what you're asking is like will we determine which one of these is best for us? Yeah, I mean generally with your longer deployments you know the POC which you does so from the docker it's you know day by day you're getting more and more containers on different programming languages so LXC is one which is being like closely with the Linux kernel mostly so how do you benchmark those things and come up with a solution for your particular requirement like I just want to know how you do it? Yeah so mostly it's been about developer time so how much of a pain are these going to be for developers to set up and start using and so Vagrant really wins for that but the problem is is that Vagrant doesn't really win for to be able to have like these nightly images so a lot of our developers can't download 800 megabyte images every day to get the latest version so it was more like we have these requirements and we're striking things out and the thing that we used was the thing that had the most features that we wanted and the least strikes doesn't the developer feel like it's an overload on their Vagrant on top and LXC container and then and then come up with the solution it's a load on their laps right? Yeah so it definitely is and that's why we kept the EC2 option for them just in case they wanted to load a virtual machine up in their in their Amazon account and then just run that instead some people just thought this was too much effort for them okay yeah thanks any more questions? Any question down here? So I come from a database background you mentioned something very interesting about stage testing for a bug using LXC and containers now stage testing for a production bug is going to require production like data do you have a use case that can explain where I can get you know you still need that amount of data like we have data that is like in terabyte sizes yeah right how does this apply to an environment like let's say for example Amazon I don't come from Amazon but yeah something of that kind it's a very cool idea right I have a lot of stakeholders asking me for hey I need an environment that is easy for me to test and I don't want to come to you every time saying I have a bug can I do this right there are ACS involved because it's production level of information we have a stage environment but you know how would yeah so I think I understand you correctly in that like when you want you want a staging environment but the hardware kind of has to match production because you're moving the same amount of data yes and so there's no real good way around that without just getting the same hardware for staging that you do with production okay with this you could kind of do double duty so if you don't have to test things in staging that often you can use these same staging hosts just in case you have like six different one terabyte databases and you need to test them all separately okay yeah cool thanks okay if there's no more questions thank you guys for being a great audience


It's simply inequitable to suggest that Black Americans should pay higher taxes because we are the victims of systemic racism and we bring that on to our tax returns. Welcome to the State of Working America podcast, where we strive to provide a reality check on how workers from all walks of life are impacted by the economy and what needs to be done to address workplace inequalities. Today we address a source of inequality that a lot of folks don't think about, including me up until now, the racial bias in the tax code. I'm Eve Tachman-Gio, the communications director for the Economic Policy Institute. EPI is a nonpartisan think tank focused on leveling the playing field for all Americans and their families. When we think about economic discrimination impacting workers based on race, we tend to think about pay disparities, the lack of good job opportunities, but what about how taxes, the taxes we all pay, contribute to those inequalities, especially for Black workers and their families? Could the tax system we all live under be biased? Our guest today, Dorothy Brown, the author of The Whiteness of Wealth, How the Tax System Impovishes Black Americans and How We Can Fix It, makes the case that, quote, our tax policies were built in total ignorance of, if not willful disregard for, Black families' financial and social structure. And she goes on to argue that Black workers have not only not benefited from many tax breaks, but they have actually had money taken out of their pot with as a result. Dorothy, welcome to the State of Working America podcast. We're so happy to have you. Thanks for having me. I'm delighted to be here. Well, let me tell you, I never thought I'd curl up with a book at night on the tax code, but I just found it fascinating. It made me think in a way, you know, I never ever thought that our tax system could be skewed against a certain group of individuals. And that's, you know, what you bring out here in the book. And so the tax policies, you're saying the tax policies are biased against Black workers, Black families, and you looked at Black individuals and compared them to White specifically. You're not looking, you didn't look at other groups, right? And in this book, no, in this book, it's basic. It's Black and White because the racial wealth gap is the greatest when you compare Black Americans and White Americans. So that's the focus of the book. Right.  So I first want to start with something you just said, Eve. And basically it was that you never really thought about tax policy, having a racially disparate impact. And quite honestly, there was no reason for you to think it because the IRS never published statistics on race. So there was never a connection when we talk about tax statistics about race. And in fact, I went into tax law because I knew it had nothing to do with race growing up in the South Bronx dealing with racism on a regular basis. I didn't want to take a job that required me to deal with racism in the substance of the law. I knew I wanted to be a lawyer and I made you an accounting in college and took a tax accounting course and said, that's it. It's just numbers. The only color that matters is green and I want to be a tax lawyer. And as I say in the book, I've never been more wrong about anything in my life and how is it that I stumbled onto this? Well, it started years before I figured it out when I was doing my parents' tax returns. So I'm doing their tax returns. I'm doing my tax returns. My mother was a nurse. My father was a plumber. They earned roughly equal amounts. Some years my mother would make more than my father by like a couple hundred dollars. Other years, my father would make more than my mother, depending on how much overtime he made. And I earned by myself what they earned combined and under our progressive tax system that should have meant I would be paying a whole lot more in taxes. I was paying more, but not a whole lot more. And every year that I did their tax returns, I left thinking I'm missing something. I don't understand this is the right answer, but I don't understand why fast forward. I become a law professor one day. I read an article and the article says, how do you know there isn't a race and tax problem if you don't look? And I went, what race and tax? And it was written by someone who was a mentor and who always made me think.  That's when I realized the IRS does not publish statistics by race. So how am I ever going to do something? I couldn't believe that, you know, and you know, at EPI, we're all about data and data, right? How, how could that be? And I mean, that could be a whole other discussion. So you can't even gauge what's going on because they're not publishing the data. Yes, because there is this myth that tax law is color blind. There's this myth that there might be a class differential, right? Because we have a progressive tax rate, the higher your income, the higher your tax rate, although that's not true because high income Americans have a lot of income from stock that is taxed at a separate rate, not even in the progressive tax system. And it's at a low rate. So, but there's this myth of color blindness. So we point out to an investing that you put when you compare blacks and whites that whites are investing more in the stock market. So that creates that inequity there. Absolutely. It's everywhere.  So race is throughout the impact of the code, but it's ignored in the Treasury published statistics. So what did I do? Well, once I figured out this is going to be a lot harder promise to keep, I then started reading everything I could get my hands on that talked about race and I applied my tax eyes to them. And shortly after I made the promise to write about this, I came across a commission on the status of black women. And in the report, it said black wives contribute roughly 41 percent to household income and white wives contribute 29 percent. So to anybody else reading that, they're like, yeah, OK, fine. But to me, it was tax gold because that was the beginning of my unraveling why my parents paid so much in taxes. What that 41 29 breakout tells me is I know there's this thing called the joint return and I know that when some people get married, they get a tax cut.  If you contribute income to household roughly 50 50 like my parents, you don't get a tax cut. I'm sorry. You don't get a tax cut. You pay higher taxes. If you contribute like a hundred percent zero or 70 79 21 something less than 20 percent, you get a tax cut. So what does that tell us in and of itself? Nothing. What I needed was Census Bureau data to confirm what that statistic hinted at, which is namely when black Americans get married, they are more likely to be in the 50 50 wage earner household that doesn't get a tax cut. And when white Americans are more likely to be married, they are more likely to be in the hundred zero or 90 10 household and they get a tax cut when they get married. That's why my parents are paying so much in taxes because they were married to each other and contributing in roughly equal amounts to household income. I love how you weaved your family through it, your parents through it. It really just made it a great read.  His wife didn't work. So he went with a tax break. That that was fascinating. Can you explain that? Absolutely. So it's Henry and Charlotte Seaborn. And back in the 1920s, basically at the beginning of progressive tax system in 1913, the only people who paid taxes were the really rich. When I tell this to my students, they're like, what are you that's crazy, right? No, the only people who pay taxes were the highest income Americans. One of them were Henry and Charlotte Seaborn, and they didn't like it. He made all the money. She was a stay at home spouse. We had individual filing, so he was filing a tax return and paying taxes on all of his income. But he and his lawyers came up with an idea. If they could, if he could shift half of his income to Charlotte, then the last, the tax rate that applied to his last dollar would be significantly lower than if he was taxed on all of it. So that's what they did. They filled out what I would say is a fraudulent tax return. They put half the income on his, half the income on hers, and they got a reduced tax bill. But the IRS said, no, you can't do that. There's no such thing as what you just did. And it went all the way out to the Supreme Court and the Supreme Court sided with the Seaborns. The reason why the Supreme Court sided with the Seaborns is they lived in a community property state. And in a community property state, each spouse has a legal right to half of what the other spouse has. So the Supreme Court says she basically has half. So yeah, let you get tax on half. The problem is every rich white American who didn't live in a community property state paid higher taxes and they didn't like that and ultimately got Congress to change the law to make a joint return possible so that no matter where you lived, if you were rich and a single wage earner, you get a tax cut when you got married. So forward fast to today. And recently things have shifted a little bit, but that creates an inequity because you have what you were saying like your parents, James and Dottie, who made about the same amount of money. So they yeah, with a penalty. That's right. And like you said, things have changed. The 2017 Tax Act has minimized the couples, the married couples that pay a tax penalty. However, the 2017 Tax Act ignored the significant marriage penalties in the earned income tax credit and ignored the significant marriage tax penalties at high income levels. Why is that? So at high income levels, most white married couples are in single wage earner households and get a tax cut. But at high income levels, married black couples are still more likely to pay higher taxes than if they remained single or live together unmarried. So at these high income black households where you would think you would see more wealth production, tax law penalizes them. So now there are a few specific things you point to that are skewed against black families. So there's the marriage penalty we talked about, no deductions for rent, limited tax breaks for for-profit colleges. There's a whole story there. The term in account early withdrawal penalties, among other things. Yes. Is there one you think impacts black people, black workers hardest and their wealth or when I when I think about the impact on black workers, I think about health insurance and retirement accounts that are received tax free. But because of occupational segregation in the labor market, black Americans are less likely to have access to the jobs that come with those tax free benefits. So I look at the racism in the labor market and how tax law comes on top of that and makes it even harder for black workers to get tax benefits. Got it. So all tax policies are inherently designed to incentivize some activities, de-incentivize others. What do you say to folks who might be skeptical that racism, a motivating factor in some of these policies? That it should, well, we know that the law says it is illegal to discriminate on the basis of race. And even though Congress may not have a sentence in the legislative history that says we want blacks to pay more. If, in fact, black Americans are paying higher taxes than their white peers, we should all see that as unfair and we should all work to change it. So it's simply inequitable to suggest that black Americans should pay higher taxes because we are the victims of systemic racism and we bring that on to our tax returns. Right. And as you say, we don't know exactly how blacks are impacted because we don't have the data. How would it help us to have that data? So it would help us tremendously because what I've been able to show in my book would be easily replicated with tax return data. So we would see that black Americans pay higher taxes. We would see we would have a connection in the minds of the American public that taxes and race go together. Right now, the refusal refusal of treasury to publish statistics by race reinforces the narrative that there are no racial disparities. There's not really a problem. And if there is a problem, it's no big deal because, you know, everybody loses under the tax system. But it's simply not true. Everybody doesn't lose under the tax system because of their race. But black Americans do. So I really want to give you time on the solutions part because, you know, I love a book with solutions. Well, it's daunting to think of the things we face. And we all identify the problem, but we and we try at EPI to say, OK, now what do we do? What do we want policymakers to do? So how do we make our tax policies more equitable? You have three solutions in your book. So the race and taxes, statistics, transparency, which you just spoke about.  And then the racism tax credit, which made so much sense to me, you know, there was a lot of talk of reparations. There's a universal income. But this is an interesting twist there. So why don't we take each one? Race and taxes, you know, how do we get that transparency? Well, the IRS decides to do it. And let's start with President Biden's racial equity order. His first executive order, once he became president, was a racial equity order that basically said his administration is going to look at racial equity across the government. And he put together a working group that includes the Assistant Secretary for Tax Policy at Treasury. But nothing has happened. So the fact that the president signed this executive order doesn't mean Treasury is taking it seriously and making any progress. I can compare Treasury with what the Department of Labor has done in response, which has been amazing. They've been transparent. They have up on their website. This is what we're looking at. Basically, you can hold us accountable. So there are government agencies that are taking the president's executive order seriously. Unfortunately, Treasury is not. So we need the president, in my view, to basically kickstart the Department of Treasury to say, I meant it when I signed this executive order. I want to see movement. So we need Treasury to get on the stick, right? We need Treasury to get it together. And it's easy to do. That's the thing. It is not difficult for this to happen. In fact, in 1977 or 1978, there was a report that was put out under the auspices of Treasury that dealt with race. So it's an outlier, but it's totally doable. So that's number one. Is it information that they're tracking and obviously can see if they want to pull it or? Oh, that's what I'm saying. It's totally doable. This isn't, you don't need a law. You don't need anything other than will. And I simply do not think the will is there. Or the competency, quite frankly, when you look at who is in Treasury and who's holding these jobs, they were former academics who never wrote about systemic racism and tax. So they ignored it when they were professors and they're continuing to ignore it now, right? So that's why their boss, the president, needs to help them understand. He meant it when he said it and we need to get it done. I will say this, I've testified before Congress twice talking about race and tax statistics and there certainly seems to be support in Congress for more transparency on race and tax. So I'm cautiously optimistic but disappointed in Treasury. Okay. And then number two, so returning to a more progressive tax system. Yes, let's get back to basics. What it was like at the beginning. We didn't have a joint return so we shouldn't have a joint return now. The Henry C. Born should pay taxes on the income that he receives. That's number one. And from a bigger picture perspective, we should get rid of these deductions and loopholes that were for the most part put into the law to benefit white Americans and leave black Americans behind. So we need to get rid of these deductions and exclusions and tax income from stock, the same way as income from labor. And what you would see is if you want it, lower progressive tax rates across the board. If you expand the base, you don't have to tax income as high as we're currently taxing it. And then the final one I found so interesting, essentially a racism tax credit. Yes, so I wrote a book that showed regardless of what the activity was, whether it was getting married, whether it was buying home, whether it was paying for college, whether it was getting a job, our tax laws subsidize how white Americans engage in the behavior, but disadvantage how black Americans engage in the behavior. Well, I want to compensate black taxpayers who have been paying higher taxes. So I came up with a reparations tax credit, right? Targeted for black Americans who paid higher taxes. Unfortunately, the Supreme Court would not find that constitutional. So that would be a legal race-based discrimination. But my next best alternative is a wealth tax credit. And the wealth tax credit would be applicable to any taxpayer in a household with below median wealth. So it would apply across the board, but it would disproportionately advantage black Americans because of the racial wealth gap. So it's my second best alternative, given that my first alternative wouldn't be found legal. And so on this one, you mentioned that it would impact not just black families, but other- All families, yes, white. Yes, white, exactly. White Americans, Latino Americans, Asian Americans, Native Americans, everybody who had, was in a household with below median wealth would get this wealth tax credit. And a lot of the book you talk about, black families are impacted, but I could see why families who feel that they're not benefiting from the tax system because of wealth issues, because maybe they didn't have the generational wealth that other affluent white families had. But again, we go back to disproportionately, black families don't have that generational wealth, right? Right, absolutely. And I will give you an example where white families are impacted as well. So 2016 Treasury Report said 51% of married couples got a tax cut when they got married, but 40% paid higher taxes. And while my book would show that's disproportionately in the black community, there's a significant minority of white Americans who are paying a marriage penalty. I actually think that led to the Trump tax cuts minimizing the impact of the marriage penalty. I think over time, more and more white Americans needed two workers to get their household functioning financially. So we see what happened in the black community for decades, suddenly started happening more in the white community. And once again, tax policy was responsive to this increased percentage of white Americans paying a penalty and fixed it. Right, right. So, and you mentioned now under this administration with Biden saying that he wanted equity in the tax system, is there anything in the plans that he's introduced that make you feel like, yeah, this is in the right direction or wrong direction? So absolutely the right direction is his plan. If you have more than a million dollars, income from stock will be taxed at the same rate as income from wages. Now, taxpayers with more than a million dollars are three-tenths of 1%, right? So we're not talking about a revolutionary change, but there is an argument that once the camel gets his nose in the tent, it's over, right? So once we started a million, we can come down to half a million and then we can come down to a quarter of a million. So I'd say that's a huge step in the right direction because stock ownership is such a racialized asset that even high income black Americans do not own stock the same way their white peers do. Yeah, I did see research recently that younger black workers are investing more during the pandemic especially, but still there's a long way to go. Absolutely, absolutely. Investing more is a start, but there's still huge disparity. And millennials don't have that much money to invest. A lot of them have a lot of college student debt, right? What my research shows or what my book talked about is research shows black college graduates are more likely to send money home to their parents. White college graduates are more likely to receive money from their parents and that they use to build wealth. Whereas black college graduates are seeing their wealth depleted so that they can take care of family members who were victims of Jim Crow, who are currently dealing with systemic racism. So we see black millennials, they have a really hard, they have a lot of difficulty building wealth. Yeah, our research is focused on definitely leveling the playing field. We talk a lot about raising the minimum wage, which would impact black workers considerably. So there's the two, and you started out saying, there's this disparity potentially in job opportunities and then overlay the tax issues. No one likes getting tax, but you're not arguing we shouldn't be taxed. I mean, the bottom line is you just wanted more equitable. I mean, there was a key point in your book, I wanted to share it and I tweeted it the other day. Hard work alone will never enable black Americans to get the benefits that their white peers receive. And you really feel the way the system is right now is gonna- That's absolutely true. And what we see when we look at whether it's home ownership, whether it's marriage, whether it's paying for college, wealthy black parents cannot protect their students from debt the way their white peers can. So you can't run away from being black, right? It doesn't matter. This system, systemic racism is going to get you and try to pull you down. Even when you overcome, you are still fighting a system that wasn't designed for you to build wealth. It's such a good point. And we talk a lot about this idea of worker power and how workers' powers today has diminished over the last few decades. Going into work with college debt diminishes your power even more. Absolutely and we know that black students have more college debt than white students and over time black debt increases while white debt decreases. Part of that reason is a higher percentage of black Americans go to grad school, but also we see income-based repayment a lot in the black community. And all that does is increase the amount of debt outstanding, which is why I basically support student debt forgiveness. Have you got in any pushback on the bulk or you've been out there now and I said, I saw, listened to your NPR interview. What has been the reaction? So I get a lot of positive emails, a lot of positive tweets, but the pushback tends to fall in a couple of categories. One is she can't be right. The tax law is objective. She can't be right because it's written in a race neutral way. So these are people that haven't read the book. If you read the book, it's obvious. Yeah, I'm kind of right. So the other pushback is she's wrong. It's not race, it's class. It's fascinating. White Americans who are resistant to conversations about systemic racism always come back with, but what about poor whites? That's the, it can't be race, it's class. When no, this is impacting black Americans at all income levels and it is not impacting white Americans at all income levels. So those are the two primary pushbacks that I get. And there's so much going on in this country, a reckoning on race, the discussions we're seeing, George Floyd, the trial, the discrimination that is so clear that we do see in the workplace. And I wonder that could it be disheartening that they're like, and the tax system too? Well, actually what I think is the summer of 2020 woke up a lot of white Americans watching George Floyd be murdered in real time woke up a lot of white Americans to how messed up the policing system was. Black Americans knew this. We were victims forever. We knew it. I grew up knowing it, right? But white Americans said, wait a minute, I watched this, right? White Americans disproportionately had jobs that enabled them to work at home during the pandemic. They were home. They could watch it and they were outraged. And then they took to the streets in the middle of a pandemic. Those same white Americans that had this revelation are quite receptive to the argument of my book that, oh, here's another area that systemic racism is playing a role. Black Americans, on the other hand, have embraced the book because they've kind of known something was wrong but they didn't quite know what it was. And then they read the book and go, aha, I knew it. I just didn't know what the it was. So this seems to be a unique moment for people to embrace thinking about systemic racism in ways and in areas they never would have thought about or even accepted a year and a half ago. That is great, Dorothy. Thank you so much for the enlightening conversation, for making me think, for helping me curl up with a tax book. Thank you, thank you.  Dorothy's book is the Whiteness of Wealth, as we said, how the tax system impoverishes black Americans and how we can fix it. To hear more of EPI's State of Working America podcast, check us out on YouTube, Apple, Spotify, wherever you get your podcasts or visit epi.org, backslash podcast. Our latest analysis, research trends can be found at epi.org and follow us on social media via act economic policy. Thank you so much for joining us and thank you, Dorothy, again. Thanks for having me.


Welcome to the 11th session in the second module of the course signals and systems. We continue now with the recrysin dot product or the inner product as we called it and move on to explain how we could generalize that to the context of continuous variable signals. Now what we do for discrete variable signals? We treated each value of the independent variable for each integer as a different dimension. So, let us make that clear, let us make that formal. So, discrete signals as vectors xn as a vector means every n a different dimension and x of n is the component at the nth dimension. And in fact, now we can take one more step. You see let us just verify what happens if you describe two perpendicular components here in this language. Now what are the perpendicular components? That is very interesting. The perpendicular components, perpendicular orthogonal as we call them are essentially the unit discrete impulses. So, for example, if I have a 1 at the location capital N and 0 everywhere else, this is essentially the sequence delta n minus n where delta denotes the unit discrete impulse signals or unit discrete impulse sequence as we would like to call it for every different capital N, a different unit vector. And in fact, when we write down xn in terms of its decomposition in terms of these unit vectors, in other words, we could write down x of n as summation capital N going from minus infinity to plus infinity x capital N for each specific capital N, delta n minus capital N. We are saying the same thing, but in the language of vectors. What we are saying is xn capital N I mean is the component along dimension capital N and delta n minus n is a sequence which also forms a unit vector along dimension n. So, you know it is just like saying if you look at it for two dimensional vectors, it is just like saying this v when decomposed into its components which I am now showing in green being v1 and v2 and v1 again being a multiple of the corresponding unit vector which I am showing in blue. So, this is the unit vector here which I call u1 cap and there is a unit vector u2 cap and v1 is essentially the magnitude of v1 times u1 cap and v2 is the magnitude of v2 times u2 cap and I have v is essentially v1 plus v2 and that is essentially magnitude of v1 times u1 cap plus the magnitude of v2 times u2 cap and this is essentially very similar. What we have written here is essentially a two dimensional or a smaller dimensional version of this. So, what we wrote in two dimensions we are now writing in an infinity of dimensions a countably infinity of dimensions. Now, you know infinities have different grades, the smallest infinity is the infinity of the integers it is called the countable infinity. So, any play any kind of infinity where you can put all the elements of that infinity or all the objects of that infinity in one to one correspondence with the set of integers is called the countable infinity. The next infinity is what you call the infinity of reals of course, there are you know there are grades. So, there is the 0th grade of infinity which is the infinity of the natural numbers of the infinity of the integers then there is the infinity of the reals and there are higher infinities as well. Let us not get into all that, but at least let us appreciate that for a countable infinity we have now understood what it means to have a countably infinite dimensional vector and we have now generalized the notion of components of that vector unit vectors for that for those infinitely countably infinite dimensions. The unit vectors are essentially are familiar unit discrete impulses and you could express any sequence as a linear combination of that countably infinite set of unit vectors using the points on that sequence, the points on that sequence x capital N for every integer N are essentially the components or you know the contributions of each of these unit vectors. Now, when we the reason for emphasizing this perspective of a sequence as a vector is that it is very easy now to generalize to a continuous variable context. In fact, the generalization is almost straight forward, all that we need to do is to recognize that when you go to a continuous variable context instead of a discrete variable N you have a continuous variable T that continuous variable T can take on an uncountably infinite set of values all the reals and for each real number T you need to associate a different dimension. In fact, if we go back and look at what we call the shifting property of the impulse or essentially what we call the combination of impulses coming together to form an arbitrary signal x t let us write that expression down once again. You know that a large class of signal x of t can be written in the following way integral from minus to plus infinity x lambda delta t minus lambda d lambda. So what is happened here? The integral has replaced the summation x lambda is the component along the direction lambda or dimension lambda. And in fact, now you can all think of this continuous impulse at lambda as a unit vector so to speak along the dimension lambda. So what are we saying in this expression? We are saying that one can put together all these different continuum of dimensions indexed by lambda with the corresponding unit vectors which are the unit impulses but now in continuous time. Now you remember that unit impulse in continuous time require a little bit of work to explain. So in fact that is why we went from discrete to continuous here. It is easy to understand the connection between discrete variable signals and vectors first and then move to the continuous context. But once we understand the connection between discrete signals and vectors moving to a continuous context as you can see from here in this expression is not difficult at all. All that you are doing is to sum instead of summing over the different dimensions you are now integrating over the different dimensions. It is a replacement of the summation. So in fact now you can also define a dot product between two signals. We can talk of the dot product or inner product. Let us be formal now of let us say x1 t and x2 t. Now you know all this while we are assuming real signals. The dot product or the inner product which we will denote like this is essentially the integral of x1 t times x2 t over all t t running from minus to plus infinity. In fact we can take an example. We can find the dot product of these two signals. Let us define x1 t to be 1 between 0 and 1 and let us define x2 t to be a ramp between 0 and 1. In fact we could even take that ramp to infinity. So x2 t is equal to t times ut so to speak and we can calculate the dot product x1 x2 which is very easy. It is essentially the integral from 0 to 1 t dt and that is an easy integral to calculate t squared by 2 from 0 to 1 and that is just half. This is the dot product of the two signals x1 t and x2 t. You have now understood how to calculate dot products of continuous time signals. Now we are going to come to business. How am I going to use these dot products or inner products to get what I want? Namely to decompose signals into their sinusoidal components and then why am I talking about what I call perpendicular components? How can I think of sinusoids as perpendicular components? We will come to that in the next section. Thank you.


To the mat we go, Brainerd hosting a triangular day. Denny Busby for Brainerd at 126 pounds. Hillpin Fully's Danny Halverson to the mat. Busby goes on to win the round, but next at 132. Kyle Patton with a Brainer against Cameron and Cowitz. Cowitz just making it look easy. That's some points for Fully. They would go on to beat Brainerd tonight at 53-12. The final score. If you've enjoyed this segment of Lakeland News, please consider making a tax deductible contribution to Lakeland Public Television.


艾monekoja kwen iyo hwo wanshuwa kewa kwa naisha wanaa kwenkojina? Siwa kwenkwa kwa naisha kwenkya? Tumita kwa hkutuctuwa mizuna nga kwenkwa kwenkwa kwenia kwa baka mwenda kwa kwenkwa kwa hkutuwa kwenkwa kwenkwa nga kwenkwa kwenkwa kwenkwa kwenkwa kwenkwa yontia Rah ribsn being that before i talk about the reasons being by the way if it's your first time to come across Sisshano don't forget to subscribe and don't forget to give a subscribe share this video let us hope those new commas that are coming to the country let us give them that kind of guidance that they need to achieve in January the other yes your employer is responsible for counseling watu kwa kwa kwa kwa watu visa. Rizal bim that, hui has to feel out some forms and those forms that you employer has to feel or your sponsor that has to feel will bear what you call signatures on them. It is that signature that you will put that authorizes that visa to be cancelled out and when that visa or when that visa is being tuu kufahaweon yawe ni,猪awe, nisha kwa jpatiwa, nisha nisha mpunjt, kwa mawi nisha kwa ministri haf usahirawe, yawe jpatiwa, nisha nisha kwa jpatiwa wande haf wakandhiku kisha tiaja yung ko nisha. Katiye brani iitati. Sia hita – kwa jai nii kwa ho maliti. Fuku na kwa woka nii, kanizwadomu zukina sa pabikizu, kwa ui bakishaся, naku kya naliti irita, kwa hiba tinii kwa qили na na na pabikizu.  Tengu kyua skua ni nmuzi.


And West Africa officials who were heading for Mali plunged into crisis after the military detained the president, prime minister and defense minister in what international bodies called an attempted coup. President Bando, prime minister Mokhtangkwane and defense minister Soleiman Dokore were taken to a military base in Kati outside the capital, Bomaco, on Monday, 24th. Because after two members of the military, a delegation from the main regional decision-making body Echo has visited Bomaco on Tuesday. Mali has been in turmoil since an earlier coup in 2012 triggered an ethnic charge rebellion in the north which was then hijacked by Al Qaeda-linked jihadists. French forces intervened to drive back the Islamists in 2013, but they have since regrouped and expanded their reach to neighboring Burkina Faso and Niger.