Okay so we are here at the trailhead and it's called Three Falls Trail because it has three waterfalls. The first one is Bering Falls, St. Mary Falls and Virginia Falls. This is where we are at Sunpoint. We walk all the way here by the St. Mary Lake. We get to Mary Falls which is 0.6 miles and then continue to St. Mary Falls 2.1 miles and 2.8 miles to Virginia Falls and there is a possibility to continue to Reynolds Creek Crampground which is 3 miles all the way here. So now because we were looking for something short and easy I think we will go all the way here to Virginia Falls. Let's see. Hopefully it won't rain more than it is right now and we'll make it there and enjoy the beautiful falls. Trail profile. Sunpoint Trailhead is at 4,670 feet, Bering Falls 4,572 St. Mary Falls at 4,560 feet and then Virginia Falls all the way to 4,802 feet. Ready? Yeah we just got to be warm today is all, which everybody else is going to be less. But we are just making sure we're figuring out what it takes to keep us warm. Not worried about finishing it's just you brought all this stuff you probably use it. It's just the rain and cold, but other than that the trail profile is not dead, so here we go. This is another sign with the mileage for every point. It seems like they a low horseback riding on this trail and no animals. And you can't ride your dog. You can't ride your bicycle or motorcycle. Alright, let's get going. The car is making noise. That's not the wild goose island in front of us right? Down the shoreline. You do me a favor. Can I just put this in your bag? Yes. Alright, you have the car keys. Oh no, there's GoPro stuff in there. Not risking it. Can you put this in my bag? The all the way top top, well not the top, it's like the third zipper from the top. I put it inside. Which one? Isn't this snack bag? The one that I found next to me. Okay. Wonderful. That's good enough. Got a photo shoot going on here. Hello. We're hoping to find some too. We've been like looking. All these campsites are closed because there's too much can. Morning. This is the San Mary Lake. I think the number of lakes I saw in this trail is more than the number of lakes I've seen throughout my life. All colors are coming out now. I was really expecting it to be raining more actually. It's raining more I feel like it has to be a little cooler. Hi baby. I mean hello people. I'm not mistaken. This area it seems like from the way the trees look. It was probably impacted by the wildfire that happened a few years ago. It really seems like it. I think there is a little bridge that we're going to be crossing here. Otherwise it's the first fold. Let's see. Can you come to me? If you catch a little marmot over here, he's right in the middle of the frame. And Habiba's down here doing her photographer thing. Yeah. So I found a little back way up to the top of the waterfall.  And then I shouted down to Habiba. And this is the only really slick part of this adventure right here. The water tube came off. She threw it up. But I got to figure out how to get by down this. But either way, I got to figure out how to get to my tube.  Yeah, you can just leave your bag down there I guess. You going to use one? Okay. Oh you're going to use it to grab the... There you go. Okay. I'm going to go see if there's a good view and then I'll come down. This is what I get for all my work. Okay. I have to come with a strategy too. I hope I don't die.  This is what happens when you hike off trail. Oh my God. I'm nervous now. All right. Hey, I want to show you guys the technique. I want to show you the first time I wore this. Oh no. I like this thing a lot. I got all my money. But anyway, Sue, if he fell down, he would slide all the way. Oh, your bag is getting... And then he would actually... I put it there on purpose. Oh, okay. So that it would stop you from falling because there is a branch there and it can hurt. Okay. More adventuring. Dirty. Definitely taking a shower when we get back now. Yes, baby. Okay, so we got to that first fall and I thought that the trail will continue the same way, but it doesn't seem like it. So we have to try to trace our way back to the sign and I think we're taking the other trail that goes to Saipas. Yeah, so here's the sign. What we did, we went to St. Mary Falls. Junction. Junction. This is where we were. But it says bit... No, no, no. But we went to Bering Falls. Bering Falls. So how come it says St. Mary Falls junction and then site trail junction 2.6 miles? I think we might really supposed to continue trekking through those woods there. Hmm. Because St. Mary Falls is the one after Bering Falls and if it says 1.2 miles then it should be that way. I'm confused, yeah. I'm also confused. This sign says Sunderf Gorge, Sea of Pass, Beacon Pass, trail junction. Sunderf Gorge, 0.3 that way. No, but then the other one, the last falls, Virginia Falls, was supposed to be like 2.8 or something, 3 miles? Yeah, I thought we were really going to get ourselves in for a bit of a walk. I feel silly, guys, that we missed the trail taking to St. Mary Falls. Check your zipper in the back of your bag. Maybe the one at the bottom here. Have a good day. You too, take care. Nope, I don't feel one. That's fine. Yeah, so quick dock here. Beautiful. Beautiful. Let's go. Huh? Hair tie. Anyone need one? So pretty. Now we're in the video too. This section feels silly that we missed the trail. It's not raining as much as we thought it would. But we're comfortable. I'm personally comfortable right now with the one layer and rain jacket. And I think Alex behind me stopped to take off his jacket because it's getting a little warm. Yeah, all colors are popping up and it makes this forest so beautiful too. I'm not taking any photos on the way up actually just because the camera don't have a hard shell to protect it from the rain and I didn't bring my rain poncho which I usually use to keep the camera protected. So I'm only taking videos with the GoPro but the plan is on the way down so we'll probably make a quick stop into viewpoints that I found intriguing. Take a couple of photos and take it from there. Virginia Falls. Sorry I have to clean these guys. Oh, okay. St. Mary Falls, 0.9 miles. Virginia Falls, 1.6 miles. Grooving. What is this trail up? Let's see. St. Mary Falls, trailhead, parking area. Oh. Okay, that's the... This sign goes up, all the way up to the parking lot for St. Mary Falls, trailhead. We didn't know there was one of that. No, we could have parked our car there. Red Eagle Lake campgrounds here. Yeah, just so that everyone knows that Alex is looking forward to the Burger King at the end of the trail. Huh? Okay. Exactly. I'm number one. I know. I'm aware of the state of affairs. The rules of engagement and the happiness of our relationship. You are pound number one. Yeah, whiteberries, my favorite berries. White like your boyfriend, exactly. So another fall, actually, besides St. Mary Falls, there's another little one. And so Alex is inquiring to make sure that we didn't pass it, but I saw a couple of people coming towards me. So I'm imagining that Virginia Falls are up ahead. I have to keep cleaning the camera because it's raining. Okay, just turning my bear bell. This sounds a little quiet in this section. I want to make sure I'm not scaring any bear in a wide life. Okay, stairs here. What did they say? Maybe that we have time to turn back. Huh? It's time to go back. Really? So there's one, see there's one more stop. Keep going past it though and then you'll get to where you're going. To Virginia Falls? So you know that was a little stop down there, but I think this is the first stop. I think Virginia Falls is a bit further. Okey-dokey, let's go. Okay, let's see if this is the end for another intersection. Two miles. Next point, two miles. Okay, the last stretch. Hey, what's the matter? I love you. I love to bridge here.  Alright guys, we're walking over. We're going to go stand right in front of the falls. Whoa, boy. You can hear them. We made it to Virginia Falls. Come on. Okay, let's follow us back over this way. We'll let some other people snap some photos as well. You can see way down there. A little bit of blockage. Some better pictures while we're up there too. So we just came down from the Virginia Falls. We got a Yanni of photography over here doing her thing. We're going to get some of the water coming down. I guess this is some side little stream that came. Oh, I did that.  There you go. Okay. Let me see the little chocolate chocolates. Anyway, we're going to go back down somewhere. So we found the mama deer and her two little babies. And I just grabbed my phone because we didn't want to make a lot of noise. Can you see them? Yeah. They're all the way down. Alex is taking pictures. And I took a couple of videos on my phone actually. I'm wondering if the other one was behind us. Oh my God, it's here. Come, come, come to me. I hope you guys saw that. That was neat. It was coming to us, you know. So I guess when we see them coming, don't move much. I see her butt. I was taking a video of it for a while. Then I realized I was taking a video of the deer's butt. Okay, I see the little one. Let me see if I'm going to go up here. Could I go closer? I don't know. That's their mama. And there are two other babies. I'm taking a video on my phone as well just in case it's not much clear. Say what? What? Alright guys, we just wrapped up coming back. I hope he was checking the photos.  Yeah, I had to inspect. I like that 50-50. 50-50. But I'm thinking on our way out, we're taking the same picture. Oh, bug right up the nostrils. So we're going to go check out this sun point. It's like one-tenth of a mile, the opposite way of the rest of the trail from the parking lot. So we figured we'd just end by checking that out before we make our way back around to our area of the park. My bed roll deflated last night. My pillow refused to stay inflated. I wasn't sleeping as excitedly as I wanted to in all honesty. The seat-to-summit pillow hadn't done me wrong yet, but the seat-to-summit bed roll looks like it might not have been as reliable as I wanted. It was okay, it was thick. Alright, we're hoping this is a sun point. We'll take us up there, baby, to Pride Rock. Alright. Our hike is coming to an end. It was very beautiful and we got to enjoy three beautiful waterfalls. And we are so happy to be in this park. The parking lot is emptier now. Yup. Anyway. Only our car and another one. Yeah. You've got our car and some... Probably the car of the guy who just took our picture. We hope that you enjoyed this video and we thank you very much for watching your trekking pals Habiba and Alex, and we'll see you soon on another adventure.


