I kind of like this one just a tad better personally. Hey what's up guys this is Josh here today I want to do a little review on this C60 by Suspended Solutions. Now C60 is a pretty interesting compound. I'm going to try to basically do a little overview about what I found online about it. I'm sure if you find other videos or you look for other information they'll have a lot more on this one. C60 is almost a super antioxidant and basically it's like a carbon atom but it's shaped like a soccer ball. Apparently like it has 60 lines or 60 sides and it's just a big ball. It's a very very strong antioxidant I think they said it was 270 times more potent than vitamin C. If you have free radicals in your body something that's not good this basically interacts with the free radical and gets rid of it without the free radical having to interact with your body and your body will neutralize it but it kind of takes a little bit of a toll. So just basically something to help you get rid of the free radicals or bad things in your body. Some of the effects I found online is that it is very very good for sleep. Now when I've taken this it was pretty good for sleep I already take a lot of supplements for sleep. Sometimes I've noticed that I'll have a lump in the day where I feel really really tired I have time to take a nap but I just can't fall asleep. One of the times I actually was able to fall asleep I felt so so good off this so I definitely think if you have trouble sleeping check this out for me I have a lot of other supplements so I don't really have that issue. Reduce effects of aging I think this is because it gets rid of the free radicals it's just a very very strong exotic supplement. One of the highest benefits is it has anti-aging properties I think it says right there age defying antioxidant. It's also supposed to increase lifespan reduce pain slash inflammation and maybe help fight eczema. Basically it seems like a super antioxidant if you've been diagnosed with some sort of high free radicals or like heavy metals in your body this might be very good to help flush all that bad stuff out. The pros is that number one it's by suspended solutions so they always send it in this EMF protecting bag so they make really really exotic high quality supplements. None of the radio waves or none of the cell phones is going to interact with it in this bag. One of the only companies that does it. Another pro is that they offer several kinds of oil. Most people love avocados and most people love guacamole but I'm just somebody who's never really tried it was never really into it so I got the avocado version here. Avocados are really good for you and this was really good but it took me a second to get used to it because I've never had avocados and I've never had guacamole. I don't really mind at all now but when I first got into it it was like a really unique kind of taste. You get benefits from the avocado oil itself on top of the C60. The C60 is actually 90% stronger when it's in certain kinds of oils this or olive oil. I know suspended solutions it's really nice. They offer avocado oil. They offer olive oil and they also offer hemp oil. To be honest I probably would have gone with the hemp but I do not mind at all this avocado right here. I use this as a substitute for or miss usually I always take or miss but I kind of want to see if I don't have or miss and I just take this how much does it help and it's actually been really nice. I haven't really felt that I've needed or miss. I just feel like a general good healthy vibe every time I take this. It's just a very very high quality supplement it's in high quality oils it's done right and there's a lot of exotic things to it especially if you're into anti-aging or you have some issue with your body where you have free radicals or like if you're somebody who is worried about getting sick if this is 270 times stronger than vitamin C this is probably one of the highest recommended things that I would go for if you're not really feeling too good. I really didn't have almost any cons with this supplement I know the price is about $40 and you get you get 24 servings for $40 so that's not as good as or miss I think or miss you get 38 servings for $35 when you have such an exotic supplement such as this that's going to do more things than your normal vitamins at what price is too much for something like that also it's super greasy because of that olive oil the only cons I have is the price it's a little bit more than or miss still not bad I probably would prefer or miss to this I just reviewed zeolite I really like zeolite I kind of like this one just a tad better personally so I recommend or miss number one this number two zeolite number three but they're all very very good and I would go for kind of the benefits that you're looking for this is kind of like a super antioxidant so anybody take it vitamin C or any other antioxidants like you know from fruits or whatever definitely check this one out is very very good I would definitely recommend this for somebody who's interested in some anti-aging there's a few good options out there colostrum is really really good atomic or miss is really really good I think there's that NMN which is really good so there's a lot of options out there but really really like in this stuff also if you have trouble sleeping check this out I've heard a lot of testimonials about that and I've had a pretty good sleep on it and then also if you have eczema I've seen a lot of people talk about this being really good for eczema and I tried a lot of other really good compounds and they don't mention eczema as much if you're somebody who does has have eczema definitely try this out it could work out for you it seems like a very very high quality supplement very interesting supplement and I think this was modeled after things that appear in space from the mistaken very interesting supplement of supplement that I really really like love suspended solutions hey have you tried c60 have you tried in the other oils have you tried other brands I'd be very interested to see down below if you're into supplements take a look at this take a look at all the information behind it because it's definitely something super exotic super strong definitely something to check into if you're looking for the best things in the world that's been my review of c60 I'm really really liking it right now my favorite suspended solutions product besides or miss really really good let me know what you think of the video I love you guys so so much won the road of 50 000 subscribers and I couldn't do without any of you guys help you guys are the best I'm having a great day out here hopefully I'm a great dad home see you on the next video peace


I'm Alicia Woodruff and welcome to the Fort Worth. Mark your calendars now to participate in Fort Worth's largest community cleanup event. The 29th Cow Town Great American Cleanup is on Saturday March 22nd this year. If you want to join one of 12 locations you can, but if you have your Girl Scout Group, your neighborhood association, your church group, all of those groups you can pick a location nearest and dearest to your heart then that's the location you'll clean. We're asking people to register by March 10th so we can make sure we have enough supplies on hand for everybody. After you clean the city you're invited to the Earth Party in Sundance Square Plaza. The Earth Party is going to be great this year. Our entertainment is vocal trash. They put on a great show and then we have 40 vendors out here from free giveaways to composting demonstrations to there's going to be pet adoption. Cow Town Cleanup is once a year but you can continue your cleanup efforts by signing up to reverselitter.com. It's asking Fort Worth residents and everybody in the Metroplex to pick up 10 pieces of litter on Tuesday. Just go to reverselitter.com and sign up to make a pledge to pick up litter every Tuesday. It's real easy and it helps make our our community the whole Metroplex a better place to live. To register for Cow Town Great American Cleanup visit Keat Fort Worth Beautiful's website. Here's a look at other events happening in and around Fort Worth in the next few weeks. For a listing of more events in city meetings you always can check the website.


