Now you know Abraham Lincoln is really black though, for real, for real. Have you seen the Lincoln Memorial? Put up a picture of the Lincoln Memorial right now. Click that right there. Yeah. Zoom in a little bit. He is the only statue behind bars. Oh my God. Damn. They done locked up Lincoln, yeah. Yeah. That's how you know he's black. They locked him up. He's incarcerated. He got the freeway beard. He got the Philly beard. Card of black people love to drive as the Lincoln. Thinking Lincoln. Abraham Lincoln is black. God damn. That's a black-ass man. And they shot him.


The Ruger Security 9. What Ruger's calling the secure trigger action. Safe technology from the Ruger LCP-2. It does have an internal hammer there. Five and a half pound trigger, 15 round magazines. It's proven to me to be a very nice handgun. That is an integrated barrel bushing. It locks up nice and tight there. Thumb safety. Right there. Sweep down. Disengages that. Pin in. Front sight. Adjustable rear sight. 23 ounces. Unloaded 29 and a half ounces loaded with 15 rounds. It also does not have a magazine disconnect.


So many of the things that you've talked about, I feel like they start off, they are more of an engagement concept. So this is really interesting. And that is the whole overarching idea of Queen Bee and their strategies for events because these are not, if you are taking people and putting them on their cell phone doing all the bidding, you've had this live event and then you put people back on their cell phones to do the bidding and to be the thing. And it's sort of engagement is an art. This is, it's a science. And it means building community. And there's a reason that successful events have a cadence. That means you should plan in advance of how you're going to welcome people when they come properly. Then you're going to build community. Then you're gonna sit them down and do the stage program which is when you do your mission moment and all. And then you're going to engage them afterwards. So that's the engagement strategy. How do we do that? Well, even the pre-event emails, how you welcome them and get the excitement built for that, that's engagement. When they arrive at my events, I have volunteers greeting them at the valet. If it's a theme, thank you. If it's an event that has a theme, if it's an evening in Venice, they have the boat paddles in their dress like Orisman. We walk them to the registration. The registration people have a protocol for welcoming the people. Board members, listen up. You are goodwill ambassadors. You are not there to drink and schmooze with your friends. You are there to greet the people that you are stewarding to hire them. You are a very important element. Same with the staff members. You should not be running back and forth with auction items. You should be going table to table greeting guests, telling them how important it is that they came and it means so much to you. All of this is building community. The cocktail portion builds community. When you put them on their cell phones to bid, you're taking them away and then they're checking the babysitter and checking the scores. You can all complain to me afterwards. AJ at queenbeefundraising.com. I still use mobile bidding. If you're a school, it's okay. There's certain times it's okay. Once you go into the main room for the meal or the dinner, you close that auction. You do not send people back and forth to see. And auction is a game. You make a little bit of money from it. They spend hundreds of hours getting these auction items and putting together auctions and they spend 15 minutes putting together the strategy for their stage program or their ask. You are so right. You are so right. I've done this once or twice. I've seen it once or twice. Oh my. Honestly, you guys, I'm begging everybody, please. It's entertainment. That's basically what your auction is. Your fund need is where you make your money. And there's a strategy to that. There's a strategy to how the whole dinner and then how you sequence your food.


Good evening, I'm Olamide Adeyemi and this is the news update. Abiyadu Oyebanji has taken his oath of office as the new Ikita state governor. Oyebanji was sworn in by the Chief Judge of Ikita state Justice Oyewale Adeyye, a minister plus from the crowd presence. He took over from governor Kayadi Fahimi who doubled as the chairman of the Nigerian governor's firm. During the oath taking process, the governor pledged to preserve, protect and defend as well as preserve the office as governor in the presence of mammoths Ikita people.


Hi everybody, happy Thursday. I'm Joe and that is 2022 hip parade baseball limited edition I think that's their base level. I think it's limited edition Sapphire and then platinum or something like that limited edition still pretty good Series 6 dual case rate 20 boxes in this high risk high reward. Thanks to this group for taking the risk Big thanks to the people who bought their spots straight up. Congrats again to the people one spots in the Just had to do one filler. That's it and all the teams are in Let's roll it randomized names and teams a five and a four nine times One two three four five six seven eight and Ninth and final time Lakers Clippers tipping oxygen Andrew down to Oliver Five and a four nine times for the teams one two three seven eight and Ninth and final time We got brewers down to white socks Now remember these these cards can span span a different number of years Etc etc So Trade at your own risk Andrew last Bob Mojo brew crew Sean D with the Braves Anthony with the Royals Sam with the Arizona Diamondbacks Joel with the Nats mark with the Red Sox Michael with the Pirates Joel with the Rockies Harry with the Padres Joel with the Marlins Chris with my Dodgers Alex with the Cubbies Steve with the Giants Danny with the Phillies flood with the Rangers Matt with the Cleveland Guardians Michael with the Astros Taylor with the Baltimore Orioles Steve with the A's Joel with the Cardinals Jeremy with the Mariners Matt with the Blue Jays Bennett with the Reds Taylor with the Angels Rex with the Twins Mike with the Tigers Nick with the Rays Jason with the Yankees Mike Tower with the Mets and Oliver with the Chicago White Sox It's alphabetized by a team and we're gonna pause the video for a few moments when we come back We're gonna see if there's any trades and then we'll have that two case break stick around. We'll be right back All right, welcome back folks a little bit of trade chatter, but in the end no deals were done There you go dual case break The Austin Reefs just hit three threes All right. Thank you everybody got it got Lakers Clippers game on hopefully the Lakers don't Lakers can squeak out a win today. That'd be nice Good the algorithms are working Harry. I bought that. I bought those Google AdWords. All right, there it is series six Good luck everyone Let's hope you feel the same way after this break Harry It's a different hip parade Stuff here. All right first one Is for the Dodgers nice Luis Rodriguez? 57 out of 99 one of the big Dodgers International prospects coming up the ranks. He's got some good penmanship, too. I like that Chris Walker with my Dodgers Next up is for the Mariners. That's Noel V. Marte 25 out of 99 Seattle that'll be for Jeremy and we've got a Randy Aros Aranya rookie Autograph this out of sapphire nice Tampa Bay rays that's gonna be for Nick Nick F with Aros Aranya Thick card it is to wreak schoolable Rookie patch and autograph from flawless baseball nine out of ten Detroit that's gonna be for Mike Joseph. Oh a graded card Graded cards not too common in limited edition, but they'll stick them in there every once in a while the graded card is gonna be Nate Pearson PSA six from 2017 Bowman Draft Kind of a weird grade Or is that just the auto? I don't know what that is for the entire card Anyway, Blue Jays Matt Lieber With the flamethrower Nate Pearson Yeah, that kind of threw me a little bit. They usually don't put anything lower than like an eight in this but It was weird. He doesn't use his mistake. All right. Next up is Nolan Aronato two out of three Filling ledgers is what he does Got a piece of his lumber and his autograph who has the cardinals That'll be for Joel and the cardinals out of fives and under Gets the train whistle Joel all aboard the big hit express We've got a Ryan Mountcastle two-color patch and autograph a mentee 42 out of 99 Orioles that'll be for Taylor and the Baltimore Orioles and we've got blaze Jordan Blazing on the base paths going to Boston. It'll be for Mark and we've got Freddie Freeman for the Braves From 2015 top supreme baseball nice. I love that supreme said that goes to Sean D and the Braves and the 10th and final box of this case It's a Trey Turner nice rookie Trey Turner 148 out of 1 at 99 From 2016 tops tribute baseball. That's for Joel and the nationals But wait, there's more Another case another 10 boxes to go Hey, don't worry Harry. He's still got another case Is there a code on here, okay? so we'll send this to whoever gets that card we'll send this to them you got a chance to win a VIP basketball chairman edition box There's like so there's like a code on the back and you give them all that information you might win yourself a box So that's gonna go to That's gonna go to the angels Nice 11 out of 50 Bowman Chrome Jersey and autograph Joe Adele the Arizona Fall League autograph Who's got the hit Taylor with the angels? All right, so I got I got your name on a post it right there Taylor That's gonna go along with your Joe Adele I don't see too many of those so I think the odds are actually pretty good to try to try to win one of those Try to win one of those boxes All right Next is Nick Madrigal 97 out of 99 rookie autograph for the Chicago White Sox Oliver With the shy socks the South Siders next up is Walker Bueller from inception baseball two-color patch not a graph 17 out of 75 For my Dodgers who's got that Dodger Joe mojo Chris Walker with the boys in blue Easy Harry play to the whistle we get so many boxes to go You don't have to start worrying until we're like down to the last couple boxes Play to the whistle like coach says We've got 12 out of 15, that's Bryce Harper from luminaries number three in barrels Barrel up the baseball Phillies that's for Danny in Philadelphia, and we've got Alex Bregman rookie jersey and autograph 84 out of 199 Houston Astros that'll be for Michael L next up is We've got a Jonathan Papelbaugh flawless autograph 18 out of 25 It's a blast from the past Red Sox. That's gonna go to Mark is a Christian Yelich 13 out of 25 silver signatures Brew crew that's last spot mojo for Andrew Like I say 70% of the time last spot mojo hits a hundred percent of the time next up is a Dual relic dual auto a randomizer jazz Chisholm and Andres Jimenez dual patch to autograph 17 Out of 25 one person happy one person sad Joel has the Marlins and Mike Tower has the Mets Next is second to last one is Dylan Carlson rookie autographs out of mosaic baseball Nice one for the Cardinals. That's gonna go to Joel and the Redbirds Now the last one this here's the whistle. I told you to play it in the whistle. This is it Good luck everybody fingers crossed Hi Steve. Thank you and a happy Thursday to you. All right last one is John Smoltz silver signatures out of five-star baseball seven out of 40 Sean D with the Braves There you go gang another nice hit parade dual case break in the books Thanks for getting into it now. Let's make one person happy and let's make another person sad We got Miami jazz Chisholm and then we've got Andres Jimenez, New York Mets Let's roll it randomize it two and a six eight times two and a six eight times Team on top gets it after eight one two three four five six Seven and good luck eighth and final time after eight Goes to the Mets New York Mets, and that'll be Mike Tower and the Mets. There you go dual relic dual auto 17 out of 25 And there you go ladies and gentlemen, I'm Joe for jazby's case breaks.com. Thanks for knocking this out This hit parades off is always fun. I'll see you next time for the next break jazby's case race.com


