Hey Bears, I'm Kawani Marchek with CalTV Sports and I had the pleasure of catching up with our very own Bear, Fien van Vistrainen, this past weekend. Fien is a sophomore on the women's rowing team and is from Amsterdam, Netherlands. Not only is she a part of the Dutch national team, but she recently competed at U23 European Championships, placing second in her event. I hope you enjoy our little zoom catch-up and let's get right into it. Hi Fien, how are you right now? What is it around 7pm? Your time in the Netherlands, how's everything going? It's going pretty well. I'm just doing school and stuff and then trying to catch up with classes. Well, to start off, so when you got back to the Netherlands, how was it, what was the situation like and how has it been being back home? So in the middle of March, our season got canceled and then three days after that I flew back home. It was like a roller coaster and when I got back home, kind of nice to realize that I wasn't the only one that was experiencing this whole situation, but everyone around me as well. We stayed inside for like a month and a half and then everything got way better. We were allowed to row again in the beginning of May or something. I mean, you had a race about a weekend ago and I know you got second, which is awesome. So congratulations on that. Thank you. But how was the training process? Was it normal? It was super weird because we had European schedule the first weekend of September and all events to the beginning of September were canceled. Paris had to train for a month without knowing if we actually could go and then we found out that it was going like a month before. So that's when we started full training. You guys had a goal and you knew what you wanted to do. And that helped so much because in the first few months, everything got canceled and we didn't know when we were allowed to race again. What were the precautions like at the regatta though? What were the rules that were different and made the experience different than normal? So you had to wear masks everywhere and then when you went into the boat, you could take it off and give it to your coach. And when you docked again, you had to put them back on. So everyone was wearing masks all the time and also no one could watch the race. Like you weren't able to be on the grandstand, but there was a pretty good life so everyone could watch it from back home. Yeah, I mean I watched it and it was definitely interesting seeing racing happening again after so long of silence basically. Everyone was so nervous because you're just not used to racing anymore because my last real race was like a year before.  How did you feel during it? What was it like? The start was pretty good and we were in front for the first thousand. And then the Germans started coming and they sprinted it off. But for us, it was we were super happy when we came second because it was our best race. Like we couldn't have done anything better.  It was really nice catching up with you. I hope you have a good night and I mean, I'll hopefully talk to you soon. Thanks, Kai.


Hey what's up you guys welcome back to my channel if you're new here. Hi. Hello. I'm nidia and today I thought we could talk about The benefits of having an occupational therapist Before I schooled for Instagram last night and I saw on someone's story That they've been referred to as occupational therapists and they don't know what good it can do third impression Let me tell you I Have an occupational therapist while I was under the home treatment here She gave me a weekly planner As one of the benefits of an occupational therapist They they get you to move a plan for a week. The first thing I did of the occupational therapist was make a plan For a week to my next appointment and it was so beneficial. It got me out of bed It got me doing stuff and overall it was really helpful in the appointments We talk about things that you want to do and that you don't want to do she was trying and giving me activities to do to Lift me out of a depressive episode Having an occupational therapist was really beneficial for me.  I hope you found today useful. Thanks for watching I'll see you guys in my next one if you're new subscribe join the family. Thanks for watching I'll catch you guys in my next video. Peace


Hi, welcome everybody We're here to talk about smart NICs and moving to next generation 25 gig 50 gig 40 gig 100 gig in the data center. I am Anita Dragler I'm a product manager for Red Hat focused on NFE and networking Hi, and I'm Nick DeSanovich and I'm VP of solutions architecture at Netronome and I'm focused on smart NICs and NFE So Anita is going to talk in detail about some of the options for server-based networking data path implementation but I'm going to start off with a description of the problem statement, so Everybody's seen this chart about global network traffic exploding right going off the chart The point I want to make here is that the problem is even worse for NFV because in data centers implementing NFV We're doing a lot of service chaining where traffic is bouncing back and forth between different services running in different VMs And containers, so east-west traffic is growing even faster than this graph shows on the right side, we see that Silicon is not getting any cheaper In fact, the costs are leveling off and we're not getting the benefits of Moore's law And that means that we need to be very very smart about the way that we implement data path functions to get good Cost in the data center. So Anita Here's the data path options that we have today for 10 gigs or 10 gig servers We're talking With open stack our default default configuration is open v-switch with the kernel data path And this one gives you a ton of features switching bonding overlay But your performance is does not meet what you want if you want higher performance You got to move to the right and this is what we have today in deployment for NFV a lot of SR IO V and This is hardware dependent on your nick vendor But you can get line rate. You can get line rate 10 gig But if you want any switching options, you're dependent on your top of rack switch. There are no switching options Moving more on to the right, which is new GA for red hat open stack is Open we switch OVS TPDK with the data plane Toolkit with that you can get direct IO to the neck and some switching options bonding overlay some overlay offloads But you have to give up a few cores on your host to be able to do TPDK Entirely devoted to pole mode drivers So if you want to go beyond 10 gig 25 gig and 25 gig and 50 gig is the new 10 gig in the data center And if you want to go there and you have 25 gig servers, we have to move to OVS offload as our new next-gen Technology what is red hat and what are all our nick vendors doing? We are working with multiple nick vendors to get OVS offload both in the kernel and in OVS and in TPDK Our goal is make sure we have everything upstream all drivers upstream first and to integrate with open stack Must that's a must as well and our goal is to standardize the API both in the OVS kernel in the OVS TPDK and open stack So a little bit about smart nicks So smart nicks sole purpose is to accelerate and offload the server networking data path so Netronome is a vendor of smart nicks and There are many models for offload as Anita just alluded to basically at a high level what we're doing is moving functions that are Traditionally implemented in the server data path either in Linux or in something like an open v-switch for instance Where we're doing complex functionality involving overlay processing traffic classification QoS security rules and policies and Things like that that are not typically done in the nick card today The smart nick actually does do those things and so we are actually moving that functionality from the server Sorry into the smart nick as shown in this diagram and what we're doing is bypassing either partially or completely The server networking data path which is eating up CPU cycles in the server bogging down the server and actually Creating a bottleneck. That's in many cases starving In the end of vk starving the vnfs that are trying to execute on the server so the smart nick pulls all of that down into the Nick card itself in this particular case We're showing it being implemented in the Netronome flow processor, which is our silicon purpose-built silicon That's designed to implement the smart nick functionality And Anita is going to go into more detail now about how this is is done so over here We have a use case that we're working on today with a number of nick vendors The sri ov with ovs fallback. So you have sri ov So this is merging the worlds of ovs and sri ov So you have sri ov vfs directly to the vnf, but you also have a pf a Physical function going into the ovs bridge And so you have now ovs in two locations you have ovs in the kernel and you have ovs in the nick You have two ovs versions and you're off you're off loading your control Your ovs control is now going to offload using tc flower Which is the traffic control piece on the kernel is going to decide which flows are going to be offloaded to the switch And some flows will continue to stay in the ovs bridge on the host So there are some features. So most of the white features in the features in white are already Being worked on and available some of the advanced Connection tracking and fallback to ovs are not supported by all nick vendors. This is on a case-by-case basis These are vert IO options if you're not interested in sri ov and you want to do live migration Then these are some of the what IO options and Nick will go into a few more as well But this is if you're using you want to use Ovs dpdk and you want to do a partial offload So the whole flow is not offloaded, but you want to take advantage of Nick vendors like NETRONOMA providing QoS security groups contract overlay offload. You could still do that and still have pretty good for performance Or you can do another option with with another Nick render is looking at where they're moving your Ovs completely into the Nick there is no Ovs in the host and then you have to worry about tighter integration testing Because now you have to deal with Open stack talking directly to the Nick author and SDN controller Yeah, and then briefly this is These are the models that NETRONOM is very focused on So we have Basically a user space agent Which is a relay agent that implements the vert IO back end and talks to VMs So VMC a nice vert IO vendor agnostic interface. That's very good for for live migration But you get the very very high performance of the smart Nick So that's our model on the left that you're seeing there and NETRONOM supports that today And then we're moving to a model on the right which will Provide the same functionality in terms of vert IO and live migration But the relay agent now moves down into the silicon So it's even more efficient I will not go into depth in this since we're running out of time But these are the open source communities that we have to work with And you can see everything in white is going to be either delivered or shortly delivered everything in yellow is still Work in progress and some of it is in the design phase Just looking quickly at the advantages and limitations. Yes, we can get line rate Especially if you're using SR IOV if you're using any kind of vert IO, there will be some performance hit But not as bad. It's it's has to be benchmark. It's not as bad as doing pure OVS You have all the advantages of all the off-load capabilities and in some cases you may have fallback You have option to fall back to OVS if you're Having control plane traffic or you have a failure or you've exceeded the capacity of the nick There are some limitations, of course Using OVS off-load you have to you may need to do certification Every time a new open stack or a new OVS releases to make sure your nick vendor is compliant with the latest one Your bonding is limited now. You cannot go across Nick. You have to do within the same nick bonding your feature Availability depends on your nick firmware So you need to make sure your nick firmware is updating at the pace of yes and open stack updating What IO for live migration is needed. You need what IO you can't do it with SR IOV And there are different options with that and then you have varied flow capacity based on your Nick vendor and how much memory or cash is available and whether you're running contract or other security options And there's a five-tuple match. I Think we're done any questions Right as I said, it's not supported today. It's a future direction for an astronaut. It's coming upcoming release, right? That's that's the situation with where I owe the the driver is Not yet decided whether that will be a separate version or not you can come see me after the talk


