Hi, this is Christian. In this video, I'm going to complete or build this assignment for the sandwich so we have three, I think three parts, right? There's three parts. One is to create the bread class. We're going to create the sandwich filling class and then, actually four, right? The sandwich class which is used for a composition as we discussed in this week's lecture and then, finally, we have the main application to generate these sandwiches. Okay, so if you look at what I have down the bottom here, I have a simple run to show you what it would look like. Of course, I should have probably you know, I want to call these not bread one, bread two, but maybe like sandwich one, sandwich two, and so on. And then down here is the UML diagram to show you the different pieces or you know, functions and variables or instance fields in each class. So the sandwich class test sandwich is just the main application and you're going to instantiate three objects in here, three sandwiches, and then the sandwich class, is the one that has the composition, right? So it contains what is composed of the bread and a sandwich filling data field and then those are mapped to these separate classes over here. Okay? So again, this box just tells you what are the fields and then this is one of the methods you need to create for each class. Okay? And okay, what I'm going to do here is just one of the ways to do this. There are, I'm pretty sure there are many ways to do it, but this is a fairly simple program. So the differences may not be that too too many, but you can't be done in a different way. So I'm just going to show you one way how you can accomplish this, right? So using this as a guide as well, and if you are kind of like stuck, if you don't know what to begin, just write it out. Write it out in words and sentences. We call those pseudocode, right? And what have appeared is pretty much kind of pseudocode ready. These instructions are pseudocode, right? Kind of. So we're going to create a class called bread and then under bread class we'll have two fields. Okay, and then for like the calories and then the bread type. Okay, so we'll refer to this document. As we continue on, so let's go to the IDE. I'm going to go and create a new class. This is the bread class. And before I continue, I should put this into the package. We'll call it chapter four sandwich. Yeah, that should be enough. Okay, so use that as the package. And then we have more, right? So let me go in here and the sandwich. Create another class for the sandwich filling. And then one more, two more, this sandwich, then the main program. So this one here is just a test sandwich, but you can call it whatever you want. Okay, so I'm just going to call it test sandwich. Follow my instructions there. Um, is that what I call? Yeah, well, okay. So this is the main main program part of note here. Main application. We'll leave that for now. Let's go to the bread class first. So we need private bread type. This would be a string. I've got to put that there. And then we have one for the calorie. So calories are usually measured in double. If you want to use double, if you want to use just, um, integer, I think that's fine too. We'll just go with integer. We're just assuming it's whole numbers, like, you know, 100 calories and so on. So you could hear calorie per a slice of bread. Okay, because the sandwich is made up of two slices. So this is about one slice. And when we do the calculation, if you go back to the instruction, ask you to multiply this slice, uh, calorie per by two to get the two slices, right? So we get that and then put notes here. These are your data fields. And now we have a constructor. I will constructors here for both of them. The first one is the blank constructor. You need that. And the other one is the one that kind of have both parameters. So the string for the bread type and then the end for the calorie per slice. And then down here we have our getters and setter methods. And just use a shortcut to do that for you. Okay. And then we can use those to set our properties. So this does set bread type bread. This does set Calc per slice Calc per slice. Okay. So this part is pretty much done. I think I asked you to also create a static field called model. I think we can just do that right here. Let me see where to put it though. I don't remember the instructions. Include a public final stack string for model. Initialize it to the staff of life. I think that's the only one, right? Yeah. This is just for practicing using static data. I mean it has very little meaning here but we just put it here. So this is going to be private. Is it private or public? Public. Okay. We'll make this public. Public static final model is going to be assigned to the string the staff of life. Okay. So that's our field. Okay. So this part is done. Let's go over to the sandwich filling. This won't be kind of similar. These are your data fields. Private string for the sandwich. You can call it just make a short filling type. And then private and filling the calorie per filling. Okay. Something like that will be fine. And then our constructors. This is the empty constructor. This is the one with these two parameters. Okay. And then we're going to set them. So again the setter, getter and setter methods use the shortcut and just fill those. Okay. So this is done.  And I think let's go to the sandwich. This one here is going to have the data fields here as well. And it just basically has two fields. Okay. These are used for composition. And bread compositions are when you use a data field as a type of another class. So we have the bread here for the bread class. And then we have the sandwich filling for the sandwich filling class object. And then notice I did not instantiate it right away. You can if you want to. You could do like new bread like this. Only thing is that if you do this way then you have to manually add the content to the class. Right. Because you're already pretty clear here. But if you want to wait and then in the constructor you'll see in a minute how you can actually make it a little bit faster. So here are my constructors. So I'll do just put two constructors. This is the empty constructor. And this is the one that has all the parameters. So bread will be bread again and then sandwich filling sandwich filling. And then so again just like before getter and setter methods. Okay. So now remember that these are objects. Okay. These are not primitive type.  So if you want to print later you have to go through the get bread function dot and then go to the bread class to get those information. All right. So let's set these the bread and then this that set sandwich filling with the filling. And then okay notice that when I set the bread and the filling they come in as an object. That means that the fields when you create this bread and the sandwich filling objects they would have already been set to have all this information. They type in the calories in order for this to work. Okay. You have one option here. This is option number two. And I put here this is the default constructor. I'll just put another one here. Okay. So you can see the difference here. The I guess the power of using constructor overloads. So we have another one here sandwich. This time I'm going to I'm going to put something very different. So what do I need for the bread? Well the bread needs two things a strain for the type and then a integer for the calorie. The filling is the same thing right a strain in a calorie preserving. So this option can give the developer or user to provide both information instantly. So I can say something like this. So I need a string for the bread name or bread type. I need one for the maybe calorie per slice of bread. Okay. These two will be passed to the bread class. And then the next two will be passed to the sandwich filling class for strain. You know filling type and then the int cal per filling. So if you think about it these are right the same variables I use over here. Okay. So I'm going to pass them to this to this class when I create the objects. And then here now notice because I did not instantiate the bread object yet. Right. So you need to instantiate the bread object in order to make it work. In this case this part here because I'm passing in as an object already. So the bread object has already been created. So you don't need to create that. Right. But here I have to do that. So what I mean is I have to say bread is new bread. And this is why I mentioned earlier that you don't want to do up here. If you did up here then you can't you don't have this option. Right. Because I haven't created my object yet. I'm just declaring or defining a placeholder to hold the bread object. So it doesn't exist until I either assign it to an existing bread already or I create it right here. And so when I do this way I just pass in the bread type and then the calorie per slice. And then now my bread has been my bread object has been created because this bread object is this bread object here. Right. And then I can also do so in this case you can do bread or you can do this dot bread. It's actually safer to do this dot bread. And this dot sandwich filling is new sandwich filling. And I pass in the filling type and then the count per filling. And there you go. I have my two objects created. Oops. I have too many parentheses in here. Okay. So my two objects are created and then now they are assigned with those two objects. So we have three options to create. Right. All right. So go back to my other question was if I did not do this down here say if I did this I just do the bread part. Okay. If I did that then I cannot re-declare this again. It's already declared up here. So in that case then I have to do something like this. I have to say bread you know set bread type and then pass in the bread type. And then bread dot set calorie per slice and then count per slice. So you have to do it that way. Right. You have to call the functions to set them this way. Whereas if you did not you know create them yet you did not instantiate is the term. Then you can just pass these two properties or arguments directly to the bread class. Right. So that's the difference. So I'm going to go back to what I had earlier and we'll keep it this way. Okay. So this is done and then now we need to go to the main program and do our action here. So we have the main method and inside we're going to create three sandwiches but also ask you to create two functions. This will be two functions. And again since we're not creating objects of this sandwich class you test sandwich class. You want to call this function directly within the static main. Remember static can only call static functions. So this function has to be static static and this is for uses for the calorie calculation. So let me see what my what I have here for the output. Okay. So it says down here a method to calculate total calories in the sandwich. And then it says the sandwich has two slices of bread. Okay. And this method should take two parameters the bread and the sandwich filling. Okay. And they have another method to display the data. So the display here would see what you see here. Okay. So I see that my calories are in double or decimal numbers. If that's the case then you can just easily go back and change it to decimal. Maybe we should do that. Maybe just make more sense. Okay. So we can just change it to double. All things if I do that to change it everywhere else. Here down here. Okay. And not that bad. Double double. And then yeah this is this is fine. It's just in here. I have to have double here then double here. So we're good. Oh yeah. And the constructor too. So in here double and then double here. What I have the first slice double. Yeah that's fine. Why is it red? Oh maybe my sandwich. Yeah I think it's fine. Maybe just out here. So double calculate total calories. And it takes two parameters bread and sandwich filling. It's a long one. So two objects. Okay now I have an error here. Why is that? Cal per slice. What's wrong with this one? Oh one more here. Yep inside the function parentheses. Okay. So now we got that and then we're going to return the total calories. So I'll put here total. Okay so we're going to declare a variable here called a double and then total. And this is going to be assigned with something. Okay so what is the total it's going to be like? For now let's put zero here for now. So we're going to do a calculation of the bread calories. Right times two plus the sandwich calories. So it's pretty pretty simple right. So I can replace this naturally. If we replace it now since I know where it is. Bread dot get calorie per slice times two for this one. And then plus yeah I'm going to times two first right. I don't want to times the other one times two for that. And then plus the sandwich filling dot get calorie. Only one for that one. And then I return the total to wherever it's being called. So that's my calculate total calories. And then I have another one here to show the information. So this will be a void. I'm not you know returning anything here. So what does this say? It just say display data. So you don't don't have a name here. You can call it whatever you want. So we call it you know show or just say print result. Okay so what do we need to pass in here? Well maybe kind of similar thing right. I need to print the bread and then print the filling. Because I need to access those so we put here bread. Oh actually you know what I'm not going to print the bread. I'm going to print this sandwich. So I'll be the sandwich object. Because the sandwich contains both the bread and the filling already right. So you don't do pass those in there. You can obtain this information from this sandwich. Okay so really in here I could just you know pass in the sandwich and you can get these information too. Like I mentioned in the previous couple of minutes ago that you have many ways to do this. Okay and yeah well I'm going to show you what that is. So remember about method overload right. I can overload this with something like this. Okay just the sandwich. But here I would say sandwich dot get bread get calories. Okay and then here will be same thing. So sandwich dot get sandwich filling dot get calories. And I should have a wrap. So you can see the different ways how to do this right. So I have two functions now. And they are both returned the same information. Here I'm passing two objects. Here I'm just passing one object. Because this one here contains both already. Okay so either one of those will work. And I just leave it here because it should work. Now this part I'm here for display. So I'm passing it this justice sandwich. Because I can access all this information here. So here then we're going to print a message. This is the model. So the model will be sandwich dot bread. It's in the bread class dot get model. And I think I didn't have a getter for that one. But it'll be just model. Okay you notice if I do that. I did have a getter. And the reason why is because it's set to public right. If it's set to public then there's no meaning to have another function to you know return this. The reason why we have the getters and setters for the other types is because they are all private. And since they are private you cannot access them directly like I did over here. Now you cannot just say give me the bread type. You can't do that. You have to go through the function to get it. Because we make those hidden. That's deterring encapsulation. Okay so encapsulating means you're hiding information they're private. Only way to get them is through a public function. Okay but this is public. And also it's static right. And so that means when you call it this way this is fine. It's no problem. But you could just go directly through the class. Which is the bread class. So this is okay. This is synonymous to just doing something like this. All right I'm calling the model because it's static. And it's public and the bread class. So you just do that. It's shorter. Whether I call this way or the other the other one I had earlier you're going to get the same information. And that is also why static is being used like that. It's shared by everybody anybody you want to use it. It does not belong to any particular object. Well I mean it's in the bread class but any data can access that. So we've got the model and then we'll have a dash some dashes down here. And the way I had was I put like here I say bread or sandwich. Like number one or something like that right. One something like that right. Now how do you how do I get one two and three. Well you could do it multi lines. Sys out and then here will be what did I have. I have really short memory sorry. So you have the bread type calories the filling per serving and then the total calories. And then everything gets repeated for this for the second bread. Okay second bread and it looks exactly the same. It just that the name is different and these values are different. So that means you have to call this function three times. Each time you call you're going to pass that sandwich. But when you call it's going to print this every time one one one one. You want to say one two three four right. So how do you do that. Okay and again a couple of ways. One way is you can use a variable and you pass a variable to this function. Along with the sandwich you can pass another variable here. And maybe like a counter. And then here you'll print the counter here. So we replace that with the counter. And then plus the rest of that string. So it will say sandwich one sandwich two and so forth. So we got that and then here we have the bread type. And plus the sandwich that get bread that get type. Okay and I'll go through that and I'll duplicate this a couple of times. This is the bread calories. Let me just put it like a calorie after you've put a slice. And then bread just get calories. All right and then here will be the sandwich filling type. You get the get sandwich filling type. And then you get the get filling type function. Here will be kind of same thing. I put here calories per filling. And get this information here. Get sandwich filling that get calories per filling. Okay and then one more down here. I'm going to get the total calories. This is for the sandwich okay. So we're going to add and get the information from where. From one of these functions and either one you want to use. It's fine. So we'll try the first one first. So that says calculate calories you pass in the sandwich. Right so that should return the total calories because it will be turned a total here. And if you call the other function then you just pass in the bread and sandwich. And since we don't have the bread and sandwich how do I do that? So I'm going to print here just to show you two ways okay. This is method one. This is the method two. And so this one here you have to pass two objects to it. So the first one is the bread. So you can say sandwich that get bread. Remember the get bread function returns the object the bread object. Which is the sandwich bread. The second is sandwich get sandwich filling. So you get those two objects passed to this function. And now they are satisfied. And you're going to get the same result down here. Okay so these are done. Now we need to go to the main method and start creating our objects. And so you want to instantiate three sandwiches. So we call it sandwich sandwich one. Get new sandwich. So we have three options right. As you can see actually two options. One is the empty one. And one is I think we have let me see. You have three options. That's what it's not showing but yeah we have no parameter. One has the bread and the other one. I mean you can always go back here and see it. We have we have three of them. The empty one one has the bread and sandwich object. And the one has the value for each of those. So you can choose any one you want. And the less the less of one you choose the more you have to add more data. The the more you choose you have to you can you know quickly create those in there. So if you choose the first one then you have to create each object because they were not created yet. Right so that means I'll do one of each so you can see. So this one here chooses this option. So that means I need to go and satisfy the bread and the filling. Object because it's not filled right nothing is set. So in this case I have to say a sandwich one. Okay I have to create a new sandwich new bread for that. So I can't really do this one yet. I have to say you know but bread and then let's call it bread one. It's new bread and we'll put the information here. So the type would be like rye and say this one has 50 calories. And then I can add that to my sandwich but I also need the filling. So sandwich filling filling one equals new sandwich filling. I can pass in again this is the say eggs and then calories would be 100. And so I have my two objects. Now these two objects can be passed to my sandwich now but I can't because I already created. So I have to use the sandwich one to set the bread. I pass in the bread one. And sandwich one that set filling. Pass in the filling one. Okay so all of these lines are used only to create this single sandwich bread. And for now we'll just leave that for now and if you want to print the result you can just say print result passing this sandwich one. And see what happens. And also the counter because we added a counter. So this is bread number one so you just put here one. Okay so if I save this now and run this program hopefully there are no errors. And see what it gives us. Okay so here we go we have the static data. Then we have the sandwich one. Right we have the bread type and the eggs and so on. So the calories you can see exactly the same whichever function you use. All right so that's the first method to do that. Now what about the second method? The second method is to call the second constructor. So here's sandwich two. Okay so sandwich and then sandwich two is new sandwich. This time I'm going to pass in the sandwich and then the bread filling. Okay oh not sandwich I mean bread. That's what it means. That means I have to create this again because I don't want you to say one. But I'm going to copy this too and I'll just put it right here. Right above here okay because you need to create those first. So this would be the number two. And we'll call this white bread 670 and then this is like salad. And then since salad's healthy we'll put here like 60. Okay so now I passed in the bread two and the filling two. So I created my second sandwich and I can print that out right here. And that's the sandwich number two and so I passed in the parameter two. Argument two. Okay so if I run it now I'm going to get two results. So here we go. The first one is what we had earlier the rye. The second and notice it says number two now right. And then it has this information and surprisingly enough at the same calories. And just to make sure this is true okay because remember we have to double the slice two times two. So you're going to get 40 out of that right. I mean 140. So 140 plus 60 you get 200. Same thing here. If I double that I get 100 and 100 plus 100. Wow interesting. Okay so that's the method number two. Now here's method number three. Sandwich three. So this time you're going to pass in this information directly to the constructor. So I would say sandwich sandwich three three is no sandwich. Pass in the first is for the bread. So let's call this what do we have right. Right so we'll call this the wheat. And this one has maybe like 25 calories per slice. And then the type would be a potato. And then this one has let's say 80 calories. Not 800. So you can see this much shorter I'm done. And then I just print the result. Print the result of sandwich three. And then the counter would be three. So there you go. So run. And as you can see I have my the first sandwich. The second and my third right. So you can see how your code get shorter and shorter. If you have these constructors here. And here because I didn't I have to pass in both objects. That means they have to be created first before you can actually pass them in here. This one is the most tedious one because I use the shortest one. But then I end up creating my new bread object. And then my filling object and they pass those objects into that. You set each of those individually. So you can see there's a lot more to do there. But either way either one of these will work. And of course you can always reflect on these. This is you can always reflect to make it a little bit shorter. Like this part here I can make it so that it will look something similar to this. Okay just to show you how that works. I can go here and use this sandwich same name. All right let's let's put sandwich four. Okay but I'm going to use something similar like this here. So where's the sandwich four is new sandwich. I'm going to pass in two objects. So instead of you know declaring them this way I could put this inside here. Inside here that's the new bread object. The second object is just this part. So there we go I have my fourth bread. And yeah it's a little bit longer inside here. But I need to instantiate a bread object. And then instantiate a new sandwich filling object. Yeah that's the way I can hide this information here and make it make my code really long but actually it's not this long. All right so the reason why you do this is because you don't want to reuse this again. So I'm not creating a variable here. So once I run line 2021 I'm done. Okay no more I can't access this again without going through the sandwich four object. These two will exist because I created using a variable. So once I pass those to this function here this constructor I can still reuse them again. And because they are the same object remember they are just the same memory address. I pass that to the sandwich this still exists. So if I'm making any changes outside here it's going to affect the bread the sandwich in here too. Here I can. Here once I instantiate that I'm done. It exists inside the sandwich only. I can't access anywhere outside unless I go through the sandwich four okay. So by doing this way you can see I have one line of code just kind of like this one here. And this one here yeah has a lot this is just the you can't get any shorter than that until um yeah because once you once you set that then you you can't I mean you can you can omit this right. So here's the same thing so when you set the bread I could do this. I could do the same thing like I did here okay. So instead of creating this bread here I just copy this. You can put it right in here bread one and then this sandwich here going to the sandwich too so in that way I don't need these two lines here. So it's the same thing right it's the same thing I'm just either if I want to reuse it I put in a variable if I don't then you can instantiate right inside the function as an argument it will pass that as an object to the constructor or to the function here. And you'll see that that should be completely okay and I can print here the bread number sandwich number four. So sandwich number four and four and two are the same okay because I'm using the same white here but I can just make some different calories say that this is I don't know chocolate is there a chocolate bread I think so right so it's really high calories okay so here we go and run okay so here we go the first one as you can see even though I changed my code right everything's fine this second one is normal the white bread the third is the wheat and then the fourth one is the chocolate one okay so there you go and you might want to you know separate these with a with another line it's kind of how to read and so when you do the output here the variable above you can put this out and then just leave it a blank line like this that will give you an empty line so you can see that looked a little bit nicer has a little separation here so you can see you know much better this way okay so I showed you like how you can use this in many ways when you create objects this way and so that's that's really important and if you have any questions let me know I know I probably did more than I should have but I do want to show you the you know flexibility of doing all this code because there's really no single way to do it okay I just did everything here in the main method here but of course you can always reflect on your classes to do more than we would just had here but this will do all right well let me know if you have questions