Hey guys Shaber 1000 here today, we're gonna find out Why this thing does not run Stick with yeah guys today We're gonna check this golf cart out Find out it's electric It's all battery-powered, but If you can see right here on the dashboard, let's turn it on it's reading its Almost three-fourth charge works Turn signals work. I don't see what's going on with it. I do here. I've got to lift this seat up All right, we've got the seat lifted up. Here's the batteries now. I'm seeing some some green stuff there I'm seeing a lot here, and I'm guessing there's the problem. I'll bet you anything So what we're gonna have to do. Yeah, see all that That's not good that first thing we're gonna do.  I've got that coke here not mine. That's her mom's Well, she bought it for me last time I was here because she thought I I like diet coke, but that's okay I'm gonna pour a little bit of this on here And we'll see if we can't find an end in the garage to put on to that cable and see if that's the issue All right first thing we want to do you want to cut this end off cutters here. I don't know if either one I'm gonna cut up, but We'll see the regular end So what we're gonna do Is we're gonna use this end here and this on to here and we'll see See what we get from there. This is at her mom and dad, so I'm using her dad's tools. I hate using another guy's tools, but I mean he's got everything here So a lot with me. We got to go get a hospital bed for when her dad gets back, so we got to go get that her mom had to go get a stress test done so That's where she took her So I figured now would be a good time as any to Find out what was wrong with their golf cart because if it don't run can't sell it All right, I know you can't see much but you get the idea what's going on here, right? Some guessing since this one wire is still connected here. That's probably why it still had the horn and everything's still working on it so Let's go ahead Loosen this up Take that off. There's the old Piece that broke. I'm gonna go ahead and set this on first and we'll set this down on here Put a washer on it Tighten her up. We'll see what we got that way so it doesn't touch any metal. Let's move this stuff out of the way Let's see what we got Chester. I got this thing with Temperature probes and couple extra leads and in a bag. I got this for like three dollars at a yard sale Well, it came in a box of stuff, but let's check the batteries.  It should at least move Let's check if there's any fuses bad Okay, guys, we're on the other side. I was wiggling the wires the cables around to see if I found any loose cables and Lo and behold, there's one right here. So Let's see if he's got another end like that in the garage somewhere like we put on the other side Let's put it on here and see cuz see that's not gonna make a full connection. See they're running series So let's see what we can find out Okay, guys, so this is what I came up with for now to check it and if that's the problem Then I'll go ahead and get them another Link the cable the right cable for that and The right end for that one over there. So let's see and put this on the charger So that way it'll be charging up good and I think we got it All we got to do is get the the right ends for but now we know what the problem is. It's nothing major So I checked the batteries and they're all good. Oh, so We're good to go there guys So they should be getting back and then we gotta go get that bed stay tuned Okay, guys, of course figured out I just got to get the regular ends that go on it put them on there for and that'll be that'll be good to go so We got the bed loaded that's one of them kind of like a hospital bed Goes up and down all that stuff for her dad But we had help when we loaded a butt.  Yeah Drag it down off there and just let it roll right down slide off that puck. Okay Pick it up That's it for now, I took the basket out it just slides into the receiver Just goes right inside there and a pin fix it up So now we're gonna get this thing inside. I'm gonna call it a day. All right Okay All right guys Maybe you need to rest for shaper 1000. I'm gone for now. We'll see you soon. Bye. Bye


Are you upset because you accidentally lost or deleted your most treasured photos and memories? Fear not! You have the power to bring those precious photos back with Photos Recovery software. Let me assure you, it sends out as the best recovery software available. Download and install Photos Recovery software using the link provided in the description. The user-friendly interface makes it a breeze to use. Simply select the dry you want to scan, choose deep scan for a thorough scan and click start scan. The hold, your deleted photos will appear. Preview and select the ones you want to recover, then click recover. Choose a different location to save the recovered files and watch as Photos Recovery software certainly retrieves all of your deleted photos. It's truly amazing, isn't it? If you found this video helpful, remember to like and share it with your friends who often find themselves losing or deleting their precious photos.