If you had a chance to change one thing in Africa, what would it be? Man, the mentality, you know. I would want people to understand that actually, Africa is the life for, you know, everyone in the world. But for some reason, we've, you know, oppressed ourselves. So the way of looking at things, you know, that would be the first thing that I would change, the way we see things. Our mental way of reasoning, because we are capable, but we don't believe in ourselves. We believe in someone else, you know, our own ideas that we always put them last. This is my second day in Burundi, and the first day that I tweeted, hey, I want to meet entrepreneurs in this country. Everybody was telling me, you need to meet Dr. Jackson. Because he's an inspiration that we all look up to. And I was like, who is this Dr. Johnson? My name is Jackson Nahayo Quincy. I'm 37 years old. I'm a Burundian. I'm a farmer here, lived in North America for most of my life. That's where I did my education in healthcare and decided to come back to Burundi to work specifically to build a hospital and to work in healthcare and quickly realized that there was something that was more important, agriculture and feeding the population. So I decided to go into farming. How many farms, how many different crops are you growing right now? Yes, so the main one, like I said, is soybeans and maize, but we do cassava. We do a lot of things. We do amaranth for vegetables. We do cabbage. We do even chili, hot peppers. We do eggplants. We do bananas on a large scale as well. We grow bananas. And then on animal husbandry, livestock, we do chickens. We do fish, tilapia mostly, and catfish. The best moment in doing what I do has been to see that there is people that are better off, that are, you know, better off today because of my existence. Youth that have earned some skills under their belt. People that are sick, that have been, you know, treated in some of the health centers that I have built in two of our hospitals. The people who have earned themselves employment and are able to sustain themselves, to support their families because we created jobs for them. So we do things slowly. And sometimes our friends come in and say, hey, let's assist, you know, with the project you're doing. Because whatever you do, I first see if there is any good for the ordinary people. If it's beneficial for ordinary people, then I do it. I don't think about me. I think about others first. Is this need there in that community? Then we talk to the community leaders and then we get to work. How do you feel any time you come in here? Well, really, one thing that I was challenged with was when I was thinking of building this here, people were saying, you know, take it to the capital city. You know, there is nothing here. There is no money here. You won't be able to find people to be interested in coming to work here. So in my heart, I was determined to do it. And I said, you know, it's not all about the money that I need, but I want to be able to respond to a need that is not there, to something that is needed. If I see there is need for the hospital because I would always see people that are sick and they just leave them home. So we started out of nothing to build this place. Where do we see Jackson in the next 10 years? Really, I think the question would be where do we see Jackson's, you know, where would we see Jackson's in the next 10 years? My brother, the people of Burundi in the diaspora and at home are telling me that you are an inspiration to them. And I just want to tell you, thank you so much for inspiring your people. Thanks man. What are you doing that everybody is telling me I need to meet you? Like I said, my name is Jackson Nahayu. I prefer just you call me Jackson. I need no titles. I'm a farmer working here in Burundi. Were you born here? Yes, I was born in Burundi. Burundi? Correct. You grew up here? No, I didn't grow up here. Unfortunately, I lost the chance to see my childhood here in Burundi. What do you mean? Well, there was war. As you may have learned, Burundi has got a lot of history of civil wars. So I was one of the victims of that. And in 1993, when the democratically elected president was assassinated, I was only six years old and war broke out. And so, you know, there was lots of fighting. And me and my sister were trying to run just over the river by Congo side. And unfortunately, she got attacked. And she was wounded. Her lungs were punctured. And so, we got to a place. What do you mean by she was attacked? She was shot at. Gun shots in the chest. What were your parents? Actually, at this point, we had left. We thought our parents were dead because the rebels attacked during the war. Our home or our village was all attacked. So we were sort of like, we escaped pretty much.  Yeah. When we couldn't walk no more, we went to a place where she told me, you know, I can't walk no more. Just run. Otherwise, they're going to come and find you. So the soldiers at the time, the government soldiers at the time were the ones waiting for the people. They're actually the ones that shot my sister. And she couldn't make it across. So I left her there to die. And I tried to run on my own for survival. Someone gave me a helping hand and helped me cross the highway that you've seen there. And I ended up in the Congo. But life wasn't easy for me in the Congo because, you know, I suffered. I didn't know the language. I was only six years old. I didn't have a family. So I had to really to struggle to survive. I had to hustle. So I had to look after people's goats and cows to be able to get food. And eventually I got malaria.  I was almost dying. So they took me to a Catholic nuns clinic called Sanghe there, where I went to get treated with malaria. And from there I was reunited with my uncle who was studying in the Congo at the time. So he took me in. I lived with him for two years. And unfortunately, war broke out again. So we started running all over again. War broke out in Congo too? Yeah. And what happened to you? This time I didn't want to wait too long, man. I had suffered so long. I didn't want to get shot at like my sister. I didn't want to go through the trouble I had gone through. So I just was the first one to just leave that town. Jumped in a ship that was also fleeing the port there. And I just tried to find myself a spot to hide. We ended up in Tanzania. I knew nobody. My uncle wasn't there with me. And so we lived there for a long time. And I remember that in the camp called Miyavosi where we lived. There were other people who were trying to go to some other places. So I flew with them. Some of the things that they did, man, things that can't happen to a human being. I remember that they put a cast on me pretending they were taking me to the hospital because they didn't have passports. They didn't have papers. So to be able to cross countries, they had to put this cast on me and pretended they were taking me to the hospital. So then we ended up in Mozambique. They were arrested. Then deported into Zambia. And I became a street child for some time in Zambia. In Zambia? How did you end up in Canada? So in Zambia, when I became a street kid, I was looking.  I still had, you know, kindness. I still also longed to be somebody. So I started looking. I mean, I was living with other, you know, like kids that were doing drugs and stuff like that. And my heart never allowed me to do so. So one day, as I was looking for help in town, I came across a building that said Bible in it and walked into there. The first thing I went into was a law firm.  So they, you know, they yelled at me. I went to the upper level. I knocked and that time a white woman who's become my adopted mom came out and she asked me what I was doing, who I was. I didn't speak English at the time. I didn't know English, but I tried to communicate, you know, the human language and she understood. So she asked me, she gave me some transport money to go back where I was and asked me to come the next morning when her husband, my adopted dad would be there. So then I came the next morning and they said, how could we help you, you know? So I told them I wanted to go to school. I was just alone. I didn't have family. Maybe if I went to school, get educated, maybe I could have my own family. So they didn't doubt me. They said, you know, we'll support you with school. So I went and found the school and I started grade five in Zambia. I started to learn English, I started to learn the culture, the local languages and I had to be on fire because, you know, I wanted to, it was a chance when I was remembering what happened to me in Congo and stuff like that. This is a chance that I couldn't take for granted. So I started extra hard. I was always working hard. The first term I think I was the last in class, but the second term I was number two. The third time I was number one.  I was getting all these awards for being a disciplined child and that kind of, like it didn't get to me, it didn't make me proud, but it made me humble and even encouraged me because I could see a child who doesn't speak English comes in an English speaking country and is dominating, you know, like it was humbling. So it made me want to work hard and hard and hard. Then eventually we got to, they brought me to Canada. That also was a cultural shock, you know, because I, you know, I went to high school there. It was very cold, minus 30, minus, you know, 25 degrees Celsius. It was very tough, but I tried to adjust. So I was working really hard. I was, you know, also I had the big wound in my heart because I was thinking of my sister that I left, you know, behind who I thought she was dead. By the way, she's still alive. She survived. What? Yeah, the next morning after I had left, her red cross came across and she wasn't dead yet and they drained her lungs. They took her into town in Bujumbura, the hospital. She was there for more than six months and she recovered and she's back in the village. So yeah, yeah. But I didn't know that at the time when I was in Canada. How long did you live in Canada? Maybe a couple of decades. Yeah, so when I was in Canada, it was only in, so I left my sister in 93 in 2005. When I was just graduating from high school in Canada. This is when one of my crazy friend, Eric, he's in Canada right now from Bujumbura. He kept, you know, because, you know, really, to be honest, I really didn't like to be called a barundian with all the bad things that had happened to me. I didn't want to be called to be referred to as an African. I was so sad. I was hurt. But this friend of mine, Eric, decided to take a tour just like you're doing, came here in Burundi and was going around with my adult picture. Well, I wasn't an adult. I was only 17 years old. But, you know, he brought a picture of a 17-year-old in Burundi asking, would anyone know this guy? You know, no one could know me, but when he was stating my parents, because I knew my sister's names and my dad's name and my mom, so he was asking and then he found them. They were shocked. They had another, they had replaced me over time. They had another Jackson. We are two Jackson's in the family. Okay. Yeah, it's crazy. So, it means your mom and dad were not dead? No, they didn't die. They survived. Wow. You know? And this is what, you know, like when you see me going, some people say, what gives that guy so much courage about life? What makes him so hopeful even when things are miserable? I say, man, I've been hit, you know? I've seen it all. I've suffered enough. But at the end of the tunnel, there's always a light. I believe that. So, I always believe in positive possibilities even when things are tough. But it's not that, it's something I just create in my brain. I have experienced it before. So, when I learned that actually when the soldiers came, went to burn my parents' house, they didn't kill them. And that my sister also survived. Because I remember when she was, you know, like she was wounded in four places. You know, back and forth. And when she would try to talk, I could just see, you know, like air coming out of her chest. And she couldn't. She was so tired. She couldn't talk. She was bleeding.  Show me the wounds. And she was able to show him the wounds. And so, then she said, you know, show me Jackson. He says, well, he's in Canada. Well, can we go to Canada and see him? He says, well, it's just not that easy, you know? And at that time, 2005, mobile phones weren't as common. So I think he managed to find a place to climb on a tree. That's what he said, called my Canadian parents and said, you know what? We found Jackson's parents and family. We were all shocked. My Canadian parents were shocked. I couldn't talk. I was just in a shock. But very quickly, as I was graduating, we organized a trip for me to come back and see my family. And I was still hurt. I had this wound.  So when I got here, you know, I could feel the wound, the wound in my heart starting to heal. You know, it was healing. It was healing.  She had already forgiven the people that hurt her. I saw my family, my parents. I had about seven other siblings born after I was gone. I saw another small Jackson as my replacement. Wow. But with all that, I also saw a vulnerable community, a suffering community. All my friends, when I left here, was I think in grade, in third grade. And some people that were in that grade with me, they were, that's all the education that they had.  There was no schools, no hospitals at that time. Burundi was just starting to come out of war. So it was sad. So I told you I had just graduated from high school. At that time I had my plans to go to study, to be a pilot. I had a lot of bursaries. So when I went back to Canada and I started taking my pre-university courses, I suffered. You know, I had depression. I really couldn't keep up. My question was, I already have high school. And there are some of my brothers and sisters back in Africa that only have that third grade and they don't have food to eat. So it was sad for me. And I couldn't concentrate in school.  And I asked some of my friends, I said, what's the hardest paying, well, the hardest job, but the biggest paying job I can do as a laborer here in Canada to earn so much money.  But you can get a lot of money doing tree planting if you can. So I started doing tree planting. And people would say, you know, why are you on fire?  What's going on? I said, you know, I have to do it for my people. I have to love being a Burundian, being an African. So I was saving this money, sending it the money. We started with an orphanage. So we built an orphanage. I didn't, I don't always like to call it an orphanage. I called it a youth center really, because I grew up as an orphanage and I knew how painful it was. So we built the orphanage, started with about 52 children, giving them education, food. And you know, so I was only doing it alone, tree planting there. And then my friend said, you know, we see you're doing this for almost a year. And you also have passion to go to school. Why can't you allow us to help to support you so you can also get your education as you wish? So we agreed on that. And I got friends supporting me. So the orphanage was getting, was going well. I went to my grad, my undergraduate part of school. Did nursing, completed that. And I moved here to Burundi checking and I was going back. During that time, I also was working on oil rigs, you know, in the summertime. Tried to drill oil to make money so I can send it back home. And yeah, did some courses. I wanted to learn. So then I went further with schooling. I wanted to learn about tropical medicine. So with all that, I was thinking, what do I really want to do? How can I make myself necessary for my African people? Wow. And so, you know, my Canadian parents were like, you need to take it easy.  They were feeling sorry for me.  I want to try and make myself necessary to others. I want to help Africa be what it is supposed to be because it has so much potential and that potential has been, you know, oppressed for certain reasons that we can mitigate or issues that we can solve. So in 2013, I decided to pack my bags to come back to Africa. So I managed to talk to some people, hospitals, organization in Canada. I said, look, you have medical equipment that you don't need. And there are some of my people that may need it. And so I was able to collect some of that equipment. I moved here. I said, I really want the place where my sister almost died because that image has been stuck with me. I would like to turn that image into a place where we could save life. So the objective was to try and see that place, that exact place where my sister was left to die. And so when I found that place, I begged the owners of that land. It was just an abandoned land.  Well, they had to help me because I, you know, where the, what do you call it? I knew where the armored car that shot was shooting at us where it was parked. So I said, this is the place. So we tried to locate the place. My sister had a very sharp memory. She was still here. So she said, this is where you left me. So we looked for the owner of the land. I begged him. I said, can I buy this land from you? He was very nice. And he let me buy the land. And we built Ubuntu Clinic. Now you may ask why Ubuntu? Why Ubuntu? Another long story. But you built a hospital for your community. Correct. Which means there was no hospital in here? There wasn't a hospital in that area. We have only district hospital is Chibitoki Hospital. Are you a doctor in the hospital too? I am not working there at the hospital.  I decided to be a farmer. Sitting at the hospital when we have so many nurses and doctors that could do the work. And my mind is, you know, like trying, I'm a visionary, looking for things that I could do. So I decided to hire people. You know, earlier you said entrepreneurs. You know, I have a brain of an entrepreneur, a guy who just wants to make things work. So I'm not a task oriented kind of guy. I'm an innovator.  So I had to weigh, you know, the options that are there. Are there people that I can hire to work in the hospital? Or do I have to work there myself? So we trained people. We hired people. We have about seven doctors working full time. Two specialists that come in twice a week, 53 nurses, and those are enough. So earlier I was telling you one thing that I looked at was, and I haven't always believed in chemicals, you know, like having to treat people scientifically is good. But when you can prevent that, so people don't have to be filled with medication and stuff, it's a better way. So I was here busy looking at what is making people sick. So we realized that nutrition, lack of nutrition, was a big problem. And also I was thinking about, you know, moving Burundi up, moving Africa up. So we needed to empower people. So I thought, what are some of the things that don't require so much of professionalism, so much of legal, you know, permits that we could do but we could develop Burundi, we can create jobs. And farming was the only thing that, you know, I would call is still a virgin here in Burundi. And a lot of people know how to farm here. So I wasn't bringing rocket science here. So we started to think together with the community. I wasn't bringing new ideas. We sat together with the community. We say, OK, what could we do to be able to produce much food? So people had a lot of ideas. What are some of the crops can we grow to be able to make proteins? So I became very passionate about soybeans, which is our main, the crop that we grow because of the protein content. People were initially growing cassava. But I also said, what if, because I lived in Zambia and we were using maize, fufu. And I said, what if we start growing maize on a big scale? So that's those are our main crop that we're growing, soybeans and maize. And with that soybeans, we process it with the maize and other things like barley or other things that we get from outside vitamins and stuff, powdered milk, and that we make porridge to be able to give to our patients that are in the hospital. But we went further. More than that, we do also 600 children in our community here and 250 children up in my home village there. We feed them with porridge every day. The result has been phenomenal. First, the number of admitted children, those who had anemia related to malaria, if we are feeding them, the number of the children getting admitted just dropped. And also the healing process, when they have enough food in their stomach, then they heal faster. You can imagine taking medication on an empty stomach. Most of them would throw it up. So it was just like, boom, we're finding solutions. But that was just an intervention really. We also want people, our president, his excellence of Burundi, he has a saying that each mouth should have food to eat and each pocket should have cash. So I had to walk under his footsteps. How could we achieve that objective that his excellence is the president of Burundi believes in? How could we have each mouth have food to eat and each pocket with money? So we said, okay, the intervention process is over. Let's now start to think about growing abandoned food, some that we could give to more people, some that we could trade with other things so that we have a health Burundi. And that's what we're doing right now. How many farms, how many different crops are you growing right now? Yes, so the main one, like I said, is soybeans and maize. But we do cassava, we do a lot of things. By the way, this is a conflict that I had when I grew up in Canada where we would have 100 hectares of wheat, just one, or canola. But here in Burundi, we have that privilege to do variety. So we do beans, we do amaranth for vegetables, we do cabbage, we do even chili, hot peppers. We do eggplants, we do bananas on a large scale as well. We grow bananas. And then on animal husbandry, livestock, we do chickens, we do fish, tilapia mostly, and cutfish. And this is, you remind my parents and my Canadian friends, you say, ah man, you're spreading yourself too thin. So I would say, come to Burundi, then you'll see that I'm not alone, I have people. Burundi has so many people, we have the human capacity. That's an advantage that other places don't have. I remember in a Canadian hospital, I would be there on a ward, looking after so many patients, because there's lack of human power. Or when I was working on oil rigs, maybe just three guys operating a rig that would need at least 100 people. But that's the problem that they had there. And I said, why don't we use, here in Burundi, here in Africa, we have so many people that we can put to work. And that's what we've been doing. So when my Canadian friends say, you know, you're doing too much. So when they come, many people have been coming now, which is a great thing. They say, oh now we understand, you know.