Okay guys, this is the Yeba Pico T1. It's a brand new portable on the go projector. Yeba did send me this and just a caveat. This is a prototype and it's not the final production model that will go out to the public. But this is now released on Indiegogo for crowdfunding so you can back this if you are interested in buying this. I am so excited to try it out because look at the size of this. Just by looking at it from a distance everyone would assume this is a power bank but it's not. This is the projector itself which I think is incredible. Just look at the design of this. It's very reflective. It's anti-scratch. It's kind of like a glass design but it has this special coating with the touchscreen buttons just on the top to control the projector. You've got the power button just on the right hand side with the volume controls.  At the bottom you have yourself a micro HDMI port with two USB-C ports. One for powering on the projector and one for charging your phone as an additional backup. Then you also have the bulb there just on the front and I just feel like this is an absolute great design. You've got yourself the speakers there at the front as well. For me personally I'm just surprised at how lightweight this is because it literally doesn't weigh anything. How compact it is. You can literally put this in your pocket and take it with you anywhere. You can put it in your backpack very easily and just store it wherever you like but not only that this can also be powered by a power bank so it can really be portable so you don't need to use the plug or the cable to attach it in there. If you have a separate power bank that supports PD 3.0 then you just connect this and you can use that to power on the projector and use that essentially with the battery life of your power bank. Let's go ahead and quickly see what else is in this box and just remember some of these things may change once this does get released to the public. I'm just a big fan of Yeba products. I reviewed one of their projectors in the past before which is the Yeba V7 Pro. So in the first accessories box you have yourself the micro HDMI to HDMI so you can connect pretty much anything you like so I'm going to be connecting this to my Apple TV but you can use it for Firestick, Chromecast, whatever it may be even your laptops. Then you have a mini remote control. Let's see the remote control as well. You have yourself the volume buttons, power buttons, the back buttons and the menu control buttons so very quick and easy it does come with a battery you just literally pull out the slot and it will start to work. Then you have this very mini tripod as well which I think looks great and essentially this tripod is magnetic ball head because the bottom of this projector it is magnetic so you can see here you can pretty much twist it 360 degrees angle it however you like just the flexibility of positioning it very quickly and easy and then just take it off. I think that's something that's excellent for this type of projector that's very portable, very pocket sized and it's just so quick and easy to set up no need to fiddle around with getting the right angles or adding a kickstand or anything like that. Then you have one more accessories box here so you have yourself the power plug for USB-C then you have yourself the USB-C to C cable for the power plug to charge it up and finally you have yourself a traditional USB to USB-C as well as a backup so all the plenty of different options to get this connected. I'm really excited to try it out and see how this performs so I'm going to set it up with my projector screen and see the projection size on this but this can also connect via bluetooth it supports 2.4G and 5G dual band Wi-Fi which I think is great and it's got an inbuilt smart OS as well so I'm going to start off by running through the smart OS and see some of the features that this contains so let's go ahead and set it up. Now one other thing depending on which package you buy from the Indiegogo listing you can actually get this very nice carry case for your projector and the accessories that come with it. If you open it up there's plenty of different slots where you can store the tripod the cables and also the projector as well and this is very convenient to take it with you in your backpack or anywhere else to make it very portable and easy to carry. One other thing that this also benefits from is the ability to power the projector with a power bank so if you take a look at this power bank this was included in the package so you can check out the website in the link below to see which one you can get that includes the power bank as well as the projector and the carry case the full package this is actually very similarly sized to the projector itself and it actually weighs more than the projector which is quite surprising because the projector is super light and it just goes to show how portable and how versatile it is now you can use any power bank to power the projector which is you know a very great option you just need to make sure your power bank supports pd 3.0 or qc 2.0 which this one does that comes with the package so let's go ahead and power this on and I'm going to showcase to you guys some of the menu buttons on it what these do I will also use the remote control and I will mount it on this tripod and go through some of the key specifications of how this performs starting off with the smart os which is based on the google android platform okay so mounting it on the tripod is super easy because it is magnetic you can actually twist this 360 degrees and angle it however you like if possible try to keep it in line as straight as possible with your screen or your wall where you're projecting it onto because this does have vertical auto keystone correction which I think is great in addition to that it also has automatic screen rotation so if you did want to maybe mount this the opposite way then it can rotate the screen automatically but the focus itself is manual and there's no automatic focus so I'm going to use this power bank and pull out the usb c part of the power bank to turn this on and showcase really you know how much it can work perfectly well as a wireless projector so I'm just going to turn it on with the power button on the side and I am in fact two meters away from the screen which is the ideal distance for max projection that will give you maximum around 100 inches but the closer you get the more clearer it is now I do have a lot of light coming into the room but I will darken it so you can see the screen lot clearer it's starting off with the yaba logo and I will cycle through with using the remote control okay so I've just made it a little bit darker now you can see this is the homepage for smart os it has done the vertical keystone correction automatically I have now adjusted the manual focus to make it very sharp and very clear this is about two meters away and they say it's ideally the max projection size should be 100 inches around six and a half feet away from your screen but you can go as close as to 30 centimeters and it will give you more of a smaller and more sharper projection the closer you are to the wall but I think this is quite a decent size right now I have it at around 70 inches so for me that's working absolutely fine if I cycle through you can set some favorite apps on the smart os here if you go into apps you'll have a bunch of apps that you can watch content on if you go into any it will ask you to download it from the google play store so netflix for example is 25 megabyte download and I can go ahead and download it directly from here you can also see a bunch of recommended movies to watch from any of the apps that you have downloaded onto the system you can play back music you can add your own media and play that back directly from the projector eshare this is something where you can use your own wireless mouse or keyboard and then essentially use this as your remote working screen so you can attach it with your laptop by going to a certain link in the browser if you go into settings you can find here settings around your wi-fi you can add bluetooth devices change the language if you're going to projection you can change the mode the keystone correction and adjust the brightness levels if you go into other this is where you can adjust some of the application settings so if I go into that here you can go into specific apps that you've downloaded and just adjust the settings these are very much just like android app settings that you might find on android phones and you can also do a factory reset if you ever need to do that date and time and a little bit about the device so it's very straightforward and it's very clean I'm super happy how this is working if I wanted to use the projector using that button in the middle of the projector menu it's actually a mouse pad you can see obviously the projector screen is shaking a little bit as I'm pressing against the projector itself but if you wanted to use this manually then you can go directly to any of the items by using the mouse I generally wouldn't use this because you can see the screen is jumping around a little bit as I'm pressing lightly on the projector itself but if you wanted to use this to highlight anything specifically that you can't use with your remote control then that is an option there now that you've seen the smart os just a brief information about some of the specs this is a dlp display and it has 110 lumens of brightness which is a decent amount for a projector of this size if I just show you how clear this gets the closer I get to the screen and of course you have to manually readjust the focus every time you do get closer I would say maybe this is the closest recommended point which is around 30 40 centimeters away and then the further back I go it can go pretty large but I'm going to manually adjust the focus as I'm going I would say this is around the 100 inches so it's still pretty clear but I wouldn't say it's the sharpest I would say 80 70 inches is probably the most ideal size which this one is where I'm placing it currently and if I switch this upside down you can see it's auto rotated and you can see how responsive that is how quickly it does it so I think that is a very great selling point on that front and then finally the lamp life inside this projector gives you over 30 000 hours of its lifespan okay demo time I'm now going to be playing a sample demo that has a variety of different color ranges and also I'm going to be trying to see how the sound output is from the internal speakers of the projector because it is very pocket sized I'm quite impressed of how loud it gets so I'm going to put the volume up at various stages throughout this demo video and let me know what you guys think of the quality okay you guys saw that that was a very detailed demo I was pretty happy with the quality of the video given that it is a very tiny and portable projector and it does have just 110 lumens of brightness I still think when you have a very dark room things come out very clear and I can see all of the details in the video quality and even with the audio it was quite loud for the size of the speakers so for me I was personally that impressed and I wouldn't need to go to all the way 100 max volume just to be able to hear anything on screen because for me standing in front of the projector that was still pretty loud so do remember that how you view it and how you hear the demo might be slightly different to how I see it in person standing in front of it but hopefully that gave you a clear idea of the capabilities and the quality of this projector as well but not just that you can have a full setup like this so I've got the micro hdmi connected to my apple tv box here which I can then use to play my content directly from that then I've got my white cable there in the middle to power on the projector that's one of my own cables and then the last cable here is to charge up my phone at the same time with the other usb-c port so this is the usb-c to c cable that came inside the pico t1 box so you can see it's actually charging so this is a full setup and it is very tiny it's portable and it doesn't take up so much space so now I'm going to showcase how to switch over to use apple tv via the hdmi port so on the screen go over to source go up and select hdmi and there we go apple tv is now on so now we can very easily browse apple tv apps and use this it's very responsive it's very easy and now I'm using my apple tv remote instead of the pico t1 remote so very quick and convenient way to connect any of your external devices so whether that's an amazon fire stick for example chromecast apple tv whatever it may be there's plenty of options to utilize this tiny portable projector but what's great is if you do visit friends and families you go to the office quite often and you just want to have a larger screen to show content to people whether that's for work for business for pleasure movies tv shows I feel like this is the ultimate solution and I'm super happy with this I'm going to be keeping it in the little carry case and I'll take it everywhere I need to go and show content and watch content with other people because it can literally be played anywhere you'd like and that for me is one of the biggest selling points of this new projector so that's pretty much it guys hopefully you found that review useful this is the yaba pico t1 take a look at the link in the description for the indiegogo page for this have a look at the latest pricing information if you are interested in this then try and grab yourself a super early bird deal and see what package you can get with some of the accessories for me personally I'm so happy with this even when it is a little bit brighter in the room it still is pretty clear and I'm impressed with the picture quality even if you don't want to listen to the audio directly from the speakers inside this then you can use bluetooth connect your own headphones and just listen directly to the audio from your headset which is probably what I'll do most of the time when I am using this to watch some content if you guys have any other questions about the yaba pico t1 drop a comment down below and I'll try to get back to you as soon as I can if you like this review and you like the look of this projector and its capabilities make sure to give this video a thumbs up make sure to subscribe I've got plenty of tech gadget reviews coming out in the near future with really cool gadgets like this one and I'll add this to my projector playlist amongst all of the other projector reviews I've done in the past so make sure to check those out as well and I will catch you guys at the next one take care