My name is Adelbert Chang. I'm a software engineer at BOX. I work on the machine learning team. And today I want to talk to you guys about why I like functional programming. So to sort of set the stage for what I'm going to talk about, I'm going to sort of go into the background of how I got into the ideas of functional programming and why I enjoy programming in a functional style so much. And so I'm going to start off by where I got into computer science and where I learned programming. And that would be in college at UC Santa Barbara. So there's an aerial view. And UC Santa Barbara is in Southern California. It's a nice campus. It's where I first learned CS. It's where I first got into math and physics. And it's where I also learned and started really enjoying functional programming. So I went to UCSB in 2010. And so I'm going to start off in 2011 because that's when I really started taking the more interesting classes. And so the first few languages that I learned at UC Santa Barbara were really popular imperative languages, languages like Python, C, C++. And I really enjoyed my courses a lot. I really liked the CS aspects of it. I really liked learning about the theory bits. But then when it came time to actually do the programming, to actually do what I wanted to do, I ended up writing code that looked like that. And so the problem is relatively simple. You say you have something like, I have a binary search tree and I want to insert a value into it. And when you give the algorithm, when you say the algorithm out loud, it's pretty simple. You say, compare the value you want to insert to the value at the root. And depending on if it's greater than or less than that, you go to the left or you go to the right. But in the actual code you write, you end up thinking about all these weird things where, oh, you say I have a traverser. And then I have a parent that's initially unassigned. And then depending on what the value is, I'm going to move these two things in tandem. And then based on some condition, I'll break out of this loop. And this loop is while true. So the condition is more or less ignored. And then presumably you're going to break out at a place where your parent has some specific value. And then you're going to mutate the parent in place and then create the new node. And so the actual algorithm that you care about, I felt like, ended up being lost. So when I went to my CS classes, I enjoyed, oh cool, if we have this thing called a binary search tree. You can implement a hash map based on this. You can implement all these things. But when I actually went to write the code, it became really annoying. And I thought that we had all these extraneous factors and outside factors I had to think about. I wasn't really thinking about the actual CS part. I was thinking more about maintaining this weird state. On the other hand, I also started taking our required physics and math courses. And so these were relatively simple undergraduate level courses. The math was like differential equations. Physics was classical mechanics. So it wasn't terribly involved. But one thing that I really enjoyed was that all the problems they were solving were simple and they were consistent. And so whenever we did problem solving in these classes, I never really thought that I was trying to solve a problem outside of the thing I actually cared about. I was always like completely focused on a problem and I could work with it in a very reasoned and logical way. And so as a sort of motivating example that I came up with in classical physics, we are given like these various laws of motion and I put three up there. And so I did take a little bit of physics in high school and when I first saw these equations, I sort of felt like, okay, these are three equations, three magical equations that I have to like memorize and figure out somehow I have to know when to apply these various equations. And then when I took physics in college and I began to sort of study it more, I realized that you could basically derive a lot of these seemingly magical equations from first principles and you could work with them in a very logical and reasoned way without having to worry about does this thing side effect or if I call this thing twice, if I apply this function twice and I'm gonna get something different, I was always focused on a problem. So as an example, we're gonna derive this equation. This basically gives the position of an object in a system given its initial position, its initial velocity and acceleration. And so we start off by saying, okay, let's try to get like something, which let's try to get the position first. So we maybe start out with average velocity. Simple enough, that's just changing position over change in time. We do some basic algebraic manipulation and we eventually get there. We have our x isolated on one side, we have our initial position and now we have like this average velocity thing. Well, average velocity is just half of the final velocity plus the initial velocity. And then we say, okay, we don't really know what final velocity is so far, we can't really work with it. So where else can we get final velocity? Well, we do the same thing, acceleration is just changing velocity over change in time. We do some manipulation and for one, we have one of the laws of motion that I gave in earlier slide that we derived from a very simple basic first principle. We also now have a final velocity equation that we can plug right back in. I don't have to worry about, is this valid? Is this okay to do? I sort of just do blind simple manipulation. We plug it in, do some algebraic reasoning and then we eventually say, all right, average velocity is initial velocity plus one half acceleration times time. We plug that back in due to earlier equation. Oh, so that average velocity equation is also one of the laws of motion that I showed earlier. And so, so far, things are coming together nicely. Things are being reasoned about in a simple way. We plug that back into the right side using more of a simplification and we eventually get the equation that we cared about. So something, what I really enjoyed was we would get these equations that seemed sort of complicated or weird or something that looked like they were just pulled out of thin air. But when I actually sat down and took some basic equations like Newton's laws of motion or things like that, I was able to eventually derive it. And so I had this sort of simplified and consistent view of what physics was at least in classical mechanics. And so that was something that I felt was really missing when I went to my CS courses. And so I sort of began, I got to a point around my second year where I seriously considered changing my major to physics because I didn't want to deal with all this weird imperative programming thing where I had to maintain state in my head and do things unrelated to the problem. And so I thought about changing my major to physics and I even thought about minoring in math. About a year later, I ended up not changing my major. I didn't sort of like dealing with it. But about a year later, I started taking more and more CS classes and in 2012 I picked up this programming language called Scala. And I remember one example that I was really fascinated with was the same example that I showed in C++ earlier which was doing an insert into a binary tree. And so that giant code block I showed earlier was just the code to insert into a tree. I didn't even show like the tree definition. Whereas here when I saw it, I have fewer lines and to me a lot more readable code. And there's a lot easier to reason about, right? So when I say what's a tree? A tree is just either a branch that contains some data and then a left and right tree or we have a leaf that just contains nothing. And then when we insert it, we say well if the tree is just a leaf then we just create a branch and have two empty trees. Easy enough. And then depending on what that value is, if the value is less than it, then we just insert it into the left side. If the value is greater, we insert it into the right side. And so there's none of this like weird like state tracking where you have a loop and then depending on some conditions, you might break out of the loop early. And then depending on when you break out your, this value has some specific state that you hope is correct. And so I began seeing a lot more examples similar to this. And I began thinking well, this thing called functional programming seems pretty cool. And so maybe programming isn't as terrible as initially I thought it would be. It would be really awesome if this major I was in, I could really enjoy the theory that I was being taught in class and also actually put that theory to practice and not really hate my life as I was doing it. So the question I began to ask myself like, well, I really, really enjoyed physics and math. I really enjoyed like this algebraic reasoning, being able to derive things from first principles. Can I do the same thing with this thing called functional programming? And so the rest of my talk is going to be basically various examples in functional programming that I've learned over the years that I really enjoyed and that I think sort of follow the same pattern of being able to derive things from first principles, have various seemingly unrelated things come together and be consistent across the various things you're going to deal with. So to start things off, I'm going to give a definition for functional programming because that seems useful. So sort of like the tongue-in-cheek answer you'll often get when you ask what is functional programming is, functional programming is programming with functions. Which may or may not be a terribly useful definition to you. And so we might qualify functions as, we might re-state it as programming with pure functions. And when I say pure functions, I mean functions in a mathematical sense. That is for every valid input, we map that input value to exactly one output type. And so there's sort of two bits of details that is important to note here. One is for every valid input. And when I say valid input, I don't mean just like a subset, like let's say we want to parse a string to an int. I don't mean like for specific strings, the string happens to be integer that's a valid input. I mean, so long as the value that you have is a string that it type checks, then we consider that a valid input. And the second detail is for every valid input, we map it to exactly one output value. And so another thing that comes up is, say a random number generation. When you call a random number generator in the language like say Java or Python multiple times, you're probably gonna get a different answer each time despite the fact that the expression is exactly the same. And so that breaks the definition of function in the sense that for the exact same input, we're not getting one output back. We're getting different output back. So I'll elaborate on that later. But as an example of the sort of first detail, we have a parsing function. And let's say we're gonna take a string and try to parse it and turn it into int. And so our first attempt might just say, give me some string and I'll give you an int. If it's not int, I'm just gonna throw an exception. And that breaks sort of the first detail that I discussed where for every valid input, we're not giving it an output value. We're saying, well, for some inputs, I can give you a valid output, otherwise I'm just gonna throw an exception, which is not really what we want. So instead we can do something, we can change the type signature of the function to sort of be more honest about what we're trying to do. We can say, give me a string and I may or may not be able to parse it into an int. If I am, I'm going to wrap it into some object that is a type option int. If I'm not, if I get a number format exception, the string is malformed or whatever, I'm gonna give you a non-object, which is also a type option int. So we're no longer lying about, our function is very honest about what it's doing. For any string that you give me, I'm gonna give you a valid output value back. I would have to worry about, does this function throw an exception, does this function return null, anything like that. Earlier I talked about random number generation, oftentimes when you call next int, what happens under the covers more or less is you compute the integer from the particular seed that it has, it's going to mutate the seed in place and it just give you the int back. And so if you have various calls to next int scattered through your program, maybe when you do your refactor you say, oh well I have all these exact same function calls, maybe I'm gonna take that expression and then assign it to like val r equals random dot next int and then replace all these calls to r. But now what you've done is you sort of change the behavior of your program and that, now everywhere you're getting the exact same random number, right? The behavior program has changed even though the substitution you've done seems logical to do because you've just evaluated the expression to its value. The more functional way that we do it is, one of the ways we do it is by instead of just returning the int, we're returning the int along with the next int. So when you call next int, it's gonna compute the int, it's gonna compute the next int, but it doesn't mutate the state in place, it'll just return to you the next state with the int together. So if you call next int on the same random number generator multiple times, you just get the exact same value back. So if for whatever reason you have next int scattered through your program, you can just take that factor into its own value and then replace everything and your program is gonna behave the same way. And to actually get a new random number like the next random number that you might actually care about, you have to call next int on the new state that you're giving back. As a sort of a side, I'm not gonna get into it too much since there's limited time, but it might seem tedious to have to continuously get the next state each time you wanna get the next random number. There is a really nice way to do it. The sort of key word that you wanna look for if you're interested in this is a state monad.  So this property I've been talking about for the past few slides has a name. It's a relatively fancy sounding name, but it's essentially what allows us to, and it basically describes what I enjoyed about physics and math and what allows us to sort of reason about our programs in a very principled way. And that was referential transparency. And to give a more concrete definition to it, I stole this definition from Rune-Arm Bjarnasen who wrote a book called Functional Programming in Scala that I recommend a lot of people check out. And so we say referential transparency is a property of expressions. And so we say an expression E is referentially transparent if for every single program P, every occurrence of that expression inside that program can be replaced with the result of evaluating that expression without changing the result of evaluating P. So in the case of random number generation, if we just replace random not next int with what you eventually evaluated to and replace all occurrences of it, the behavior of our program changed. In the previous talk, Daniel talked about calling a side-effecting method twice. And so maybe that method, depending on if some global counters is greater than one, then we'll do something and it will decrement a counter. But the next time you call it, I might throw an exception because now the counter is zero. So you've called the same expression twice, but each time you've gotten a different result or different behavior, which seems kind of bizarre when you're dealing with something like physics or math or if you want to reason about your program in an algebraic way. So I have one more math-related example that I thought illustrated referential transparency relatively well. So let's say we have a quadratic equation, just something that comes up in a very basic algebra. And we say, find me all values of X such that this equation holds true. And so you might say, okay, this equation seems kind of weird. Let's simplify it a bit by having some other value equal X squared. And then we substitute that back into the equation without having to worry about is that substitution valid. And then we say, okay, it just begins to resemble something that we've seen, that I've seen before. And so there's a very simple equation, a mechanical process to take a quadratic equation of this form and find all the roots for it. You take the coefficient, you essentially plug it blindly into this formula. So we do some more substitution, do some simplification. And then we say, all right, for that particular equation in isolation without regards like where it came from, we don't even care that it came from like that X to the fourth equation. But we say for this particular equation based on Y, we can say, all right, not Y equals six. Then we recall, we said Y equals X squared earlier. So we substitute that right back in and then we say X equals plus minus root six and we're done. And so we're able to take a seemingly complicated problem, sort of break it down into a smaller problem, take that, plug it into a separate equation, bring it right back and do a substitution again to solve the problem. And this is sort of kind of like simplicity and consistency that I was really enjoying in physics and math and something that I was hoping to find in functional programming. So one example that I ran across recently and ran across a lot before that really irritated me was let's say I have a method that given maybe just for like a web service or something, given a user ID, I'm going to go to like the database or go to some API and get the user data associated with the user ID. And so this returns a Scala future and the way the Scala standard library futures work is upon creation of the future in the background, it's already a running process. So something's already happening by the time you actually get the future. And so at the point where we have fetch data, something in the background is already running. It's already going to the database to get the value it's going across the network to hit the API. And maybe we're writing a retry library which I did a few months ago and ran into this issue. We say, all right, if we get a say 429 which is rate limit back, maybe we wait a few seconds and then we retry the exact same request. And so it seems reasonable to say, okay, if we got a 429 error code, we're just going to fetch the data again. But this doesn't actually do what you want it to do because since fetch data doesn't represent like a value that represents something that has an already running computation in the background, what's going to happen is when you get the, by the time you reach, so this, that little function block isn't going to actually execute until fetch data is finished evaluating. And by the time it's finished evaluating, you're saying, if I got a 429 do fetch data again, but fetch data has already finished executing, so you're just going to get the same value back. And so what you end up having to do to make this kind of stuff work is you have to create a new future. So now you're saying fetch data on 429, call user info again, so you get a brand new future back and therefore you get another already running process back. And so this seems kind of weird that you have to do this instead of just calling fetch data because these two things are exactly the same, yet you can't sort of substitute one for the other because it's going to change behavior program. In one case, you're not, you're just going to get the exact same value back. In another case, you're actually making a new request to the database or to the API service. And so there was a bug I had to deal with at work a while back that was related to this. A nicer way to solve this and a more functional way to solve this is you might, instead of having an already running process, you just have a data type that represents what you would do, just describes what you would do once you run it. But upon creation of this data type, nothing has actually happened at this point. Task is a data type found in Scala Z and essentially you can think of it as a future that has not been run yet. But there's a method call, this isn't actually how it's implemented, but there's, you can think of it as, there's a method call that when you call it, will then actually go and make the request, but until you call it, nothing has actually happened. And so when you call user info and given a user ID, you now have an object that represents, when you run it, I will go to the database to get the data. But until you do, nothing's actually happening. And then you say, well, given this object, when we run it, and if we get a 429 back, then this is the next action I want you to take. And so this transformation is now valid because you're saying this thing, which has not been run yet, when you run it and you get a 429, just run it again. But it's not an already running computation. So you don't have to worry about like, the value in the background has already been like, evaluated in cache and you break like this idea of referential transparency. So that's sort of like the really nice parts about if you work in, if you treat your functions as pure functions, you're able to sort of substitute and do equational reasoning with your programs. Another nice thing is, oftentimes you will be writing lots of different small functions that do one very basic thing, which is what you should be doing. You can sort of like, separation of concerns, you can test them more easily. And so you have all these functions lying around. But if your functions are impure, if they can throw exceptions, if they can return null, you can't really easily compose them because what you end up having to do is, maybe you say a foo might throw an exception or it might return null, bar might handle null input. I don't actually know the type signature that says it takes some b, but I don't know if it takes a subset of bs and bar itself might throw an exception, maybe baz will call into foo or whatever. And so you sort of can't just stare at the type signature and figure out what you want to do. You have to sort of go into the internals of the function and then figure out what it's doing. Whereas if all your functions say for every input, you map it to one and exactly one output, you can sort of compose them all together and expect it to behave in a reasonable way. And so you no longer have to worry about, does this handle null, does that not handle null? You sort of just follow the types and you can reasonably expect to get something that you want back. So another thing that I mentioned earlier was, as part of turning your functions into a pure function, I said don't return null, don't throw an exception if say you were looking a value open to a map and that key doesn't exist. Instead I said we have to use this option data type. And so this option data type is a particular example of what people like to call effects. And when I say effects, I don't necessarily mean like side effects like a print line or like a logging statement. Effects are sort of anything that does something outside of giving you the pure value that you care about. So options sort of captures the effect that this value may or may not be there. We also have error handling where you have like a more involved computation that where a series of errors can occur. And so that sort of captures the effect that is traditionally handled by exception throwing. We have asynchronous computation which we saw rarefied as data earlier in the form of task. And we have input output which is addressed by the IO monad. I'm not gonna get into that but essentially we're gonna have different effects in our programs and we want a nice way of handling those effects without having to sacrifice referential transparency. So the solution is essentially rarefied effects as values that the same solution we've seen in the previous slides. So a missing value I sort of glossed over earlier but we have a missing value can be represented by say an option data type. And the SEAL after class sort of like a detail of Scala you don't really have to worry about it. Basically what it means is you can think about option as a type that you actually care about. Option is a thing that represents a possibly missing value. And then some and none are the constructors for option where an option is either a sum which actually contains the value that you care about and none is just like a sort of set in a value that represents the absence of the value. So when you do like say a look up in a map you say I have a map of food a bar given an arbitrary food. If the return time was bar you'd already know something was off unless there was some like reasonable default bar value. But if the key is missing if we say we didn't check well if there's map contained food if it does that means the particular value you care about is there so you put in a sum otherwise the value is not there we have nothing to return so we just return none. And so when we look at the type signature of this function we say given a map food a bar and an arbitrary food you may or may not be able to give me a bar back. I don't really assuming I'm working in like a functional code base I don't really have to worry about does this thing throw an exception? Does this thing return null? I don't have to do a null check. Similarly with errors we have another we have this data type called either and so you can think about either as it's either a success that contains the actual value that you care about or it's a failure that contains some error value. And so a way you might actually end up using it is you create your own hierarchy of errors that may happen in this particular program. And then for instance to get user info you have a user ID and an access token and maybe the user doesn't exist in a database maybe the access token is expired. One of those errors is gonna happen so you say well I can either give you the user info that you actually care about or I'll give you one of these two errors. And so when you actually call that function you can now say well if I have a success of the user info I'm gonna go do this. If I have a failure of a user design exists I'll go do that. If I have a failure of invalid token I'll go request a new token and retry or something like that.  Does it return null? Do I have to check? You sort of just look at the type signatures and then begin like matching things up which is really nice. And so now we've, the really nice part is again types and share of our functions reflect the effects involved. One issue that I might, when I first started learning about verifying effects as data was it might seem strange that okay so when you look up a token for a user ID that token may or may not exist so maybe that particular function says all right I'll give you an option of an encrypted token back. Then you have a pure function that will take an encrypted token and it somehow magically give you like the decrypted token. And so on the client side you say all right give me the token for this particular user ID I now have an option of an encrypted token. But I can't really pass that option of encrypted token into the decrypt function because decrypt wants an encrypted token and I have an option of an encrypted token. And so usually what you would end up doing in a more traditional setting is maybe a token forward return a null or throw an exception and what you end up doing is at the client's at the call site you'll say if I got it if it's not if the null then I have the plain value already so I can decrypt it otherwise if it is null I'll I don't do something else. So it's begin sort of you get the feeling that it might be getting more dirty to work with effects this way because you now have to like deal with like these rapid values and you actually really just want to care about the inner value. And so there's I guess patterns to work with effectful data. And so one of the patterns I'm gonna talk about is called a functor. Ignoring sort of like the strange name essentially the idea that it captures is how can you work with a single effect? So if you sort of replace if you do some substitution in your mind you replace F with like option or list or task or something. What it's claiming is give it say an option of A and a pure function A to B I will give you an option of B. And so a particular instance of a functor might look like this. We say if the option is a sum we get the A value that we care about we apply the function to it and wrap it right back up in a sum. If it's a none then we're just gonna give the none back. And so now we're able to do is the encrypted option and encrypted token you just map over it and the function you pass into map is just going to be the pure function that you care about. And so now you're able to write isolated effectful functions that have the effects in them but also write other pure functions that don't really care where that particular value came from. You don't care that the encrypted token came from like a database or from API or from a file system. You just say give me some encrypted token and I'll decrypt it because I don't really care where it came from. Another interesting thing to note is that we didn't do any null checking or exception handling here. Sort of the option effect the functor instance for the option effect sort of handles it for us, right? Because as you saw in a previous slide if it had a valid value then it was automatically going to apply it for me but if it's a none it was going to thread it right through. And so the call side no longer has to worry about does how do I handle the error case? Well, usually if you have a missing value here and you apply a pure function to it you just want a missing value out on the other side because there's nothing you can do. But you don't want to have to handle it each time you call it. Instead you can just rely on the functor instance to sort of handle that for you. And so you're no longer really worrying about what the effects of this particular effect are. You're sort of more focused on how do I manipulate the data that I actually care about. And so you no longer, again, this sort of goes back to I don't, I'm not worrying about extraneous factors like mutable state or how do I handle errors. I'm sort of just focused on what the problem I'm trying to actually solve is. And so functor captures the idea of manipulating a single effect. There are similar mechanisms for manipulating multiple effects. In the previous talk, if you were there Daniel talked about applicative zip which is essentially how you handle a bunch of independent effects. And then he also mentioned monad or flat map which is sort of how you manipulate dependent effects. If you have like, take the result of this effect and then depending on what that result is do something else. And so there are similar mechanisms but in the interest of time I'm not gonna get into it. All right. We're gonna sort of switch gears a little bit and we're gonna talk about one really cool thing that comes up in functional programming a lot which is called lens. When you have a lot of data in, when you're working with a lot of data in your code base you often want getters and setters, right? So maybe you have like an address data type and the address contains a street and the street contains like a house number. And so you wanna like get the street and then you want to get the house number from the street and similarly for set. Typically these getters and setters are gonna be on a per object basis so it's sort of hard to compose or work with generically. You sort of like give it a particular instance of an object you say get that or set that for this particular object. But we would like to do things in a nicer way. Maybe we wanna compose things together somehow. I'll get into that in a bit. So to sort of see what we can do in that front, let's say instead of putting it on a per object basis we're gonna just reify the idea of getting a setting as data.  And so the actual data form of it is relatively simple. Parameterized by two types. S is the particular object type that you care about and A is presumably something inside that object and then you have abstract get and set methods. And from there you can write some interesting stuff. Modify will just simply get it, apply a function that you give it and then reset it so you don't have to do like a get and set on client side. And then the cooler thing is compose which basically says if you have so on the outer layer you have a lens from S and then you sort of like look into the A inside the S and you can get and set. But if you have another lens from A to B so maybe that A has a smaller value B inside it you can take the lens S to A, take the lens A to B and get a lens S to B out that will allow you to automatically jump from the S to the inner B without having to do again like a get and a get and then a set. So lens is composed which are really nice. Composition is really nice. We wanna be able to focus on small things and be able to take those small things and compose them to create larger things. And as a simple example of how this might work say we have an employee that contains a position we have a lens going from employee to position and then maybe we have a team that contains some other stuff among which we have a manager which is an employee and then we have a lens from a team to employee. And if you can take that manager lens compose it with the employee position lens and then now we can give it an arbitrary team we can set the position we can like set the new position of the manager directly without having to doing a get a get and then the set and set. One thing that might be useful for lenses is effectful modification. Again, I'm talking about effects in the sense that we're doing something like possibly failing computation or maybe we can think about the list effect as having a collection of possible values or maybe we go out to a database and look something up and compute a new position based on that. And so what you wanna be able to do is say modify option given a state and given a function that goes from the aid inside that state to some option of A if they don't want an option of S. So maybe for like a modified list given the particular position of this state I'm gonna compute several possible positions and then I want a list of all the states all a list of all the new states that correspond to setting that new A inside that state. And so when you go to implement it you're gonna get a lot of redundant code because all that's gonna happen is you're going to given a state you're gonna get the A out you're gonna apply the function to it now you have an option of A you want to take that inner A and set it on that S so you're gonna say we're gonna map over it take that inner A and call a set. But the code is literally exactly the same for everything the only thing that's differing is option, list, task maybe it's either or maybe it's IO. And this is like really redundant code and just as good programmers we don't we're trying to abstract this out. And so earlier I discussed the idea of manipulating a single effect, right? We had something that just captured idea of mapping over a single effect given a pure function. And so we can actually take that idea of a functor and abstract and write a new function called say modify F that says given a state and any effect for modification I will give you the new state in that effect. And so now when we call modify F we can say F is option in which case we'll get the modify option, F is list in which case we'll get a modify list. And so we've abstracted out all that redundant code into a single method call. So some example function you might run into option either future list IO. And one thing that might come up now is well what if we want to just modify without any effect? Earlier I talked about a modify function that just takes a function from A to A. And so you can think of that particular function as modify it without doing any asynchronous code without worrying about errors maybe it's a total function. We just want and essentially what we want is we want that F of A in modify F to just be a plain A.  You can sort of think of that as a type level identity function. Regardless of what A I give into this F type constructor if you think about the type constructor as a type level function regardless of what A I plug in I just want the A back out. So earlier I don't think I mentioned it directly but earlier we did use the identity function and all identity function does is given any A get an A back out that's sort of like a value level identity function. Now we want a type level identity function which looks pretty much like that. And so let's see what we can do with this. We want to be able to implement modify in terms of modify F and modify F requires that whatever type constructor we give it we have a functor instance. So we say all right let's try and implement functor for identity. Given an ID of A and a function A to B I'm going to get a B out. We see that ID is just a type alias we do some simplification. So now we're given an A and a function A to B I want a B out and that's just simple we just apply the function back I'll apply the function to the A and so now we can take or either modify and implement it in terms of modify F which is good we're beginning to reuse code. Now we might look at modify and say well we can implement set in terms of modify right? We can implement set in terms of modify simply by just ignoring whatever A was used to be there and just always returning the A that was given to us in the call. And so we use the const function which basically looks like that. The first parameter is the thing that's always going to be returned and then the B is you can pass in whatever B you want and it's just going to ignore and keep the exact same thing out. So when you use it in terms of modify it's going to get the old piece of data that old piece of data is just going to be thrown away and then when you apply the function it's just going to give this particular A back. And so this is cool we now have modify and set in terms of this one modify F function but if you look set is defined in terms of modify and modifies in terms of modify F which is implemented in terms of set.  So maybe we say all right well set it makes sense to define set in terms of modify in terms of modify F. So let's make modify F abstract then and along the way I also make get abstract. So now I might think so now in order to define a lens we don't implement set and get we have to implement modify F and get but it sort of seems weird to have both of them and so you might think to yourself maybe we can define one of those in terms of the other and simplify how to actually define a lens. So can we define get in terms of modify and what I first thought about it it seems really weird right? Modify is modifying something inside there whereas get is you're getting a value out you're not doing any modification. And so if you just look at the types and this is something that comes up a lot especially when you work in functional programming and when you're working with pure functions as you sort of look at the types and think about what you want. So modify F gives us an FFS back but we actually want an A value. So it seems we're kind of we're out of luck here we can't really get an A out of an FFS nowhere in FFS do we have an A. If you step back a little bit we say well we need some way of ignoring the S parameter to F and we get an A back right? So we're now again thinking about F not as a type alias but maybe as like a type level function. So regardless of what S I put in or regardless of yeah what S I put in I always want a particular A back which sounds really familiar to something we saw in the previous slides which was a constant function right?  So what is the type level function it looks like? Two type parameters is Z or Z which is the thing that you actually care about and then A which is the thing that's gonna just be ignored and so when we define a function instance for to make modify F happy we're gonna fix Z to be a particular value and then we're gonna leave the A parameter free because a function wants to type a type constructor and so all right now we're safe to implement it the map call we have a const to Z A we have a function A to B we want to const Z B back we do some simplification we have a Z a function from A to B and we want a Z back the only way we're gonna get a Z so just another we're going back to in a pure functional setting and where we don't have like nulls or exceptions or anything like that in this particular case there's really only one thing you can do which is just completely ignore the function and just return to Z back so another thing that programming in a functional style gives you is ability to sort of like guide you through how you want to implement the code and if you want to look up this technique the key word that you're looking for is called parametricity I think there's a talk later today by Chris Nutty Com that's gonna talk more in depth about it so we have our functor for our const and so now we call modify F with that const and so it might be sort of weird to follow it but essentially what's happening is you're going to the call to modify F you're going to say given the currents A inside it I'm just going to give the A right back because const Z of whatever is just it's just Z itself so that's valid and then when you go to apply when you go to map over this const to sort of set that state set that new value inside the state I'm just gonna ignore the thing completely and so while on the other side you're gonna get a const Z of S back we know that under the covers it's just a regular Z and so we now have essentially what it's doing is it's storing the Z value inside something someone's gonna try to map over it but we're just gonna throw that function away and then we're gonna give that stored value back and we're able to get the Z right back out and so what we've now done is we've implemented get and set in terms of modify F modify is also defined in terms of modify F and so it's sort of interesting to see that the idea of a lens which is getting and setting on objects is now fully defined by an effectful modification on that object and so the point that I'm the interesting point that I'm trying to get at is well we were able, it's cool to see this it's sort of like a neat thing that happens to work out but we had this sort of like idea and const thing that we were using to implement get and set in terms of modify F and it might be easy to think like well maybe it just conveniently happens to work out in our favor in the context of lenses right ID just happened to be what we needed to make a non-effectful modification and the const just happened to be what we needed in order to get something based on a modification so I'm gonna show another example of where ID and const become really useful and just to show that they're not just like a one-off trick that we use and so the example I'm gonna talk about very briefly is called traverse traverse is a really cool thing encourage everyone to check it out but I'm gonna sort of like hand-wave about it traverse has sort of like a complicated type signature if you recall, if you're in Daniel's talk you can sort of just ignore the applicative for now just sort of gloss over it but essentially applicative allows us to take two G of A's and then like get one G of A back by sort of combining those two based on some sort of function and so what traverse says is give me some F of A you can think of F as like say a list give me some list of A and the function from A to some effectful B I'm going to, you can think of it as apply this function to every single A so we now have like a bunch of different effects and then we're gonna combine all those effects we're gonna collapse all those effects down back into the original F you gave me and so if you sort of instantiate F and G it might become more clear so if we instantiate F to be a list and then G to be say an option you can think about traverse as doing validation you have a list of maybe unvalidated you have a validation function that goes from A to option of B and the other side you're gonna get an option and list of B out and if the result of applying this function to all the A's was some in all cases you're just gonna get a sum of the list of validated values back out otherwise if you hit a none at any point you're just gonna get a none back another way you can think about it is fix F to be list fix G to be task the async effect that we talked about earlier and what this is doing is essentially given a list of data take each piece of data fork it off into a new its own computation and then take all these new async computations and join it into a list so it's for like the scatter gather idea so traverse traverse this type signature again in a more general form in a in a curried form looks like that given an F of A given some effect full function on A we're gonna get an effect full collection or context back so earlier I talked about we're going to see this identity and const thing again so what happens if we fix G to be identity let's replace any where we see G with ID so we have F of A to A of ID of B to ID of F of B remember that ID is like a type level constant function so we can sort of ignore that outer type instructor we do some substitution and we see it goes from F of A to A of B to F of B which should look pretty familiar at this point we've seen this in earlier slides twice now this is exactly the type signature for map on Functor Functor says give me some effect a pure function I will give you I will apply that function to the value inside the effect and you're good to go traverse with identity is exactly that so we're now seeing two for one we're seeing identity is not just a cute trick used for lenses it's useful in other contexts as well another thing is this idea of traversing doing like a factful traverse over like a collection is also related to just manipulating a single effect we're going to do a similar thing for const the const is a bit trickier for traverse we have to assume that there's some way and we'll see in a bit why this is a reason but we have to assume that there's some way to take for the Z type parameter we have to assume that there's a way to take two Zs and combine them into a single Z the actual keyword that we're looking for here is called monoid I'm not going to get into that too much but essentially you can just think assume that somewhere we have a reasonable binary operation on Z that would take two Zs and produce two SZ we do some substitution so we say give me an F of A a function from A to const Z of B and I'll give you back a const Z to F of B back we do some substitution and we say given an F of A and a function from A to Z I'm going to give you a single Z back and what this means is remember we have this ability to take any arbitrary Z and join them together so what this actually does under the covers if you say make F a list and Z an integer or something it's going to take that list of data it's going to take that list of data and it's going to map all of this bits of data into say an integer it's going to take now this list of integers and use like addition to reduce it all down to one value and so again we have this reverse function which seems to be doing an effectful traversal over some sort of data type and it's capturing both the idea of manipulating a single independent effect the function which we talked about but also it's capable of reducing a collection of values down into a single value and so all these seemingly unrelated things are sort of coming together in a nice way and this is sort of the things that I really that I find really fascinating that I really enjoy and there's several other examples of this but in the interest of time I'm not going to get into that but lenses and traverses are sort of like the two big things I discovered over the past few years that I really really enjoyed and if you're interested in learning more I have a list of like so for one there's a book by Rudolf Jarnsen and Paul Chuzano called Functional Programming and Scala that I really recommend people check out in terms of libraries there's a list of libraries if you're doing Scala development already that I would encourage people to check out if you want to program in a more functional style so cats and Scala Zd are two general purpose functional programming libraries that will give you general tools like Functor, Applicative, Monad, Identity, Const and then there's some other libraries like Arcannot which is for purely functional JSON encoding and decoding, Adolf which is purely functional parsing, Monocle which sort of takes the idea of lens that I just talked about previously and takes it to like a whole another level of abstraction which is really awesome and a shape list which allows us to do like really serious and magical abstraction like it's able to abstract of arity of functions and it does a lot of crazy type level stuff. I mentioned the word monoid earlier and there's a whole group of so monoid comes from this mathematical branch of group, abstract algebra or group theory and it comes up a lot surprisingly a lot in like data analytics and things like that where you're like working with data a lot. Algebra has some stuff, it's from Twitter they use a lot in their Hadoop MapReduce engine. Algebra is a joint effort between Twitter and Eric Osheim who is the author of Spire to sort of share, have a common foundation for the Algebra library and the Spire library and then Breeze is a similar library out of UC Berkeley. If you're working in like the big data space I guess and you want to look more into functional programming there's Skulding which is from Twitter which is a wrapper at MapReduce but allows you to work with MapReduce in a more functional way. Scooby which is out of Nikta, similar to Skulding and then there's Spark which is separate from MapReduce but the interface is sort of the same. You work with your data in a functional way and at behind the scenes it's sort of like handling the effect of distribution and reading and writing for you. And then if you're doing systems programming which is what I do at Box Often something I'm really excited about is that we're seeing a lot of these like purely functional systems-y libraries coming out that we're now able to write like a purely functional like backend system where you don't really have to like say oh well I'm writing into a database so I have to sort of side effect in this particular isolated corner or I'm like doing remote calls so maybe I have to use like I have to side effect to send something over to network. There are libraries out there to help you do this in a purely functional way and so Doobie is I think there's a talk by Rob Norris later today that's purely functional database access backed by JDBC. HTTP 4S is purely functional HTTP client and server. Remotely is purely functional RPC that's out of Verizon and then there's also scholars that stream which is purely functional streaming IO. And so there was, I forget the name of the talk but someone had did a talk a while back I think in Australia where you sort of took Doobie, HTTP 4S and scholars that stream and combine them all together where you had like requests coming in as a scholars that stream into a web server backed by HTTP 4S which then made purely functional database call via Doobie and then propagated that back up. So the entire like HTTP thing was like just one stream you have streams in, you have streams out and it was really nice to work with. And there's tons of other libraries out there these are just some of the ones that I use or play with often. But other than that, I guess that's all I have for today.