Within the writing process, we have to see how we can train our students, transfer their ideas into texts which are well-formed, which are meaningful, and how they can review themselves, assess their own writing for further development, or in other words, how they can take the charge of their own writing as autonomous learners. So, transferring ideas from brain to text, from mind to text, and then reviewing is challenging. And as a language teacher, I would strongly urge you to see some of the causes why don't students, you know, what causes difficulties among star students to assess their own writing. So, once the students are aware of their own difficulties in putting ideas into text, they can become a better judge, they can better assess themselves, they can better identify some of the difficulties which hamper them from putting their ideas into coherent text. Some students can be very slow and some can be fast in terms of putting their ideas into a text. So, in this regard, as a language teacher, one of the effective ways is to develop collaborative writing exercises, pairing slow versus fast writers, and putting students into group of five and making sure that not each student has the same proficiency. Like each student, the participant of the group has different proficiencies. So, this is how we can patch the slow with the fast writers. Another possible cause is the script, difference of script. For example, Arab writers may have more difficulty as compared to French writer. So, we'll have to find out the causes, yeah. And in the Pakistani context like Urdu writer, or even then we compare the K.P.K. or Balochistan or Sindh students, they may have a different exposure to their own first language in different way. Another reasons might be lack of practice. When the students, when we mostly learn from students that they are blank, they have nothing to say, nothing to express. In this regard, teacher's role is important. By bringing in tasks which are relevant, by bringing in tasks which are appropriate, which are not too difficult.  For example, filling in the form, for example, writing a letter to the ministry, writing a complaint letter or asking for a bill or writing a letter to the bank manager. So these kind of, you know, tasks can encourage students not only put their ideas into text, but also review themselves. How we can make students self-judge their own writing. We can, for example, we can give them their own written assignment, and we can ask them to compare with that, that of model assignment. And in this way, they can compare and contrast and find out what worked for them and what didn't work. And I have used this as a language teacher in most of our class, in most of my classes, where I, you know, show the written assignment by the students and show them the model answer as well. And they themselves, you know, find out their areas of improvement. So we can, another area is to provide checklist to the students to take whether the introduction is okay, whether the middle is okay, whether the conclusion follows the norms of conclusion. And then we can engage them in peer feedback where students, each student looks at the writing of the other student. And this is how they develop kind of collaboration. And then we can train them giving peer feedback, which is helpful, which is not discouraging, which promotes self-esteem, identity, and self-respect amongst students.