Ragdoll Cat vs Norwegian Forest Cat. What are the differences between these two cat breeds? With positive reinforcement, ragdoll cats learn quickly and can pick up tricks as well as good behaviors such as using a scratching post. The ragdoll cat is an all-around best buddy to just about everyone. They love their human families even children and will get along with other pets fairly well. Dossel, sweet and happy to relax for a good cuddle session, the loving ragdoll will even greet their humans at the door when they come home. If you're looking for a companion, you can't find a much better choice than one of these easygoing felines. The gentle and friendly Norwegian Forest Cat, Ouija for short, is fond of family members but does not demand constant attention and petting.  They are among the largest of the domesticated cats, with some males weighing in at 20 pounds or more. A ragdoll has a light colored body with a darker face, legs, tail, and ears. He comes in three patterns, midded and bicolor, both of which have white and color point, which has no white. Ragdolls don't reach their full size and coat development until they are three to four years old. Ragdolls sold as pets may have slight cosmetic imperfections that make them unsuitable for the show ring. These might include ears set higher on the head than preferred, a nose that doesn't turn up at the tip, eyes that aren't crater lake blue, or maybe mitts that don't go up high enough on the hind legs. As long as they have the sweet, loving ragdoll temperament, none of that really matters for a cat who will be a beloved companion instead of a show ring star. Norwegian forest hat is notable for its long, thick, beautiful coat and large size. The head has an inverted triangle shape, pointed at the chin and then widening on each side up toward the medium to large ears, which are heavily tufted. Large, almond-shaped eyes are green, bold, or copper, although white cats may have blue eyes or eyes. The moderately long body looks powerful, with its broad chest and heavily muscled thighs. Large round paws have tufts of fur between the toes. The bushy tail is as long as the body. The weatherproof double coat varies in length. The bib begins with a short collar at the neck, mutton chops on the side, and a full frontal rough. Full britches, long hair on the thighs, cover the hind legs. On the body, the coat is long and flowing, but it changes with the seasons. A Ouija in summer looks relatively naked compared to his full winter glory. Unlike many cats, ragdolls are notable for collapsing into the arms of anyone who holds them, even if they are cradled on their back. They love their people, greeting them at the door, following them around the house, and leaping into a lap or snuggling in bed whenever given the chance. They often learn to come when called or to retrieve toys that are thrown for them. The word most often used to describe them is docile, but that doesn't mean they are inactive. They like to play with toys and enter into any family activities. With positive reinforcement in the form of praise and food rewards when they do something you like, ragdolls learn quickly and can pick up tricks as well as good behaviors such as using a scratching post. In a small, sweet voice, they remind you of mealtime or ask for petting but are not excessively vocal. Ragdolls have nice manners and are easy to live with. You will find a ragdoll on your sofa or bed, but generally not much higher than that. He prefers to stay on the same level with his people rather than the highest point in a room. The gentle and friendly Norwegian forest cat is fond of family members but does not demand constant attention and petting. He is satisfied to be in the same room with people and will entertain himself if no one is home. Although he appreciates the human company, he can be a bit reserved with visitors. Even with family, he's not much of a lap cat, but a nice screech between the ears or beneath the chin is always welcome, and he'll usually reciprocate with a nice head butter cheek rub. He communicates with classic Scandinavian restraint. His quiet voice is employed only when he needs something dinner on time, and rises only if he is ignored. This large and athletic cat is a climber. You will often find him at the highest point he can reach in the home, and unlike some cats, he doesn't have any qualms about descending trees or other heights headfirst. Thanks to his heritage as a wilderness and farm cat, not to mention his waterproof coat, the Ouija thinks nothing of fishing in a body of water for a nice meal. While he loves the outdoors, he is content to live quietly in a home. This is a smart, independent cat who learns quickly and has an alert nature. He likes to play and thrives with a busy family that loves him. Hello. This video is sponsored by Beemix Pets. Are you looking for high quality cat collars at an affordable cost? Check out, BeemixPets.com. Use coupon code KittenLife, to get 20% off. A ragdolls moderately long fur has a little undercoat, which means it is less likely to mat and shed, but that doesn't mean the cats need no grooming. Comet twice a week with a stainless steel comb to remove dead hair that can cause tangles. Be sure to comb the fur on the legs thoroughly, especially where the leg meets the body, where mats are most likely to occur. A rubber curry brush will smooth the fur after you comb it and remove any remaining loose hairs. If you are gentle and don't pull their hair, ragdolls will love the attention they receive from you during grooming time. Note that seasonal changes, as well as hormonal fluctuations in unaltered cats, can affect the length of the coat. The coat will be at its peak in winter. Ragdolls that have been spayed or neutered will usually have a lush coat year-round because they lack the hormonal fluctuations that occur in unaltered cats. Ragdolls usually go through several growth spurts as they mature. These can continue off and on until the cat is four years old. Don't be deceived by the pad of fat on the belly, which is a trait of the breed. Until you are sure they have reached their mature size, make sure they always have plenty of food available to fuel their growth. Brush or comb the Norwegian forest cats long coat once or twice a week, using a bristle brush, wire slicker brush, or stainless steel comb. If you run across tangles, work them out gently so you don't hurt the cat. A bath is rarely necessary, which is a good thing. With a Ouija's practically waterproof coat, it can be very difficult to get him wet enough for a bath. He is certainly built to survive a cold climate. Check the tail for bits of poop stuck to the fur and clean it off with a baby wipe. Bathe them as needed, which can range from every few weeks to every few months. If his coat feels greasy or his fur looks stringy, he needs a bath. Brush the teeth to prevent periodontal disease. Daily dental hygiene is best, but weekly brushing is better than nothing. Trim the nails every couple of weeks. Wipe the corners of the eyes with a soft, damp cloth to remove any discharge. Use a separate area of the cloth for each eye so you don't run the risk of spreading any infection. Check the ears weekly. If they look dirty, wipe them out with a cotton ball or soft damp cloth moistened with a 50 to 50 mixture of cider vinegar and warm water. Avoid using cotton swabs, which can damage the interior of the ear. It's a good idea to keep them as an indoor only cat to protect them from attacks by dogs or coyotes, diseases spread by other cats, and the other dangers that face cats who go outdoors, such as being hit by a car. Cats who go outdoors also run the risk of being stolen by someone who would like to have such a beautiful cat without paying for it. The laid-back ragdoll and Norwegian forest are perfectly suited to family life. He rarely extends his claws when playing, and he usually doesn't mind playing dress up, riding in a baby buggy, or being a guest at a tea party.  They are happy to live with other cats and cat-friendly dogs, too, thanks to his amiable disposition. Introduce pets slowly and in controlled circumstances to ensure that they learn to get along together. If you enjoyed this video, kindly press the like button. Also don't forget to subscribe with notifications on, so that you don't miss out on videos like this. Thank you for watching.


