Okay, so I'm Andreas Rumpf, the original inventor and still lead developer of NIMP. And so this is my talk Move Semantics, which is the new stuff coming to NIMP, inspired by Rust and C++, but we tweaked it. So let's get started. So the unofficial motto of NIMP is actually copying bad design is not good design. So it's already a useful motto because it tells us what not to do. So yeah, we should not copy bad designs. And more useful than knowing what not to do is knowing what to do. So paraphrasing this into recombined good pits from several sources. And so that's what we did. We looked at, as I said, Rust and C++ and Swift, how they do memory management. And if these concepts also apply to NIM, and it turns out the answer is yes. So here, this is an example. So I have an array with two elements inside, and then I append the number three to it. And so this is a growable array. I think in C++ it's a vector and in NIM it's called a sequence. So here is what happens in memory. We have this growable array, and it actually has a length and a capacity and a single pointer to a block of memory that can grow. And when we append the number, we need to, and since the capacity is already full, like we had capacity for two elements, we need to create a new block of memory, which is big enough to contain all three numbers. And we need to do something with the old memory block. And usually, you would say it's a realloc in C and it would free the old block immediately. And now this is the most effective way of doing things. However, it causes a problem, and that is, is that? Yeah, okay. And the problem is that if I have other aliases to this pointer, I must ensure that it doesn't cause a dangling pointer. So here in line two, I say I have these other variable, and it should have the same contents as some numbers. And if I do a shallow copy and just copy all the bits, then I would copy the pointer, which is invalidated in line three by the append, causing this to contain a dangling pointer. So that would be very, very unsafe, and it's a very bad idea. So to solve this problem, there are a couple of solutions. One is to deep copy the elements in the container, which is what C++ does, and also what NIMP semantics do. You could also say, okay, so let's have a pointer to a pointer, so everybody gets the new update. This is done in Java and C sharp, I think. But it's slightly less effective efficient because then you have another indirection. You could also say, well, this is an assignment, but it's a bad assignment, so let's just forbid it. This would be a terrible solution, but yeah, you could. The first solution, as I mentioned, you just have a garbage collector cleaning up this bad pointer for you, or only if no other variable refers to it. Finally, we could move it, and that is the fifth point here. So we could steal the block of memory and perform a move, and that's also available in C++. So this would be an explicit move here in NIM, so you can do this. You can say, I'm gonna move these numbers over to other, and then afterwards the source is invalidated. So it becomes an empty sequence. And so if you then append the three, this is the only thing that's left inside there. So as you can see in line six, after that some numbers only has the three inside. So this is the explicit move. I mean, you can try to program in this style, and it's not really pleasant. So but if it's explicit, it's okay. Like you are aware that some numbers is empty afterwards. But there are plenty of cases where you can move implicitly. The first example, famous, if you have a result of a function call, you know it's not gonna used afterwards, so you can move directly into the variable A. Yeah, and then you could also say that if you know that it's not used afterwards, this is what you can do, you can move it. So and one design goal was to make this work. Like okay, we know function calls can be moved, but I want to be able to name my results for readability without performance overhead. So as long as named value is a local variable, the NIM compiler can see that named value is like it's used for the F call and that not afterwards anymore. So it would move the value, the named value into the F, and then it would move F's result into A. And here's another example. So I have a list of three integers inside. And if I say Y is X, then since X isn't used anymore, we can move and likewise for the set equals Y. And so this works for local variables. So let's think about parameters to cause problems because we don't know if the value that's been pushed to our put is used afterwards. So this example is about like it's pseudocode for a hash table implementation. I mean usually it would more be more than two lines, but so we hashed the value. We want to move this key value pair into the T. And given the current semantics, this would mean to make this expensive copy operation here. But you can annotate this parameter values to use the sync keyword. And then it's like the constraint that afterwards it shouldn't be used anymore. It bubbles up to the call chain. So now because it's a sync parameter, we know it won't be used afterwards. And we can perform the move in line three. So again, if I have values like a list with three strings inside, and I don't use them afterwards, I can move. Now what happens if I use values afterwards? Then we, since we want to take ownership of the guts of this object, the compiler produces a warning for us telling us like you are about to sync something that is used afterwards and I will make a copy for you. So to ensure safety. So this has also been a design criterion. If you get it wrong, the performance suffers, but no weird crashes place. So and that's true. And the compiler warns about the performance aspect. And currently this warning is overly like it's a bit too aggressive. So I need to make this a bit better. So one solution here would be you move it around. If you echo the values before you embed it into this hash table, then it would work because the compiler knows echo doesn't want to take over ownership of values. But table put does because of this sync annotation. So that's one solution of course, like if you are just adding some code for debugging purposes, you don't care if it causes more copies or not because this code will be removed soon again afterwards. Okay, so as I said, it's the sync parameter is an optimization. You don't have to use it. If you get it wrong, performance is worse than before. If you get it right, you get better performance. And we're also working on inferring this property so that you don't have to annotate it at all. Because actually I went through the standard library trying to add these sync annotations everywhere and I was like, yeah, no, I'm not going to do that. I let the compiler figure this out. So anyway, here are a couple of favorite examples. So we have a hash table and this is this put putter or whatever, like insert or update. Then we have equality on some generic type T or plus on T on finally append or add on this global sequence. And the question is where to put the sync annotation. And you don't have to guess, I'm telling you. So, sorry, it's not really. Yeah, okay. So embedding stuff into a hash table takes the sync annotation and the append for the sequences takes the sync annotation. And now here is, this is an, so the first line is an insert or an update. And if I insert into the hash table, I also want to take ownership of the key. But if it's just an update on the table, I already have the key and then what happens? Should this be a sync or not? Well, I don't know. But the thing is, if you do this with a sync, the compiler will actually ensure that this value is consumed for all cases. So you don't have to do that. And there is some notion of what it means to consume something. So we are going into destructors anyhow. So there's a different problem. Okay. So now I can put stuff into a hash table very effectively. That's good. How about, how do I get values out of it? And the game, again, the same problem like, result equals is the same as return statement in this case. But I wrote it as an assignment so that it's more obvious that this, again, is an expensive copy. So, okay, we can now try to move this. And then you would, the compiler will complain that T is actually not mutable. Like, you cannot move out of it because move mutates the source. Okay. So, and then let's, let's make it mutable. Okay. This, this works. But now you need to think like, what, what happens? Like, you move the value out of this table. So you can access it exactly once and then there's, it's, it's gone afterwards. So that's pretty bad. Unless maybe, I mean, if you have a pop operation for your stack, that's exactly what you want. But for a hash table, it's pretty shitty. So yeah, we need another annotation which is lending a value or lent V. And this is then a borrowing operation. So in Rust, this would be a borrowed cop pointer. In C++, it's a ref. So it's, it's actually the same thing. And yeah, you, we need to ensure that the, once you borrow that this doesn't outlive the, the collections lifetime and stuff. But it's, it's, yeah. It's like in Rust, but not like in C++ because where it can't be checked. Yeah, okay. So the point is in Rust, it would be checked and in C++ it wouldn't. And in NIM, it is checked except that we need to be better. So, okay. So now that we have, now that we understand how to optimize complex assignments like deep copies or whatever you want to call it, we can apply this knowledge to something else like take reference counting. The reference counting is basically the pointer assignment just simply got way more expensive than it used to be because if I copy a pointer around, I need to increment the reference count of the source. I need to decrement the reference count of the destination and then I can do the pointer copy. But if I'm able to move the pointer, then that could just be this bitwise copy and maybe nilify the source afterwards if, if required. So this insight led us to the development of a new garbage collector mode. I mean it's called GC but GC is actually NIMS name for any kind of memory management that you want to. So, and here I have a benchmark. This is the binary, like this is a standard benchmark for throughput of a garbage collector. And so I'm not, I don't expect you to understand all of this. But the point is now here all the annotations like sinks and lens, they are not there. But even so they work under the hood for us. And so we create binary trees and then trillions of these to some depth. And this is the main part. As I said, this is standard benchmark and the results are really, really nice. So we have a couple of garbage collectors so we can compare all of them. And the new one is fastest by quite a lot. Like a factor of three or two or whatever you want to compare it with. And memory consumption is about the same as before. For BermGC I haven't been able to figure out the memory consumption precisely. So that's not available. So this, yeah. So now the question is, okay, this is very better than before. How does it compare to manual memory management? And NIM can do both. So you can use your own PTRs. So previously this was a ref in line four. Now it's a PTR. And to make a tree we have this nasty allocation with a cast in line 12. And of course we need to free the tree manually. So this is a recursive free. So first free the left and the right and then deallocate this node. And again this, and now in the main part we have to free these trees manually which is very annoying. So in line 18 for instance you can see this. Or in line 15 where you actually had to introduce a new temp variable just to be able to free it later on. So, and the result is it's still slower. I'm sorry. But here is the thing. What Arc actually does, it does optimize reference counting. And what the manual version does is basically I don't have a reference count because I know these are unique pointers. So if you add just the machine word for this reference count back to this manual version, it's back to almost the same to six dot two seconds. Whereas Arc is at six point seven seconds. So there's still, and the memory consumption is identical under the assumption that I fixed this one buck. That's left. So we are getting close to manual memory management. And for this particular benchmark I think we can get to the difference into the noise level. But no they are not. We will get to that. So I'll get to that. Okay. There's a different benchmark for latency. I don't have the source code for this.  And the latency was 0.0.3 milliseconds for this benchmark. And now with Arc it's better by over a factor of three. The total runtime has been reduced also. And the peak memory consumption is also better. So not just throughput is better but also latency. Now I've already outlined it. So what's going on under the hood is that we have destructors and move operators and assignments.  We'll see in a minute. So you can now make your files close automatically after you. So that's very nice. And there's better composition between these custom containers. Previously we had manual memory management and GC memory management. You must be careful not to mix them because it doesn't really work well. But with these extension points the interop between these two worlds is much, much better than before. So here's another thing that we now can do. Again the same benchmark but now we want to have some object pool. I think it's better called an arena. So we have an arena allocator still dealing with these silly nodes with only have two pointers inside. So to allocate a new node we basically check if there's a capacity left kind of like for a sequence. But the node itself is an unchecked pointer so we take the address of the element in the array which is the backup storage for our node. And now here we can say look if you want to copy a pool it's not supported because I couldn't be bothered to implement it. So if you try to copy the full pool around accidentally the compiler will complain and tell you like no you can't. And if the pool goes out of scope the destructor is called so this is in line three and of course what do you do in a destructor? Well you free the blocks of memory that's been and they have been chained in a linked list via this next pointer. And then you need to change the program unfortunately so if you want to make a tree you need to be aware of this pool where to get the new nodes from and so this becomes a parameter of this make tree and recursively you need to pass it on as you can see in line 11 and 12 and now the bench. Okay. And now it's a bit easier to use because these pools are free for us afterwards automatically. And in this case I had to make two pools like one for the long lift data and one for the short lift data so that you can see this in line five and 14 and the question is how does it perform? So that's the result it's still much faster over a factor of two performance improvement and memory consumption is roughly the same I mean. So yeah. Okay so in summary move semantics mostly work under the hood for us they give us really good optimizations five minutes left. Yeah we have seen the speedups and they make the memory management deterministic so what's actually the case here so if you use a reference counting scheme and optimize it what you can do is you can attach a cost model to your programming language and once you do that you get into the realm of hard real-time systems so you can use NIM for hard real-time system with this technology we have seen it improves throughput, latency, memory consumption and threading well I don't have an example but as you can imagine if you can move data from one thread to the other it's and because you are guaranteed that this is kind of the last user of this data you cannot have data races so it's a very nice feature of that yeah it also improves the ease of programming like just imagine your files close automatically and your sockets and we get a better composition between these different container classes let's say okay yeah you can play with these benchmarks I have uploaded them to GitHub and yeah if you don't know already this is our website and the forum and we are active on IRC as well so that's my talk thank you for your attention also the next speakers will come up and start preparing okay questions yeah so is this available right now or is this still a work in progress well it's on GitHub in the development sorry I need to repeat the question is how to get it it's not in the version one of the language well it will be our next major release this year but you can already use it if you want to if you use the development version of them yeah yes the threading no okay oh sorry sorry okay next question yes for what ah owned refs so yeah we've been tinkering with owned refs which is kind of unique pointers NIMS style but I did these benchmarks and I noticed that it doesn't pay off like it's it's so for instance you can use this binary tree benchmark with owned annotations and use this new runtime and I got the same number so in this case we didn't see the benefit and so currently we do not know what to do with the owned yes so my question was how do you define visible after and in particular how subtle are you when the if statements and stuff like that okay okay so the question is okay void safety void safety very like from so void in Eiffel Eiffel yes yes void safety okay okay okay okay okay so two questions the first was how do we know that it's the last usage of a variable the answer is we have a control flow graph and we track these precisely ah well it's in it's conditional then we notice like say you move it in every case then or you how to put it let's say you move something in a loop and it's used it's moved every time except the last one yeah we notice that I mean the compiler will tell you I cannot move because you use it for the next loop iteration no exactly we are smart enough about it in practice okay yes the second question is void safety on ill-ability it's ah it's also like work in progress like we want this not nil annotation in the language to to guard against this and you're right like if you use an explicit move you need a value to have afterwards to put inside the source and then you need to make the pointer nil-able just for that right but if you use an implicit move we know it's not going to use afterwards so we can simply pretend that nil is not a really value for your pointer so the reason I was pointing to void safety is because in the case of iPhone I decided to have things like if, blah, then else and I can say for instance if my test is specifically on this test then the then part is considered to be void safe and the else part is not we do the same thing for moves we decide that if I have my move semantics inside an if inside if I'm in the position for the test then I can keep the move semantics in the else I cannot that's what I was referring to for the next one I need to think about it you do have time for another question if you want really? ok, more questions we'll have to wait ok, it's not actually a question ok, good I just want to say a big thank you because I learned a meme last year in Boston in a presentation landing talks and I have to say a big thank you because you saved from the dilemma if I had to use Go one last time like the other you're welcome