Everyday woman, woman, woman, in every way, yeah, yeah, I'm living my life, life, life, living day by day. Welcome to Every Way Woman. There are some major changes happening in the talk show world. Live from Los Angeles, here's Every Way Woman. Face those imperfections. How do you do it, Cheryl? Well, you know what, I'm fortunate to have been blessed with a very, very healthy dose of confidence. So, quite frankly, I don't let mine bother me all that much.  And so, we looked like, we left the house looking like we just came off the couch. We were couch potatoes. We were couch potatoes. And then we drove into town and we saw this restaurant, the Goucho Grill, and we decided, you know, why don't we just go in? So, we went in there knowing good and well, we looked like crud, but we sat down and we had a meal.  And it didn't matter because it's like, you know... Wait, wait, hold on. She said she wanted to go to the restaurant and look like a brother. The restaurant was okay. Downtown Long Beach. She didn't have a reservation. Oh, she got the table. No reservation? Look, I barely had shoes on. You know, I find it really interesting, though, because it's coming from the fashion industry as a model where a lot of times these differences or these imperfections were celebrated as uniqueness.  They've got this gap tooth and all this and their exotic beauties. And for me and most of the women, I know, we look at ourselves in the mirror. We think, ugh, you know, something's wrong with me.  I've got to change that. I wonder how much it costs for a nose job. How old do I have to be to start my Botox? I mean, I see everything that's wrong with me. And it's really hard to think that those are things that make me individual or that I should celebrate. I think sometimes that it starts with our parents and our brothers and our siblings and our family. That's true. Because growing up, I had a grandmother and I loved her dearly now that she's gone. That was a happy thought. Thank God bless her soul. Bless your grandmother. Oh my God. But one of the things she used to say all the time is as I was getting older, you know, I have freckles. And I had them a lot as a kid and she would look at me and she would look at me and go, ugh.  And that was her thing. We have a lot in common, Madison. Because my grandma used to tell me, you know, I used to love popsicles and like ice cream sandwiches. And she'd be like, girl, you're going to be as big as this house, girl. Because I have a big booty. Yes, yes. And if I can get my booty sucked, I would. Just a little bit. And some people want to keep their stuff, but I would like to get mine sucked up a little bit. But she used to say, you know what? You keep eating those ice cream sandwiches, you want to be as big as this house. And I was skinny as a tool thing. I lived in San Francisco. I walked up hills and mountains. Oh my God. Did it give you the complex? Were you worried about being imperfect enough? Mm-hmm. As far as my booty. I think it does. It plays with you a little bit.  And I'm like, ooh, you know, but I try not to make up a song or tell her not to eat popsicles. I really wanted to enjoy it. Make up a song. There was a mom, she used to make up a song like, ooh, that big belly. And so. And she does the same thing. She gets that when they get eight years old. Kyle, your niece does the same thing to you. Oh, she does the same thing to me the other day. She's only two. And she was singing to your belly. She was singing to my belly. All right, my son was about four, about a year ago. And I'm a fit person. I consider myself to be extremely fit.  I was kind of depressed. I just started my divorce. And my son looked at me and touched my belly and he goes, having another baby mommy. Oh. You touched your belly? Yeah. And he's going, you have another baby mommy. And I went, oh my gosh. What am I going to do? I think of my whole point to like, my niece doing that to me. And like, let's get real. I lost 160 pounds. Yeah. Yeah. Obviously. Thank you. But obviously that was my, like I have a lot of imperfections and that's one of them because I still, I still struggle with that, you know? But at the same time, I can't be looking at all my imperfections. I, I've learned to embrace them. Right. And that is one of the reasons that I ended up, you know, being on the cover of that magazine that actually took.  But what's the stereotype of being on a cover? Skinny, right? Yeah. And I, yeah. You know, I, of course, I don't. And I got a little, I have a vocal of a body but I would lug my hips and like just, my booty just, they get, maybe that's, I'm still on that thing. Right, you are. To get like a little burn. Like, I want the muscle, I want muscle there. You want to be less minutes in your hourglass? Yeah. What do we do? It jiggles sometimes. But I, I was teased. I was teased. But sometimes, sometimes women look at, generally speaking, they did a survey. Women look at what's attractive and we tend to look at what's on the thin side, including our men. But men look at what's attractive, they tend to look on what's on the heavy side. Men don't look at cosmopolitan and go, that girl's hot. That is not true. You know, you know what I think is really interesting though in this conversation is that when we are referring to imperfections, we are all talking about our bodies. And that's really telling of where our focus is because none of us have talked about our imperfections and you know, our habits or our personalities or our lifestyles. Very true. What are you talking about? Yeah, exactly. I mean, I don't have any. That's a good point. That's a good point. But you know, because it does start from the outside because a lot of times what we feel on the inside is what we reflect and see on the outside. That's why we focus on the outside because it's the easiest thing to hit first in terms of work. I feel like I'm in therapy right now. They told me to look in the mirror. My therapist at one point did say that. He said, you know, when you look in the mirror, what you're seeing and when you see these imperfect reflections is really just what you're struggling and what you're fearing and those are the imperfections that we have to deal with. That's the only way we're ever going to really embrace and love the perfection in our own perfection. You know what? Now that I'm older though, I don't really want to take that much ice cream sandwiches.  But I liked what Anna was saying earlier because sometimes what can be perceived as an imperfection is what makes you beautiful. Wow. So it is kind of learning for yourself because if we look at ourself in pieces, we can all break each other apart and break ourselves apart. But what does it look like as a whole? And what does it feel like as a whole? But if I was to like look at myself and pinpoint out an imperfection that doesn't have to do with my looks, it would probably be that I'm too hard on myself. Wow. I'm too hard on myself. And that's true. And I had to have somebody here tell me that. So I realized that. I was like, oh man, she's right. Well if it makes you feel any better, I did make a New Year's Resolution to drive around with a clean car. Inside and out. Wow. Not doing so well with that. Thank you. This is a shiny car at the valet. We'll be right back. Coming up next, more Every Way Woman.  We have Danielle here to let us know. Welcome back to Every Way Woman with Danielle Addisi for Real Moments with Real Mom. Danielle Addisi, you've just had a baby about a year ago. Yeah, yes. You had a fourth of July baby. Yep. What was that like? Oh man. Well actually, I was afraid that when I approached the due date, I would be very afraid. But I just, it was so miserable.  You didn't even celebrate. Oh thank God, yeah. My family came out and they were all just waiting. It was a week after the due date. I was afraid they were going to have to go. And it was just, I was really glad when it went into labor. How was Holiday in Staff because it's the fourth of July? Yeah. It was the first and then we stayed until the third. So by the fourth of July, we were able to watch from our own home the fireworks and that was really, really wonderful. So this is your first year of motherhood. Yeah. What would you say is the most rewarding part about it? Man, when she cuddled, she's a very active child. She hardly ever sits still. So when she finally calms down and takes that moment to really appreciate me and you know that look in her eyes, nothing is like that in the entire world. Was there something within this first year that you didn't expect? Like, we all get the book, moms get that book. What to expect when you're expecting. But then there are things we don't expect. So was there something that you didn't expect? Yes. When I became, you know, when I was pregnant, I knew there would be days where I was very overwhelmed. I knew there would be late nights. There would be hard moments. What really struck me was that it never ends. And just, it's like a marathon. You know, I was ready for some sprints, but it doesn't ever slow down. So, yeah, and that was really difficult with my family not being around. They live in Wisconsin. I moved to L.A. about two years ago. So that was a big surprise. So your metropolitan lady married? Yes. Yes. And how was it with your husband? Now you've been married how long? Two and a half years. Pretty earlier than we expected. Yeah. But, I mean, it's amazing. Yeah, he is absolutely incredible. Surviving in the city together does put some strain, especially with the baby. We've really worked hard to be supportive, but it's hard when you look at each other and you see just the tiredness in the eyes. It's difficult. Yeah.  Wow. He, gosh, he's done so many things. Everything from just housework, that's something that wasn't really expecting him to do. Are you working? I am. Yeah. When I, first I went back to work at six weeks. I work at Starbucks for the health insurance benefits and he earns the income. But, I went back at six weeks. I was working 35 hour work weeks. I was kind of slowly, I've become more honest with myself. At the beginning I was like, I can do this. What does that mean when you said you became more honest with yourself? You know, I realized that you can do only so much. You can do a million things, but you can't necessarily do them well. Is that because you didn't feel like, sometimes you hear that, oh, the super mom, I can do this, I can do that, we can do everything. Did you feel like the challenge was over? Yeah, well, it should be completely honest, the way I would get through on the days that I would qualify as super mom was a ton of coffee and that really had a detrimental effect on nursing. So you nursed your baby? I did, I nursed my baby. It was amazing. And difficult. I thought it would be amazing. The first three months or so was not that amazing. At one point I thought, I remember I was supposed to love this, but it just hurts. Yeah, yeah, yeah. Well, and I thought right after the baby was born, I'm done, and it was incredibly painful. It kept going. Yes, just a surprise. Now, you seem like you're in pretty good shape. And how was that for you coming out of getting back to the main flow of things? What about your body? See, this is, I'm not back to what I was and that's difficult for me. My strategy tends to be whenever I have a little bit, my life is a little bit saner, I'll do cleanses because there's less to think about. I know a more consistent approach is probably longer-term lasting. Like exercise? Oh, exercise. Yeah, yeah, yeah. Exercises. You know what? You just joined the Y and that has been absolutely incredible. I love that you said that, that you joined the Y. I think it's wonderful. I'm so happy that you could do that. Yeah. Well, and I didn't know, I didn't realize the impact of two hours of childcare a day. That's the only moment I get to myself in a day. So, that's been huge. Yes. So it is. It's challenging being a new mom and being honest with yourself about what their approaches are.  But thank you, Danielle, for coming here and sharing your truth to childbearing, childrearing. Is there any advice you'd like to give to our audience? Yeah. I would just say that I would encourage you to feel like you have permission to feel like you can do less and still be supermom. Do less and still be supermom. Thank you. After this commercial break, more Every Way Woman. Are you an Every Way Woman? Today, Dr. Sherry Thomas is going to give us a little information about menopause. Or, as my mother told me, the change. Do people still refer to it as the change? Oh, yes. Wow. Tell me, what is the problem? Why do women have a difficult time accepting menopause? Well, it's not just the word menopause. It's the changes that go on in the physiology of our body. And one of the biggest problems is the change in the body. So those personal summers, hot flashes cause us to not sleep at night. And as a result, we have some personality changes. It causes us not to think well. Women multitask all the time. Right. First two weeks of our menstrual cycle, lots of estrogen, lots of multi-task.  But when we go through menopause, it just really destroys our ability to have reserve and to think and to really deal with all those issues we deal with when we're having periods. So in addition to hot flashes, personal summers and not sleeping, what are some of the other symptoms of menopause? Well, drier skin, especially in the vaginal area, which causes pain with sexual activity or may cause more bladder infections. Osteoporosis, we also catch up with men with heart disease 15 years later because that's going through the chain. And our body, just the physiology is that we just start aging a little faster. And as women, we just hate aging anyway. And so I think that's why women have such a negative connotation about menopause is like, now I'm really going to age. You know, I agree with that. I think that is why women do because you come to terms with I'm getting older and there's something about aging that just kind of messes with our psyche. And I think that's why women don't address this menopause to change aging. What are some of the health risks? Well, let's let's back up to how we can go through menopause without the health risks. And that is let's start about taking good care of ourselves. Making sure we see our physician every year keep our cholesterol and blood pressure and glucose under control. Not smoking, exercise, eat well and have a nice social life with our friends and our family. And that's why menopause there's a lot of things we can do without hormones. And we know as Pujo will help the hot flashes but how can we get through it? Well, let's keep our weight down let's cut down on the alcohol especially at night because that will really increase the hot flashes. So you're saying a little nip at night is not good for the ladies?  Let me ask you this as my doctor you will help me through this process what should I be looking for or how would you help me if I come in and I say I'm going through the change how will you help me or how should I know that my doctor is my advocate to menopause? Well, I want to ask you symptoms and specifically which symptoms you're having hot flashes, problems thinking problems concentrating dry skin pain with sexual activity and then I want to ask you how much does that bothering you? How much is that affecting your life? If you tell me you know I have a few hot flashes here and there but it's not a problem I'll say well let's just see how you do but let me know if it comes worse and if you say I am so overwhelmed that's why I'm here today I'll say let's talk about how we can change Now what about premenopause because there's the notion of some people who are close to me that started their menopause are the change in their late 30s early 40s or even in their mid 30s Yes, that happened we call that premature ovarian failure our ovaries produce estrogen and release follicles at a time that's genetically predetermined basically when our mother goes through the change we will but some women their body doesn't pay attention to that and so in their 20s, 30s they just stop producing estrogen and that is very significant and very upsetting for them because we know as women between 45 and 55 we're going to go through the change but when women start doing that at 25 first of all it may take them a few doctors to really diagnose what's going on no, it's not a thyroid problem no, you're not having some infection no, you are going through the change and then we start treating it appropriately because I know you talked about some of the health risks by not going to the doctor so if I'm having those symptoms what should I do tomorrow? what should I do tomorrow? I'm hot flashing what should I do tomorrow? so if you're having hot flashes and you say gee, I didn't sleep well get a fan out take a little cool shower go swim at E4 don't drink the alcohol not high spicy food see how you get through the night if you feel like the next day I'm still just rung out I'm miserable I can't go to the meeting every time I sit through a meeting I'm drenched I just feel beat red and uncomfortable go see your doctor the fastest, quickest way to get rid of hot flashes is taking that well, hopefully a lot of people will be making doctor appointments today listen, ladies in order to take care of others you have to take care of yourself if you're having a personal summer get a little hot flash or just not sleeping well you could be starting to change stay tuned, everywaywoman we'll be right back everywaywoman gives back to the community go to everywaywoman.com to find out how you can match our donations of undergarments for needy kids thanks for getting to know everywaywoman I'm an everyday woman woman woman in every way yeah yeah I'm living my living day by day