Oedden nhw'n gychwyn ni ddweud o gymryd o'r gyfrannu chi'n cytuno coreisio newydd ym ni, ac o unrhyw wedi'u cy segregoedol. Byddwn ni wedi ddesgrifennu hynny fel gyflawni gwasanaethol ni'n gweithio'r gwestiyniadau nifer, ac rwy'n cael iechyd o'r holl fawr i cofio'i'r ddweud o'r holl yma. We'r hebion a chwell i'n gwneud yw gwneud hynny, ond rwy'n cael ei wneud ei wedi'u cyhoedd Spieler, ond rwy'n cael ei eistedd i'n gweithio'n gyflawni. Can I invite the Cabinet Secretary therefore to get us under way by making some opening remarks? When I became Education Secretary in December 2009, I had my own questions about whether we were going to succeed with such a hugely ambitious programme. Yet all the time I have seen throughout Scotland, in every school I've visited, what is the tremendous enthusiasm for the new curriculum and the work that's gone into making it happen, including work by my own predecessor Fiona Hyslop. It has provided us with the best possible long-term plan for how we do Education Scotland, and that was the whole point of CFE. That was what was envisaged in 2003 by this committee, and it's a process, not an event. It's been going on for a considerable period of time and it will continue to go on, and we'll learn as we go forward. Firstly, from a principal physics teacher, why not postpone the cessation of the old advanced tyre for a year so that pupils who are following the old tyre will have a continuous experience? The new CFE advanced tyre is significantly different. Pupils who follow the old tyre will be disadvantaged. How would you respond to that teacher? I've been very open to discussion of both higher and advanced, higher and flexibility in these circumstances. We offered flexibility in the higher as required by schools in circumstances which they could define, and that was very positive indeed. In terms of advanced higher, I think it is less likely in this process that that will be a major pressure, but if any school found itself in an impossible situation, we'd be listening, as we're always listening to these circumstances. We don't think that there's a need for dual running of the advanced higher. We've taken quite a lot of pressure out of the system with the much more flexible view on the higher. The advanced higher is pretty intense no matter which curriculum you follow. In those circumstances, I think it's unlikely that there would be the need for a final change in that regard, but I'm always willing to have conversations. I've spent much time sitting down and talking to teachers about these issues and will continue to do so. Thank you for your commitment to listening. Teachers are raising the concerns about the possible disadvantage it could bring to pupils. Another physics teacher has said, I greatly appreciate the extra inset days allocated to prepare resources for implementation of the new curriculum. However, too many of the resources that I produced on these days are now redundant as the SQA has continuously changed the guidelines. I attended a meeting in February where the SQA assured the community of physics teachers that there would be no changes to the guidelines after April 2014. They stated that changes may be made after the 2015 exam date. This has not been the case across the range of levels. Changes have been made across the whole of the secondary curriculum over the recent months, with the most recent being published at the end of September 2014. This physics teacher has asked, can the government intervene to prevent the SQA making further changes to the curriculum or that, when changes are made, they are not for the current teaching session but for future sessions? I think that if you think about it for a moment, there is a good reason for that. There are two good reasons. One is that we do not set curricula. I do not think that you would want me, Mr Bibby, to interfere in the physics, what is taught in the physics classroom. The reality of the situation here is that the SQA has made changes where those changes have been either requested by or seem to be essential because of the views of classroom teachers themselves. The SQA is not spending time dreaming up ways in which it can change things, but it is trying to be. Indeed, this is a request of teachers. It is a request of the IS. It is trying to be as responsive as it can be. I think to some extent the problems that some teachers experienced in the early part of this year were because it was being too responsive from time to time. It was trying to listen to every single point that was put. I do agree that there is a point at which we say, no, that is it. It is done. It is set. That is what we are going to go ahead with. I know the SQA well. I know they are trying to be responsive. I think it is much better to allow them to be responsive. Certainly, when teachers think that there is too much change, they need to say so directly to the SQA. One of the purposes of all these meetings that have been held is to give the opportunity for teachers to say directly to the SQA, hang on a minute. We think this and we think that. So, they should take those opportunities. Another question that has been raised by science teachers. Why do people who have not been in a classroom for years think that subjects such as biology and physics can be taught at N4 and N5 in the same classroom? They are totally different courses. What would you say to that teacher? Well, I think a teacher who finds it difficult to teach in those circumstances should first of all talk to their head of department and then to their head teacher. There may be reasons why that is necessary in that school for a period of time. I am not likely to know those reasons in every single classroom. There may be opportunities for mixing those classes at certain times. That is what the teacher needs to discuss with the head of department, the head teacher, with the parents of the pupils involved and with the pupils themselves. Participation of pupils and deciding on their own learning is extremely important. That is how decisions will be reached. There is a sort of parallel in something else which you may come up later on today, which is the number of subjects that are taken in a school. One of the most interesting discussions I have had with this is a group of pupils at Rossi Academy, my own constituency, who felt that taking 8 was too many and wanted a change to take place and explain why that change should take place. Young people taking national 4 and national 5 should be influencing their own learning, and that is a collaborative and collective decision within a school. Is there not the case that has been raised by many of the submissions that we have had that I can understand the depth of learning? I appreciate all that. It is more about the breadth of opportunities in terms of career and the options for career. Moving from 8 subjects down to 5 or 6, could that possibly be limiting careers? If I could perhaps tie that in with Neil Bibby, he mentioned quite a bit on physics. In our comments from Facebook and Twitter, the physics teachers had quite a lot to say, but they did say that sciences and physics in particular seems to have been made more difficult. What I am asking is the reduction in the number of subjects. Does that limit options? Given that physics and other science subjects seem to have been particularly critical of CFE this year, is that likely to reduce the numbers taking those subjects at schools or at university at a time where I know that we are all committed to having more women coming into the STEM subjects? I think it is a good question. I think that the answer cannot be given for one cohort alone. There will be many different opportunities. Generally, I do not think that it reduces opportunity. I do not think that it reduces choice. I think that a school will encourage the widest possible choice and will keep those choices open for a long period of time. I think that is probably what the system does. It would be important that we show you in more depth perhaps some of the examples that we used in the leaflet with the parent forum last year, because they showed a variety of different examples of career pathways which were different and were chosen differently in different circumstances. For example, somebody who was studying for a variety of N4s and N5s, there are some learning pathways, a variety of learning pathways that come out of that. They could leave school for work, do a modern apprenticeship, complete an HNC as part of a modern apprenticeship at college and then perhaps matriculate into university. So there are opportunities there. There is an opportunity to bypass N5s in which case the issue does not arise. There is an earlier selection with a number of selections being made for hires and that trajectory being taken. There is the N4 and N5 route for young people who will then want to make a decision as a result of that of whether they do more subjects at a lower level or whether they take a number of subjects at a higher level, possibly even at the advanced higher level. So I do not think there is a reduction in opportunity and we would keep ourselves alive to that because pathways should be kept wide open for as long as possible. In terms of science and physics, I mean, I think there has been, of all the subjects, I think physics is the one that's expressed the most concern over the last two years. I mean, I've met a number of physics teachers so has Alan. I can understand that, the particular nature of the subject perhaps leads to that. But we are alive to the fact that we need to continue to offer the sciences as broadly as possible and we will continue to do that. I think we should always be aware that we need young people to be scientists, to be engineers, to be physicists. I opened a new Merse Academy on Friday and I met two inspirational young people in their sixth year, both of whom were going to study physics at university. When I told them about it, it was the influence of their physics teacher, almost more than anything else that created those circumstances. Whoever the physics teachers at Merse Academy should take a bow or physics teachers for that. So we need to encourage that broadly. We also need to encourage, as you will know, the languages options. And I think curriculum for excellence has been helpful in allowing a broader choice of languages plus the one plus two. So I'm mindful of the importance of your question. I think we should remain mindful that we don't limit opportunities. But I think if we could share with you some of the pathways information, I think you would see that those options are remaining open. That's very helpful. I'm pleased to hear that you are mindful in your keeping an eye on the sciences because they do seem to have been very vocal in the past year. Just a very short question that you did say to Gordon MacDonald that we have to trust teachers to teach. One of the questions and comments through Facebook and Twitter says, when will the government stop meddling and allow teachers to teach? Have we got the right balance here? I don't think we've ever had a system that encourages teachers to take responsibility for their own teaching greater than the system we've got. We have a very clear system in Scotland now. CFE encourages teachers to teach essentially in their way to their full professionalism. And we have a very clear registration system, which is absolutely clear. The standards for registration are clear and transparent. I think that frees teachers absolutely. There's always a balance to be struck. I believe that we're freeing teachers in such a way, but you've also heard parallel complaints about not supporting teachers enough. So there always will be a balance, but I am a strong advocate, as you know, of freeing teachers to teach and of not interfering in that role, and I think we've got the balance about right. A teacher contacted us through Facebook and Twitter. The implementation of the new curriculum has been done at a time when local authority budgets have been cut. The knock-on effect has reduced staff training and resources in the classroom for the people that are delivering the curriculum. I along with many of my colleagues spend much of our own money funding some of the gaps. There are also cases of tri-level teaching as the staff are not available to run national free, four, five, or national five in higher courses separately. Is the government planning on making available extra resources to allow teachers to deliver the described curriculum? Well, the reduction in local authority education budgets between 11.12 to 12.13 was 0.8%. I fight very hard to maintain local authority education budgets, but it is within the context of enormous financial pressure on the Scottish budget settlement, and that remains the case. I have repeatedly said that there is always a difficulty and bound to be difficulty in introducing major reform at a time of falling resources, but we have done, I think, remarkably well with the resource, and that means every teacher has done remarkably well with the resource, and of course I would welcome an opportunity to increase that resource. It is not an opportunity that will now be available through full control of the Scottish financial resources, unfortunately, as would have happened with independence, but we need to make sure that we have stronger financial control in Scotland so that we can make these decisions. And of course we wouldn't be assisted if local authorities reduced educational expenditure.