Yeah, and during the break I had a question that was really asking about hearing the difference between hearing the Holy Spirit and hearing the Ego. How tricky that can be, how we could say that the Ego is ingenious so it will masquerade as if it's the Holy Spirit and then you follow what you hear and then you have a very dark fearful experience and you've sowed and reaped fear, but you thought you weren't. You thought you were listening to authentic guidance. So this topic is really a topic of discernment and it's an enormous topic. You could do lots of retreats. People know me, I do retreats. The longest retreat I've done is six weeks. Imagine coming to a six week retreat with me. I showed a lot of movies. We had a lot of deep experiences on an island off the coast of Spain, Mallorca. And there was a four week and a six week, but it's discernment is a very deep topic. On the most basic level how do you feel is the answer to which one you're listening to but also the Ego has invented a whole feel good repertoire of different emotions that feel good in its system and really are part of the death wish. So that's what the Course calls attraction to guilt. You know the Ego has to be pretty clever if it's attracting you to guilt to keep you stuck in guilt and using things of the world as part of alluring ways to stay stuck in that guilt. That's why it takes a lot of discernment. So then the follow up question, another question was raised too was what if, I mean I'm tuning into the spirit and I'm hearing things, but what if I hear it and I go, that's ridiculous. Because you remember the world is a world of guilt and pain and shame and fear and the unwinding from it, the Holy Spirit and Jesus will ask you to do things that oftentimes the Spirit just judges as plain ridiculous. Part of the ridiculousness in this whole thing is the sense that the Ego has made up a hierarchy of illusions. It's turned the whole cosmic image and all the images into a hierarchy. So part of that hierarchy of illusions are major decisions and minor decisions. A minor decision might be what kind of, what color of shirt or blouse or pair of pants you're going to wear or what kind of food you're going to have for breakfast or lunch. A major decision would be a life partner, picking a life partner or, and we'll talk a little bit about that too. For leaving jobs, leaving, switching careers or decisions that you have to make around a terminal illness to diagnose with cancer or something like that, those are more considered the major decisions. The more you go down into the miracle, which shows you that there's no order of difficulty in miracles and no hierarchy of illusion, you start to really get a sense that there really aren't major decisions and minor decisions. You may be guided in terms of a life partner like Armel, who was with me and this other man, Eric, who had worked with me. She'd come over from Belgium, Canada and down to Cincinnati and I was out at the monastery in Utah and Armel got clear guidance to marry a man that she had not met in 15 days. Now that would probably go into the category of ridiculous. In fact, that's after Armel called and talked to me and said that she was kind of trembling at the time like, I'm hearing that I'm supposed to marry Eric, this man Eric that she'd never met. She'd seen a picture on the internet but had never met him in 15 days. So she joined with me and I felt a confirmation from the Holy Spirit and you should have seen the look on Eric's face. I did get to see the look on Eric's face when I said go get Eric and when he came in and the phone went to his ear and I just got to watch his face. You know, you've heard of arranged marriages like in India where the families get together. This is Holy Spirit matchmaking and there's a real important purpose behind it because it's undoing the ego. It's a major purpose because relationships involve mirroring and the spirit knows. Some of you read Absence from Felicity that Ken wrote that Bill Thetford and Helen Shuckman had what Jesus called complimentary ego dynamics. Isn't that a fascinating phrase from Jesus? Complimentary ego dynamics. In other words, put these two together and there's going to be like a really swift undoing because, you know, it's the Holy Spirit uses contrast. When you're so addicted to misery, you're going to have to have some contrast experiences that are going to pop you out of it. So that's an example. I mean being guided to marry a man that you haven't met in 15 days. And the thing was Eric had been part of a devotional with us where he went through a lot of deep undoings over a period of weeks and the very end of the devotional we tune into the Holy Spirit and we just listen and pray for next steps. One of Eric's next steps at the end of this so many week devotional was to break up with his girlfriend. But he didn't follow it. So it was an interesting proposal to get a marriage proposal and have a girlfriend. And the marriage proposal did not come from the girlfriend. It came from our mouth. I said, how do you see what I mean? You've got to follow the spirit because it's conflicting if you don't follow the instructions. It would be like trying to bake a cherry pie and leaving the cherries out of the cherry pie. You can't really bake a cherry pie without the cherries. So that's one example and there I could give you lots and lots of examples. I'll give an example from the parable of David. A friend of mine many years ago was of course a miracle student and my girlfriend from Michigan, Janie. And we took some guided tours with the Holy Spirit here and there this and that. We came back around to Cincinnati and we were praying in Cincinnati. We were just tuning in and listening to the Holy Spirit and Jesus and we started feeling like we were going to be taking a trip out west. We were coming in really strong. So it's coming in stronger, stronger. Yeah, we're going west. We're going out, you know, I-70 across. It was coming in stronger, stronger, go west, go out, I-70. But before we left we were in Cincinnati and the Holy Spirit said, I am the destination and I will tell you the direction. And at that point I had been on a lot of guided trips. Go here, go there, do this, do that, go here. I mean I had already done many, many, many, many guided trips, many miracles too. I was really on my major carpet ride just flying with the Holy Spirit. And then we're praying and it's like I am the destination and I will tell you the direction. And I told Jane, I said, this is going to be real interesting. I've never gone on a trip with those kind of instructions. I am the destination. I will tell you the direction. So off we go. We're going through Indiana, Illinois, we're going out through Missouri. We're heading out west, you know, driving across the United States, up great plains. And we're talking about Colorado and California and we're talking about these future hypothetical thoughts. But really the lesson is I am the destination I will tell you the direction. So we get out to Kansas. Has anybody driven through Kansas? It's like, it's flat and it's like, there's nothing there. You know, it's just wheat fields and cornfields and fields and fields. Drive, drive, drive, drive, drive. So we're driving there. And we got to the point where it started to get a little bit later in the day. Jesus is like pull over, get him a hotel room, we do that. The next morning we get up and I go, I'm just having my meditation and I'm meditating. And then I hear Jesus say, go east. And I'm like, what? You can't possibly have driven up to the middle of Kansas thinking about Colorado and California, all the fun ocean beaches. And you got in the middle of Kansas and now, and then the other thing was it was like, how am I going to tell her that this is going to be the end of the relationship. You get some wacko guy that's driving out the middle of Kansas. And then you get, go east. So it was like, share the guidance of it. And I was just like, no, I cannot. I'm not going to share that. And so she's up and getting ready. We all get together and get in the car. We come, we drive, start driving towards the interstate highway. We're getting closer and closer. So get closer and closer. We stop in a red light and we're just about to the interstate. And I've got Jesus telling me to go east and she's sitting in the passenger side and I'm just looking at her.  In total joy, like a little five-year-old girl. And she looked over at me from the passenger side. She said, are you hearing what I'm hearing? Saved by the grace I've got. And I said, I think so. What are you hearing? She's like, still holding back. She said, I'm hearing, go east. I'm like, go east. I pulled off onto the ramp and we started heading east. And it was like we were in Chitty Chitty Bang Bang. I thought the car was going to like go off. Chitty Chitty Bang Bang. We got the car, you remember. The van dyke up into the sky. That's how it felt. Because it was one of those moments where it was all about guidance. It was really about being true to the guidance. Let go of all your preconceptions. And I used that example because again that would be in the ridiculous category. To drive all the way from Cincinnati to Kansas. And then stay in a motel and turn around and drive back east. Like this is the crazy wisdom. The crazy wisdom teachers. But this is what we're dealing with. When you start to unwind from the thinking of the world, you really have to tune in and you really have to be open. What's the tenth characteristic of a teacher of God? It starts off with trust. Number ten is open-mindedness. Perhaps he says the less one to come in. You see? You have to let go of all judgment of what you think everything means. And be totally willing to look like a fool to the ego. Believe me, this guidance has been this way over the years.  People laugh at me all the time. They burst out laughing for 15, 20 minutes and a half an hour. Because they think he's just clueless. But he's foolish. But he's going to, just like putting on a hat, like I'm determining my Holy Spirit cap. Come on, let's go. We're going back to heaven here. Let's get the hat on and go for it. You got your hat on. You asked me the question about the ridiculousness. We're going for it. So really, you start to realize in so many ways that we work with people on a daily basis that are being, receiving guidance. And it sometimes involves leading jobs, leading partners, leading children. It can involve relocating. It can involve, you know, what people would call major, major life changes. And we join in prayer and really tune in and hear it. Because again, the ridiculous temptation can come in there with some of these prompts from the Holy Spirit. It's unwinding you from a crazy thought system.