This is covering the spread part of the Fandall podcast network You more games in the NBA playoffs for tonight. They keep on pumping out three game slates. I am very into that We got three more fun ones coming up on the docket for tonight a couple or three game threes all here And we're gonna break them down with Austin Swain We're gonna get his thoughts on all three of those games And if we've got Austin here might as well talk some UFC for this weekend as well We'll break it all down with Austin right now This is covering the spread right here on the Fandall podcast network and number fire com My name is Jim Saunders. I am a senior writer and analyst for number fire Joined here as mentioned by Austin swain checking out on twitter at a swain 3 you can find his work Over at number fire com often the NBA playoffs are chugging along ufc this weekend as well. How you doing today? I'm doing phenomenal because you didn't even mention. We've also got stanley cup playoffs right now We got nascar talladega this weekend. It is one of those sneaky loaded times of the year on the sports calendar It's weird This has always been my favorite part of the year because when I was growing up I was a huge like nfl draft nerd. I still like it. I just don't like publicly like talk about it as much But like I love the draft. You got the Kentucky Derby. It's kind of like a fun event for the day You've got just kind of everything cooking all at once so Underrated part of the calendar. I would say like this might be a bad take and that's okay I like this more than March Madness this time of year. Is that bad? No, I don't think that's a bad take. I think that's an acceptable take like I have equal joy in my hearts I have more attachment to this from when I was a child because it meant school was almost over So that's that was my reasoning. We got the Indy 500 coming up coke 600 monaco coming up part of the reason I don't care as much about march is because of school alignments Wasn't a huge factor for me in that range, but still fun time of year So we'll talk about the nba and the usc side of things for today with austin getting his read on all three mba games before we break down the usc this weekend But first a reminder to make sure you're subscribed to covering the spread wherever you get your podcast If you like what you hear me was a five star rating But also check us out over on the fan dual youtube page if you want to watch And uh, check out over there just search for the faddle youtube page Subscribe over there and if you like it hit the thumbs up button there as well The nba playoffs are here and you can get in on the action right from first tip with faddle Right now all customers can get a no sweat same game parlay every weekend when you bet the nba playoffs That's right. Just place a three plus leg same game parlay or same game parlay plus on any nba playoff game You'll get bonus bets back if you don't win There's no better place to bet all the playoff action than america's number one sports book Head to the faddle app and get a no sweat same game parlay every weekend of the nba playoffs faddle official sports betting partner of the nba Must be 21 plus and president select states faddle is offering online sports waging in kansas under an agreement With the kansas star casino llc Bonus issued is not with probable bonus bets that expire seven days after receipt Restrictions apply see terms at sportsbook dot faddle dot com gambling problem call 1 800 gambler Over the faddle dot com slash rg in massachusetts. Hope is here gambling help lie down a dot org or call 800 3 2 7 50 50 for 24 7 support In new york 1 8 7 7 8 hope and wire text open lie in arizona 1 800 next step or text next step to 5 3 3 4 2 in connecticut 1 8 8 7 8 9 7 7 7 7 over the cc pg dot org slash chat in indiana 1 809 with it in wyoming in kansas 1 805 2 2 40 700 or in kansas ks gambling help dot com louisiana is 1 8 7 7 7 7 7 7 7 0 stop In maryland md gambling health dot org and in west virginia go to 1 800 gambler dot net Let's dig in now to the mba 4 2 night awesome Let's start things off with the first game that is the 76ers at the net 76ers here 4 and a half point favorites total is 2 10 right now philadelphia is up 2 0 in the series looking at game for 3 austin anything you like on the board at faddle right now uh So you know this line weirds me out it's one of those lines and you can get these where they kind of smell a little bit fishy When you look at brooklyn they have just been destroyed in two games in philadelphia and they're only getting four and a half points at home here It's one of those things that doesn't sit right But we see this anecdotally in sports every year in the seven game playoff series I'm gung ho effort in game three or game four just you know to avoid the sweep a team that is overmatched Just like brooklyn is in brooklyn if they had a whole season with this group They probably would not have been a playoff team that a negative net rating when you look at Post deadline after they traded kevindor and kairi erving and brought in the new pieces With no official action I do kind of have a lead toward that net spread for that reason that they put together a good effort in brooklyn until it happens I I do think they've significantly underperformed at least defensively in this series 114.7 defensive rating in the regular season It's 119.9 in the playoffs and you know playoff basketball is different The stars on philadelphia do shine through But I expect them to put together one of these lockdown efforts. We've got a low gritty total here at 209 and a half So I have a lean to the net spread. I don't have any official action on this game And just because all my stuff is pointing toward philadelphia, but it just does not smell right When you look at the first two games, is it match up problems? What has led to the the 76ers handling things so well and what makes you think that will change here in game three Well, so well, so really brooklyn is just having a tremendous amount of time scoring outside of mckell bridges And we saw more double teams in game two. They don't really have a guy that can reliably put them all in the basket They're offensive ratings sitting around a hundred. So They that the role players typically shoot better at home. So that could help guys like joe harris like seth curry They've they've really underperformed on open three point shots as well in the series um Like I don't think that they have the offensive talent to regularly threaten the sixers because they are very quality defense as well But one of these games i'm expecting brooklyn's defense to shine back through probably at home with that home crowd energy Um, and then just make a few more shots to keep it close with philadelphia I don't I don't know if they take this one, but I do like the points given that we're over that magic number three So it sounds like to you the thought process is they're getting open shots They just haven't nailed them and over a longer term you expect open shots to go down And they haven't yet So that could imply there's value on the nets here at plus four and a half Get 96ers as you said not a full bet for you not one you have bet yourself But uh lean towards the nets in that first game between them and the 76ers Second game for tonight is the kings and the warriors spread is six total creeping up here It's 240 of course the big headline here is no draymond green democracy bonus will be good to go for this one What's the impact to you of no draymond and are there any Value bets to you in this game whether it be because of his absence or otherwise So I I got this over at 239 and a half. I still love it at 240 That is the biggest effect without draymond is that the warriors really they don't play much defense without them They have a 118.8 defensive rating which would have been the second worst League mark in the league this year and you had half of the league actively tanking toward the end of the season So the warriors are definitely trying they've been trying to get into this play And they just aren't very good without draymond on the floor. He's one of the best defenders ever, of course I'm not Breaking news there, but I have a lean toward warriors minus five and a half here It's just really tough to overcome the metrics that you look without green They have a plus 6.9 net rating with him. Everything is great minus 5.6 net rating without him So I'm a little scared of the top side, but I do love the total given that this is the fastest pace in the playoff so far Um, great golden states defense as I mentioned is awful without draymond And the kings have the worst defense adjusted defensive efficiency in the playoffs of anybody to begin with So this is as close as you can get to a kind of a regular season defensive environment in the playoffs That that is trending up and there's a big difference between the warriors on the road and at home We've seen that they won 11 road games all year. They won 33 at home I don't know where to draw the line about how draymond's absence Affects that part and I think this line is pretty efficient. I only have kind of a lean toward thinking the warriors get it done Convincingly, but I love the over here Yeah, the total again 240 minus 110 on me over there Warriors money line minus 250 the spread is minus six there for golden state now. We talked earlier in the year I think it was around the trade deadline and you were skeptical at that time of the king So are you surprised to see what they've done so far through two games? No, because um, I I saw that more as sacramento potentially pulling back in the regular season and then falling into a playout play-in scenario They got the ideal matchup in my opinion for them in round one with golden state because of golden states issues Especially defensively on the road. I would have expected two games in sacramento's building We've seen the environment there through two games to be look exactly like this I think golden state at a track meet is exactly what sacramento could have hoped for because golden state doesn't bring a Lot of size to the table. Uh, they don't play a lot of big big guys and that's kind of sacramento's main issue I see for them moving forward But this series is fun and we've all benefited as basketball fans because like these teams are perfect matchups for each other Um, I won't be surprised at all if the warriors punch back and this series might be headed toward six or seven games And I hope it does because they're two fun teams to watch if we can get a high total in the playoffs I'll take that as well. So uh, like in the over here at 240 for the kings and the warriors Final game for tonight is the suns and the clippers your clippers tied one one across the first couple of games spread here Is three points in favor of the suns total is 226 and a half We saw the suns bounce back after a kind of lethargic game one with a winning game two How do you see things playing out in game three? So there the clippers mindset is probably the same mindset I have as a fan Which is you know, if we can get this to two two and prolong things We already see paul george moving pretty considerably with basketball activities and warm-ups Like if he can come back before the end of this series Even though it said it was unlikely according to like woge and shams Then the clippers have a very different chance to win this series But I I do kind of like the clippers here is in a short money line spot But my most annoying pet peeve in sports betting is like people that have a favorite team and tell you that They're like the sharp side of the game like I know that you think your team is going to win So nobody should care what I have thoughts on the clippers money line in a pretty close game But I do love the under here. Uh, it's exactly the exact same number We got in game two and that was just another worldly shooting performance from phoenix They went 60.6 from the field on pull-up two-point jumpers 40 on pull-up three-point jumpers and jim pull-up jumpers are the most difficult shots in the mba Just cats shoot fire Obviously the suns have kevin durant and devin booker so they can do some of that But those are still godlike numbers that they put up in game two toward craig made five threes chris paul barely missed, you know They will naturally pull back as this series progresses and the clippers should not have a total of this high If you look at them in a vacuum 24th in pace in the regular season That's even slowed down as koai lender does more of his isolation stuff And 19th and adjusted offensive rating per dunks and threes So these totals should absolutely drop moving forward So I will still target the under here and hope fewer those difficult shots go in the basket Yeah, that under is 226 and a half minus 112 on that one if you try to take your clippers fandom out of it What do you think the money line is plus 124? It's tough to analyze things objectively and I totally get that But if you're looking at it like from that perspective, um, what's your read on plus 124 in the money line there? So I I think that the clippers are actually doing well with some of the match-ups in this series Like russell westbrook has actually had a tremendous time attacking downhill against either chris paul Or or debon booker and he's just he's actually had some Poor shot luck as far as like he's taking efficient shots that just aren't going in the back in the basket You see some of that stuff around the rim So I do think the clippers can offensively have a little bit of positive regression in that direction Yeah, um the shot quality is very even these teams are actually very evenly matched as far as the types of looks that they're generating So, you know the clippers coming home. It's game three I think this line is a little bit shorter than any would have would have expected And you see a heavy amount of tickets and money coming in on the sun's it looks like on faddle sports books So, um, I I think the clippers are still kind of getting a little bit written off I heard a lot of predictions about four or five six games Without paul george, but they've matched up very well in the series so far I think it's a very close team if I got the suns plus two and a half at home I'd slam them of course. I think it's a very I think it's a very tight series And I'm excited to see what happens tonight in la well. Good luck Hope it goes well and enjoying the game there for tonight. Let's shift focus now and talk about some ufc It's not the biggest card by any means not the most exciting card, but hey, I've got you here I can't not talk ufc because I don't want to deprive myself personally. This is a very selfish segment on my end We got uh, surga popovich against kurtis blades as the headliner for this weekend Let's start things off with talking about some money lines awesome when you look at the fights here Who do you think wins who is undervalued right now on the money line at faddle sports book? So I I think one of the biggest things that you can learn if you're if you're new to sports betting is you Should not shy away from juice if you are showing value on a specific bet Then you can still make that bet. So if you flip over the prelims gem I'm looking at donna back row the very first fight on the card here a sitting in minus 150 And I just look at this line and I can't make heads or tails I've got a closer to like minus 250 because there's a massive gulf here in pre fight competition And long-term expectation between baccalaurel and brady. He stand In that fight and donna baccalaurel's lost two in a row But there are a pair of ufc guys with seven wins apiece that baccalaurel has been fighting Brady he stand just squeaked out his first ufc win over a guy that hasn't won in ufc himself So you're talking about a massive gulfing competition and it really comes down to Whether or not baccalaurel can defend takedowns in this fight and I think he can he's defended six of nine so far Including a couple from kyeong-ho kang in his last fight and kang is a more efficient wrestler on paper against better competition Then he stands so I really like the way this profiles for baccalaurel brady's a good wrestler, but he's really struggled to defend strikes negative 1.2 striking success rate 43 striking defense is poor baccalaurel just has too much positive experience with power for me to think that he'll take a set back here against brady he stand The money line there is minus 150 on baccalaurel. How do you handle these pronunciations? I know like Like for baseball, it's pretty easy because it's not like a ton of different But like you got like portuguese pronunciations. You got everything here. Um, I would swim and I would be in a bad place Is it like a ufc like media guide or what goes on here? So I a lot of times I get pronunciations from previous fight appearances It helps in ufc because these guys the broadcasters get to specifically interview the fighters in the past I have gotten pronunciations wrong based on regional footage before so It happens. It definitely happens been there. Believe me watching youtube videos trying to get pronunciations We've all been there for sure. Okay, uh, baccalaurel minus 150 to one money line You like any other money lines or are we talking props now? Yeah, no So also on the prelims here it is basically a pick-up and we love pick-up ufc fights because that means it's usually going to be competitive I really like matthew semmelsberger semi the jedi here taking on jeremiah wells It isn't really another instance where we got a significant competition gap Might actually be on the main card. I might have fumbled that for you jim, but um The big gap in competition even though wells is six years older It's actually semmelsberger that has significantly more high level experience He's got upwards of 75 minutes of octagon wells at just 10 and a half And you see this in ufc with guys that make their debut They just kind of hit the peak the pinnacle like 95th percentile or better outcomes in their first few fights We don't really know a lot about of them. Uh, you know wells came from behind with a knockout of warley all these Submitted my guy blood diamond who can't grapple at all and then a quick knockout of corp McGee who is at 38 years old at this point? And and certainly on the tail end of his career. He's got major questions Including he's only defended 32 of strikes so far Which is fine against guys that don't have as much power that have aged But semmelsberger hits like a truck he had three knockdowns in his last fight And he defends 56 of his incoming strikes So he is the far more sensible guy in these exchanges about minding his weapons Um, and he's really got a second quality second pitch with his wrestling if he needs it 50 Takedown accuracy wells struggled a little bit like with that in the all these fight I am trusting high-level experience and talent here with uh, semi the jedi the former marist college football star as well Semi the jedi. Yes, sir Where do they come up with these? This is nuts I have no idea one of my favorite regional promotions the alaskan fight league matthew semmelsberger came up through got the nickname from there So, uh, some good some good fights in the afl gym. You should check them out I love it. Uh, matthew semmelsberger minus 113 in the money line against jeremiah Jeremiah wells lost another that is on the main card for saturday. Okay Props just went up this morning for most so you might not have had a ton of time to look at those But looking at props beyond the money lines. What do you see in there for this weekend? So let's talk about the main event, right? The only fight on this card that truly matters when you're talking about tidal stakes That's surgey palovich and Curtis blades And people have asked me what's what's gonna happen in this fight The thing is is that this money line is decently close blades is a moderate favorite But it's not because they're expecting this fight to be competitive We really just don't know which one of these guys is going to win out because Curtis blades is this aggressive wrestler Has ragdolled almost everybody short of francis and ghanu and and one lucky luck knock out by Derek Lewis in a fight that he was losing handily, but Surgey palovich is this guy that now has this fearsome label Just went in has knocked out his last two opponents in like less than a minute. So He really has this terrifying combination of speed and power palovich more of a striker blades more of a grappler And it just depends which side wins out I i'm looking at a prop for blades when I look at his method of victory Curtis blades by submission at nine to one And this line has a lot of nuances that doesn't sound very Odd considering I just said blades is a grappler, but it's actually not something if this is the lowest this prop has ever been for him in his career and it's because This isn't really in his range of outcomes. He doesn't have any career ufc submission temps He doesn't have any professional wins or losses via submission I had to force my stuff to like this range of outcomes because he is going to have such a grappling advantage over Pavlovich here in It really has to do with Pavlovich being a one-dimensional striker in ufc thus far Blades averages north of six takedowns for 15 minutes So if he's having his way this fight is going to take place on the mat and this is a small dart If blade survives gets this fight to the ground that I think he can close it quickly because These wrestlers they train defensive and offensive grappling just to avoid getting submitted themselves So I know Curtis knows how to do it. He trains 20 minutes from my house here at elevation fight team And I can promise you he knows how to grapple He just hasn't necessarily had a match up We had to go through with that but kind of an anecdotal reason why I love a submission John jones just won this title via submission and he made it look easy Like like zero gun didn't know how to do it at all If Curtis blades can go here grab a submission in this fight. He says I can grapple too I need a date with john bones jones because I can give him problems So it sounds like this is a spot where the eye test is playing a big factor for you Which is good because I know that like a lot of Betting markets are going to be set by numbers. I run mine by numbers too So like there's nothing wrong with numbers, but if you have More in-depth knowledge of the sport that can factor in and kind kind of get you some value And it sounds like that's the bigger factor for you with this one Yeah, so think of it this way uh one against cursed caucus in columbus last year Curtis blades one dimensional wrestler that everyone thought that would be the path to victory right Submission north of 20 to 1 so it sits here at 9 to 1 So odds makers they've even made a manual adjustment like I have like oh If the grappling advantage is going to be this big in this fight It really doesn't matter that blades doesn't have a submission record that he doesn't have a submission attempt because He absolutely has the advantage here in this particular fight So I actually it's one of those situations where I don't like to miss out on value I would rather have this number 12 15 to 1 for my own personal sake But seeing it this low makes me know that odds makers are on the same track than I am And the fact that you know is 20 to 1 for that one is hilarious to me and I love it I love that recall that memory. That's very impressive. Okay. What about other props across the card for this weekend? Well, I bet it and lost it. It's however, remember But uh another prop that I'm looking at the main card I as min lucindo one of the kind of budding prospects in UFC one of the youngest fighters at just 21 years old Anywhere on the roster here. I'm looking at her if you look at her double chance odds Which by the way, if you're new to faddle better UFC on faddle This is how you quantify kind of an inside the distance bet I don't know if it'll be a knockout or a submission But you're gonna encompass both of those results with plus 220 behind lucindo this weekend I just have a very low baseline assumption of brogan walker. Um, she comes in off the ultimate fighter Which is UFC's reality show in the finale against juliana miller Which is the first of those fights that has tracked data. It did not go well Okay, and she didn't defend any of the four takedowns from miller 36 striking defense She was finished inside the distance. Here's the problem juliana miller in her next fight got ragdolled like that as well So it's not voting well for brogan walker to take on a bona fide UFC contender like I think lucindo is because lucindo in her debut Kind of a fight of the night type of battle with yasmin gyargy Uh 60 striking defense. So she did very well of keeping herself safe on the feet Um women's straw weight is not a division where you typically see finishes It's not like a knockout and submission heavy division But lucindo is one of those fighters that bucks that trends 10 of her 13 pro wins Via finish eight knockouts two submissions. I feel more confident My stuff also feels more confident in a knockout here But I am encompassing that submission element because of how badly walker struggled in that domain in her debut You know, I've got this inside the distance number closer to like plus 150 So plus 220 is an excellent number for lucindo Yeah, that's in the double chance market over at vandal sportsbook Lucindo by knockout or submission is plus 220 her moneyline odds are minus 370 So just kind of different way of betting that it sounds like basically what they're saying is This one is gonna go the distance, but lucindo will win and what you're saying is no I think she takes care of business pretty pretty quickly I I think a lot of that distance number has to do with women's straw weights historical trends Like this is a division that regularly does seed decisions This one bucks that though. In fact, you know, when I lined my stuff up I would have thought walker was less likely to be finished in the distance in her debut than in this fight So that is that's great value for me when I look at it Alrighty, well that is nba and usc via awesomeswame for this weekend awesomes. I appreciate it as always Good luck to your bets, but also thanks for joining us and enjoy the clippers game for tonight If you can I'm not sure I tend to get too stressed in the situation So hopefully you can enjoy that game tonight I feel like I'm playing with house money with paul george down. So, you know, I'm just having a great time I love the nba playoffs. So and thanks for having me on today, jim Appreciate it as always check out awesome on twitter at a swing three I am on twitter at jim sonnis make sure you're subscribed to covering the spread wherever you get your podcast And don't forget to check us out over on the fandal youtube page as well back once again tomorrow talking some soccer MLB and nascar all at the same time in the same place. We'll talk to you then This has been covering the spread right here on the fan duel podcast network