We should be live Welcome everybody We're just taking one or two minutes to let everybody get joined Properly and settled in before we get started So hang tight and we will get started in just one or two minutes Welcome everybody. Oh, yeah, sorry talked over you there But while we're waiting if you want to open up the chat on the bottom toolbar and let us know Where you're joining us from and what kind of work you oversee we love to hear from you Awesome got everyone joining really fast Welcome everybody For those of you who just joined we are just waiting one or two minutes to let everybody get joined properly before we get started and Like Cara mentioned if you want to chat with us using the chat tool Please do it's really fun for us to get to know you all a bit better before we get started You can let us know where you're joining us from and what kind of work you oversee Looks like a few people are chatting in we have a salon in st. Louis, Missouri Carnival owner in Long Island and Diagnostics in Williamsville. Thank you for joining us today We have seen a lot of different account setups and we're excited to give you a little preview of what one ever can do Police department in Nevada. We definitely schedule for a lot of police departments and fire departments Definitely car and I have been working with bunny work for quite some time and we have seen so many different setups So many different companies that come in and chat to us and then we help, you know on board and get all set up So we are able to schedule for so many different types of companies. So welcome everyone Great. So many people are joining You don't want to wait too long So I'm gonna make the most of our time, but I want to make sure everyone is settled before we get started Thanks for everyone that chatted with us again It's really great for us to get to know you all a bit better before we get started It helps us kind of inform where we take the questions and how and you know, what kind of setups we talk about So thanks for chatting with us Looks like we can probably go ahead and get started So I just want to say welcome one last time to everybody to the live Q&A We're so happy to have you all join and we're really excited to help you get started with when I work So during the next 30 ish minutes, we're gonna be answering your when I work questions We're gonna show you some ways that you can save time scheduling cut down on overtime costs and cut down the time It takes you to run your payroll But the content of this session is gonna be directed by the questions that you ask So make sure to ask any questions that you have The questions are gonna be flowing in and we're gonna get to you as many as we can if not all But if your question doesn't get answered or you come up with a new question and you want some further help and guidance You can always chat with us after so listen for more information on how to get in contact with us We'll go over that during the webinar and also at the end with our Resource packet that we have for you all if you're totally new to when I work and just checking out your account And the different plans that we have We're gonna outline those plans and how you can go about upgrading your account at the end If you really liked the tools that we're gonna show you today And if you're joining us from your existing when I work account and you're already kind of going with your plan I'm really I'm really liking it, but just have a couple of questions So we're we welcome you as well and we're happy to answer any questions that you have So we can go ahead and get started The live Q&A works with the Q&A button So we're gonna turn off the chat that we've been using just to get to know you all a bit better Just to take up that time and we're gonna be using that Q&A button So you can pop your questions in there now or at any time during the webinar Kara is gonna be going through those questions and kind of grabbing as many as we can We might rearrange some questions depending on where we are within the product But we will try to get to everyone's questions So as I share my screen, you can put your questions in that Q&A I'm going to be sharing my screen and giving you a little bit of a demo And a walkthrough of the answers to your questions on my actual when I work account Just so you get a better visual of what I'm talking about So as I swap my screen over feel free to just pop your questions in that Q&A All right, Kara. Can you see my when I work screen? Yep, I sure can Awesome. So I am logged in right now as the admin on my account Or just essentially the person that started and opened the account Um, this is your main Scheduling page kind of the place where you'll spend most of your time and when I work creating the schedule The top menu bar is where you can navigate to all of our different platforms including attendance and our workshop tool The menu bar extended over to this right hand side is going to be where you can add in any information into your account Um, and then including your settings so you can change any settings within your when I work account When your employee is logged in if they do log in on a computer like I am now It's just interesting Kind of notable to say that your employees will see a screen or a setup. That's pretty similar to what you're seeing right now They won't have access to seeing information that they shouldn't changing any settings or you know scheduling anyone But they will see a setup that looks pretty similar to this so you can kind of get an idea Of what your employees might be seeing as well But with that we can go ahead and get started with questions Sounds good. We got some questions rolling in. This is a great one that I always like to start with Andy is asking how can I create shifts that employees can pick up themselves? Awesome question and this will bring in the open shift tool and I think it's a really cool tool. I really enjoy um talking about it and talking about it with when I work so Just a quick background for those of you who are new to scheduling and when I work Most of the time or generally not most of the time, but sometimes Your you will be scheduling out shifts directly to your employees So you can see your employees down this left hand side and then all the days of the week at the top Each cell corresponds with a specific day and a specific employee. So what you can do is you can Set shifts directly for your employees just like that just by clicking into the cell and selecting a shift Or clicking into the cell and creating a custom shift this will Directly schedule out those shifts to those specific employees for them to see on their end And check and view on their end If you don't want to set your employees up with shifts specifically for them You can also use the open shift tool So the open shift tool will allow you to build out all of the coverage or any shifts that you need covered at your workplace And then when you publish them out your employees will be able to grab those shifts first come first serve based on their qualifications like the position tagged to the account Or the other tags or other qualifications associated with that shift So right here you can see that I have three open shifts in this green section up here To add them to add new shifts into the open shift section You can just select one of your pre-made templates or just create a new custom open shift If you don't want your employees to be grabbing those open shifts first come first serve Again, that is based on their qualifications for positions and sub tags If you don't want them to just grab those shifts first come first serve based on when they're available You can turn on our pickup approval or shift bidding system Or we even call it shift requests sometimes. So when you turn that on for a new open shift Your employees will be able to sign up for the shift or I like to think of it as raising their hand Saying I would like to take that shift. I'm available and I could pick up that shift Then any manager or admin in the system will be able to go into their shift requests And see all of the employees that have requested to take a particular open shift And then they can actually give it to one of those users that they want to actually take that shift at the end of the day So this kind of um marries the idea of using the open shift But having a little bit more control over your schedule and who takes those shifts So, um, you always be sure that the right users are picking up the right shifts at the end of the day So those are your two options with open shifts But definitely check it out if you are interested and maybe dabbling with the idea of more of a flexible Self scheduling type workplace. It's really cool and employees tend to really enjoy it Awesome. Yeah, just going off of that Michael mentions that he wants to schedule staff Based on if they have a car or if they're called They will carpool and I think tags would be a great option for doing that within the open shift This is another layer of qualification that you can add to the shift to make sure You know people who have a car picking up those shifts people who need to carpool are picking up those shifts I think that would work really well for that That's a great point tags are really useful for all sorts of things like that And where you can create those is just under this Shopfront icon and into your tag tool. That's where you can add those tags that will show up When you go to edit your shift Thanks, Marie. So our next question is from Tyler. Is it possible to have multiple schedules for multiple purposes? Example works in healthcare and there may be a staffing schedule staff A schedule for workers who are on call that day, etc Definitely We do have a multiple schedule tool and this can be used for a variety of different reasons Including just splitting up your workforce into different types of schedules that you need covered So where you find those schedules that you have created would be on this left hand side here You can pull down the menu of all the different schedules that you have created and you can easily toggle between those schedules Under your employee list by hovering over the shopfront icon again and tagging your employees This is where you can assign them to the schedules that they are able to be scheduled on So right here. This is where the schedules live within your employee profiles And right now all my employees are tagged to all the schedules I have but you're able to customize this under their assignment tab This is where you can add or take away any schedules that they're available To be assigned to and to work at And Then you would be able to create any schedules under this shopfront icon again And then into your schedule list This is where you can add or delete any new schedules into your system And you can add schedules that are maybe a different location But it doesn't have to be a new location if you just want to split up your workforce maybe an on-call schedule or Different departments different qualifications. You can always split up your schedules by that too It doesn't have to be a remote location or anything like that. You can use it for departments teams qualifications things like that Back in the scheduler. I'll just show you one more time how you can be toggling between Any of those schedules within your account if you just toggle back and forth between them If you have an employee that is tagged or assigned to both schedules You will be able to see any shifts that they have scheduled on their other location or other schedule So that way you can make sure that you're not double booking anybody when you are using multiple schedules With the same set of employees or same employee on both You can see here that Chandler is scheduled on the other schedule And when you click into his his cell to schedule him for a shift any shifts that Conflict with the other schedule will be grayed out and any that don't will be highlighted So you are able to schedule for that day So now you can see that we have two schedules with two different shifts for that one employee So, um, again, I would use schedules for literally anything that you need to split up your team by in the workplace It's really up to you Our next question is from brad is when I work capable of scheduling eight hour shifts My department has a day shift swing shift and grave shift I think this will be a great way to highlight shift templates and how if you have the same shift you can schedule it over and over with that Definitely Yeah, and Short answers. Yes, you can schedule eight hour shifts in when I work And I can show you how you would do that from scratch And then how you would do that with our shift template tool and then I'll show a couple of Tricks to quickly schedule all those shifts out if you need to copy them or schedule them in a new week So just to schedule a shift from scratch right within your scheduler. You're just going to be clicking into the cell Whether it's a specific employee cell or an open shift cell It will be the same And then you can just choose custom shift This is where you will add a time So we start and stop time for your shift you can do eight hour shifts 16 hour shifts whatever works And you will be adding a position So the qualification or what your employee is working on during that shift And then there's a ton of other information that you can add if you want to including job sites sub tags task lists things like that Once you save the shift that you created It will show up in your schedule just like these little colored boxes depending on what color you choose and what color you're viewing If you want to save your shifts that you create for use at any other time You can save them as a template when you make them You can also create and save new schedule shift templates Within this shot front icon. This is like a very well used icon. So remember this And you'll click into your shift template list This is where you can see any templates that you have created and saved and this is where you can also add new templates These again are just going to be shifts that you've created and saved and that you can load into any day depending on your employees positions and tags So once you've created all of your shift templates back in the scheduler You can see when I click into the cell for the employee Any of their qualified shift templates that you've already created will pop up so you can easily add those into the days that you need Just like this And when you have created your shifts in for those days If you want to copy that shift add it into all the other days of the week or add it into a new employee You can do that as well. It'll just hold down your command button Click onto the shift Drag it and drop it So it's really easy just to create a whole week of shifts If you know that you need those worked often you can also also copy it into another qualified employee You'll get a thumbs up if your employee is qualified And the thumbs down if your employee isn't qualified based on their position if you want to also Copy your schedule from one week to the to the next you can using the wrench icon as well So you can use that to copy the previous week into the week that you currently are in If you just want to quickly copy that over And you can do that based on individual employees as well awesome All right Next Shana is asking she wants to just start with scheduling But eventually would want to add on the attendance options. Can we just have a little bit more info about attendance and how it works with scheduling? Definitely So just for those of you who don't know what the core of when I work we have our scheduling tool And this is what every account in when I work will come with so that is scheduling your employees for shifts If you just want to start with the scheduler and then add on any tools Afterwards you definitely can do that. You're not locked into kind of what you've purchased or what subscription you've purchased You can always add on users or add on products like the attendance tool as you go But you would start out with the scheduler If you want to track when your employees are actually working You can do that as well by adding the attendance add-on And this essentially is just having your employees clock in and clock out for the times that they're actually Working and this works really beautifully with our scheduler So you'll be scheduling your employees when to work and then having your employees clock in for their actual time worked All within your one when I work account. It's really cool So i'm just going to hover over the attendance tab here to click into my time sheets This is your landing page for the when I work attendance tool And again, you can add this on to your account whenever you're whenever you go You don't have to start with this if you want to use it a month after you've started with us You definitely can it doesn't matter So again, this is the landing page for your attendance tool This is where you can toggle to all of your different employees time sheets You can view all of their ins and out times and any details of the shifts that they're clocking in for So this would include maybe a break if they clocked for a break Which schedule they're on which position they're working for Maybe which job site or location they're at and they can also even add a note If they need to let you know something upon clock in or clock out Up here. This is where you can move between all of your different payroll periods Close out your payroll periods and produce your payroll summary Users can clock in and out three ways on when I work The first way would be logging into their account just like I am right now on a computer Hovering over the attendance tab and just simply clicking clock in to clock in for their time and they would do the same to clock out If you want you can also add a time clock terminal So this would be locking a device like a computer tablet or smartphone at your work location And it would be locked as a time clock so your employees could come and arrive at the workplace type in a code Or their email and that would clock them in when they're on site You can lock the a computer as a terminal just by logging in and clicking lock as terminal And if you are on a tablet or smartphone, you would be downloading the when I work terminal app from the apple or google play store And then the third way to have employees clock in and clock out on when I work and I always kind of think and say this is the most popular way Employees tend to really like it. It's our mobile clock in tool So when you turn this tool on your employees would get a big green button on their when I work app on their mobile phone And they would just click that button on their mobile phone to clock in I'm just going to hover over my gear icon and hop into my attendance settings to show more about this tool So again, when you turn on the clock in with mobile app tool This is when a big green button will appear on your employee's mobile app home screen And they'll be able to touch that to clock in And the question that always comes up when talking about mobile clock in Is when is if your employees can clock in and out from wherever they want if they are using this tool And the answer is yes, if you want them to you know, if you want your employees to be Clocking in from wherever they are. That's fine But you can always always also turn on the geofence to restrict where your employees can clock in and or clock out All you will do is just choose the distance from the scheduled location that your employees must be at to create that little fence And then your employees won't be able to clock in until they are on their scheduled site So that is their schedule address or their job site address attached to their scheduled shift So this does give you another added layer of management from when I work And it'll make sure that your employees are clocking in from the right location at the right time perfect We have a question from noelle. How difficult is it to set up and someone to manage who's not entirely tech savvy How long does it take to set up and I could speak to this for a minute? It really depends on the number of employees that you have on how long it takes to get set up And what the different settings you'll be configuring But I have seen people get started set up within the same day They're rolling with clocking in and clocking out and checking their schedules So Marie is going to go over in the end how you can reach out to us over chat And we'd be more than happy to walk you through any setup questions you have that are specific to your business We're here to help we want to make sure that you get rolling and Start using when I work as soon as possible Definitely It's so true. I think when I work we're good at making it easy to get set up We have a built-in onboarding structure. So when you hop into your account It will walk you through the steps of getting your account set up and like like you said car It depends on how many employees you have but getting your account set up is actually very easy and very fast Um as you go through the onboarding, you know, all that you have to do is configure your settings add in your employees And basically start scheduling your shifts and depending on how many shifts you have and how many employees you have This takes more or less time But we have seen an onboarding go really fast and when I work And if you aren't tech savvy, that's okay I actually wasn't either when I set up my when I work account And it's very fast and easy to get a feel of what this system entails and what you need to be successful And we have a really awesome need help tab This pops out the help center if you have any questions as you go You can type in a keyword or a question and we have a ton of articles for you And we also have a training center and kind of a get started packet I always like to think of it as so when you hop into your training center You can watch videos and a full onboarding training Um Video it's like a video stream and you can really use that to get started if you are worried about How hard it will be for you to get started or for your employees Definitely take a look at the management training and the employee training we have training for your employees too And this will really help as you're getting started And then of course you do have us Live as you get started you can chat with us using the green chat bubble And if you get stuck anywhere or have any questions You can always chat with us as you're actually getting your work your when I work account started So you do have support if you need it as you get started But we are generally really quick and easy to start using and kind of start understanding our processes So never fear. We are here to help Absolutely All right, uh looks like our last question here is about the plans that we offer Definitely I actually can switch my screen over again And I have a little bit of information built out so I can talk through the different plans that we have And then we have more information and helpful resources at the end as well So we have really condensed and made our plans very easy and simple We have a small business scheduling plan for accounts that have under 100 users This will include all of the information that I talked about scheduling and messaging wise So this is going to include all of the scheduling availability Communication work chat things like that tasks positions And if you need any of the time clock tools so time clock and attendance You can add that on to your small business scheduling plan This is going to include what we kind of talked about at the end That's going to be the mobile clock in the clocking out on your computer time tracking time sheets and payroll And you can add this on to your scheduling plan When you upgrade or at any time during your subscription So if you start with just the scheduling plan You can add the attendance for like a prorated cost at any time during your billing cycle If you just want to start out just scheduling and then eventually adding attendance That's fine too or you can just add it all right away We're really flexible as far as that goes And you can actually find all this information directly from within your account So when you do log in you can click to account and billing And then it will pop up your account and billing page where then you can choose upgrade my account And choose the tools that you need and there's more information on what the features are within there as well If you want to refresh your memory on what each plan offers And you can toggle on which tools you need and then choose your billing frequency monthly or annually And then you will choose the amount of users you need in your system And it will calculate what your price would be depending on all of that So it's really easy to actually just get started from right within your account But if you have any questions as you go, you know, what's the right plan for me? Where should I get started? How do I get set up is when I work even for me? We're here to help every step of the way essentially So you can whoops you can reach us via the little chat icon from within your when I work account on the bottom right hand corner You can use the need help tab to get some self-service resources And if you don't have an account yet and you just want to chat with us kind of get You know get everything rolling, but you haven't started your account You can reach us at getting started at wheniwork.com and we will shoot you an email back and this is all pretty fast We've got some great people on our team and we're you know excited and ready to get you all started as As fast as possible So if you take a look at the chat tool that we that we were using at the very beginning We have just sent out a little onboarding packet. I like to call it It's just all of the most helpful resources that we've compiled for you all And if you copy and paste this onto your computer This will have all the links and all the resources that you need to be successful and get started We've got the sign-up link. So this will help you sign up for your account for your trial And then all of the resources like our demo video help center training center all of those links are linked in there as well So take a look at that And this will help you out and then again if you have any questions as you go You need help onboarding or just need some advice Definitely chat with us as you get started because we are here to help So with that, thank you all for your questions They were great questions and thank you all for taking the time to chat with us And to join this webinar Thanks everybody