Cool. All right, so I've got I've got this buddy and he is super into synthesizers right now and we're both kids of the 80s, so I'm like right there with them He used to have this this cute little one here. This is called the OP one and It's it's really easy to do just fun stuff with this So this is this has been now he fiddles with it and I've played with it some and it's super cool But the other day he sent me a picture of another synthesizer he saw and it looked like this That thing first off that looks awesome. That is one cool looking synthesizer, you know, you can do some rad stuff with that but number two How do you do this stuff with that? I mean there it looks like there's like a hundred knobs on that thing and Several different like equalizers and there's some keys and there's just so much going on to that I think that's a real good example of what OTP looked like to me when I first tried to learn it It's just I knew the power was there, but I wouldn't even know where to start with it So what is OTP anyway? So there's a lot of things to OTP But basically it's a collection of libraries and a hierarchy of supervisors and workers also called the supervision tree So there's of the libraries. There's a lot of libraries, but kind of the main ones are the supervisor Gen server and Then agent and task which are abstractions of gen server And there's a lot of other other stuff like gen stage gen event gen FSM Actually, gen FSM is gone and gen events on the way out but we do have gen stage and then there's other stuff like application ETS and MNESA NESA, I'm not really sure how to pronounce that it seems to be a debate on that And then dialyzer gen TCP observer and that's probably like just half the stuff There's a lot to OTP, but the main thing when people say you should learn OTP They're talking about supervisor and gen server for the most part at least to get into it and agent and task So to be able to use these you need the the basic building blocks, which are processes so Processes any looks or as you may know are not like an OS process. They're super lightweight You can just spin up like a thousand on your laptop or more than that Like they're they're really lightweight. You can spin them up really easily. So let's go ahead and see what that looks like So we're in IEX here and we're gonna spawn up just a quick print out hello elixir days So we've got our spawn function and then we're giving it The function that we want the process to run so the prod so spawns we're gonna enter it And it's gonna kick up a process and that process is going to run the function We gave it which is print hello elixir days So I run that there we got our hello elixir days and then we have this if you haven't seen it before weird-looking Hashtag PID with some numbers after it and that's the process ID So we actually want to track that so we can see what's going on with this process So we'll run that again and this time we'll capture it in a PID variable We run that prints elixir days and then we see a different process ID right there And now we check on the process. We say process alive.  I do the work and then I'm done and So that's great so now we can take this newfound knowledge of processes and start using them our apps and then Eventually you're gonna give it a big task and it's gonna fail halfway through that task And it's not gonna die gracefully and it's not gonna give you the answer you need So now it's time to figure out some error handling for these processes So something you'll hear a lot is Let it crash which is a common thing said by people that you know use Erlang and elixir 2 as well Which to me Sounded terrifying like let it crash. I don't want to crash my app. That does not seem like a good solution But that's because I wasn't thinking of my app as a bunch of different processes. I was thinking of like the app And when you think about like if you think outside of that you think about like what's the best way to fix something? Whether it's an app like you know Photoshop or something or it's your entire operating system or your phone or your Xbox PlayStation Electronic toy your TV like what is the IT crew IT crowd approved way to fix that problem anybody Have you tried turning it off and on again and and this works like this fixes like I don't know 50% or more of your problems like it's like this thing won't work. Well, did you try restarting it? Well, no, I know that'll work and you restart it and it does work Why does this work? So the reason that letting it crash or turning it off and on again works is because we're giving it a Fresh state so whatever happened there is some transient bug that happened that messed up the state and then Excuse me, and now it doesn't work, but when you restart it that weird state is gone and now it works So the supervision tree is based on this principle We have the cluster of different our processes and we can turn them off and on again at an individual level so Supervision trees basically these are all an individual process We have the worker processes, and then we have our supervisor processes And the supervisor processes all they do they just have two really simple jobs So they start up a new process They start up the workers underneath it and then they keep an eye on it and so that if it crashes it restarts that worker So like let's do an example real quick this worker down here on the bottom right say that's it's doing some work for you for your app And it hits a bug and it crashes not gracefully. It just dies halfway through its work The supervisor above it will see that it's crashed and Automatically restart it and restart it isn't actually what it's doing. It's just starting a brand new process with that same function and So it'll do that and it'll try it a couple of times And if it doesn't fix it then that'll kind of cascade up and the supervisor above it will then try and So on and so forth so then I'll cascade up and if that that supervisor will restart the one below it And then that one will start the workers underneath it and that's that's kind of how it works If the top supervisor crashes well, then maybe it's time for a rewrite So the the thing that I thought when I was first learning about this is Like okay, like that that makes sense. That seems really cool. But what if you just have bad code like Restarting and rerunning my badly written code with the bug in it isn't going to make the bug go away and You're right. I was right. It wouldn't do that But so if OTP doesn't magically fix your broken code, what does it do that's so magical? So there's this great article called the Zen of Erlang by Fred Abert And this is one of the articles that really made it start to click for me In in his article. He talks about the ease of finding bugs in production He talks about how there's basically four different types of bugs in your app You've got your core features and you have your secondary features and Of those the bugs that they have are either easily repeatable bugs or transient bugs So with the core feature you have a transient or you with the core feature you have an easily repeatable bug Those are really easy to find. It's really easy to find those kind of bugs Those are the kind you find your basic testing like no problem and the secondary feature same Those are also easy to find when they're repeatable bugs, but sometimes you miss it because it's just some oh Forgot our app did that we should probably fix that But the transient bugs these are the ones where you get a bug report and you read what the user says and you're like I have I have no idea how they made the app do this I don't know and these are the ones that take most of the time trying to fix You have to figure out like what weird state did they get the app in to be able to have for this bug to kind of creep up and The thing with these kind of bugs the core feature Repeatable bugs should never go into production like that just shouldn't happen the secondary feature ones They shouldn't happen, but they do because we forget about our apps get big and we miss them sometimes But the transient bugs whether it's a core feature or a secondary feature Those happen all the time in production because they're hard to catch because they don't have a really obvious like Steps that make it happen. It's some weird Element of state that makes it that makes it have the bug But the really great thing about these transient bugs is these are the ones that are handled by resarts so the The repeatable bugs Restarting isn't going to fix that but those you should be able to catch before they go to production anyway But the transient ones restarting it which the supervision tree will do automatically for you that will fix the bug so One thing that makes the supervision tree work is that all the processes are completely isolated and memory independent So when you say restarting you really are just restarting that one process not having to restart the whole app But because they're completely isolated like that They still have to be able to work together and they do that by sending messages to each other Excuse me So earlier we are passing around or we are tracking that that PID or that process ID of that first process we spun up So that is actually so every process has a night has a process ID and that is basically like a mailing address to that process So every every process has built in the ability to receive messages It doesn't automatically do something with the message But every process like when you spin it up is ready to receive a message So let's go ahead and see how how this message sending between processes works So I'm a big fan of fantasy football and it's never too early to get started for the next season So I made this past summer. I was I made an elixir API wrapper for fantasy football nerd Which has got like just kind of different stats and we're going to use that to get We're going to make an app called fantasy team real quick that Stores that the players that are in our team and then use the API to grab their stats So we have that all to track and then we can do some fun stuff with that later So the first thing we need to do is like, okay, so how are we going to hold that team? How we're gonna hold the state? And we could create a database. There's lots of great ways to do that And maybe if we went to a production with this we would use ecto to create a database or we'd use Erlang term storage or ETS or Menesia, however you pronounce that and there's some other options too But for now, we're just going to store it in this process and that's going to be totally fine for now So here is a really basic Process that stores state and lets us add and remove players and then send a message to the process to say Hey, who's on the team? So we're gonna if this looks weird to you for some of you I'm sure this is like really basic but for me. I saw that like this didn't make sense to me So we're gonna go through it line for line so that there's any other means out there. This will make sense to you, too So we started off with a with a simple function called start link and this is just a common naming pattern And that's how we're gonna kick up the process You would run fantasy team basic start link and then that's gonna run spawn link and What we're giving spawn link so it takes three arguments, which is a module a function And the argument we're basically giving instructions to the process of what to do So first we've got the double underscore on both sides all cast a module All that's gonna do is take our module name fantasy team basic and then plug it in right there And then our second our second one there is the atom loop That's gonna say run the loop function from this module and then it's gonna this is our list of arguments We only have one argument. We still put it in a list But that is an empty map because what we're gonna start with is there's no players on the team It's just an empty map waiting to receive data So here you can see basically the process is gonna start up and then it's gonna run fantasy team basic loop With an empty map argument So that's gonna go down to our loop function So loop takes that state of the empty map and then we have received you and so what that does before we had A process it printed out elixir days and then it gracely died So this isn't gonna die because it's gonna sit and wait to receive message Messages so now it's watching its mailbox waiting to receive stuff So when it gets a message at first checks does it match this and then if it doesn't match the tuple It starts with the add atom then it's gonna move down the line So we'll go ahead and go through the first one say it matches So it's a tuple with the add atom at the beginning and then the name would be a player name So like Russell Wilson and you know, it's Russell Wilson string So then we would take that name and then we would search it and this is a function We're not gonna look at this is the one that's using the API behind the scenes to go ahead and pull all the data So we run fantasy team dot player dot find Russell Wilson and then it's gonna return and like all this information like College, Wisconsin position quarterback team Seattle Etc. So we do that and we find a sign it to the variable player And then we're gonna take that and we're gonna add that player with his stats to our empty map So now we're defining new state with the map that now has Russell Wilson as the key and his all his stats is the value And then if we just stopped right here, it would be like great We did that and then the process would just die So we actually need to jump back to the loop function to kind of recursively run it again So that now it goes so it takes a message does the stuff with it And now it sits again waiting to receive a message with state now being the map with Russell Wilson So our second message that it can receive here is remove and it's similar to the ad We don't need to look up the player We can just Redefine the state as whatever the current state is minus the player that we're that we're trying to remove and then we loop it And then our third message that we receive is our team Adam and this is asking to return the state So the first thing it does oh and it takes the second one there is the PID So that's like where to send the state to so the calling process So if you're using like IEX and you you're sending in a message you would put self right there And then that would give give it the process ID to send a message back to So we'll do that right here send a message back to the calling process with the state and then we loop back up to the top again So here's our process module. Let's go ahead and see in action real quick Now I don't want to embarrass myself like Dave Thomas just did so I'm just gonna do it through the slides All right, so we start off and we assign PID to Run our function fantasy team basic dot start link and there's our return of the PID and So now our process is up and waiting to receive a message. So we're gonna go ahead and send in a message Send to PID the message Tuple with ad and then Russell Wilson. So we get the return at Russell Wilson Yep, and we'll do it again. We'll add Doug Baldwin and then extra we're gonna remove Doug Baldwin So we do the same thing but with the remove Adam in there And then finally we send the team the tuple with team in it to get the team back So we don't get anything back as I said before IEX or any process isn't Originally ready to do something with messages or it sees but it still has the mailbox in there So we can just flush it out and then there so we run flush and it's gonna spit out our message and up there It is Russell Wilson position quarterback, etc so this right here is a really common pattern in elixir and It's so common that they made a generic library to emulate it. So This works really great, but it's actually missing lots of little edge cases Like just compatibilities deadlocks message ordering dynamic tracing some tail call stuff and half of that I don't even understand But I don't have to because people have been working on this generic server that's gonna do this for me for 30 plus years So now we're gonna learn about gen server, which is the right way to do what we just what I just showed you Hmm. Alright, so on the right we have the one we just wrote our basic and then on the left We have a gen server version and so it looks like a lot more code But really the top part is mostly convenience functions So it's really not that much more code than the basic one. We just went through So to start off we just run we put use gen server and that's gonna call up that library So now we have all the power of the library kind of in here And then we're gonna jump down to the parts that are kind of more the same between the two So we start off with our start link function and that's again the common function name to start one of these and Now instead of doing our spawn spawn link function on the right We're gonna do gen server dot start link and we're gonna provide that again the double underscore module Which is gonna replace that with our module name, which is fantasy team dot my gen server And then we don't have to give it the loop function because gen server kind of has its own functions Like you don't need to tell me what to run. I know how I know how to run a loop And so instead our second argument there is actually the argument We're just gonna put an okay to pull there and the third option is Or the third argument is options and we're not gonna do any options. So we just do an empty list So this is gonna start up that process And the first thing it's gonna do because we did use your gen server It knows to jump back into our code and say alright Where's the in it function because as a gen server I know I got to run in it first And so we're gonna define in it and it takes our our okay to pull and then it returns and An okay to or sorry. Okay, Adam is the argument It's gonna return an okay to pull with the second argument is our state So that's where we put the empty map where before we put it in that initial call Here's where we put our initial state, which for us is just gonna be an empty map And now we're gonna go through and see okay, so this is a little bit more interesting This is a bit different than it was before so instead of having like one master loop receive block Jen server actually handles each message as its own function So Jen server has like two types of messages that it receives which are cast or calls And a cast is kind of like sending a postcard like it doesn't have a return address like it doesn't need a reply It's just saying hey here you go Here's a message do this thing and a call is like mailing a self-addressed stamped envelope like here's my return address And I want you to send me something back So for our add and remove messages, we don't need anything back We're just telling it like hey add this player remove this player and then for our team That'll be a call because we're asking tell me who's in the team so for this one here, we've got handle cast and We've got our message right there as the first argument before we had it as kind of that Part of the receive block so we have our add and name and then we have state defined in that function So rather as an argument in that function since we don't have the wrapper loop state We actually list the state as an argument in each function that we go through So these two lines are exactly the same. We're doing just like we did before We're grabbing the players stats from our API in the background And then we're defining the new state as adding that player to the existing state and Then before we re-ran the loop function with that state this time Jensen is expecting a Return of a tuple that starts with no reply because this is that this is a cast and there is no reply message It needs to be sent out and the new state which now is the map that has Russell Wilson in it. Yeah, new state So same thing here for the remove message. It's basically the same as before we have our message right there We have our state which before was again defined once in the loop We have it as the argument for each one of these functions And then this line is exactly the same and then we have another no reply to pull with the new state in it So for team instead of handle cast. This is a handle call because we're receiving a call message and This one we're not actually doing anything to the team. So we don't need to do any other lines we're just gonna have that return tuple and This starts with reply because it's it is a reply. There's gonna be a message sent back The second argument is state and that's actually the message that's being sent back The third one is also state and that's the mess. That's the state that's being saved So if if we had another function here that was like handle call a quarterbacks this second state That would be the quarterbacks and the third one would still be the entire team because we're still saving the entire team And so that that's how that works. So how do we actually make these casts and calls? That's back up at our convenience functions So we've we're gonna fill out our API here and we've got Add so we have a basic add function and this is what people are gonna. This is how people will use This module and the first thing is the process ID And this is the process ID of the gen server that you started up. So you're telling which process to add these players So we got the PID there and then the name and then we do gen server dot cast With that PID again and then the message add and name And so now that's going to be handled by the stuff. We just define further down and Then team is the same sort of thing. There's no argument other than just there's just a single argument of the PID We don't need anything else and then we'll do the gen server call with the PID and the team and That's it. So now we have our gen server ready to go But the one thing that's kind of annoying about this I'm not planning on Releasing this to have a bunch of different people track a bunch of different teams right now And so I'm just gonna make this a named gen server because it makes it a lot easier to deal with so To do that so on the right. We had the one we were just looking through and on the left We're gonna name it now So first thing we do a module attribute with the module name So now our name is fantasy team single server And we're gonna start plugging that in here. So we now have an option which is giving the Gen server a name when we started up And now we can replace the PID In these convenience functions with the with that module attribute And then because of that we can now take the process ID out of the function argument list So now all you have to do is run and just have the names you don't have to track that process ID So we're gonna go ahead and see this in action real quick Fantasy team single server dot start link So there's our return tuple but we with the PID in it But we don't need to capture it because it's a name server And it knows its own name So we don't even have to worry about that and then we'll run fantasy team single server dot add Russell Wilson We'll do it again. We'll add Doug Baldwin and then we'll remove Doug Baldwin and now we'll say fantasy team single server Dot team and then we get our return back, which is our map with Russell Wilson in it So that is awesome. This is working great for me. I'm really excited. There's one more thing We have agents and tasks. So the thing about gen server, we're mostly just using it to store state But gen server can also do a lot of stuff with kind of used for like parallel programming kind of kind of stuff Concurrent tasks that sort of thing and so what agents and tasks do they kind of They're kind of like a more focused abstraction of that where agent is just For doing this just for storing the state and tasks are for more doing the concurrent stuff And we're not really doing any of that but agents we could actually use an agent in place of the Gen server we just did and It's a lot less code. This is this is the full thing So it doesn't have to have the convenience functions because they are the functions So we just have like right there to find add with the name I'm going to look up the player and then we use this agent dot update To be able to place the player in that map. So these are can be really convenient personally I really like gen server because I feel like I have a better grasp of everything that's going on And then I don't have to change the abstraction later if I if I decide that oh, I need this to do other stuff But the nice thing if you're working with other people When you jump in here and you see agent, you don't even have to question. You're like, okay Well, this stores state. I don't have to worry about doing anything else. It's really obvious What this does where is gen server? Maybe if it's a more complicated app there might be more to figure out So let's build a supervisor real quick because right now it's still gonna crash and nothing's watching it so we'll build a supervisor really quick and That's it. That's all the code we need to supervise. So this is a module-based supervisor We're gonna start off with you supervisor to use that library and Then there is our familiar start link function again And then we do supervisor start link and we provide it the module again and this one doesn't need function or Or argument so it just has a Spot for for options and we're not going to give any options. So just empty list again And then when that when that process starts up, it looks back to our code say, alright My process just started. I need the init function. So there's our init function And the first thing we define in here is The children so before we had that tree and some of the supervisors had like multiple Processes multiple workers underneath it In this case, we're just gonna have the single supervisor with a single worker underneath it So we define one worker and worker just basically means not a supervisor It's just a regular old kind of gen server. And so we have our worker We provide at the module name again, no options needed and then we just supervise So run supervise and we give it our list of children, which is just the one and then we have our strategy One for one. There's several different strategies one for one Just means if you get if a supervisor has like four processes for workers underneath one of them dies It's just gonna restart the one and there's other other strategies in there But for us, we only have one processor anyway or one process anyway, so we're just gonna have it restart that one process and That's it. So now it's ready to go if our gender server dies Supervisors gonna automatically restart it and we're good to go. So this gives us the ability to kind of hold state and a lot of functionality inside of just a process and It has all the benefits of the supervision tree and there's a lot we could do to kind of go to the next step If we look back at this guy and we consider this kind of the world of OTP we we learned like that Which is not much but? You can play music with that like you can play music with that little section right there and now you can start to say like well Maybe I want to learn. I want to learn ETS and figure out how that can plug in well You're playing music already. So now you can just find that section and see how that works with the part You know how to do That's it there. I'm on Twitter. I've added some different resources that really helped me to learn OTP There's some great videos and there's some great books out there I'm Dave Thomas's book Sasha Eurek. I think might be here and he has a great book And the one that really really did it for me There's the literal little elixir and OTP guidebook by Benjamin 10 way how and I'm probably pronouncing that right? Incorrectly, but those are some great resources and that's it. Thanks