Hello everybody, Andrea here with dental little tutoring, what is the easiest way to study for the board exam so I've been a dental tutor for, oh gosh, about 17 years now so I help dental hygiene students and dental assisting students pass the board exam and I do this all online. And how that works is you would sign up, you can log in anytime you have full access to your online account where I go through everything you need to know for the board exam you will see different modules. You will see PowerPoint files, if you want to read, you will also see me teaching you those types of content to so I teach you by a video all about pharmacology, oral pathology, community special needs you name it everything that you need to know for the board exam. When you don't want to hear me talk here you teaching things then that's where you have the PowerPoints, you have the PDF file to read the materials because I will always suggest the best way to study for the board exam is to use a mix of materials so don't just read through the textbook for eight hours every day. For two hours listen to me teaching you something for another two hours read a PowerPoint all about special needs and then maybe you want to take a mock exam after that. Mix it up all the time and that's what I teach my students there's also a private Facebook group for a dental L students only where you can network with other people. If you have questions get study help, all of that. And I will also come on live about twice a month. Answer any questions you may have. We talk about certain topics and at those live sessions we go over mock exams and case studies. You're constantly learning you're constantly being I guess motivated to study because it's really hard to study for something you know you have to but if you're alone, trying to study for something it can be very difficult but I will always be there with you I tell you what to study when to study study so it takes the guess work out of it so even if you're not you're not really feeling motivated that day, you can log in and go okay. Yesterday I studied special needs the next module is oral pathology I'm going to at least do half of that today, and that makes me feel like I got something done and I'm always there if you have any questions. Full support anytime that's what I do for my students now a lot of people ask me well what if I take your course Andrea and I don't pass so I have a 99 point. As of this year 99.8% success rate and helping students pass, meaning if you go through the modules, if you attend the live classes, if you watch all of my teachings, you will pass because there's no way you can't. But for those who might not have the time to go through everything or you just couldn't really devote as many hours as you wanted to. Maybe you missed some live sessions just maybe something happens it doesn't even have to be anything like that but if you do not pass, you will get full access to your full membership until you do pass. So I don't just kick you out after six months a year whatever know you have full access to everything until you do pass. So that's a guarantee, you will pass with my help, if it's not the first time.  I will leave the links for you guys down below I have a separate course for dental hygiene students taking the board exam. I have a separate course for dental assisting students taking the board exam. This is for Canada US international I have students from everywhere. This will help you pass the board exam. I go through mock exams quizzes. In fact, there's new mock exams and quizzes added all the time because we talk about this when we have our live sessions where I go through the answers with you. First we go through the questions of course, then the answers and then I go through each one to explain to you why this is the best answer because two answers, as you know, are always going to be correct right talk about which one and why this one is the best answer so don't just study from your textbook picking a page here picking a chapter there study with me I have full access to everything for you in fact what I'm going to do. Let me just pause the video for one moment I'm going to upload the dental hygiene board exam prep Academy now so I can show you guys everything what's inside so one moment. Okay everybody I start I started the recording again can you guys see my screen okay so just to kind of give you guys a look inside. Briefly the dental hygiene a board exam prep Academy so again I do have a separate dental assisting board exam prep Academy. So I'm just going to go through this with you so this is what the website looks like when you log in. I'm going to pick the three lines up here and then all of this this is what you will be studying from if you guys notice on the left hand side. You see all of the different topic titles things are neatly organized in here. So you don't have to wonder okay I want to study anatomy where's the anatomy section. It is right here for you and if you notice to there's mock exams after each and every one. So if they're not here you will also see them in our session recording so new also is that you have full access to every live session that I have done every tutoring class I have done for the past two years so this year. This is the last year and even some of the year before so again if you're just sitting around one night thinking I don't really want to read anything I just want to listen to Andrea teaching me will you have full access to all of those session recordings the past two years if you want to look at special needs, then you have full access to those and each live session is about 45 minutes to one hour long of me teaching you that material so it can't get any easier than that. And remember if you don't pass a big if because I want you guys to pass this is what I am here for. If you don't pass you still have full access to everything until you do pass. I'm going to give you more mock exams more case studies and I'm going to work with you to figure out why you did not pass the first time or the second time. So before if you're taking the board exam for the second time or the third time you have not taken my program before. It's never too late to sign up now is the time to ensure that you pass so comment below if you have any questions I'm going to leave the link for you guys to sign up for the dental hygiene board exam prep Academy and the dental assisting board exam prep Academy. You can sign up anytime the the enrollment is now open so if you click the link and it lets you sign up, sign up and you have full access right away. So once you sign up, I will be talking to you very very soon. So I look forward to talking to you guys, I will see you soon. Please click like if you like this video and definitely make sure to subscribe to my channel, especially if you are a dental hygiene or a dental student or a dental professional because this is the channel for you even patients. This is the channel for you if you want to learn all about dental. I've been doing this for 17 years you guys, I love it. So thank you guys so much for watching, I will talk to you guys very very soon.