So, then the one small point is, so in order to solve the pivoted system, so recall that our goal was actually to solve Ax equals b in some computationally efficient manner. So, what we will do is, okay, so if we have Lu equals Pa pi, then since P P transpose equals P transpose P, this is the property of permutation matrices is the identity matrix and a similar thing holds for pi, that means that if I pre-multiply by P transpose Lu pi transpose is equal to this matrix A and so I will use that here P transpose Lu pi transpose x equals b. And so what we will do is, we will set y equal to u pi transpose x and z equals pi transpose x, then we solve Ly equals Pb, so I am multiplying this by P, then we solve uz equals y and finally, we compute x equals pi z. So, basically if rows of A are permuted, then the corresponding entries of b must be exchanged, so that is what Pb does. If columns of A are permitted, then the corresponding elements of x have to be exchanged, that is what pi z does. So, this is how you solve the pivoted system. Now, the last point that we have not discussed is, what happens if A is ranked efficient? So, the point is that the pivot elements are guaranteed to be non-zero, only if A is not ranked efficient, if A is ranked efficient, then the pivot element will go to zero at some point.  And so then we can simply set Pk equals pi k equals mk equals the identity matrix for k equal to r plus 1 all the way up to n. So, once we see that this sub-matrix has become the all-zero matrix, we do not have to do any more Gaussian elimination steps. So, we can terminate Gaussian elimination after r steps. And we will get Pa pi equals matrix that is an LU, but it is L11, which is going to be r cross r, 0, L21, which is of size n minus r cross r, and then i r times u11, which is again of size r cross r, u12, 0, which is of size n minus r cross r, and then 0, which is of size n minus r cross n minus r. So, this is the kind of form you will get. So, in fact, this can be used to find the rank of a matrix, but in practice, you will need to have a threshold on the entries of this matrix to decide when you are going to call it the all-zero matrix. So, I think these things will become very easy to, I mean very clear to you, if you were to try to do these Gaussian elimination steps using a rank-deficient matrix. So, pick your favorite 3 cross 3 or 4 cross 4 matrix, make it rank-deficient. So, for example, write down three arbitrary columns and then write a fourth column, which is the sum of those three columns or something. Now, it becomes a rank-deficient matrix and then try to execute the LU decomposition on it with pivoting. And you will see that there will be a, after r steps, this sub-matrix will go to 0, and so you can stop the Gaussian elimination there. So, what we just discussed about pivoting is actually called the full pivoting algorithm. It gives you maximal numerical stability, because at each stage, it is pulling the biggest magnitude entry in akk of r minus 1, a, sorry, a22 of k minus 1, and putting that to be the top left entry. Now, but then that is also maximally numerically expensive to compute because you have to compare at least, so akk, sorry, a22 of k minus 1 has n minus k plus 1 is of size n minus k plus 1 cross n minus k plus 1. So, that many entries need to be compared in magnitude and you need to find the biggest entry, find its location and then do a row and column exchange. So, as far as numerical computation is concerned, this increases the computational complexity of the Gaussian elimination. However, I mean, so people also sometimes do partial pivoting, where for example, you may only perform row operations. In that case, you will have the P matrices as discussed above, but you won't have the Pi matrices. You won't do the column exchanges. This can reduce the number of comparisons required. And of course, there are cases where pivoting is not required. So, for example, in what are called diagonally dominant matrices, a matrix is diagonally dominant if the magnitude of the diagonal entry is bigger than the sum of the magnitudes of all the off diagonal entries in the same row or the same column. Then the such matrices are called diagonally dominant matrices. And for such matrices, pivoting or row and column exchanges are not required. Or in other words, even if you did that, it would just return pk equals the identity matrix and pi k equals the identity matrix each time. So, you don't have to do those comparisons. So, in some cases, pivoting is not required. So, this is kind of an area in itself on how to efficiently compute the LU decomposition. There is a lot one can say. But for the purposes of this course, I think this is for you to get an idea of how it is and how it is done and what it is is sufficient. There are a few other useful modifications of this LU decomposition that one often considers. So, I will highlight them a bit here. Modifications to the LU decomposition. So, the first is what is called the LDM decomposition. It is also often called the LDM transpose decomposition. This can be done if there are no zero pivots that are encountered in the Gaussian elimination process. Because if you encounter a zero pivot, it doesn't mean you can stop there. You can stop there only if this entire matrix AR of r plus 1 through n and r plus 1 through n, that sub matrix of AR is all zeros.  But if no zero pivots are encountered, the Gaussian elimination process, then there is a unit lower triangular L and M, both are unit lower triangular. That is why we write it like this as M transpose and diagonal D such that A is equal to LDM transpose. So, essentially what we are doing here is since A is equal to LU, what we can do is this exists. So, we let U is equal to D times M transpose where DII equals UII. Basically what this is doing is each row of M transpose is equal to the corresponding row of U divided by this element UII. So, it is just extracting the diagonal entries and pulling them out and writing it as D times M transpose. So, this gives you a decomposition of this form where L and M are both unit lower triangular. So, then if you were to again, if you had to solve Ax equals B, then you have LDM transpose X equals B. So, what we will do is we will let Y be this part here, B M transpose X and solve Ly equals B, then we let Z equals this part here M transpose X and solve DZ equals Y. This is a diagonal matrix. So, this is easy to do. And third step is you solve M transpose X equals Z and obtain Z, obtain X. So, and in particular, if the matrix is symmetric, then you can actually have a decomposition of the form LDL transpose decomposition for symmetric matrix. So, the idea is that if A in R to the N cross N is symmetric and non-singular, then L equals M. So, LDM transpose becomes LDL transpose. So, this is not hard to see. So, since A equals LDM transpose, that means that M inverse times A times M to the minus transpose is equal to M inverse L times D. I just pre-multiplied by M inverse and post-multiplied by my M inverse transpose. And these are unit lower triangular matrices. So, their inverses always exist. So, this is M inverse LD. Now, M is lower triangular. So, M inverse is also unit lower triangular. So, M inverse L times D, D is diagonal. And so, this whole thing is actually still lower triangular. And A is symmetric. So, M inverse A, M inverse transpose is symmetric. Now, the only way a symmetric matrix equals a lower triangular matrix is if it is a diagonal matrix. So, basically, M A M minus transpose is diagonal. And if you call it some D dash, then you can take M times that and then M transpose multiply on the right and you see that A is equal to LDL transpose. It is of that form. So, basically, D is diagonal and non-singular. And so, basically, we have just showed that M inverse LD is diagonal, which implies M inverse L is also diagonal. But M and M inverse and L are unit lower triangular, which implies that M inverse L is unit lower triangular. But if it is lower triangular, the only unit lower triangular matrix, unit lower triangular matrix that is also diagonal is the identity matrix. So, that means that M inverse L equals the identity or M equals L. So, basically, the decomposition of the form LDL transpose. Okay, we stop here for today. And the next class I will continue with another closely related decomposition called Cholesky decomposition. And that is applicable to positive definite matrices, positive definite Hermitian matrices. And that will lead our way into a detailed discussion of Hermitian symmetric matrices and positive definite matrices, which will occupy several weeks of further lectures.