Okay, I wonder how close should I meet to this microphone? All right, so we're gonna start in, I don't know, 30 seconds because there are still people entering the room. There are some seats in the front, like two, three, four, six seats in the front at least. And there are two there still available. Okay, so I'm gonna start now. Hi everyone, happy to be here with you. Today I'll talk about CK5 in Drupal 9 and 10 and about some things that you probably never heard about CK Editor. I hope to inspire you to squeeze the most out of CK5 in Drupal projects with this presentation. About myself, I'm working for CK Source since 2007. CK Source is the company that makes CK Editor. We are located in Poland, have currently like over 80 people on board. I started as a developer in the past, I was also the maintainer of the CK Editor module for Drupal 6 and 7. Currently I am the president and CPO of CK Source. So today I will cover several topics, how CK5 ended up in Drupal. I will give you some overview of CK5 including presenting some of the features that are not included by default in Drupal, but that you can try to add. And at the end I will go through a sample plugin that was built to showcase you how to extend CK5 with your own features. But before we start, let me show you a couple of screenshots of CK5 to stimulate your imagination. So that's the stock CK5 in Drupal. It recently had a refreshed interface, so the background is white. This is also the stock CK5 in Drupal, this time with a little bit more features. This is CK5 with a customized team, thanks to CSS variables. This is CK with restricted editing functionality, allowing you to create only... Oopsie... That's funny. Super restricted editing. I have to be very gentle, this adapter is really sensitive. Okay, so I will try to change the slide with my eyes maybe. This is CK5 with restricted editing functionality, so you can create only certain parts editable in CK5. Here you can see some fancy features called pagination. That lets you see in the editor how the content will be split into pages in created PDF files, that you can create with CK5 too. CK5 can be enhanced with spell checker, grammar checker and intelligent text predictions. This is also CK5, here you can see track changes. So basically instead of making changes in the document, you can add suggestions to remove add content, etc. There's more sophisticated revision history where you can compare even several revisions at once. This is CK5 with free time collaboration, where multiple people can edit the documents simultaneously. This is the cake edition of CK5. Yes, so I'm showing those examples to you to underline that CK editor is really flexible. The default Drupal integration is great already, but it doesn't have to limit you in any way, because thanks to Secular API and Drupal API you can extend it further with features. So, a couple of slides about how it happened that actually CK5 ended up in Drupal 9 and Drupal 10. As most of you know, Secular 4 is the default with weak editor in Drupal 8 and Drupal 9. It has been added to the Drupal core years ago, like 12 years ago or something like that, or 23. Unfortunately, as every software is slowly reaching its end of life next year. So, because of the upcoming end of support for Secular 4, Drupal had to choose another with weak editor to replace Secular 4 in Drupal 10. There was a little bit of brainstorming about which editor to choose, but Secular 5 has been selected as the successor and will become the default editor in Drupal 10. There are multiple reasons why this has happened. Secular 4.5 is a really good editor, but most importantly, we had a good track of previous collaboration with the Drupal team. The next slide will show this a bit. On the next slide, it will show the number of tickets that both Drupal core team, Drupal community and CK editor team had to close to ship Secular 5 in Drupal. I'm not sure if that's a good recommendation for Secular 5 in general, how many tickets it took, but just have a look at this. So, it starts here, and we go through tickets, even some more tickets, and tickets, tickets, tickets, lots of them, plenty of tickets, too cheap, just so easy to get it over, and tickets. And the list stops here, so that was the 10 seconds time lapse of two years of people's life. Yeah, so it took us over two years to complete all the work required to seamlessly integrate Secular 5 with Drupal and guarantee desired developer and user experience. And taking this opportunity, I would like to thank everyone who was engaged in this process, especially to Benjamin Millins, Laurie Escola, women leaders, and Peter Weber, and really big kudos to them. And I would like also to thank all the other people involved. Thank you, everyone. This list actually does not contain all the nicknames of people that help with that. Okay, so on the Secular site, we introduced some features in Secular 5 internally to satisfy Drupal requirements, and we had to focus among other things on several things, such as general HTML support, because believe me or not, but the initial version of Secular 5 was actually very strict in terms of HTML elements and tags that it supported out of the box. Basically the first version of Secular 5, I mean the first and a couple of other reasons, were just supporting elements and attributes that were only supported by Secular 5 plugins. So if there was an HTML markup that didn't follow this rule, it was simply removed by Secular 5. We had to introduce, yes, I have to speak closer to the microphone, we had to introduce so-called general HTML support, where through just the definition, you can actually define what additional elements, attributes, and styles Secular 5 should support. And this took a while, but thanks to that, you might be sure that if you port your content from Secular 4 to Secular 5 from Drupal 9 to Drupal 10, the content will be preserved. Another thing that we had to introduce, and this is just like an internal thing, but basically, unlike typical JavaScript applications, Drupal has a requirement to be able to ship an extension for Secure Editor through country modules. So we had to invent, let's say, a mechanism to be able to attach plugins to Secure Editor. And because Secure 5 is, let's say, a modern JavaScript application, typically you just bundle all the JavaScript and finish with a bundle that cannot be actually extended, etc. But here Webpack Delos were handy, and we added some additional functionalities that were not available in Secure 5, but for, let's say, future priority, etc. We introduced them, so styles drop-down and document lists. Document lists were particularly funny because this is the thing that you actually probably don't notice at all when you work on it. Basically, this is a functionality to be able to have a block image inside at least item or a heading inside at least item. And it took us like months of development to ship that particular thing. So one understanding that I wanted to mention before we move forward, don't be fooled by the numbers. Next to the name of the editor, Secure 5 is not a continuation of Secure 4. It has been rewritten from scratch. So as a Drupal community, you maybe remember the situation with Drupal 7, Drupal 8, and the migration. So that's the case here. So it is a completely new editor with a different architecture and APIs. We were writing the editor was a hard decision, but we doubted we will not be able to introduce all the changes we wanted. Basically, there was no easy way to make some transitions from Secure 4 to Secure 5 to enable the functionalities that we wanted to introduce like truck changes, return collaboration, and so on. So as a consequence of this switch, any country plugins for Secure 4 have to be recreated to work with Secure 5. Side note, yeah, writing so complex software from scratch is an incredible challenge. And we will think twice before we try it again. So basically, we started the Secure 5 development like eight years ago. And we still are adding features to it. So really, it looks simple at first glance, but it's complex and really time-consuming to produce something like that. So let's have now a closer look at Secure 5 in Drupal. Secure 5 was started into the core in Drupal 9.3 as an experimental module. And starting from 9.5, Secure 5 is no longer experimental and Secure 4 is deprecated. It shows the confidence of the Drupal core team into the effort that has been already made. We actually support it. So basically to try out Secure 5, you don't have to wait until Drupal 10 is officially available. You can even try it out in Drupal 9.2. So the process of enabling Secure 5 was a little bit different in the previous version of Drupal. It was marked as an experimental module. And starting from Drupal 9.5, it's no longer experimental, it's stable. But instead, the previous Secure version was marked as deprecated. Just to notify unaware people that it's going to be succeeded next year. So once you enable Secure 5 module, if you're on Drupal 9, you have to switch the editor, text editor, and text editor. It takes for much configuration to Secure 5. And once you do this, you will have a new toolbar configurator with new buttons and some warnings. So that's the new Secure 5 in Drupal. Okay, so in Drupal 10, Secure 5 will be the default, the only wisdom editor available in the core of Drupal. That's because of Secure 4 not being supported anymore. Drupal 10, according to my knowledge, is going to be released in December this year. So we always still have some time. However, we encourage you to give Secure 5 a try, especially if you're looking to improve the editing experience of your users. A little bit about the data retention. I already mentioned this. The Drupal core team did everything that was possible to keep your data safe, and so we do. And once Drupal 10 is officially released, there should be no data loss. When your content from Secure 4 will be loaded into Secure 5 after the upgrade. Even if it turns out that some features are missing in Secure 5, the goal is at least to keep your data in place. So remember what I said about general HTML support, that it provides support for everything, basically. A bit different story is when it comes to all the modules that were extending or interacting with Secure 4. Since Secure 5 is completely different software, all these modules need to add dedicated support for Secure 5. If you're using some less popular modules for Secure 8 or you have developed your own, you have to make sure it's ready for the new editor. There's actually a helpful documentation page that may help you understand what's the status of some Secure editor-related modules and how to test the upgrade path, etc. Now let me go quickly through some new enhancements added to Secure 5 in Drupal. First of all, the new editor comes with a new better UI and improved user interface. For example, media widgets have now a dedicated balloon toolbar attached, allowing users to quickly adjust embedded media. You can find options directly in the editor. Links have now a balloon panel attached to it, allowing users to quickly see the link URL to manage it. The styles dropdown has been reworked to let you present nicely how each specific style will look like. I was having some hard time to configure it in Drupal, so make sure to try it out and report any errors you find. We introduced some productivity enhancements, such as how to format things, where you can use the markup similar to Markdown, within the editor to make lists or quickly format the text. For instance, if you start with two stars, type some text, it will become bold, so simple but a useful feature. In fact, it supports lots of markup, like lists, to-do lists, headings, code logs, etc. The one small issue is that it's not yet available in Drupal, but it's in progress, and I know that there is an intention to have it shipped in Drupal, too. Right now, we can test it in the Secure Editor documentation, for example, but it should land soon in Drupal, too. Another similar functionality are transformations. In this simple example, we will surround C with parentheses to convert it to a copyright sign automatically, something like that. You can actually configure those transformations to add similar transformations in Secure Editor. This is actually not shipped in Drupal, but if it looks interesting to you, you can always fill an issue and count on that. It will land sooner or later. One more thing that I wanted to showcase to you. Basically, it's something that doesn't make a wow effect, it's just a source mode. But if you are more familiar with how the development of Secure 5 was going over the last years, we were actually quite unhappy with adding support for social elements. For quite some time, we thought that that's not the way how you should propose rich text editing, that basically you should propose a decent UI for that. You shouldn't expect from your users to know HTML, etc. And guess what? We had so many people looking for it that we had to give up and we introduced it. It's typical that on some websites there are power users that actually want to use HTML, that want to enter manually some sophisticated HTML, which isn't supported through the UI, so we basically introduced it. So yeah, we have source mode again. Right now I would like to show you a couple of ideas for simple country modules that you may create for Drupal, utilizing already existing features of Secure 5. They are not shipped with the core library, but you are free to make country modules. By the way, just my two cents. Country modules are a good way, in my opinion, to sell your skills. We are looking actively for a good developer to help us with Drupal module development. And one of the things that I look personally at is the public profile on Drupal.org. So if you're a Drupal developer, make sure to do something for the community. It will help yourself, too. Okay, so first plugin, not available in Drupal, but probably easy to ship it. It's the word that characters count. Basically, we expose the API and you are free to propose it in any way you like in the UI. Second thing are mentions. They may even have more sense, paired with some custom notification system, for example, to notify people when they are mentioned in a document or something. And perhaps also with two-list items. Things that probably some of you know from CQl4. There was quite a popular module for CQl4. This is also available, like setting font family, size, color, background color. It's available for CQl5 too. Same as find a new place. So basically, if something is not available in Drupal out of the box and you like it, you can always add it by writing a module or checking if someone already did that. Another category of plugins that are not included in Drupal... Okay, that should work. Another category of plugins that are not included in Drupal are the premium features. As you know, CQl5 is an open-source editor. Anyone can use it for free under the GPO license. At the same time, in order to have a team working full-time on an editor, we need to have funds to run the whole thing. So that's our solution for this problem. We just have some additional paid features that anyone can additionally purchase to CQl5. And just like two minutes, why actually funding is required, that's the story of Aloha Editor. Basically, they had a really high chance to be included in Drupal 8. And somehow it happened that we were selected to Drupal 8. But the story is that Drupal 8 was released publicly in 2015. And the same year, Aloha stopped being maintained actively. They just were minimally maintained with a two years break in 2019. And for a project like Drupal, it's really important to have stable dependencies. And we as a product company also understand how it's important to have stable dependencies because you don't want to ship your product with a dependency that you will have to maintain a year later by yourself. Another example of dying projects is QuillJS. So it actually is kind of that since 2019. And as you know, projects without proper support are a major threat for everyone. There are some security issues hanging on GitHub issue tracker. I haven't verified them, but nobody's taking care of them. Another fun stat is that from eight supported editors by Drupal 7 with WIC module only to survive until today. Okay, so enough about that, editors. Here are some of the premium features I would like to quickly showcase before we move on to another part. So export to PDF. With proper configuration, you can actually achieve some document layout. I mean the same document layout I've seen CKEditor. So that was CKEditor. That's the PDF file. Yay. Export towards similar functionality as export to PDF, but this time creating DocX files with commands and suggestions supported. Talking about commands, there's support for commands in CKEditor 5. There is support for track changes. So adding suggestions in the document, revision history. What I particularly like in this functionality are the up-down arrows on top that will let you quickly browse through the changes in the document, especially useful if you have like super long documents for some reason. And retouch collaboration. So basically, if you like, you can change your CKEditor 5 into a Google Docs-like editor. I actually found out that some people are using Drupal and Google Docs together to collaborate in Google Docs and later paste the content into Drupal. So if you would like to use a single application, you can do so. And you have full control over where the data is located and so on. So we are working on a dedicated module for that integrates those functionalities. I was actually hoping that we're going to have our release today, but yes, we have. Okay, so yay, it has been released. So you have a chance of being super early adopters, probably misleading documentation and some issues. If you are eager to try it out, go ahead. It's marked as 1.00 beta and some of the modules are marked as experimental, but I encourage you to give it a try if you like and report issues because we probably are not aware of some issues. Yeah. So here's a sneak peek of the module. So CKEditor with retouch collaboration comments, track changes directly in Drupal. It works in Drupal 9.4 plus and 10 alpha beta, whatever, alpha 7 and beta 1. Yeah, this is the same article, but we don't have a lot of space for the editor by default. I have no idea how to fix it, so we have this collapsible sidebar to gain at least a little bit more space. And we have some proof of concept of maximized planning. That expands the editor to the whole report, let's say. The revision history is also integrated with Drupal. It's a little bit different than the default Drupal revision history because it is accessible actually from the editor itself and it's more granular than the Drupal revision history. Yeah, so just play with it and you will understand the differences. Export to Word is also integrated with Drupal. Here you see the same content but exported to Word with suggestions and comments included. Okay, so let me check the time. Yeah, we'll have like half an hour for questions. So let me change the topic now and talk a bit about widgets. Similarly to CKEditor 4, you can use widgets in your plugins to place various objects inside CKEditor. For instance, more complex structures, product cards, external libraries like charts, math formulas or whatever you imagine. So to put this in really, really simple terms, a widget is just an element inside the editor that has this little highlight border. The arrows in top left and bottom right are to actually make it simpler to add paragraphs at the top or under the bottom of the widget. And it can have some additional toolbars attached to it. So a good example of a widget is this image element or a table or this widget to insert diagrams using the Mermaid syntax. There are other brilliant widgets that you can create by yourself. It's just to inspire you. By the way, in case of you are wondering what you see here, you are correct, that's actually a screenshot from GitHub where we replace the default markdown editor with CKEditor. And we made this Mermaid widget when we noticed that it's supported by GitHub. Yeah, so that's our editor in action. So we can actually download it if you like. We just wanted to... There is this saying like, eat your own dog food or something like that, so we just wanted to try out CKEditor in action all the time and deal with all the issues we have. Yeah, so it's available for Google Chrome and Firefox. Yes, changes this thing into the other thing. There's one thing that I actually appreciate the most in this extension is that basically it has support for tables. I cannot sometimes even remember how to make links and so on in markdown, so for sure I don't remember how to make tables in GitHub, so it's useful for me at least. Okay, so I will use the GitHub writer to explain one more thing about CKEditor 5. So now we, let's say, change the part of this presentation to the more technical one. So how is it actually possible that we injected CKEditor 5 into GitHub? Since GitHub is actually operating on markdown, so that's because of the architecture of CKEditor 5. So basically if you input HTML to CKEditor 5, it goes through HTML data processor to convert it into a model, which is an abstract presentation of the data, and the same if you ask CKEditor 5 to return the data, it goes through the, let's say, data processor, let's say, to output HTML. So we replaced the HTML data processor to markdown data processor, and that's it. But this should give you an understanding of what's possible, because in theory we could replace the markdown processor with JSON data processor. So perhaps someday we'll introduce some more block-based oriented variation of CKEditor 5 next to classic HTML that outputs something like JSON instead. We'll be interested in something like that. Just feel free to reach out to us because we would like to actually understand how to propose such an editor. Yeah. So in the last part of this presentation, I will quickly introduce you to the CKEditor 5 plugins development. So let me check something. Okay, so anyway. Yeah, let's switch to the plugins development. I was sure that I have a warning here in the presentation, but I can't find it. Basically, my expectation is not that I will teach you how to write plugins in like 10 minutes. It's more like to inspire you. And there is a sample plugin available on GitHub. You can go back to this presentation to get a taste of it, but it's impossible to learn this so fast. At least I'm not able to. Okay, so before we switch on to that plugin development, I just wanted to say one more thing about Webpack DLLs. I will actually probably repeat myself. So basically CKEditor 5 uses some modern ES6 JavaScript, so it's being bundled with all the features you need in the ahead-of-time build process. So this wasn't suitable for Drupal, where plugins should be added actually dynamically through country modules. So we had to, you know, ship this Webpack DLL support. And I'm actually not able to explain what they do inside. So basically it's about placing one magic file with the DLL handling code for Webpack configuration and it magically will make it happen that your imports between dynamically added files that they will work. So you don't have to understand it. Just like me, we have like a special DevOps team that handles that and we just consume what they do. Yeah, so in the sample plugin, you will find like the part of code that you have to use to give support for Webpack DLLs. And you can do it this way or you can actually use our CKEditor 5 package generator. That is actually producing a nice plugin out of the box with things like ready, I mean, there's like some simple code that shows how to write a plugin. Basically, there's a code of a plugin that defines a button and does something. There are tests already included. There is a code to actually create a DLL out of this sample plugin. So basically, I encourage you to give it a try. It saves a lot of time. There's life reload also available and so on. Okay, so let's see this whole module plugin development in action. We'll create a sample module that will add two columns layout in CKEditor. So this is an example of a widget. Again, you see this like additional features around this widget. And remember that widgets can do really magic things. So for example, we can restrict what HTML is supported inside widgets. So if you'd like to have a widget with something like title that just supports text or just basic formatting that's possible too. Here we just define two columns layout. The source code is available on GitHub and this is like a nice example of open source cooperation. It was based on previous attempts by Peter Weber and Laurie Escola. I just copied it and fined it and added some comments. I did the code later if you'd like to. So a little bit about how it's structured. Know that there is no PHP required to a Shippa module that provides a CKEditor 5 plugin. There's just a webpack configuration file and some YAM files and some JavaScript files. So in the webpack configuration that I never understand, there is some like definition of an output file, library name, etc. So basically things that I never remember but they have to be there. There is a landscape that actually builds the DLL. This is if you copy the sample plugin that's available on GitHub. But if you use our plugin generator it will actually provide you a little bit more features like building the DLL, life reload, linter, tests, etc. So that's why I'm actually recommending it. Yeah. So about the YAM files required for the plugin, the info YAM file is just a standard module. I mean standard description with some dependencies. The CKEditor 5 YAMLA is more interesting. It describes the plugin that we create. For example, at the bottom you see the elements that it introduces a little bit above the toolbar item that it introduces and so on. And the libraries one, it just like defines which assets to load with extension for both admin and the frontend. So that was the JUPAL part. Now the CKEditor 5 part. Let's start from the simpler things. So basically the plugin will consist of let's say four parts. CKEditor 5 is in general much more decoupled than CKEditor 4. An anecdote to enforce ourselves to have a really decoupled architecture at some point we ended up with like 100 repositories for every single plugin. It was super useful when we actually had to, I don't know, update the copyrights with a new year or have pull requests that were touching like several plugins. So to solve that problem we have to write our own tool to deal with that. So after dealing with that for a long while we ended up with a monorepo back because we spent so much time on it. And yeah. So going back to the reality we have to define the UI. We have to create a comment that will insert those two columns into the editor. We'll connect this comment with the UI so that this comment was executed when the UI is when the button is pressed in the UI. We have to define the schema which actually tells the editor where these two columns can be inserted and where not. And we'll define converters that I will explain soon. So basically four concepts that you have to understand. Don't worry we have it explained in our documentation. Yes. And if you will not be able to understand it after the first reading don't worry. It's just complex. Yeah. So these are all the files that we need to create. The comment one. The main plugin file that loads the rest of files. Editing file where we define schema and converters and the UI file. You know in general you could place it into a single file that just to showcase more or less how those things are split in CK editor. So the main file has just a bit of code. It simply loads the editing part and the UI part. The UI is pretty simple. So we create the button there and we ask the button to actually the editor to listen to the execute event of this button and if that happens the insert to columns command is executed and that's basically all. So changing the topic for a while the main difference between CK editor 4 and CK editor 5 is that CK editor 5 operates on its own document model. We love abstraction. It actually was supposed to help us a lot with dealing with changes in the document and it actually helped a lot implementing things like track changes or return collaboration was much easier. Thanks to that. So in our case we will create two model elements two columns and columns that will have their own representation in the view let's say. So the representation is pretty typical we have section and some divs but in the model this is much simpler. So a little bit more about the model just to give you a better feeling of this part. So on top you have at the bottom you have the representation in the model so we see that the headings are let's say typical paragraphs too but at the same time you see that inline elements are actually just attributes on the text and another interesting thing are the list items. So we no longer used nested list items in the model we have pretty flat lists with attributes that handle the list indentation. They help us deal with nested structures. Okay, so the editing file takes care of almost whole logic. I will go through each method on the next slides. So in the init methods we define the schema and co-vertors and register the comment. Of course the code will go later. The comment itself will insert those two already mentioned model elements to columns and column on the current selection if it's allowed by schema. So here we have also the refresh method of the comment to make sure that for example the state of the button will reflect whether it's possible to inject particular element in the editor or not. So a little bit about this magic word schema. Schema defines rules for the cq editor engine on how to process the model. For example where elements can be placed what attributes are allowed in elements it will be used during editing when pasting content and so on. It's a little bit complex to understand but it's where the power of cq editor is. Again if you were not using general HTML support in your project let's say somewhere without using Drupal just be aware that only known elements and attributes will be retained by cq or 5. So speaking about schema we will tell the editor to allow two columns elements everywhere where block elements are allowed and we tell that the column is only allowed inside two columns container. Now we define converters so another complex word. So going through this super quickly in cq editor 5 there are two different conversions, model to view which we call downcast and for example if you call getData to get HTML from cq editor the data conversion happens so when cq editor renders the model in the wizard area it frequently does the conversion into the editing view whenever it is needed and the upcast conversion so the opposite to the previous one upcast conversion on the other hand happens for example when you paste content into cq editor cq editor gets HTML and transforms it internally into the model also the downcast conversion simply happens when you start cq editor with HTML. So we define some upcast and downcast converters for the main two columns converters using our conversion API I won't spend too much time explaining this but you can check out the extensive documentation if you want to more more. Again the goal is to guide cq editor 5 how to convert HTML to the model and vice versa and we do the same for the column element as well so once we have this module completed we can go to the module screen and find this module and simply enable it remember also to adjust the format configuration text format configuration to add the new toolbar button and if reverting went well you should see a new button in the toolbar and you can should be able to insert this two columns layout so for the better developer experience we created a dedicated developer tool called cq editor 5 inspector this is the thing that you see at the bottom it basically lets you inspect the model the view selection markers and basically everything that will help you to build your plugins you can check our documentation for more info I believe there is also cq editor 5 def module that ships that functionality too you can also attach this cq editor 5 inspector simply using bookmarker it's explained in the documentation if you're using a bookmark in the browser you can inject cq editor 5 def inspector anyway that's almost it but I wanted to mention at the end that there are two additional sessions about cq editor 5 tomorrow Lori will make an event deeper dive into cq editor 5 so check it out and on Thursday anyone willing to work on things related to cq editor 5 may come to our dedicated session where help will be available we will have also some cq editor 5 core team members available online to help so there will be me, Katzper, Lori and lots of folks online willing to help you I wanted to say at the end that we also have a booth during this conference so please feel free to drop by we would love to hear your feedback about cq editor believe me or not what we will develop next depends on you, cq editor users we basically have really feedback driven development so feel free to come to us and say what you would like to see next and give some context what's your application what you're trying to achieve because sometimes it's that we can figure out a different way to solve your problem so that's also important also please feel free to drop by if you are interested in some of those premium features that you showcased so that's all I have for today I hope you liked it and you will give it a cq editor 5 or try if you would like to chat about cq editor or anything else I'm here until Thursday as well thank you the hardest part questions if you have any if you have time, I don't know yeah, go ahead hi, could you maybe elaborate a little bit like on the revisioning system like how the persistence work so basically it depends whether it's together with real-time collaboration or non-real-time collaboration let me explain how it works with non-real-time collaboration basically the module that we ship the cq editor 5 premium features comes with adapters we save those revisions in Drupal database it's not using internally the Drupal revisioning system because we didn't want to break Drupal by adding our own enhancements so we save it as a different entity in Drupal database thank you for your talk you showed us the image handling system inside the cq editor 5 does it play well with core media module and with other kind of medias I think so, because I was trying it out and it worked well basically the core Drupal team was working heavily on that and I think that it has much nicer experience than it had before with cq editor 4 so according to my knowledge it works well last one hi, thank you for good presentation how would you use that in a decoupled scenario? could you maybe render the model in a decoupled way like a graph kill or something like that you mean decoupled headless version of the editor so basically yes the code is super decoupled we have customers that use cq editor for example I don't know if you are familiar with Zendesk support it's quite a popular ticketing system they are using cq editor 5 you wouldn't notice that because they are using their own UI they used cq editor 5 engine cq editor 5 is super flexible so you can replace the UI write your own UI in React or whatever and use just the editing engine and the same with how cq editor 5 operates on the data so just like I said you can force cq editor 5 to return anything else than HTML it's up to you we actually had a prototype even of returning JSON Piotrek who is here was actually doing that for Nios CMS we didn't pursue that idea yet but this is something that we have in our minds to have this kind of proposal next to cq editor 5 so we are not going to replace our default proposal of cq editor 5 we just would like to propose something also different I watched a part of the presentation that was here before about layout builder and I would love to provide some more sophisticated features in cq editor 5 make it possible also in cq editor 5 in some way but I would also like you if you are interested in that kind of functionality to come to our booth and tell us how you envision this kind of editing experience that's it thank you everyone