Mill does pull the lever. The trolley goes off the left-hand track, killing the one and sparing the five. Mill pulls the lever because it has the least worst consequences. The death of one is gruesome to be sure. The death of five is even worse. So here's the question. Do you agree with Mill?


Welcome back to Geeks are sexy. I'm Jason Laduke filling in for Michelle Davis on the fourth Thursday of every month talking about business And how to be successful here in Las Vegas? And of course one of the things we always talk about is business is great making money is great We love that here But we also want to use our businesses to help make our communities a better place and my next guest is sunny Shabro from the Douglas J. Green Memorial Foundation. Did I get it all right? You got it All right, great sunny as a gold star mom and founder of the the foundation the Douglas J. Green Memorial Foundation And it's a volunteer nonprofit dedicated providing comfort and support to service members and their families And we're gonna talk about the great things you do for our folks up at Nellis and our garden reserve guys and even the Families and spouses in the area, but before we get into that You named this foundation for your son Doug and I want to I want you to tell us about Doug and How we got to having this foundation today sure well Again, my name is Sunday I'm a gold star mom and not everybody out there knows what that is but it's someone that if you have a son or daughter who's been killed in action and Unfortunately, that's what happened to my son Doug in August 28th 2011 Right after he was killed. I decided to start a non-profit organization after him and I thought there was no better way to honor him was to do something that he loved and What he loved was getting care packages sent to him on each tour that he was on and Every time he was on tour. He would say mom. I need this. I need that I need this and I need that and I would have No problem sending him and his other brothers and sisters that he was deployed with as well so I was sending him up to 10 to 15 boxes a week and he loved them so much and so starting the non-profit and Actually taking care of the other men and women that are still deployed. It's no better way to honor him and so his actually his anniversary of Being killed in action is this month. It's actually next week August 28th And so I just enjoy doing it and the men and women that are over there right now deploy especially from this area Appreciate it so much and I can tell you from my time in Iraq That coming in and having a care package in my little area, you know Even if it wasn't from a family member, but the things that that your organization other poor organizations put together having something to open up and having a couple of snacks and Just you know some some fun things from back home when there's a magazine or a book or something or a DVD to watch is I mean it means so much to us when we're over there It's so true and I was telling Jason as well that not only are they getting their favorite snacks But when their name is called and they go up and they get that package and they open it up And not only is it what they want, but it represents home It represents we're thinking about them in the USA that we haven't forgotten about them We know they're over there and that right there means so much to them And so that's another reason why it's important to Keep sending them until the last one comes home, which I don't think it's going to be a very long time That's okay. We'll keep sending them exactly and right now. I'm sending them everywhere from Iraq Afghanistan Syria Africa Romania on ships on the Marines on ships So it's just it's just never ending in there over there fighting ISIS and it's again It's so important to know that we're thinking about them and of course giving them what they want the magical munchies I call it. Yeah, well, thank you so much. Thank you for doing that And so that is primarily what the foundation does is put into these care packages so tell us a little about how you do that throughout the year how you bring to the community to do this and Especially how you're supporting our deployed folks out of Nellis Air Force base because Nellis is a good-sized base But it's not a huge Air Force base, but we have 300 people currently deployed out of Nellis right now So it's a rotation of 300 people 300 men and women I should say and can't forget about the women because it's almost half women as well and What 300 will go over there overseas either Iraq Afghanistan and then when those 300 come back It's a rotation the next 300 they go and they're deployed as well. So I'm I make sure that I send them what they want and When they come back, I have events mostly during Christmas Thanksgiving Memorial Day and In a September as well and a lot of them come out and help us Package the care packages and it's so great because not just the men and women from Nellis that come out and help but we have people come from all over the Las Vegas Valley and When we have events People come and call and they email me and they ask if they can volunteer and they all come out like an hour before to Tape the boxes because I use the priority boxes. So they tape them.  I think to do community service. So it's really a family affair and Always afterwards, I'll get an email or they'll call me and they'll say it was so much fun When are you having the next one? So I encourage Everybody to come on out across the valley and help and it's just a great rewarding experience to to give back And to keep that awareness out there with the community that there's still so many men and women that are deployed And that they they want the support. They need the support and I like to keep that out there And so the care package is wonderful Will you do more for the community and and you told me a wonderful story when we sat down for coffee the other day About a young woman in the post office, right? And can you tell us her story and the kinds of things you're trying to do to help these young these young women or Or even young men who are military spouse in the community.  He's deployed. He's a Marine. He's on a ship And I said well first of all you're using the wrong kind of box and she laughed and I told her what I did I told her I had a nonprofit and what we do is send care packages and I showed her the right box I showed her how to fill out the custom form and I took that box and we actually pay for it because that's what We do that's what my foundation does is we pay for shipping and She was just Dumbfounded she just couldn't believe it. So we went up there We paid for her box and I said anytime your husband wants anything. Please call me. We'll send it and you know She felt you know alone, you know in this community and I want people to know that they're not alone If they have a husband spouse brother sister friend deployed to reach out to me and I'll make sure that they can come to our events and customize their own package for their loved one and That's what we like to do and another reason it's expensive for some people and it can add up If you want to send your loved one or a friend a care package even three a week That could add up to over you know over a hundred dollars a week So that's what we like to step in and really help the community and know that they're not alone If they have someone deployed that we're there to talk to and support them as well And one of the reasons the story is so compelling is this a young woman who grew up here. She did but her Husband when he's not deployed is stationed somewhere else. And so she's living here with her family And so she she doesn't have the squadron or the the unit back at the home base To help her out with those things and that's that's the way that your organization is really helping fill in some of the gaps Nellis is a great job You know all of our support organizations do a great job But this is this is one more way you're really helping out And I know you get a lot of support when you do your care package events But you need help throughout the year to do another things How can someone who wants to get involved in addition to coming and helping pack up care packages and ship care packages How can how can someone who wants to get involved and stay involved be part of the organization? Well to volunteer sure they can come on out and help me throughout the year if they'd like to volunteer if they want to Give back They can reach me on our website the Douglas J. Green Memorial Foundation and leave me a message We welcome volunteers all year long to help us do Correspondence to work in the storage to organize all the munchies because we like to store a lot of munchies because we have to Be ready for our events, but yeah, we always welcome all the volunteers all year long and that's always welcome all right well, that's great and You know so so coming out help the Douglas J. Green Memorial Foundation sunny Tell everyone how they can get a hold of you and the foundation and if you have any events coming up sure Next few weeks or few months. Absolutely. Well, we're partying up with and spirata and that's gonna be for president's day And we always do you want to November? Going towards the holidays, but if anybody would like to donate to our cause meaning that the government Yes, does not pay for care packages So we strictly pay 100% of the profits goes to the postage So if anyone would like to donate we're 501c3 we're right off they can go on and message me Or if you have a company and you want to Have a non-profit to donate to you over the holidays or work with us We can partner up with a company and we can do all sorts of great things. So yeah, they can go on www.douglasjgreen.org or they can find us on Facebook as well That's great. Well, thank you for Doug's service. Thank you for your service and all the things you're doing for this community as well So thank you He's a veteran so thank you for his service and sacrifice Yeah, so we are gonna have you right back for our panel discussion. Just stay right there. Don't move We'll be back in just a few minutes remembering Chris and Greg back.