Our next speaker is a lawyer, he has his own lawyer office and he is working with free software. Please welcome Mika Ehrich-Demann. Hi, thank you for the introduction. I'm really happy to be here on stage for the second year in a row, talking about free software. When talking about digital sovereignty, my stance is that it is only possible with free software. Let me introduce myself. I'm a law professional, I studied law at the University of Cologne with two state exams as mandated by the German law. I worked as a lawyer for quite some time, also as a freelancer. As a law professional, I have an interest in free software and this is why I'm a member of the legal network of the free software Friends Europe. As a freelancer, I also joined the open office project and together with friends, I also founded an association, which I'm also the chairman of as I'm a law expert. It's a now an overview of my talk. First, I'm going to talk about what is sovereignty because we have to have a closer look at the concept. Then I'm going to talk about free licenses and the third question I want to look at is why is free software needed for digital sovereignty? Digital sovereignty has become a buzzword, one has to say. Everyone's postulating it, every company, every community, every country, every association. The umbrella organizations are postulating it, so there's not a day where digital sovereignty isn't postulated. I think digital is a clear term at least here with our audience, but what does sovereignty mean? And this is what I want to talk about now. If you look at the definition an old man like me would do that in the Duden. And in this dictionary it says sovereignty is the highest order of power. Okay, then the second definition is the independence of a state from the influence of other states and the third sovereignty being secure and able to navigate the world on your own. This would be a dream in terms of software. Now synonyms are also listed in the Duden. But Torchdeny is listed as a synonym. Now there's a city called Homingberg which wanted to be digitally sovereign and it resulted in half of the city being actually had a half of the city's IT department being actually sovereign, creating their own programs. And employees of the city did programming courses and now are writing their own programs. It doesn't really work like that. It would be very ambitious even for Germany. And also for Europe it would be a real challenge. Autonomy means that you can define on yourself on your own terms. Then sovereignty, then maturity is also listed as a synonym. So that also goes into the concept of as being superior. It means that you have experience and skills in what you're doing. Then self-reliance and self-government, self-management and supremacy. What does that mean? Am I superior to other people or am I superior to the cause? Independence and a position of power. Well, this is a word you shouldn't maybe you shouldn't use in this context. So when talking about sovereignty you encounter Karl Schmidt sooner or later. This is a man who had some interesting views to put it mildly. And he was also kind of keen of the national socialist regime. And he said sovereign is the person who decides or who is in power in exceptional situations. And you can say that about politicians, about leaders, about companies who run certain platforms and who now say that digital sovereignty for them means that they decide on their own what people can communicate on their platforms, who they communicate with. And this goes beyond and what is communicated beyond the borders of the state they reside in. This has nothing to do with free software, but this is a popular stance. And that is also because politicians in a democratic liberals system we all remember that there's a politician who now has a higher position in the EU and who thought that certain contents should only be available at night in Germany. That was supposedly to protect children. And maybe something she didn't understand is if it's night in Germany, it's they somewhere else. That's because of the rotation of the earth. Maybe someone should tell her that. This sovereignty is also called the monopoly of the last decision or the final decision. So if a state wants digital sovereignty, they are basically saying that they want to be in control of everything. That's frankly, in my opinion, it doesn't go well with my understanding of democracy and free society. You could also say that those are people who would like to put up walls and fences on the Internet and make their own walled gardens that they cultivate, if you want to say it positively. So they want to decide what content and opinions, pictures can be shared on their networks. So for example, they want to dictate that only men can show their nipples on the Internet and not women. And of course, they're saying that they do this for the benefit of the users and for protection of our children and so on. So it's kind of a condescending sovereignty. So this is also not the sovereignty that I define in terms of free software. So you see that the concept of sovereignty is diverse and there's different usages of the concept. So you always have to question what is the position of the person who uses that term and what is their interest in using it. Digital sovereignty doesn't have a common definition and it's also not differentiated in terms of its content. So a lot of people are using the term for their own benefit and trying to fill it with content. You could use the terms in the context of being able to make your own decision and be sovereign on the web. This is more of an engineering definition. It's not suited for politicians. If you put independence in absolute term, this doesn't exist in the analogue world either. So of course, it also doesn't exist in the digital world. Now, trying to define this, you can say digital sovereignty is the sum of all abilities and options of individuals and institutions which allow them to take on their roles in the digital realm in an independent, self-determined and safe way. That sounds good, but to make it viable, there is another question. Digital sovereignty has certain prerequisites that also arise from this definition. You need competencies, skills of, for example, employees. You have to have a choice. If I don't have a choice, I'm not sovereign because then I have no other option than to take what is offered to me. And security or IT security is a big issue here at the CCC. And this is a good thing. Now let's get to free software. So sovereignty, as we've elaborated, you always have to question who is saying it and why are they saying it. Now, free software, software is defined as free if it has a license that has certain prerequisites or that for certain requirements. And this determines where a program is free software or if it has freedom as a quality in terms of the law. So software with freedom built into it. There are four basic freedoms that are called use, study, share and improve. So this means that A, you can use the program as you wish for any purpose. Second, you are free to study how the program works and to change it so it does your computing as you wish. Also, you're able to share copies to help others. And you're allowed to distribute copies of your modified versions to others. And to do so, you need the source code. And by doing this, you can give the whole community a chance to benefit from your changes. And the conclusion is a program is free software when users have all of these freedoms. Now what is the benefit for the user and what is the benefit of digital sovereignty to the user? Primarily, a program that is free software can be used for any cause and for any duration. So there's no limits in content or in the usage period. So if the license elapses, it's not free software. So you can use it anytime, anywhere and for any purpose. So of course, you're able to use free software to write blackmail letters or for reasons that others might consider immoral. And you can also use it on as many computers and with as many processors as you want. That is also a very practical freedom because the times where people had one computer that was not connected to the internet are long over. We're living in times in a digital and networked times. And also the freedom to make copies and to distribute them is very interesting because it saved you license management efforts. I remember visiting an event where license auditing was mentioned and people were angry that programs or companies took the right to look into the source code or the license of a software to see whether it's really available without limits. Now, this freedom also allows people to practice their skills, which they may be able to use professionally. So free software also allows employees, for example, to gain competencies, gain new skills. Schools, companies and authorities can recommend installing free software to teachers or employees without limits. This allows a sovereign use. And by sovereign, I mean informed and independent. So users can use the software in this definition of sovereign. And if that freedom didn't exist, people would be at the mercy of the distributor of the software. And proprietary software has the disadvantage that you always have to tell the provider, please give me this and that feature. And if they say, no, we won't do that or we will only do that if you pay us money, that's a restriction of the sovereignty of the user of the software. So free software can always be adjusted to your individual or your company's needs. Also free software doesn't have a vendor lock in. This means that I can choose my own partners for development, installation, support, changes, training, etc. Usually you have many companies to choose and pick from, also smaller, medium-sized enterprises that you can work with locally. That you can work with locally. Also you have the security of planning because the license doesn't have a limit. So I don't have to fear raised license fees or fees for an update or upgrade, which gives me the ability to plan. But also if the provider of the software doesn't provide any updates anymore or goes bankrupt even, I still can use the software. I can develop it further on my own and also join other users in developing it further. Or you're looking for someone else who can take on the development because that's possible with free software. This is not possible with proprietary software. It's the same time. Do we have a freedom simply due to diversity? Because there are forks. I can choose which forks. Do I take Libre Office? Do I take Open Office? They're different softwares for the same purpose or even is different versions of the same software. So they're different forks and developments and freedom gives rise to creativity and therefore we have a choice among several options. And another benefit is that we don't have to get a special license just to try the software. We can just install it and use it. So there are no investments into the licenses. But unfortunately there's not diversity for every use case. Especially with software that is highly specific for a certain area of the economy. Different area of the industry. There might not be that many programs to choose from. For example it's a lot harder to get different software as a lawyer and also for architects. It might not be the easiest way to find software. And security is another important topic especially in context with digital sovereignty. So with proprietary software it is impossible for the user to determine if the software has the required quality and security of the software that they are using. But if you have access to the source code then you don't have that problem. You can investigate. Of course you also have to take into account that you might not that the compilation units of the compile program is actually not derived from the source code that you have access to. This is something you have to take into account. And another problem is in this context is security because you're losing safety and security because it's not possible that the software is verified by third parties. And fortunately we have transparency with free software. And this is often a documentation of the algorithms and the functionality and the implementation of the software is much more transparent compared to proprietary software. But in but of course there are also examples in practice where not enough investigations have been made and that's why there are now financial support programs to sponsor open source maintainers to find security holds and to find security issues in open source software. I will talk about that a bit later. When we talk about how to improve the situation what can we what can we ask for instead of digital sovereignty. So the free software we have the digital source code we can study it. And if there are many reviewers of the source code then security issues are typically quickly discovered and fixed in a short time. So this is the rule but unfortunately there are also exceptions. And it's also important to build software based on established and well documented building blocks. And another aspect is that free software is interoperable by principle. And that means that there is nothing that forces the users to pick a one-size-fits-all solution. Because if I open if I create a document with LibreOffice then I can also open it with Apache Open Office. There's no question about that. And anyone can implement this standard and I can use any of the software that implemented standard to work with the files. If we look at the macroeconomic dynamics so for instance if we look at Germany or the European Union then there are actually many good opportunities with open source. We have lower costs through cooperation. It also improves competition in the market. And everyone is on the same level in terms of software availability. And therefore everyone has the same opportunities. And therefore free software is a healthy thing for the macroeconomics. At the same time there is a strengthening of digital competencies because having the same opportunities in life is not dependent on the income of the parents because everyone can install the software students pupils everyone. And because the source code is open you can study the source code based on practical examples and learn things about software development. For example one could learn about what text markup is in text or how texts are rendered because this is always the same principle. So I have to declare okay what is the purpose of this text fragment is it a headline is it a paragraph what is it. So basically yeah so it enables learning by doing if people have access to the code and the software because people can also learn to change the software themselves and see what the effects are. And if you have a good peer group then you also can get code reviews of the changes you made. In any case this strengthens the digital competencies of the people and this is something you don't have with proprietary software. And now I'm going into future perspectives. The idea is we should maybe not aim for digital sovereignty we should not demand it but maybe digitally digital solidarity and I would like to point to the talk by Thomas Fricke who gave the talk in the sea base where he talked about that free software is not only about taking but but it's also an attitude it's an attitude that assumes well if you consider the first freedom the freedom to study the source code that if you have knowledge then this gives you freedom and if you have access to the knowledge and the technology then you can create more things with it and something similar you can read in the hacker ethics and of course it also says what you should do with the software and not what you should not do with the software. So the term of digital solidarity is a very individualistic term and so sorry digital sovereignty is a very individualistic term and so if people look at individual states individual organizations but yeah what the creators of free software want is that other people can profit and benefit from the software that they write to quote one does not own a thing in the typical sense or in the right sense if you can still share it without actually losing any benefit yourself and this ethical attitude has led to the free free software from establishing themselves because this sharing with each other is very fundamental and I'm not a member myself in these organizations but I'm part so but I also observe these tendencies in the ccc that sharing very deliberately sharing is very common in the ccc and elsewhere and it's very reciprocal that people share but one learns from each one learns from each other and that the over 60 years old lawyer can also learn things from a 16 year old student so there's a level playing field and equal opportunities and this is the approach that we should all demand for the digital realm where the community is taking into account and I think in order to attain that goal free software is needed as much as the many perspectives that members of ccc and other organizations that promote free software and if companies want to be part of this community it's really easy to do that basically if you're not being too arrogant at least this is my experience in my hackerspace I was welcomed very warmly the community is very interested in the experiences of others and exchanging experiences I've never left a hackerspace without having learned something but you have to get into this mindset and that also means that you may have to forfeit your own developments or your own money for the benefit of the community and share with others and the presentation I mentioned mentioned many different possibilities and opportunities there and the demand to put 10 million euros a year into free software may sound like a lot but it's only right it's only just and it would have so many benefits so you have to be ready or willing to cooperate to not be egressive and selfish so for example of the open software community develops a software to raise dog taxes you have to give up the thinking that you don't want your neighbors to profit from this program you just built this attitude doesn't hold so thank you very much do you have any questions yes yes there are questions but first thank you for your presentation the audience can still send in questions on twitter masterdan and wherever you want the first question is wouldn't vegetables sovereignty also give freedom of choice between different open source solutions yes so the problem is vendor lock ins and if if I have the choice between two products but in practice once I've chosen one of them and after five years I realize the other one's actually better it's very difficult to change to the other product and in principle yes but in practice rather difficult then we got a comment licenses are still useful to make sure certain limits are being kept to relatively simple depends on what we mean what what so compliance problems occur only once we publish things and then I have to take care of take take care of making sure that I only use software that where the licenses are compatible compatible only when I publish a software then I have compliance problems between the lines and these are actually rather big and therefore I suggest that developers should focus on their software not on the licenses so much and all in our society where recklessness and respect a lack of respect is so commonplace how do you want to ensure that people are ready to be solitary to be solidarious digitally how we need a conscious we need to be aware that we cannot continue with our current societal and economic structures the way they are right now there is a lot of social inequality and this leads to splitting of societies this leads to wars or to other conflicts and because of that even hardcore capitalists have realized that we need to find a solution I still hope that sensibilities will find a way reason next question as far as I know in schools and universities open source and how to be part of them is not really taught what do you think about that I'm not a bureaucrat yes there are approaches yes but the problem is it depends on the people if they want to do it if they want to get involved and if they are at the right position to do these things and but in our political system it is unfortunately yes it's it's difficult in our political system because things can also change so there are people who invest a lot of time in promoting free software in schools and because this teacher was so so good that they were moved to a different school but then the old school moved back to proprietor software follow-up question how is access to free software regulated for example how can students get access to free software licenses or even have the hardware to be able to use that software yeah to hardware free software also runs on older systems and yeah free software can have less demand for the hardware of course it depends on what you want to do with the hardware um if you want to learn a programming language then you can use a pensium one machine but as i said we all have very powerful computers today if i look at this i'm an old man i have worked i have started with an apple 2 clone that had a lot less power okay so it looks like there are no other questions so i would like to conclude the talk thank you very much for the talk thank you for the invitation and i hope that everyone on stream has been able to enjoy the talk as much as i did