Welcome to PP18, the ITU Plenary Potentiary Conference here in Dubai, the United Arab Emirates where I'm very pleased to be joining the studio today, but it's Paula Ignebire, who is the Minister for ICT and Innovation for the Republic of Rwanda. Minister, welcome to the studio. Thank you for having me here. Now I'd like to start off by asking you there is currently considerable attention being placed on harnessing the power of information and communication technologies or ICTs as an enabler for good, for the development, for the benefit of people, families, communities and nations. What's your perspective on this? To start with I think I'm even very impressed that we've moved away from the notion of thinking of ICT as a standalone industry. And we're now over and over thinking about ICT one as an enabler to the different clusters or segments of the economy, but also I look at it as an integrator. And so when I start with a notion of being an enabler is that it isolates some of those barriers that in a way isolate the different facets of the society. I did mention that I also view ICT as an integrator and that's correct because if you look at the whole drive around bridging the digital divide as a crucial aspect of how eco-access really fosters innovation and entrepreneurship, you start to see how the different technology tools that we put in the hands of the people are able to integrate the different elements of their lives. And so as a personal perspective I look at it as an enabler and as an integrator. Now this is the first Platinum Potentiary Conference for ITU since the world agreed on the Sustainable Development Goals of which there are quite a few, but I wanted to ask you perhaps you could provide some examples of how ICT are helping to drive sustainable development in Rwanda. I want to start off with some time in 2016 right at the time when we were evaluating how much has been achieved in terms of the MDGs and Rwanda had done considerably well in the space and at that point Rwanda was selected as a headquarter that would spearhead implementation of sustainable development goals. That's not a task that comes in very easy but then what it has gotten us doing as a government but collectively with the private sector is to think of innovative ways through which we can really achieve the sustainable development goals. I'll just pick out a few cases just to give you an idea. When we look at healthcare some of the things that we've done and something that the government of Rwanda is keen on is how do we leverage these emerging technologies that are really driving social economic development across the globe to really transform the way we do things back home. I'm sure you've seen it recently even in the news where we've been using drones as a way of delivering blood to the different hospitals and healthcare centers across the country and we've seen a lot of improvement in terms of healthcare delivery thanks to drones mainly around the fact that you're able to serve lives because you're able to get blood in a much faster way. It usually took us about three hours to deliver blood and now it's come down to 26 minutes and so you're able to serve many lives but also we've been able to control wastage of blood by over 80% in terms of how much blood waste was happening due to transportation and storage related elements and so that has been one area and when we go to education the government has placed a lot of emphasis in terms of how do we increase digital literacy at all at different age groups and one of the things that we did a few years ago was really how do we place laptops in the hands of children and we've been part of this global one laptop per child initiative where you know at a very tender age when you place such devices in there in the kids hands it's almost you know triggers high levels of creativity that you wouldn't see ordinarily at you know older age groups and so that's one area but also I think even going forward what we're starting to see because our vision of becoming a knowledge best economy and really driving innovation within the economy one of the areas that we're focusing on is how do we build talent because how do we build an increased scientific research and innovation and we have been able to attract a number of partners who really are coming into that space we have the Africa Institute for Mathematical Sciences that is really focused on scientific research in the areas of mathematics you also have Carnegie Mellon that really has a strong focus on how to build developer skills recently we signed an agreement with Andela that has that is going to train over 500 developers within Rwanda and really the emphasis on talent development is mainly aligned with the different areas where Rwanda wants to lead in terms of innovation and the critical skills that are required to drive those areas are really developer skills and and so that has been a lot of the emphasis and maybe I could touch briefly on two other one element which is bringing services closer to people to improve their lives and through that we've been able to roll out a platform called Irembo it really provides all services to citizens online but beyond providing services cutting the trips the number of trips that a citizen has to make to get a service from government it has also helped in terms of contributing towards the welfare of citizens because one of the things we do in terms of increasing access to citizens is the agency network that happens in the different communities so it's not strictly getting services from really a space you know a physical space and a physical government office but really empower empowering citizens to support each other in driving digital literacy but also in accessing services so those are a number of examples in areas where we are trying to to really promote the adoption of ICT in driving sustainable development goals and maybe I should mention one last element which is really around smart cities we are part of the smart Africa initiative we're part of the member states and each member state has a flagship area they're leading on Randa is leading on smart cities but we're not just looking at the key cities we're also looking at the multiple you know secondary cities across the country but in really tackling issues that are very central and critical to you know urban city development we are actually addressing challenges that are fundamental to the citizens that are living within those cities it's wonderful all very laudable projects and initiatives and you're very much at the cutting edge there obviously of technology and a great example for all nations around the world I just wanted to talk to you a little bit about the digital divide I know that you mentioned that there with trying to address some of these elements but about half the world's population is now connected to the internet the other half isn't just really wanted to find out what specifically is Rwanda doing to get everyone connected so for a start as a country a lot of focus was put in terms of access how do we provide access equitable access across you know the different districts within within the country and that has been achieved and really we've had a good relationship with the different operators who have really invested heavily into you know rolling out high broadband high-speed broadband infrastructure across the country but we are at a point where now the issues that we are tackling are to do with affordability because that's the only way you're able to bridge that digital divide and really increase your you know internet penetration voice penetration across and a number of interventions are in place of course through engaging the different operators so in terms of affordability we're looking at two I could say segments one is affordability of services the other one is affordability of devices and I think there's been made major progress when it comes to affordability of services where we're seeing operators increasingly coming up with innovative parks that that are time best that really allow for the citizen and the user to maximize data usage but also to be affordable to them but once you do that you really have them hooked and so they are constantly looking for these services because they understand the value that it brings to them in terms of devices which is really crucial again one of the things that we've been doing is to engage operators to say can you come up with you know incentivize devices so that you're able to put devices in the hands of the citizens and and make them less expensive that makes it easy for them to purchase these devices and maybe if you need to recoup that investment that can be built into the services without making them necessarily expensive and so affordability is one thing that we this there's definitely room for improvement there's definitely room for being more creative on how we can increase affordability because that's the only way we can increase the you know how much we bridge in terms of the digital divide the other element is on literacy digital literacy it's one thing to have devices and services but it's the other thing to empower citizens to be able to actually use and make use and maximize you know these devices and services that they now have access to and so we're working very closely with different private players to see what are some of the creative ways we can you know drive digital literacy across the modern population besides just trainings what are some of the other ways that we can do this and so those are the two areas that we are focused on to bridge the digital divide which is affordability and digital literacy we covered a lot of ground here but i just wanted to ask you finally what's your message here to participants at itu pp18 and to our wider audience as well my key message and this is something that as ronda we're very passionate about as just like any other across the con the african continent we have a number of countries that are really working so hard to become innovation hubs but i think this drive is really inspired by the fact that we want to move away from being consumers to becoming creators of these innovations of these technologies and solutions and so itu provides a good platform for these kind of partnerships whether it's multilateral partnerships or bilateral partnerships but i think increasingly we need to put a strong emphasis on how we support each other to become creators of these innovations so that we can have equitable development when it comes to the sustainable development goals minister thank you very much indeed thank you thank you for having me