When we mainstream by diversity in the different sectors, I do create ownership of the strategic plan, first of all. And then also it will create transparency in implementation. And also when we look at biodiversity, biodiversity is you and I. It is the food we eat. So I believe when we mainstream it in each of the sectors, it will improve implementation of the issues that we had highlighted in the NBSAP, the emerging issues like climate change. It's affecting everyone. So you find that it will create more, it will be easily adapted by all the sectors in their plans and it will just promote national development. Because it is through conserving our biodiversity that we help protect the environment, we protect human life. We just make the global environment a better place to live in, through these strategies.


You can see how badly people tailgate. You can see how close they are and notice these are insanely windy roads. We are here this afternoon in the city of Tiberias which in Hebrew is called Tveria. This is on the Kinarit slash the Galilee. So we're going for lunch today. We had last night Indian food outside Curia Chimone in a place called Tali which was a remarkable find. So this is just by the coast and it looks like there is some kind of a people are docking their boats here. We're going to see what it is like to eat lunch with the view of the Galilee.


Hello, Detroit. Welcome to my prerecorded talk about how I ported Python to WebAssembly. It's an honor to present this topic to you today. Thank you very much, Liam, for inviting me and giving me the chance to talk about Python and WebAssembly. Hi, I'm Christian Hymas. I'm a Python call developer and principal software engineer for Red Hat. In the past, I usually worked on security-related topics for Python, but a year ago, WebAssembly really piqued my interest, and I started to dig into WebAssembly. A year ago, also, Python 3.10 did not have any support for WebAssembly platforms in upstream at all. But this year, with the upcoming release of Python 3.11, we have official support for the WebAssembly platforms, Amscript and Wazzy, and even have most of our tests running on these platforms, except for some features that just not supported. This talk is divided in three chapters. In the first chapter, I'm going to talk about Anscript and support, followed by how WebAssembly system interface support was implemented, and finally, some words, how I think the future for Python and WebAssembly will look like and some of the problems we're still facing with Anscript and Wazzy. A big shout out to lots of people who helped contributing to this effort to get Python working on WebAssembly. It wouldn't have been possible with several quality developers helping out with people from the Anscript and community, with the Paiodei team, and people from the Vitacult Alliance helped with the Wazzy and Wazzy time problems. So first part, Anscript and. If you're not familiar with Anscript and, it's a tool chain and SDK to compile C and C++ code for WebAssembly, targeting browsers or Node.js. There's usually some kind of JavaScript Google layer implemented that provides a Cisco layer, a visual file system, and other features. The base implementation of Python just kind of works with Anscript. So we have a very major importable code base. We use C11 without many fancy features because we target a variety of compilers. We use Autocon and make files and even extensive test suite. But some of the limitations made it a bit more harder and also some problems in our build system. For example, we require pthreads, which are mostly not available, not in Wazzy at all, and in Anscript only under some circumstances. Our cross-compiling system was broken at the point I started looking into that. And the way how we bootstrap Python, so Python needs to compile Python, makes it a bit tricky to get Python working. But with some efforts and also help from Eason Smith, last year in November 2021, we got the main branch of Python compiled to WebAssembly. And running that in the default HTML in the face of mscript in the browser. This required lots of hackery and tooling and scripts and shellcode to just get it bootstrapped. While Eason had that already working, I was still facing some problems with my initiative. You see here a screenshot of a web console that shows that there's a vital Python error. So because it can't import the encodings package or model, this is the first Python code that gets imported by Python. So that was very exciting for me. The first time I got Python working in the browser, at least to a point where it needed the standard library. While Eason had already figured out how to bundle the standard library and package it as a visual file system and contribute that distributed through the browser. So the build system of Python, we use, as I mentioned before, Autoconf and Configure, which detects things like the compiler, available header files, available functions, and other properties of the system. When we have these things detected, we compile a very minimal core to bootstrap the import system. So import lib is Python's import system. The import statement, but it's written in Python and we don't have anything to import the import system. So we compile the Python code to bytecode, inject the bytecode into a header file, and then just load the bytecode to C code. The next step, when we have the import system working, we can create a bootstrap interpreter that can do a bit more, can actually run Python code. And so we use that to deep freeze the standard library. There's a new feature introduced in 3.11 by the faster Python team, which makes it faster to start Python by having common packages and common models also frozen in the C code. Once we have that done, we can compile the actual Python interpreter with the static built-in models, and then use the Python interpreter to compile the shared extension models. For having WebAssembly support and having cross-compiling working again, I had to change several aspects. So what we do, for example, is introduce a new WebAssembly cross-compiling target. So we have like WebM32, M-scripten, and WASI. For M-scripten, I'll introduce the idea of different targets or flavors, because for one, we're going to target browsers, but for running the tests, we also wanted to have raw file system access from Node. So there are different ways and targets to compile Python. I'll tell you an option to specify and use a built Python interpreter. So in order to cross-compile, we first have to compile a Python interpreter for the current platform and then use that to bootstrap the freezing of the import lip and the deep frozen files. Also, running setup and detecting features is kind of awkward. It doesn't work properly. So we replaced the setup pie with additional checks in Configure and had the building of shared extension models also moved to the make file. This is not completely done in 3.11, but probably done for 3.12, because we also wanted to get rid of setup pie and distitiles in the core. There are also improvements for Config Cache to just speed up development and some fixes for VPath and other tree builds. So we can use the same checkout to build both the built Python interpreter and the final website builds. While we're working on that, we were also collaborating with the PyOdit team. The PyOdit is an existing working stable distribution of Python for the web browser. They have everything figured out, but they also had to contribute and keep lots of patches. They have like a dozen downstream patches to work around the same problems we're having. And slowly we're migrated and upstreamed several of these patches into Cpython or replaced them by better efforts, like instead of having the hackish PyConfig H patches used an auto-confeature called config-site. Next thing, when we had everything like working more or less, we wanted to make sure that our tests were passing. And with that, I used Node with raw false system access because I couldn't figure out how to run the test in the browser and with Node it was more akin to things that do normally running things on the comment line. So for each other failing tests or crashing tests, and they were also failing crashing tests, I had to check is this caused by missing or unsupported API. There's some wrong assumption in the test, maybe the bug in Python, maybe the bug in M-scripten, or there were even some known bugs in MuscleLib C. Some of the unsupported or unavailable features are like starting a new process because browsers are not there to sandbox and you can't just run a new process from a browser that will be insecure. So for all tests, they're using fork, exec or other features related to processes, added markers and decorators to skip these tests. But we also used sub-processes for our internal test system. So regression tests in Python were using sub-process for isolation and for running tests in parallel. For that, Ethan implemented a host runner so he can use the buildPython operator to drive the test system that would then spawn new Node.js processes for every test case. P-threads are not supported unless you use p-threads. So we need to add regular and skip tests. Sockets, signals and other APIs just weren't available because they're not implemented in the browser for good reasons. There are also some invalid assumptions that no longer hold true for M-scripten, like tests assume if they're running with effective user ID 0, so root. The test will also have capsis admin to have additional privileges and do think that normal user can't do in the system. Or that we can read arg value 0. So read the WebAssembly file itself. It is not accessible. Having UTF-8, non-UTF-8 files or inaccessible files also not supported by M-scripten or calling fstat on PyFolk descriptors. So the interesting bugs for the most annoying bug are until you had this runtime error from Node complaining about a function signature mismatch while the interpreter was shut down, so on PyFarmless X. This happened because one of the test models had like an invalid function signature, so it didn't accept one of the arguments. By default, if you free a model, you get a reference to the model as you can do any additional things on the model, freeing the model. But the zone info implementation just accepted no argument, so just void. This is normally not a problem for ABIs like Linux or Windows, because missing arguments or additional arguments just passed on registers or on the stack and just ignored by the function. But WebAssembly has a much more stricter call, so the call indirect call in WebAssembly has strict checks and the function signature mismatches is fails and crashes. I also ran an interesting bugs in M-scripten and also the way how to fix or address this bugs was a very interesting approach because I had to rewrite tests or implement the reproducer in C code and the fix is usually involved modifying a JavaScript layer that looks a bit like syscall interceptor in kernel code, interesting. So here's a list of bugs I'm going through, all the bugs I found, I'll put the slides up, you can follow any of the bugs if you're interested yourself. Also contributed several improvements to M-scripten, like having SQLite port for an M-scripten build environment, several fixes for WESM 64, and since beginning of this month, so September, we have all Python tests passing on WESM 642 and several other fixes. And by April 2022, we finally got all tests passing. And you see here, we're still skipping like 92 tests, it's a mostly network related test because networking doesn't work like in normal environments here, because browsers are also tightly secured at sandboxed, so you can't open raw TCP sockets. And this is unmodified C-Python 3.11 source codes, so very cool. At this point, Brad and I were considering to move the WebAssembly M-scripten to tier 3. This is a new concept we also introduced in this year, different level of support for environments like CPU architectures and operating systems. It's a bit more like the Rust concept of tier 1, 2, 3 for target platforms. For that, we need to have stable build bot, that's our CI system. Microsoft and Ralph, thank you for that, contributed a virtual machine where I installed build bot and the SDKs. The steering console also wanted to have end user documentation just to explain to end users which features are missing on M-scripten. I implemented core developer documentation to give core developers more details how the platform works and how they can compile and debug problems. Also implemented things like container images with the SDKs and another host hosted by Microsoft, the pre-installed SDKs just to test things. Finally, a new automation script which made it very, very simple to compile Python. So if you run this script in main or in 3.11.1, it's not going to be in 3.11.0. It will first tell you how to install the SDKs and give you some tips and point to the right documentation. And then if everything installed, it will configure and compile a build Python for the browser, run a local web server and then open the right files in your browser and just give you a prompt. And this also implemented for other targets like M-scripten with Node or Wasi. And that thing I've currently ran like on my own, like unofficial builds and also smoke tests for M-scripten SDK, latest version, tip-off, tree upstream and for Wasi, with different version of the weather time. So speaking of Wasi or WebAssembly system interface, after I had M-scripten working, that helped me to look into WebAssembly system interface, Wasi. It turns to be that most of my work for M-scripten, although prepared, Python code, there are still several other things that were missing, like lots of features from the socket API when implemented. There's no pthread and no pthread stubs. Well, M-scripten provides stubs for pthread APIs. No user API, no dub, just call and some other descriptions. Thankfully, SignalStore Labs has written an additional layer library called Wasix, which provides stubs for most of these APIs. And like with M-scripten, I also ran into problems and bugs with the Wadi SDK and wasn't timed for development. You can, some links, you will have to follow the map. After I started to understand how Wasix works and how Wasix works, I came to the conclusion that Wasix helped us a lot to bootstrap and stop the Wasi support. But Wasix had some downside. All the missing functions were replaced by stubs that returned an error. Well, Python developed would usually check if a function exists and then do something. So having found that error, they're present, but error out, are not very user friendly. So I wrote my own threading stubs and replaced all the missing functions with additional autoconf checks and if-deaths. So they are the BSD socket APIs, the socket net database APIs, like host lookups, wait pit, dub and missing constants. So dub was especially tricky because we required dub in one place and the Python parser for error reporting, but I was able to replace that with another function called fopen-cookie. Because we only dub because we convert a file descriptor to a file handle. And when we close the file handle, we don't want to close the file descriptor. So from future important wasm, so what holds the future of Python on WebAssembly? So there are different things that are going on. The first person who actually adopted my Cpython upstream work was Tre. He's running a pastebin where you can just copy and paste Python code and then have the code run on your system. Well, that's cool. And this is something that we want to include in the future in the Cpython documentation. So they have executable documentation examples in the Python world, but what else? So currently the system is structured and how envisioned they will work in the future is on the very low level, we will have basic support for Wasi and M script in Cpython. But since we lack a good understanding and also the resource in the core developer team, lots of additional work will be provided by PyOdite. PyLite will have the installer, will have packages provided, will have a glue layer to the JavaScript API. Now talk about that. There will be efforts like running Jupyter Notebook, like PyScript, PyGain, NumPy, other things. Well, for Wasi, we are not sure yet because we're very new and there is no production for Python and Wasi. Because there's still lots of things to do. So for example, we have not figured out how to do proper deployment and distribution of Python on Wasi. I've been playing around with Visor and Wasi VFS to create single file distributions. Soccer support does not work yet correctly. Also facing some issues with wasn't time. I have not had the time to test other wasn't run times, except wasn't time. And we're also missing popular Python extensions that rely on third party libraries. One other thing that I hope that we're presently may help us in the future to get out of the Python binary extension hell. So if you have Python extensions with binary code, like C code, Fortran code, C++ code, whatever, they have to be compiled for a specific combination of CPU platforming Python version. But maybe in the future, we could actually just compile it to WebAssembly, have a WebAssembly runtime embedded in Python as an extension, and then only have one file to distribute. There are things from M-scripten and browsers that may help us to run Python on these platforms. For example, M-scripten doesn't have a stable ABI. For PyOdiet, if they've distributed Python and extensions, they have to make sure that every extension is compiled with the same version, otherwise it will just crash or fail. Debank is also tricky, especially for core developers who like C-hackers and they use like GDB or other low-level debuggers. That doesn't work good at the moment. C, C++, DevTools, and Chrome, they don't give the same experience and the same readable information. Compile time checks for this involved function point like CASC or function mismatch would also help us a lot. There's some effort calling Chrome to improve at least error reporting here. About the SDK, the same problem. There is an option to run wasn't time to provide Dwarf debux symbol that features currently also broken. Dynamic linking would help us a lot to distribute and add more Python extensions. Some tooling like M-builders or the M-script import system to create distributions for extensions like ZLib, VZip2 would help us too. Maybe having steps for p-thread and other missing features in YSCK may be helpful, but not just that. We also want to help the community. I think one thing that Python could help you really well is use Python as smoke tests because Python is very, very good to find compiler bugs, even kernel crashes and kernel bugs. Most recently, we found a bug in QMO on PPC-64. Data could help you, but in general, I think that Python on WebAssembly will provide lots of opportunities, but there's still lots of work to do, that Python loves WebAssembly. Thank you very much for listening and I hope to see you in the chat. I hope that we'll be able to attend talk remotely and answer your questions in the chat.