will never surrender of my own free will. If in command, I will never surrender my men while they still have the means to resist. I just know we're never going to get out of this alive. What kind of crazy talk is that?  Well, we're still a lot of ammo. What are we going to do if they attack again? We're going to get captured, for sure.  Ain't nobody in this whole going to get captured. If we run out of ammo, we'll fight those cruds with our rifle butts. You can say that again, Debrowski. Nobody in this whole company is going to be captured, kid. Don't worry, the old man knows what he's doing. We're going to get out of this all right. What did I tell you, kid? You got much ammo left? We got nine clips between us. How about grenades? Refresh out. It's all I can let you have. Make them count. Don't worry. We will. Won't we, kid?   Yes, sir. Up to sea, he concerns the men of the third platoon and what they did in their moment of truth. To some members of the third platoon, the going is tougher. Between them and the reserves to the south flows a slow-moving but treacherous river. A soldier hates the idea of parting company from his weapon. For without his rifle, he is nothing. But now the big thing is to stay alive to fight again. And he makes sure to hide his gear so it won't do the enemy any good. Each man is on his own. Each man making his way to the reserves as best he can. The sergeant, the old pro of a soldier who knows he's going to make it. And the youngster who has forgotten his fear by now. But on his mind, even as he reaches the lines as the question, how about his young friend? Did he measure up? Was he going to make it too? What comes sliding into your mind at a time like this? A siren call? Surrender? Give up? Live it out in an enemy prison camp? But the approaching steps of the enemy play a tune that washes over that call. A tune with a heartbeat that stirs and fires the blood of the American soldier. A heartbeat that lays it on the line. I will never surrender of my own free will. If in command, I will never surrender my men while they still have the means to resist.