Hello, welcome everyone. So I think we can start right now. So this is the second deep type of the create team. And we are going to talk about the diffs and commenting on diffs. The first one was with Tiago. It was great. And we have the links on the issue on the create team. So let's get started. So today we're going to have a look at what exactly a Git diff is in a level of Git itself, just a brief overview. Where do we present diffs on GitLab itself, a quick demo introduction and overview of how it's stored, how do we fetch and present that both on GitLab and GitLab itself. So we are going to have a look on the standard comparison view, the merge request, diffs on merge request, and this four comments on merge request or commits itself. So a little bit what we are going to do today, we are going to have a look on the demo workflows, the tables that we use to store the diffs, the caching layers in a brief code dive. We don't have any free to ask any question any time. There's no issue to interrupt me, but we are going to have a question Q&A in the end. So basically, what exactly Git diff is. So Git diff is a Git function that takes two data sets and outputs the difference between those. So we can pass a commits range files. And it's interesting because this structure shows that we have a commit and it points to a tree. So let's say we have a readme that points to a blob and we have a lib folder that points to another tree. So that's basically how the diff is structured, the object on Git. So we can use these shards on Git diff itself. So it's interesting because it's a very powerful function and tool. And we have most of the functionalities, but we don't have everything. So it's interesting to keep in mind that we use the most famous part of the Git diff on Git lab itself by the UI and wrapping the client, but we don't have everything. So on the left, basically what the Git diff is on the terminal, a simple difference between files. In this case, we show the header here, the hunks that we can call Git diff hunks that represent the headers. And on the right side, how we present that on Git lab UI. So we can see that it's a little bit improved. So let's have a quick demo here. I'll quickly show. So this is the repo compare. I'm not seeing the chat right now, so let me just check if there's any. Okay, there's nothing. So we have the repo compare here. So we can basically what we can do here is selecting the source branch or a revision, a comment itself. And the target branch click compare and see basically what exactly Git diff does. We compare, but it's interesting to think that here we are not patching the database at all. So we don't have anything persistent here. We can't leave comments. We don't have a more requests. Obviously, we have just a few files being being showed the difference between those. We can actually view the blobs of the files here. So it's also nice. And we show that a button here that we already have the more requests for this difference. So we check that we have the source and target range. And more requests already created for this. So here's the the merge request UI, as probably you already know, we have the changes here. That's mostly the same thing of the comparison. But here we have a nice functionality of leaving comments anywhere. Exactly, because we can actually unfold the lines now here. It's a new feature. And we can leave comments here as well. And any comments, a comment that we leave here, we just track those here as well. So we also have this here. See if you think about this, this part of the code base is just a little bit of context, not the whole defile as we present here. So it's, we are going to just see a little bit of how it's happening behind the scenes. So let's go back here. All right, so let's start with the, let me move this here. Okay. So let's start with the workflow of the standard comparison view deeps compared to the other workflows it's a little bit simpler because we don't persist anything. We don't actually need to persist right now. So fetching, we just submit a request to Githy. There's an RPC that we use to fetch deeps that's common, actually use it almost everywhere. That's the commit diff RPC. We are going to take a look this on the end. And we send the limits and in the reference that we are going to diff. It's interesting to think about limiting because we don't, we can't just fetch everything because we can't handle everything possible. So imagine that we take the first revision of GitLab and the last revision of GitLab, let's say the master, we're going to have a huge amount of defiles. So we need to limit this somehow. So it's nice because before we are, we were limiting on the GitLab C code base itself. And we started moving these limitations to Githy. So that's the source. So it's, it's interesting to think that we are limiting the diff on the source itself. We are fetching then putting on memory and limiting on GitLab CE. So it's, it's better to have a service that already does this and it's going so it's faster. And for the presentation part, we on the GitLab C side we fetch those, those defiles as a string. If you think about this is the diff is basically a string. We put this on the defile in the high-level overview and we parse this string and the output of this is the define object. We are going to have a quick look what exactly the define object is and something to have in mind that we are not loading async on the comparison view. We are just loading everything that wants a plain, plain request, HTML request just once. That's because we, we are actually planning to, to move this forward. I think we have an issue for this. I'll just link when I have it. But we are thinking, probably thinking on loading those this async. So that's something that we already have for the merge request. So the merge request is to let's separate this on three parts, like storage, fetching and presentation, because we have storage and all. So there are two main tables that we have to have in mind when working with merge request tips. Those are the merge request tips and the merge request defiles. So in a high-level idea, the merge request is basically the version. So each push that we sent to a merge request, we create a new merge request def. And this merge request def points to merge request defiles. So if you think about it, every version will create, it creates all the merge request defiles. So that's interesting. At the same time that we have everything storage and we have the tracking of everything on the database and we don't have to go to Italy to fact this. There's a downside, because we, we just built a little bit of the database for doing this and we are planning to move this, this through to outside. So using object storage, for instance, we have an issue for this. So basically what I said before, I think there's a question. All right, Nick, just link it to each. We have the link here as well. So thanks. Oops. So basically the workflow is when a purchase receive it on the source branch, we create the merge request version that already said. So we have this class to basically create the merge request diffs and clear the cache, the highlighting cache. I will talk a little bit about why the cache did the highlighting, but we erase the cache here. Just a quick overview because we use Hooch, a Hooch gen. Imagine that the input is the base, the diff, the plain diff in the output is the HTML that we need to handle. So if you think that on the go, we need to do this every time a request comes in. Imagine that. Yeah, it's a really heavy process. And we started doing this for plain merge request diffs and after this for the comments diffs itself, but we are going to tell you later on. So as I said, we started thinking about the size of the tables that that are going way too high. And Nick's already working on on this issue that that's going to start the object storage and probably we are going to have external reference in the database. I still don't know. But let's let's see the merge request after Yeah, so the the fetching workflow basically instead of going to Githy itself we go to the database, we are going to have a quick look on the code dive after this but there's a class interesting to have a look. And we refresh the cache so the cache is written when we when we load the diffs itself because we we raise the cache after seven days so that's the the the expiration. So when we first load we just rewrite the cache as well. Part of the process also fetches the diff stats. And that's that part is interesting just a second. Now this part is interesting because we use it to parse the the actual string to get the additions and deletions and the file path we already know, but we had to parse the string. So I think this is a little bit boring because we have to load this on the the memory and parse everything that's CPU bound so it's not that good. So we left this job for RPC that we just request and under the hood we use the diff stats, the flag. So it does the job for us. It just returns the additions and deletions. It's nice. And there's another point that I showed that we can expand the diff and leave a comment. So we use the GitLab diff lines on folder to like inject because if you think about what the diff file is is basically a small part of the file. So if we expand this on the UI, we are requesting this for blobs. So just merging blob lines. And we have to re-merge this when we're handling. So the idea here is that if someone leaves the comment outside an expanded part, we have to merge this on the fly to have these lines from the blob itself. So the diff gets bigger because we are merging from the blob lines. So that's a kind of a hacky way but basically the only way to do that. So the presentation workflow, unlike the standard comparison view, we load those as spacing and we use the diff file entity and basically JSON. And if you think about the size that the diffs can get, we started seeing that a few diffs were getting way too big. So the JSON, actual JSON after processing everything and trying to load, we started seeing a few diffs that have eight megabytes. So more than that, sometimes. So we are thinking about strategies. So at first the easiest one would be just checking and making sure that we are using everything on the front end being serialized. Because sometimes we reuse a few serializers and sometimes we get more things that then we actually need. So that's CPU being wasted. And that's also, we have to do to actually download the whole JSON at the end. So it's not good. We need to be aware that we are actually using everything. And the second part, that's also interesting that that's an issue being linked here, that we are discussing in a smarter way to to handle the diffs. Today we first on the first load, we show the merge request widget. And we just to start loading the diffs. So it takes some time depending on the type on the size of the diffs, the diffs itself. So we started thinking, okay, so we can load at least the first part of the diff at least two or three defiles and sequentially batching batching the request for the next one. So when the user first loads the page, he can see at least something. So it will probably lead to a better UX. So there's some interesting discussion there if someone wants to take a look. So the caching layers, as we already talked a little bit. So the idea was that at the time that we created this this merge request defiles table. We had the mission to load the the merge request diffs after the fact that it was merged. So at the time we, I think we didn't have the keep around graphs. So we started losing some references. So we needed some some way to keep track of the diffs after the fact that it was merged. So we started persisting the merge request defiles. So as a side effect means we started seeing some performance improvement. So in the red side, we, as I said before, we were just doing on the flight the the processing of the merge, the, the highlighting using root. So as I said before, it's a slow test. So to make under a request. So we started caching the this part already is we are going to see a little bit on the on the code dive. So I think the last part is the discussions that if you think about what we present there. It's just a small amount of the deeps. And we are going to just see a little bit about this also as a storage fetching and presentation speeding. The first part of the most important columns that we have on notes. So it's the line code. That's basically the file path as a shot, and there's the old line in your line. So it's basically use it to link to the diff itself when we leave a note there, we can see that there's a link. And that's the, that's the, the, the link itself, the, the anchor that we use and position regional position and change position there that we are going to talk a little bit. The second table is the noted files. And if you think a little bit, we could be using the merge request defile because we already have all versions right. We have all versions of the merge request defiles on the database. But the problem is we started deleting after deleting the merge request defiles after the merge request was merged. Just keep them keeping the latest ones, the latest version just to show the diffs quicker, but we started deleting to avoid a little bit of boats on the database, but it wasn't enough. So we are working on this right now. So the main positions that we have are the original one, the position itself and the change position that we start as a serialized object that we can see down below here. So the original one, it presents the original state. So imagine leaving a comment on the diffs tab. So that's the object that we won't change. So that points to the original version. So let's say, so we use that on the discussion that if you think about that, the diff is not is never changed on the discussion that because that's the state that that it was at the time that you left the comments. The original position is the responsible for this position basically follows the merge request version, unless the line was changed the exact line that was left the comment was changed. And the change position tracks when the diff, the exact diff that the line that was commented was changed. So we, that's the that that's because the name change position. So we start exactly the, the, the point in time that we, we changed this. And that's that's what the user here to present this, this for instance version eight of the diff. So that links to the diff itself so we can see the difference between version. So this is an issue for actually presenting the difference that just linking. I think it has has the link out or just leave the link on the comments here. So, so, so basically the storage workflow I think that the main takeaway here is that we don't persist everything. We need the, the from the top most position of the diff, the actual string to the commented line. And you can ask why we need the, from the top to the, the, the comment, the, the commented line. That's because we need the header information and the header information normally stays in the top most position. So it just cuts the diff and persists this would be would be possible to just cut the context that we need to write the, the header on the string, but it would be a little bit more complex so we just cut everything that we need and persists right away and use that to parse and do the, the whole process that the red works for, for parsing the diff and creating diff lines that are already already explained a little bit. So when the diff is updated, a push is sent, we use the GitLab diff position tracer to just trace where exactly the position is to be on the next diff. So imagine that all push that's sent. We already have the comment there on the diff step, but we need to know where exactly the comment needs to be in the next, in the next version. So if the line, exactly line, the exact line that was commented was changed, it's updated so it won't go to the latest version. So if we can track the line that just changed the position, let's say it was, it was in the line 10 and it was moving to line 12. We can track with the diff position tracer that we need to present in the next version in this exact line. So that's the guy that does that. So the caching layers, we have postgres again, that we just persisted diffhunk. So as we already talked, we, and the reason why we started persisting this is that we were not noticing that we are request, we were requesting deeply all the time. So imagine that we have merge request with 100 comments. So we would need to be fetching deeply, like 100 times sometimes, depending on how many revisions that we are requesting. So we started seeing that it was getting a little bit out of control, and we just noted that we could do this little persistence that would improve a lot the performance. And the same problem that we have with the merge request, the files, the actual diffs of the merge request, we started seeing on the discussion tabs as well. We started seeing that we were processing the highlighting the actual HTML taking a lot of time to process this. So we use it basically the same strategy. So I think we have some time for questions right now before the code dive. The question is, could we go away with the code, the keep around ref now that we have the merge request, the files. Yeah, that's a good question. Actually, yeah, I think we could just reuse we would probably would see some performance like getting worse a little bit, probably, but that's doable. I don't think we could because if the merge request is merged at some point the and the actual commits that made up the original diff somehow are not in any branch anymore and they get cleaned up. If we want to view those blobs or if we want to expand some of the hidden diff lines, we still need to have access to the underlying blob, which might get cleaned up if we don't have a keeper on trap. Okay, so that's me. I think so, though, if I'm mistaken, I'd love to see an issue about this. Sorry, Nick. We just keep generating more and more of these reps and they are a bit scary. Yeah, absolutely. There has to be a way and I think that the CIT was looking at this, at least years ago already of kind of deduplicating them or reducing the amount of keeper around reps to the minimum set we actually need to cover all those commits because obviously that's the goal. And there are a lot of redundant ones that we should be able to remove. I don't know if anyone's looking at that maybe we should be. I think I created an issue a long time ago, just talking about, do we actually need to persist everything? Could we just request Githli all the time because that's not that bad sometimes, so would be reducing the complexity just having to keep everything on the database so that would reduce the problems with table sizes. I'll just link the issue that I created sometime ago would be nice to discuss this there as well. So let's let's have a quick look on the code. I have a few files here. Let's see. So the first one here is the demurge request reload this service. As you may think that that's it. That's used when we receive a push. So it does a few things here. It creates the module past it and create the module past the files as well. It clears the cache that we have because we need to get the latest. And this triggers the update of the position so we need to know where the comments will be so it just triggered the positions update. So this is a lower level would be nice to actually present the the Githli part just just one piece here that I that I separated. This is the main RPC that we use to fetch the diffs and it's pretty straightforward actually we receive the left left comment and the right comment and receive the paths here as well. So let's look here on the arcs that we are actually calling the gate itself here. So he also here we can see that if we're enforcing limits that that comes from from the seed they get left part actually declined. So this checks that we if you are enforcing limits we are actually using the limits so we are setting everything here. So on this part here we iterate on the on the diff. And I think that it returns a stream of diffs that that's the these are the objects that that are returning so lots of them. Yeah, it checks that the the deep pad size is less than we could send so we need to to just stream that. That's interesting, a little bit of go code that we use a lot. So let's go back. So, as you've seen on on the Githli side that we use the limits being sent from the declines that's the key that code base itself. We use this we set this here. So this is the class that get lab gets deep collections basically the class that wraps the what what's coming from from Githli. So that there's some logic here that we could take a look really quickly. So let's say we can see that it takes a look with it sets the overflow. When it overflows like expands a certain position a certain limit. I think I think part of this is already done on Githli Githli side so we need to delete actually delete some code here I think. So for instance, we check actually it comes from Italy, we can see overflow mark marker here. So we just set the overflow to true overflow. So we just stop Henry. So it takes some some logic of limiting as well. So, so this is the lower level wrapper, let's say, on the right side here. We have also have a lower level object that that fetches Githli so it also fetches here based on this between method. So also interesting to know this class. Let me just close this. Yeah, so that that's interesting here. Let me just a second. All right. So I've opened this because it's interesting to see how the difficult collection works. This is the difficult action with the class thief. And if you take a look on the on the subclass here that the base class. We always call this defable raw diffs. So basically what what exactly defable is so defable is basically a compare object that I've showed it before here. It's basically a compare method or a merge class diff. So things that we can call raw diffs, for instance, and each each object have his it's particular way to fat diffs. So if you pass the compare, we are going to to fat from the repo itself because the raw diffs goes to the repo itself. We pass the merge request diff. And if you take a look in the implementation of the raw diffs is it actually goes to the database instead. So there's a nice abstraction on this that we have the file collection merge request if we have the file collection compare. So each of those super classes receive this method that represents this class and knows exactly how to fat this these diffs. So it's a nice overview. So for instance, on the merge request diff, since we use the cache, the def files just use the cost cache decorates for every defile. Decorate itself don't request the the redis. It just takes what's memoize it and just assigns to to highlighted def lines. We can take a quick look here on the deep. Yeah. So if you take a look here, it just assigns the highlighted def lines and we just iterate on the content and create the def lines just create instances of def lines, based on what we had on the cache. So we have the def file here. There's a little bit too much. Actually, there's a lot going on here, but let's take a look on the def lines that we can understand a little bit of the flow of rendering. We can we call this lines we use the parser on the raw diff itself that that's the string we pass the iterator here. The raw diff each line. And we can take a look here that we parse the actual string. So those lines are actually strings array of strings. And here we can see that we check the we found the header there. So since we know the headers there we know exactly which line is there so we can create multiple lines. So that's the core of rendering the, the def lines because we serialize those lines in the front end just takes takes everything that's already there and just handers in theory. So hopefully. The lower a bit a little bit lower level rapper of the diff. It knows a little bit more about the the limitations itself so it takes some some constants here to know what's the size that we should be using as a limit. It, it's also knows the that we, we should request giddily the repo itself so it has a few methods that that's interesting to this part of fetching so not much that high level so so things that are more related to fetching. Let's see, let's see. Yeah, it memoizes a few things like to large and collapse it for instance so when this object is faster to def file. It's already memoized it so let's say this logic this logic is already like let's say prepared and we serialize this these attributes. So the logic of knowing exactly how to memorize those those attributes should be here, most part of those. So here's the line that we created from the cash that I just showed it takes a few, a few attributes here, and you can take a look on the cash again. We call the niche from from hash. And that's, that's what it's taking here. So it knows how to respond to edit remove it meta and change it so it knows what exactly the line represents. So basically what the object might do should do actually. And yeah, so we already saw. So this is the entity the serializer itself for each deep file. So it knows just how to serialize. So that's cool. I like the deep lines it calls the deep file. So what's it's calling here is the deep file that I just showed. Hopefully we are going to remove these parallel these lines and just do this use just the deep lines for serializer. I think that we have we have a merge request to just remove the parallel lines and do these in the front end. It's good because we just remove a few other a few extra megabytes maybe or just. Okay, nice. But at least we are just making it a little bit faster but it's interesting to think that the front end will be doing a little bit more, actually. But yeah, let's see. So the deep notes. If notice the persistence layer. We have the few validations on the original position the position line code. I think that's interesting to show the main part here is that the fetching of the defile. And if we take a look here it's pretty straightforward we check that we have the persistence the persistent no defile that I just showed that we have a table there. And we just create the instance of the deep file. We have the persistence no defile because it's an old merge request it's not created yet. We just try to fetch this from the merge request defiles from the the merge request itself, because we keep the latest so sometimes, sometimes you just can fetch from this from the database instead going through the least performance part that is just fetching from from the repo itself. So as I said, we will do the some magic on the unfolding lines the lines on folder that we can see here, basically this this lines on folder class. And the whole point is that it takes the position. And it takes the defile, and it knows which line is that exactly we need to fetch from the blobs to present this block of code that we did the user just commented. So basically the return of this the unfolded defilings are the defilings processing with the blob lines that the extra blob lines that we fetch it. Just a little bit of magic, but it makes sense. This part here. Okay, so the, the GitLab discussions the file collection. The idea here is to wrap all the discussions deep. So imagine the discussion that that we have on the merge request. This guy here just takes all the defiles on the truncate the chunk defiles and knows how to load the highlighting from the cache it knows how to find by the ID. So it's basically a wrapper of the discussion. It also calls the highlight cache that we can see here. And at this point you might be asking yourself, why do we have two different classes to cash to cash the same strategy to have the same strategy of cash. So the actual idea here is that on the discussions deep, we could just erase the cache when someone just delete the, the comment. So it's a little bit different from the actual deep of the merge request. Here we are able to, let's say just delete the, the cash when when just one on one defile cache different from the the other cash that we just write everything at once. And we don't have separate keys on this on this cache here. We use a little bit of lower level of the redis, but we are also able to pass multiple keys and write everything at once. So for now we are not erasing just one defile just writing and reading everything. We are just relying on expiration time that seven days. But if we want to just erase start to raising more quickly, we just could implement that really easily with this guy. So again the line some folder that we already talked about. So this this is really, really big and a little bit complex class. So the idea here is taking the old ref and then real refs on the point when the purchase received and the idea is knowing where exactly the the comment needs to be when receiving a new push. So, I think they, the output here is a result. I think though it knows a little bit better but basically the position and if it's updated or not. So the new position and if it's updated or not. It's it returns what we need to know to persist the position. So the last class here is basically the, the serializer for the discussion. It's just knows that we need to took out truncated defilings to to return the defilings to the front end. So it's pretty straightforward. I think that's it from the code dive here. And I think that's the last question part. Anyone wants to ask anything. Everyone's confident that if I assign them a murder case diff feature next month, they'll be fine. I have a quick question. Do we really handle image diffs and if so, how do you feel it fitting into the current architecture. Sorry, could you could you repeat. Do you ever handle image diffs like a side by side on a merge request, like having images. What changed or something I don't know if we currently do that and if we don't, how do you see it fitting into the current architecture. Yeah, that's that's a good question actually, we do have some, let me take a look here to the position, if position. We were talking about the position itself. So what we do today is knowing the widgets and heights of the image and knowing where exactly the comment was made by the position. So X and Y. So that's a good question actually to have a side by side. I'm not sure right now, but I can come up with a good, good response for this. I'm not sure. Sorry. So image diff commenting functionality. I think by default that we have that option of switching between old and new and using that, like onion paper kind of you, where you can drag the line and see the images kind of turn into the other one. And we support commenting there too and that's what I was pointing out with those X and Y coordinates which we use instead of new line and old line when you're commenting on a changed image. So that's part of everything related to image diff commenting is implemented on the front end, only the diff notes, when we store them of course they need a diff position to know what they are attached to, and in this case that's an X Y rather than an old line and diff line and file path and file path of course is the case for images too but X and Y instead of old line and the new line. So, from the perspective of the architecture, when you have a collection of diff files, because of course diff is a collection of diff files and then each diff line. If it text files, diff line will have a number of diff lines, but of course if it's an image diff file that is one. But the diff file implements a viewer method that returns a viewer that I think I've already mentioned that as well, which in the case of text diffs will be a text diff viewer in the case images will be an image diff viewer. And this is also communicated to the front end so the front end knows which diff rendering and diff comment rendering logic to branch into. The diff viewer image, it doesn't implement all that much logic here because it includes client site on line six, which means that it leaves the responsibility of actually rendering this diff to the front end. And the front end. Yeah. How to allow commenting there. Yeah, that's right. Thanks for that. So I think that's it. Everyone enjoyed. So see you on the next deep dive. That's soon. We can take a look on the issue that there's a few scattered already. So that's cool. I think the next one's going to be on get LFS in about a month by fun. If no one else takes a spot in between that. So that's it. Thanks a lot. Thanks.