And now, I have the pleasure to welcome Braydon Keynes from Google Cloud, who's going to talk to us about how much overhead, how to evaluate your observability agent performance, which is a really interesting topic. So give it a applause to Braydon to get started. All right. Is it on? Oh, yeah, there it is. All right. Cool. So hi. My name is Braydon, and I'm going to be talking. I worded it differently on this slide. Maybe I should have checked before I wrote that.  Everybody had way cooler slides than me. Observability agents are one of the most important parts of our—oh, shoot, it's not changing. There we go. Here we go. There we go. Observability agents are quickly becoming one of the most important parts of most modern infrastructure, especially in scenarios where you can't go change an application and add a bunch of instrumentation to get metrics, or you just need to get the system metrics running alongside your application. When you're installing a new piece of critical infrastructure on your VMs or in your clusters, one of the first big questions is what's the overhead? What's the effect that this is going to have by installing it on my system? Unfortunately, as important a question as this is, there isn't really a straight answer. Observability agents are—yeah, I love this picture. Observability agents are by design an orchestration of essentially tiny little programs that you can put together to do any combination of things that you want, which means that asking what the overhead is, you're not going to get an authoritative answer. But in this talk, I'm going to try and explain ways that we can rephrase the question to get more valuable information. First I'll explain who I am. My name is Brayden Keynes. I'm a software developer at Google Cloud. The team I'm on is called Collection Services. We're focused on making the telemetry collection experiences the best they can be, and the best way for us to do that is to work in the open. So I'm heavily involved in the Fluent Bit and Open Telemetry projects to try and make it better for everyone. And I'm also the creator and maintainer of a tool called the Amelfimp. So if you want to come yell at me about how it doesn't work on Helm charts or something, you can come find me after. If you're a Linux user, you're probably going to be familiar with a command like this. The Unix philosophy is tiny programs that do one thing and do them well, and they work by stringing them together to get new use cases that you couldn't have imagined on their own. In this example, I have a command where I grab some information about a process from the system. I grab some sort of information out of it.  Now if you're familiar with observability agents, you'll probably recognize this pattern as the same sort of pipelines that you're creating in your agent configurations. Observability agents are generally the same pattern of you ingest the data either through pull-based or push-based ingestion. You process that data to transform it into something more useful. And then there's a stage where you can export it to different backends, and there might be some work to translate it to different protocols to send it to a compliant backend, or you're sending it to some very specific bespoke major cloud provider or something like Prometheus. Unfortunately, observability agents don't look like the last slide when they're configured for production. They look more like this. You can configure your agent to have any number of different pipelines, and those pipelines could have varying amounts of complexity. And that's why asking what is the overhead is not always going to be such an easy answer if you don't know what you're going to be doing with it. So I'm going to try and rephrase the one question, what's the overhead, into three different questions. Where is my overhead coming from? What can I do to try and improve it? And how do I try to evaluate it for myself? To do this, first I have to define what I'm calling overhead and how I'm thinking about it in this talk. It's generally a combination of resource usage measured against throughput. So resource usage is being memory. I mentioned resident set size here. I was the one who raised my hand and said that last time, and I got an egg on my face. But I think for that scenario it made sense. For this scenario I think resident set size makes sense, which is resident set size is the amount of memory that the process is actually taking up in the system, which for an overhead snapshot might be more useful. But what Brian said is true, there's no one memory metric to rule them all. CPU usage is a little bit easier because you can measure the CPU time of the process, and that's a little bit easier to get a more solid answer on. Disk usage is important, especially if you are configuring your agent, which is something I recommend to do is configuring your agent to buffer data on disk so that you don't lose it in tragic scenarios like network outages. And all of these things will be measured against throughput, which depending on the type of signal it might make more sense to talk about data point count or it might make more sense to talk about bytes per second count. I'm going to start going through each stage of the pipeline. I'm going to talk about my experience in finding some potential performance challenges or potential misconfigurations in each one. And we're going to start with pull base ingestion. Pull base ingestion is the mechanism of going out somewhere, getting data on an interval. So most people will be familiar with things like Prometheus scrapes, where you're scraping a Prometheus endpoint to get text metrics. Another common one is open telemetry collector has host metrics and it'll get information about either all processes or you can ask for a specific process. Or you might be familiar with some third party application receivers in hotel contrived like Apache, which will query the server status URL. Some of the challenges with pull base, I think the nice thing about pull base ingestion is that it's under most circumstances a very predictable size workload and it's happening on an interval. So really the biggest problem with measuring the performance is just how much data you're actually going to be working with. My favorite example of this is with Prometheus scrapes, specifically the scraping library has a limitation where because of the way the Prometheus metrics format works, you kind of need to have the entire buffer ready to properly parse all the metrics out of it. And that requires the Prometheus library to make an entire copy of the scrape in memory. We've had scenarios where we've helped customers with Prometheus setups where they have like 160,000 metrics or something like that and the agent takes gigabytes of memory to try and process that, especially if you're on too short of a scraping interval. If you're scraping too quickly and you're scraping lots of data and especially if you're not using things like scrape timeouts to control that, you're going to overrun your agent while it tries to finish the last scrape, then there's a new one, tries to finish this scrape, then there's a new one, you can really get yourself into a bad scenario with that. Scraping implementation is something that users don't always have a good control over, but there are examples of scrapers that aren't necessarily implemented as efficiently as they could be. I'm quite familiar with Open Telemetry's host metrics process scraper, which is not very efficient when it processes these metrics because of the underlying library that it uses being targeted for a single process and when you try to do that same thing over and over again, you're doing a lot more work than you technically need to. This is something that users don't really have control over unless you know how to want to contribute something that is better than what's there, but it's something worth keeping an eye on. Push-based ingestion is the opposite of pull-based, where instead of going and sketching data from somewhere on an interval, you're just opening yourself up to the world to receive data. I put file here, if you're familiar with the implementation in files, it's kind of more pull-based, but anyways, I'm considering it in push-based. You could be writing logs to a file, or you could be opening yourself up for something like Prometheus Remote Write or Yeager Open Telemetry on your agent. The big challenge with push-based data is, unlike pull-based, it's not a very predictable workload. You need to have a lot more intimate knowledge, I guess, of what you can expect to push into this, but there's nothing stopping you from writing way more logs in one second and then nothing for 10 minutes. Those sorts of bursts of data can very easily overwhelm the pipeline if you're not ready for them. Something I'm going to be talking about later is back pressure and batching and how to deal with when you potentially are bursting data. If you're configured for file system, you can overrun your disk really quickly, or if you're not limiting your memory, you can overrun your memory really quickly if you're not ready for these sorts of bursts of data. Oh, yes. Most agents have kind of worked around this by now, but I decided to put it in here anyway, especially if you're someone who's running an old version of Fluentbit or something. There can be issues where, if you're tailing a bunch of files, for example, but one file is way busier than the rest of them, there used to be issues where the main process would be starved because it's so busy processing the one busy file and it keeps on accidentally prioritizing it. I haven't looked into how open telemetry handles this, so if you know more about that, please come talk to me after because I actually want to know how Open Telemetry handles this scenario a little better. Processing is the step in the middle. It's where you want to try and do something useful with your data. Maybe you want to filter out unwanted data or you're transforming it. You might be doing structured log parsing. JSON and regex logs are very popular. There's Kubernetes filters and processors in most popular agents that will fetch metadata from the Kubernetes API to enrich your logs and data. And what's becoming more popular is Fluentbit Lua and Wasm and in Open Telemetry, Wasm processes in the middle that let you do a lot more advanced processing in your pipeline in case there's something that the default processes aren't going to do for you. The biggest challenge with this is mostly that you do anything on a pipeline that's handling megabytes of data a second.  Where the plugin actually runs in the pipeline is becoming more important, especially now with Fluentbit and Fluentbit 2, what Eduardo talked about with processors instead of the old filters. Processors can run in input and output threads instead of the old way which is filters running all in the main thread. It used to bog down the performance, but processors are much better. So if you are in a scenario where you can move to a newer version of Fluentbit and try processors instead of filters, I highly recommend it. I've had a lot of success with them. Another example is on tail input. There are in hotel and Fluentbit and I think in vector, there are ways for you to on a tail input specify a parser that happens before it makes it to the rest of the pipeline. This could be like a JSON processor or a multi-line processor. And that's really convenient for understanding the pipeline and sending it through, like you don't have to send it through a JSON processor first. One of the problems with that is that if you're overworking the tail plugin with also doing the parsing, you can really hamstring how fast you can read data out of the file because it's so busy doing other stuff. We've had some issues with the Docker log processor on the input tail plugin in Fluentbit where instead we just decided to move it off to a filter and it was a crazy, crazy performance improvement in comparison to putting it on the tail plugin. So that's something to keep an eye out. JSON is a data format that for some reason we've universally decided is the default way to communicate with computers, but unfortunately parsing it is very difficult and slow and hard. And it can be a real problem when you're trying to parse something, especially that is deeply nested. If you're trying to parse deeply nested JSON logs, you can get into a lot of trouble. We had some trouble in the Google Stackdriver output plugin where someone was trying to log a MongoDB query that kept on going in and in and in and in and was crashing the process. And so if you have really deeply nested data, that can be a real problem. But really JSON is just slow in general, especially if you're running it on all your logs. If you're JSON processing every log you're putting through. Exporting is the final stage. Now that you've done all this nice ingestion and processing on your data, you need to put it somewhere. You might be sending it to one of the major cloud providers. You might be remote writing it to an external Prometheus. Or you might be sending it to an OTLP-compatible vendor or even another agent. The biggest challenge with exporting is that most exporting happens over the network. And all the problems with sending data over the network are going to come into play here. Sending data over a network is never going to be as fast as sending data within the program. And it's very easy for your input to outpace your export. And that's where we start getting into problems with back pressure. With batching and back pressure, you can handle these bursts of data without losing it. If your output is still so busy looking at data, trying to send out the network request, maybe you're just having one slow API request that's slowing everything down. If you're not sending any back pressure back, you're just going to keep on building up memory, building up memory as you try and hold on to all these logs without dropping them. Batching is a good way to deal with this, where if you batch your data up a bit larger, you might use a little bit more resources, or it might take a little bit longer to buffer up enough resources to send it out. But if you're batching up more data before you send it out, then there's less overall requests that need to be made for your throughput. Overall, when you're dealing with batching and back pressure, it takes a lot of experimentation to find the right sizes, though, especially because the hammer's got to drop somewhere. Like if you are putting through so much data and you are not having a big enough batch size, you're just going to lose data eventually, especially if you have other things on your collector like memory limiters. If you have other things that are trying to limit your usage, eventually you're going to lose data if you're pushing through too much. So it takes a lot of tweaking to get that right. Threading, if you're running FluentBit and your output plug-in doesn't support threading, you should ask them to. I don't think there are any that don't support it at the moment. I think pretty much everyone will. So if you are having trouble with sending data fast enough, I highly recommend increasing the workers or at least leaning into the threading implementation of the agent where you can. Because exporting is really the only step in the pipeline that can easily be parallelized. Most backends can handle time stamps being a little bit out of order if one worker sends it a little bit faster than the other, usually they will be able to reconcile all that. So it's really easy to set it up into, if you set it to like eight workers, for example, that means a thread pool of eight workers sending data at the same time and it can really open up your pipeline if it can send data along. At least it can dispatch it to the thread pool and let one of the workers figure out the slow part. So the last question we need to answer really is how you evaluate it for yourself. If no one's gonna give you an authoritative answer on which agent is the best or what sort of overhead you can expect, you need to figure out how to find it for yourself. And the only way is to try running it. If you are able to replicate your production environment and try installing the agent, configuring it and watching some of the metrics that I mentioned in the earlier slide, that is by far going to be the best way you're going to get an answer here. But in case you're not in a scenario where you can really easily replicate your production environment, I have some ideas for test workloads, some of the things that I've done to try and do a little bit of benchmarking on our own products. Using a log generator is sort of the obvious default one. If you're testing a log pipeline, there's a really good log generator from AWS called AWS log bench or maybe they'd call it like something bigger but I would call it AWS log bench. It lets you specify a size for your logs and a rate per second to send them. And that's a good way to get answers for like if you're at 100 megabytes a second of logs, some ridiculous number, like what's the overhead going to look like and you can test it at different amounts. And you can test it by sending it through JSON processors or sending it through 14 modified fields or something like that. You can try and test the limits really well with a log generator. Log generators aren't always the most, they're very synthetic because they're sending data at like a specified per second, same amount, same logs. It's not the most realistic environment but it's a good start if you want to test the limits. If you're scraping Prometheus, if that's the main thing you're going to be doing with the agent, it's actually very easily to replicate it because you can take a copy of the text scrape and if you don't expect that to change much, setting up a mock server with just that text scrape is a really good way to get a sense of what kind of resources you're going to be having because the changing of metric values or adding new labels can be changed. The changing of metric values isn't really where the resource usage comes from in Prometheus, it's about processing of the scrape. So if you can at least set up a mock of your scrape of like what the shape is going to be, then that can be a good test workload. Why can't I read that? Oh yes, of course. If you are scraping metrics and you can try and force high cardinality scenarios to test the limits, this is especially important if you're scraping, if you expect to be scraping like a database. Database metrics are one of the first ones that will go a little bit crazy in terms of cardinality because there'll be a time series per table or per replica or per table in replica or it depends on the database. If you can find a way to force more high cardinality scenarios like you can scrape an example database with tons and tons of tables, then that's a good way to sort of stress the limits of how the agent acts when it's pushing through too many points.  Trying to do less is sort of the obvious one. It seems pretty obvious when I put it that way, but generally if you're doing more, you're using more resources. If you can find ways to reduce how much you're processing, if you can reduce the size of your scrape or if you can offload the work somewhere else, which is my favorite way, that is the best way to do it. If you can, if you have a backend that will do the JSON processing for you, I mean, that would be a dream world if that exists. Cause if you could just shovel JSON, raw JSON over there and let them do the JSON processing, that would be great. But I'm also pretty bullish on like aggregator nodes where you have lots of agents who can handle data being pushed to it. It's a lot easier to manage one location of agents and try and scale that out than trying to deal with agents all across your fleet doing too much or growing too big. If you are truly in a scenario where you think you have an unacceptable performance or you've found a regression in some upgrade, when you do open it in issue for maintainers, make sure that you have good information and it's hard to say authoritatively like what is the right information to always include, but really any information helps with performance stuff. Cause a lot of the performance issues that are open in these repos are about things that maintainers will never be able to access. So making sure that you have ways to replicate the performance issue you're seeing, making sure you can include graphs or CSVs, making sure you can include Linux Perf reports or Pprof profiles. Any of this stuff is going to be very helpful for maintainers trying to look into performance issues. And I think that's everything. So thank you. My name is Braden. You can find me on the CNCF Slack or on Twitter. I had my Twitter up there at some point. Anyways, yeah, thank you. Another question, hey. Great, thanks. Of course the obvious question is which collector is the best but I understand why you didn't want to answer that. Maybe you could answer what do you use in Google Cloud or what do customers of Google Cloud are using and why are you considering a change and why? Yeah, so I probably should have preface the talk with that a little more. But my team, one of the main things we work on is the Google Cloud ops agent, which is I call it two agents in a trench coat because it's under the hood, it's a fluent bit, collecting logs and open telemetry, collecting metrics and traces. And that's mainly we have a central config layer that will generate configs for the underlying open telemetry and underlying fluent bit with the sort of recommended tunings for folks running on primarily VMs, like plain VMs. Collecting metrics using like we use the host metrics receiver by default. We have a lot of third-party applications so like the Apache receiver, the Nginx, all the database receivers, we use all of those and we also do have support for Prometheus. We have a Prometheus receiver that a lot of folks have started using and an OTLP receiver that is less people are using. That's mainly what we use and so the reason that I think about all this stuff is that we're trying to make the best recommendation when we generate these configs for people, they don't really know what all the knobs are so we've tried to find the right settings for the knobs. That's kind of why I'm thinking about all this. Can you also speak to horizontally scaling these agents in case like the application is big and you have to send the logs and metrics to multiple agents, what are the best practices to do that? Sorry, can I hear that again? Can you, okay, yeah. Can you speak to the best practices to scaling the agents as well, horizontally scaling the agents if the number of application parts is growing then how do you decide which agent to send that particular log or metric to? Right, so it's about best practices for scaling the agent and deciding which agent to send, like what to send where. I think it does, I don't have a lot of experience with scaling the agents in the aggregator node like I mentioned. Yeah, I don't have a good answer for that. In terms of deciding what agent to send where, I think if you're not doing a lot of processing, basically any agent can shovel data super fast except for fluency. Every agent can send data super fast without any processing in the middle. It's so it doesn't matter too much and then it's gonna come down a little bit more to functionality but in terms of performance, yeah, you kind of just have to try it. I think is the best way to tell but I've really liked working with Fluentbit. I think there's not a big upfront cost like OpenCelementaryCollector being a go program. In our experience, we've seen more usage in that than in Fluentbit by default but it does kind of depend on what you're doing with it. Thank you, Raydon.