My name is Niklas. I'm CTO of the Swedish company AdToma. I'm going to talk about how we build our software called Fusion, what decision we took and why. Hopefully I can give you some advice on what to think about when building new applications and selecting new technologies. And in the end I hope I will give you the answer if you can make more money faster selecting a no SQL rather than a traditional SQL database. So, we're working with ad-serving. So what's up with that? Isn't that just showing a randomly selected static image on the web page? Well, that was true maybe in the beginning of the internet era, but that's not so today. Why is building ad-serving application costly and complex? Let's look at a typical workflow to start with. You have a publisher, in this case I used Boston Compost as an example, that published their media content online and on those pages I want to show editorial messages. Then we have the advertisers that want to buy inventory from the publisher to show their ad message on the pages. They can then buy directly from the publisher or they can use an agency. Agencies often bulk buys inventory from the publisher to get better offers. And then the publisher uses one or several systems to publish the editorial messages on their web page. And the number of visitors can be quite substantial. It's not uncommon that the publisher has up to 1,000 visitors per second on their home page and that gives you 2.6 billion page views per month. And if you have 5 or 10 ad spaces, you multiply that and get 10 to 20 billion ad impressions per month on a single page. And for each and every one of those ad impressions, we try to do as much investigation about the viewer as possible. We try to find out where he's been before prior entering this page. We try to find out the third party plugins that are supported. And if possible, we try to profile the user to find out genders and so on. I'm just going to give you quick history and information about the company and myself just so you will understand why we took certain decisions. Atoma is a provider of a complete ads of solutions. And it was founded by alumnus from DoubleClick. And DoubleClick was later bought by Google. And Google is, as you are all aware, a small and tender competitor. In the beginning, Atoma offered ads of solutions from a company called Checkmate that we started to develop our own product in 2007. And that's when I was fired as a CTO for the company to build this new application. We released the pilot in the same year. We have customers worldwide. And we saw more than 18 billion ad impressions through the system today. That's rather old figure. I think we're around 20 to 25 billion ad impressions today. But I know about making complex applications using data persistence. I've been a developer since the mid-90s. I've always worked with object-oriented databases, persistent storage in SQL in some way. I've developed complex business intelligence systems, warehouse systems, retail systems prior to entering the ad-serving business. And I work with the traditional solutions as SQL server, side-base and what come and so on. I also have experiences from using data mining databases like Vertica and ClickView. And lately I've been experienced in no SQL and new SQL databases. Okay, so back to the product. What was it that we set out to do back in 2007? We wanted to replace the current ad-serving solution with a much faster and much easier to use application. We wanted to be able to use high-quality algorithms not just to select the perfect ad for the current visitor, but also to forecast the future. And that means we need to use a huge amount of historic data to project into the future. We would like to deliver at least 15 billion ad impressions per month and server. And we wanted to simplify the user interface to make the complex become more easy for the user to understand. And I said that normal publisher uses five to ten different systems to do the whole workflow for delivering ads online. And we wanted to make that possible to do with just one single system. And that means that the system needs to handle customers, orders, proposals, inventory reservations, finance like invoices and so on, and also reporting and business intelligence. And we wanted to do this with a limited time to the market. And that is really crucial because we had a very small budget to start with. The most important part of an ad-serving solution is of course delivering the ads. If you don't deliver an ad, the publisher loses their revenue stream and that means that we will get no money either. And there's a lot of requirements to consider when delivering ads, not just that you cannot accept in a downtime at that moment. We need to try to find out who is the current viewer. Let's keep the diapers commercial away from the bachelor sitting at home eating pizza and looking at NBA sports. It's been shown before. Maybe it's time to show another, the same editorial message but use another image than we've shown prior to this view. What technology is supported? Can we show flash ads? Or do we need to stick to static images? Should we apply frequency capping? We might just be allowed to show this ad twice an hour or maximum 10 times a day for a unique visitor. And also we might need to apply some retargeting. And that means that we need to try to find out the browsing history of the current user. So if you browse a lot of sport pages, we will increase the possibility for you to show sports related ads. And most important to the publisher, which ad brings the most cost effective view at any time. Let's try to keep the margin as high as possible. And to be able to deliver and make reservations in the future, we need to try to forecast the future and try to predict how many visitors will be at any time. Try to figure out how many page viewer page will have in the future. Just trying to find out how many times will this be viewed to any user at all. That's kind of easy. But we need to be able to filter down using key values. So to start with we project the future using a huge amount of historic data. And on top of that we apply curves to adjust to the season of the year, adjust to Christmas time or holidays or whatever they might be. We might also need to adjust to a specific event like the finals of American Idol or something like that. And then we need to be able to find out how many inventory there will be for specific key values. That means apply the frequency cap as I spoke about. Try to find out how many unique visitors there will be in the future. We might just get paid for a unique visitor. How many females will there be visiting the pages in the future? We might just want to target a specific gender. And also we might need to target and add to someone that's searched for the word iPhone on eBay. How many of those there will there be in the future? Also we need to try to find out how many will support third-party plugins like Flash. And then we also need to be able to target and add to a specific location. Maybe we just want to show that in California or San Jose only. And not only that, there's close to infinite ways to combine these key values. So there's a huge amount of data to investigate at all times. I went deep into the hard drive on my computer and I found the very earliest sketches set out by the founders. They wanted us to implement a heat map to show what inventory would be available in the future and also view the current orders that was in the system. The competitor system showed the same information using huge amount, or not huge amount, but a list of data tables that you need to look through finding values that could figure from 10 to 10 billion in the same column which makes it very hard to find information that you need. And it's a really tough requirement for us. You should be able to load this heat map in just a few seconds. So we started to work with that and tried to pack as much information as we could on the X and Y axis and then use the coloring of the heat map as a third dimension. One big problem though is that each and every cell in this heat map on thousands and thousands of counters on which we need to apply forecasting. So could we be able to do this in just a few seconds? We could if we could find a database vendor that would make our server side really fast. And as I said, we had very limited funding to start with so we need to have a very cost-effective development short timeline to the market and then use as few developers as possible. So we need very easy to learn APIs a very uncomplex development environment and as few points of failure as possible and that basically means that we need as few lines of code as possible. We wanted to be able to serve as an ASP solution as well as license models and we also wanted to be able to run the complete solution on a single developer's computer and we wanted to use a finely granulated object model so we need performance for that and using a traditional SQL database definitely leads to negative performance using finely granulated object models. We looked at the options we could try and use a traditional SQL database. They have their advantages they are well tested, well verified they won't be that many surprises during the development and we would be able to set a very accurate timeline for the project although it would probably not be a short timeline but it would be pretty accurate and the disadvantage is that it would be costly on top of licenses we would need to hire a database administrator and the development time would be longer because we need to implement source codes in more than one area. We need to implement database schemas, application code and then some layer in between to translate between the different layers. We can also try and find a mix of technologies let's try and find a vendor that's best suited for the ad deliveries and another vendor best suited for the back office functionality and then maybe a third one to support the data mining and reporting or we could try and find one vendor that would suit all our needs. If we should go by the traditional route we then need to start by implementing object model in .NET or Java, define the database schemas make a layer in between to translate between the different layers and try to get performance by scaling up the hardware and we also need to in each and every upgrade and patch we need to upgrade both the database and application code in parallel educating developers will take more time and that leads to scaling development department will be much harder let's look into some example code I've used MySQL and Hibernate if we should select the traditional solution we then would need to define the database schema where we would define data names, property names, tables, relations, data types and so on and then we need a layer to translate between the database and application and of course we need application itself. Here we would once again define property names, data types, relations and so on and hopefully we will use a good pattern to implement them pretty similar in the database schema and application. There's a lot of code just to do a simple task in the system. In our previous lives we had all used traditional SQL databases so we disregarded that solution and wanted to try to find the no SQL or new SQL solution to use in our application but we were looking for more database that would support the performance that delivers and the performance for the back office functionality with inventory and forecasting and so forth as little as possible during development we would like to avoid database schemas in whole and of course scalability and performance even though we would use to implement using fine granulated object models. Now it's time to try to find a vendor that could hold our hands during this project. We were looking for scalable and reliable database even if the performance is fantastic we cannot lose data at any moment and as I said we cannot accept downtime in the ad delivery at any time. We want the database to update the database schemas using the program date, classes, properties and fields and of course easy to use API and a huge amount of performance. We looked into the market and there's quite a few good ones out there. Among a few notable that we tested were Matisse FastObjects, DB4Objects, StarCounter and quite a few others. We ended up selecting StarCounter mainly due to that StarCounter offers really high performance for transactional data. They can handle more than 500,000 transactions per second and CPU call. It's scaled really well. You can run the same server on your developer's computer as you do on your main server. It has full acid support so you don't risk losing any data. It works in memory but it stores and secures the persistence by writing transaction logs on disk. And there is no database schema. You just inherit one class in StarCounter and that's where you end your database programming. So we should look at the same example as we did with MySQL and Hibernate using StarCounter API instead. How would that look like? To start with we have no separate database schema at all. Hence we will need no traversal layer. You just do your application code. And it's very neat and tidy solution. Even the best of developers tend to add more bugs the more lines of code there is. Or that might just be me. Sorry. Now with selected technology and vendor we set out the following timeline for the project. We wanted to spend as long time on specifying and experimenting with the technology as the actual implementation and testing itself. We gave ourselves six months to implement and do the testing before the pilot. And looking at the StarCounter timeline it pretty much matched what we set out to do. Finding four skilled developers proved to be much harder than we expected and educating them went really fast. And then we used Agile Scrum methodology to reach the pilot and we released the pilot in December of 2007. And that pilot had both add deliveries and back office functionalities. We did one crazy decision. We had the opportunity to run one of the largest media houses in Sweden as the pilot. I would recommend that you use a smaller vendor or customer than the largest one. They were willing to take a small risk to get a better solution for the add deliveries and for the sales people. And in the end we succeeded with the implementation. We worked 36 hours straight for tweaking and fixing the algorithms for add deliveries, fixing bugs and so on. If we look at the infrastructure that we used for the pilot and that is basically the same as we use today. We have the back office where we handle inventory, forecasting, orders, invoices and so on. And that service is available as an ASP service. System users and administrators can access the back office service using HTML5. Well not in 07 because we didn't have HTML5 then. Or they can use WPF. And then we have the front end service that handles all the add deliveries. They are multiplied not due to that StarCounter can't handle the pressure. We also have the Windows and the network connections of the poly and we need several fallbacks. And this serves the ads to the actual web browser users. And at their sites we try to run scripts and cookies and try to find out as much as possible about them. And of course they are just happy to see all the ads. Did we reach the goal? We deliver more than 12 billion ad per month than for a customer. We can run all our customers on a single server. We store counter data per hour on multiple levels throughout the system. We have very user friendly interface and very low server hardware requirements. And we had a short timeline to the market and we used very few developers. So I would say that we succeeded and exceeded expectations. We implemented the heat map and added a few add-ons. The user uses the same user component to see what's been occupied in the inventory and also make new reservations. The safe person can use the system talking to the customers on the phone, make the reservations, put the ad online while the customers are still on the phone. And to my knowledge there's no other competitor today that do that. Stability and uptime, that's really important. We have more than 99.999% uptime in the front-end servers. And they could be 100% if we didn't have a major power blackout during a thunderstorm in the hosting service. And of course the UPS failed at this very moment. So lesson learned was to have a UPS for that UPS. And we have a service level of more than 99.99% in the back-office server. And the only downtime is during major upgrades and patches. We serve all kinds of ads as you can imagine. The traditional static placements, corner folding ads, or other interactive ads where the system user or the browser user needs to interact with the editorial to see the message. Transparent layers, you can encapsulate the whole page. And of course you can embed the editorial message in the video player. We serve to any device that's connected to the internet. It's PC, internet or we even serve in-app editorials. I think I did this in record time. Do you have any questions? A sample of the code. Which one? The hibernator or the stalker? There's actually very few lines of code. Or any specific thoughts about... You said you had no schema, but I thought, let's see, he had a bit in his record and how many some kind of index... You can hint to the stalker directly in the code that you want an index on a specific property. Or you can add an index5 and it will be loaded with the next reload of the database. So you can make hints to the stalker on what index to use to get performance. Yeah, try and use this. But you don't define any separate schema, it's just the performance with the indexes. Because we don't implement the database schema and the code in between to translate between the layers. So instead of implementing three source codes for the same task, we just do one time. And it's just inheriting a base class in StarCounter and then that's basically it. And it's really easy to educate developers using this. Since they don't have to learn any... Well, it's good if they know SQL, but they don't need to know any specific database technologies. Well, let's have a topic. Does each class has a corresponding physical file? No, everything is loaded into the database. And as I said, it works fully in memory. So they load everything into the memory with their own. I don't really know how to do it. So you don't get a single file per se, you get one database that's loaded into it. Well, it is the file in this... Even in memory, it's not... You say you just need a class, right? You have a pop feature in the class, you have a nice class. So you can create a new one. You can create a new image. So how do you store this... They actually use the virtual objects that are created by the .NET engine. So they don't create separate objects. It's the same object as your program that's stored in the database. You can get much better information. So our counter is up in the exhibition. So if you want to go in depth there, they have the CTO is really good. So let's see. Okay, face one. Then you have a need that takes information from one whole object. Yeah, they support SQL as a query language to find information. So you can use SQL and then you get a chunk of objects back from the SQL engine. So that's just a view or a reading material? It's there. Two objects that you get. So you can query the objects and then you can modify the objects with properties and fill directly in the results set. SQL language is used to fetch information. Yeah, it's embedded. I don't have a sample code to show that, but it's really simple. And the good thing is that you can query both on actual fields and then on properties that you have get and set properties in .NET. So you can query either one of them. Okay. Thank you for listening. I will be around the exhibition if you want to talk some more and I will be up with the stock counter, guys. Thank you.


Hi everyone, Joe for Jasper's Case Breaks.com, a late night rally, 2022, Panini Prison World Cup coming at you. Six box, half case, pick your team number eight. It was a combo team spot that we sold as well. This break sold out straight up. Now eight sold out before seven, so we got it first to fill, first to break. So we're going to do eight first. There we go. On Wednesday the 16th, pick your team eight. Dennis going double last bond mojo with Brazil and Portugal. Scared money, don't make money. So let's see if this case comes through for him. There you go. Yeah, there he is. Thank you, Dennis. And there's Robert with the 11 team combo featuring those teams right here. All-card chip. And this is an awkward size case here. Let me just rip it open here. All-card chip, and this is a World Cup promo spot as well. So at the end of the break, I'll randomize everybody's names and then see who wins that spot. Six, got six right here. And the other six we'll put right over here and then we'll roll the die. Wow, Dennis says, don't think I've ever bought into soccer. I know very little about soccer. I appreciate your boldness even more then. But I suppose you can kind of do the math, right? The expensive teams are probably the better teams, which they are. You know, most times you're getting what you pay for, right? Now, the case just has to cooperate. One, two, three for the left six. Four, five, six for the right six. And it's three. We're going to do the left side right here. So this is pick your teammate. This side we will say for break seven. Pick your team seven, which is in a filler right now. So we'll mark those seven so we know that they're from the same case. All right, there you go. And here we go. He got Brazil and Portugal still. I mean, Brazil's all, you know, obviously some great teams there are great players that you can get there. And Portugal, I'm sure you know, or at least have heard of Cristiano Ronaldo, right? Place for Manchester United, you know, he probably has one of them. Maybe one of the people that has the most followers on social media in the world. He's Portuguese. So hopefully we'll find some of those here. And you got a chance to, you got a chance to win a World Cup spot or promo spot. If you win that promo spot and we ran eventually when all those spots are gone, we'll randomize everybody's name, we'll randomize you a team. And then you get to kind of track that team throughout the World Cup. And if they, if it's a bad team, you still might win some prizes. All the details are on jaskyscaseface.com. So this is the first of six. This is pick your team eight, which filled before seven. Seven's locked away and in some fillers, but I'm sure we'll get, we'll get those knocked out tomorrow. One autograph per box on average. All-card ship. And away we go. We got Noah Lang for the Netherlands. That is for Matthew. You got Noah Lang Silver. That's for the Netherlands. That's for Matthew. We've got Youssef Poulsen, 001 out of 299. Blue parallel for Denmark. That'll be for Brett. Jonathan David, one of the bigger names for Canada. And behind Kai Havertz is Bakare Sanya. International Inc. for Le Bleu. Chad Cromwell picked up France straight up. On the board with the first of six autos here. We've got Red Yvonne Perisic to 399. Global Rich Fabinho for Brazil. Julian Alvarez, rookie cracked ice. Those are not numbered, but still nice. Argentina Aaron with Argentina. Now even these base rookie cards, if you get those, it's worth looking up. You know, you may be surprised at some of the value of these, of just even base rookie cards. Not all of them, but some guys. There's Ismailisar, 44 out of 99. Senegal. And might be worth holding on to these guys for another four years, especially the rookies because, you know, next time, the next World Cup in four years will be in North America. So if you thought interest in the World Cup was, you know, was big now, just wait till it's here. There's Rafael Liao, 12 out of 299. Or Liao, I think. More of a Liao, Liao. I don't know Portuguese. Not good at that. That's going to go to, uh, it's going to go to Dennis. Got Portugal straight up. All right. Next box. Let's see if we can find some of his Portuguese teammates. Ronaldo, Jalphilish. Liverpool, that's my club, the English Premier Club, the club that I follow. Diogo Jota is on that team as well. Portugal has a decent blend of sort of young, exciting talent, balanced with a crafty vet. I guess Cristiano Ronaldo is now like a crafty veteran player now. Older guy, you know, with a little bit of luck. They may, they may be getting into, should be able to get into the knockout stages of the World Cup. I guess it's supposed to depend on what group they're in. I haven't memorized the groups yet. They're in the Portugal Ghana Uruguay South Korea group. They should be able to be in the top two there to advance. Portugal's got to be one of the top two. And then it probably comes down to either Ghana or Uruguay. I'm not sure if South Korea is going to do, unless Hyunmin Sun just goes off, but I'm not sure if South Korea is going to do too much in that group. All right. Next box. We got Tyler Adams for the United States. Pink parallel, not numbered. Kim Soo Min, hello. No love for Korea. I mean, if Hyunmin Sun goes off, I suppose he could do it. He could probably carry the team. But I don't know, real is, I'd like, I mean, I'd like to see them. I'm sure my parents would love to see them advance the group stages. You know, every World Cup, they'll bring up a goose-hitting story, you know, but I don't know. This year might not be the year. There's Sergei Gnabry for Z-Germans. That'll go to Kurt in Germany. There's Jal Cancelo, 26 out of 75. Blue Mojo, Dennis in Portugal. There's Ricardo Pepe and Gabriel Martinelli for Brazil. I forgot about this guy, Dennis. Place for Arsenal. And one of the bright young stars in the English Premier League and in Brazil. Ricardo Pepe, of course. Not on our World Cup squad, Ryan Hines, but definitely in four years, I'm sure. How old is Gabriel Martin? My kid's only 21 years old, so. This could be a breakout World Cup for him. And I mean, in four years, he'll be getting into his prime. 118 out of 199. Juan Hechan for Korea. There's Marcelo Flores. It's a rookie hyper for El Tri. That would be for Daniel Smith. There's Diago Jota. Philip Coutinho, former Liverpool man. And we got a red, Jonathan David. 73 out of 399. Not really great on that center. You can tell right away, but... Grant with Canada. Canadians look great in World Cup qualifying. Could they be... Could they be an upside store? I don't think Vegas really favors them a lot. Anyone have any World Cup upset specials that they have that are brewing? There's always an upset. These groups aren't always chalk. Soccer is a game with very high variance, right? With so few goals being scored. You know, a tie game and a point could suddenly turn into a loss with some crazy goal in the dying minutes of the game. And this is tournament football, right? Tournament soccer. Players are given it their all. This comes around once every four years. I don't think you'll catch a lot of teams... I don't think you'll catch a lot of individual players playing low-effort soccer. Unless a team is getting blown out, I think they'll be playing their hardest till the last minute of the game.  Bang. Upset. What do we got? Miquel Damsgar. 8 out of 75. For the Danes, Brett. There's Alistair Johnson for Canada. Rookie Silver for Grant. There is a Red Adam Massina. 321 out of 399 for Morocco. That'll be part of the 11-team combo for Robert. That spot actually has a lot of value in that spot. We got for Serbia, Pedrag, Rakovic, Rookie, Cracked Ice. For Serbia. That's part of the combo. Jack Grealish for England. More Gabriel Martinelli. And for Wales, there's Ethan Ampadou. 215 out of 299. That's going to go to John with the Wales spot. It's killing Mbappe. Bright Young Star for France. That's going to be for Chad Cromwell. Not as rookie, but he's pretty good. The French could be looking at a great World Cup run. All right. Behind Furohashi is... It's Jan Vertanian. For Belgium, International Ink Autograph for Mark. And the Belgians. There's Albert Sambi-Laconga. 148 out of 199. For Belgium. Suman is saying World Cup Upset. Korea goes to the quarter-finals. That would be an amazing run. There's Nuno Mendes. Rookie Pink for Dennis in Portugal. I mean, all the bookies saying Korea to Advance. Let's see, let me just grab some random website. I need group odds here, not just to win. Group odds to win... Korea's at plus 1100. I guess they're just as... Same odds as Ghana. Portugal's the favorite at minus 154. Uruguay's plus 200. And then Ghana and Korea 11-1. It's a bold take. I think the trouble is, I think group H is where Korea is and is going to be facing group G, which includes Brazil. If Korea, if I'm doing my brackets correct, if I have the brackets correct in my head, that means if Brazil wins that group, they're going to face the runners-up of group H, which is most likely what Korea is going to be if they advance. That'll be tough. Now, if somehow Brazil is not... I mean, or if Korea wins the group outright, then things can get a little spicy. There's Jafilish. There's two numbered cards from back to back. We've got Yoshida, 70 out of 399. That's for Japan, that'll be for Mark. And then we've got Rodri for Espana, that's for Raymond in Spain, 18 out of 25. Got some Gopko right there as well. We've got Adam Masina, Rookie Silver for Morocco. That's going to go to the combo spot, Robert. We've got Lovreau, Mejer, 128 out of 199 for Croatia. That'll be for Robert. I guess Korea's got some youngsters here. Kim Min Jae. I don't know too much about that Korea squad. Am I underrating the Koreans? In a general sense, I feel like Vegas does underrate just because not as much attention or knowledge about the markets outside of South America and Europe. Sometimes the odds get underrated. There's Adayemi, Karim Adayemi for Curt in Germany. The odds are a little underrated for African teams and Asian teams. Lionel Messi, wow! Lionel Messi autograph. Aaron Billingsley for Argentina. Not numbered, but this is the stuff that we're looking for. I doubt that Aaron Billingsley is in the chat right now. He's probably going to wake up tomorrow morning and that is nice. We've got Diago Costa, 3 out of 10 for Portugal. That's for Dennis. Dennis has just got an offer from a seller on eBay for a Pulisic manga. I think, I don't know, double check the prices on that, but I know those are short printed. We've got Denzel Dumfries, Pink Rookie. Might be Messi's last... Probably is Messi's last World Cup. It's Kailor Navas. Alright, two boxes to go, offers for 700. Wait, for you to buy or are you selling it? For you to buy. I can't make that decision for you, Dennis. But I would cross-reference it with prices for other similar cards. Like I said, I'm not sure what the market's going to look like in four years, but my guess is that with the World Cup being in North America, that attention for the World Cup will probably be at a level that we have not seen. I mean, the World Cup hasn't been in the United States since 1994, I want to say. So a lot has changed in the soccer landscape since the mid-90s. You know, interest in soccer is at probably at the highest it's ever been and grown. Just for international soccer. You know, the women's game definitely helped raise the profile of soccer in the United States. The strength of the MLS has helped an explosion of interest in the Premier League in the last 10, 15 years. A lot has changed since 1994. But if you're buying, my guess is that the prices are probably the highest now, right? I'm sure interest will sort of dip after the World Cup. And then might be a good spot to try to see if there's any hanging around for you to buy. There's Akram Hassan Afif for Cutter. Sadio Mani for Senegal, former Liverpool man. Who, if he's healthy, Senegal team could be pretty interesting too. 113 out of 299, Timothy Castagne for Belgium. We've got for Denmark, Mohamed Adarame, 68 out of 199. Purple parallel for Denmark that's going to go to Brett. I know, right, Sumin? Kim Sumin might be lagging behind a little bit, but reacting a little late. But if you click that live button if you want to. There's Moises Caicedo for Ecuador. That's going to be part of that 11-team combo for Robert. There's another Gabriel Marcinelli, rookie base for Dennis. If we could find a low-numbered version of that card, that would be pretty awesome. Or a rookie silver. Jacques Cancelot 309 to 399. Their scores club, Lionel Messi. There's Mohamed Adarame again. This time silver. Now Sumin's saying that Messi around a $3,000 card. And we've got a Belgian. That's Yannick Carrasco, international ink autograph for Marc. We've got Dani Olmo, 24 out of 399 for Spain. That's for Raymond. Last box, sixth and final box coming up in Pick Your Team 8. Appreciate everybody getting in on this late. Well, especially Dennis who finished off this break late at night. I appreciate that. The first half, this is break, Pick Your Team 8 sold out straight up. The first half, or the other half is in a filler. We can get that knocked out. We'll get the other one going, Jaspy'scasebreaks.com. If the Lionel Messi card is like $3,000 now, then what could it be if Argentina ends up winning the World Cup? I think anything Messi related would surely see a boost in value. That's for sure. Final, sixth and final box. Good luck, everyone. Here we go. The auto popping early looks orange. Oh, it's for England. Connor Cody, international ink. I was fooled by the color on the back. Chad Cromwell with the three Lions. All right, so the auto popping early. There's Amparo again to 99. Red Mojo for Wales. That's going to be for John. Let's see what else we got here. Yvonne Parasich, some low numbered parallels for some teams for some silver. Rookie silvers will be nice. Yeah, go for it. There's Diago Costa, Rookie Hyper for Portugal. Dennis Moore, Jonathan David for Canada. Is this all Wednesday stuff? Yes. Okay, perfect. Got John Stone's red for the three Lions. 321 out of 399. And we've got Uriel Atuna for L3. That'll be for Daniel in Mexico. 224 out of 299. Yasser Al-Charani for Saudi Arabia. I know Cutters the host country, but Saudi Arabia is right next door. There's a Saudi support there. I wonder if there's a bit of a home field advantage. It usually helps the host countries. There's Gonzalo Montiel. Rookie cracked ice for Argentina, Aaron. Good morning, Aaron. If you're watching this video in the morning, nice break for you. Fonzo Davies. And we've got a Abdul Karim Hassan for Cutter. It's flipped around, but I'll load it up. It goes to Robert. Sometimes they're flipped around for no reason. Sometimes it could be a variation. Ooh, and a Gareth Bale landmarks card. Nice for Wales. John McCormick with the Welshman. This is what, if you've never been to Wales, this is exactly what it looks like.  Castles and sheep and dragons. It's exactly what it looks like. You don't even need to go anymore. There you go, John. We've got, there's Harry Kane Scores Club, 299, Jo Keem, Myle for Denmark, Blue, Brett, and that, my friend, and the Julian Alvarez Rookie Silver. We're not done yet. For Argentina, Aaron. Very nice. There you go, gang. I'm Joe for JaspeysCaseBrakes.com. Real solid stuff here. Appreciate everybody watching and getting in. Man, what a break. Thanks for watching, everybody. I'm Joe for JaspeysCaseBrakes.com. Oh, I got to do a randomizer. We'll see you next time in just a little bit. First, we got to give away a World Cup spot. Let's gather everybody's names, new dice, new list, name on top, after name on top, after seven, five into two, seven times, we'll get into that World Cup promo. Check out the details on JaspeysCaseBrakes.com. One, two, three, four, five, six, and seventh and final time. Random out of org. A little wheel spinning on the tab. There you go, Daniel Smith. After seven, Daniel Smith, congrats to you. You are in the World Cup promo. You're guaranteed a prize. Check out the details on JaspeysCaseBrakes.com. And once we fill up all those spots, we'll randomize your name and we'll see what team you get randomized to watch throughout the World Cup. Thanks for watching, everybody. I'm Joe for JaspeysCaseBrakes.com. And I'll see you next time for the next one. Bye-bye.


Nigeria, as a nation, has approximately 220 million people. In such, the Nigerian government must take advantage of the large number of industrialists. Speaking at an exhibition by a Council of Engineering, Health and Legers, experts called for everything towards attracting more foreign and indigenous manufacturers to a list in the free trade due to zone which will, in turn, guarantee employment for the team in youths of Nigeria. We have come to actually support this nation a long time. Now, let them come and support us. Let them come and have a youth term and develop this nation so that they are enjoying here, they are selling. Let them come and actually help the youth, help the nation so that this nation can change for good. So that will be there and we have the free trade zone. They can go there and manufacture their goods. And from there, they don't pay tax, they will serve. And people can buy from them, then we encourage ourselves. The youths we have in place to stay. We don't need to go abroad, everybody goes to America, everybody goes. You can't develop this nation. We have the resources here. The moment we have power and we have the engineers, they have the solutions to this power. The government should invite engineers to create solutions to them. We have the solution to energy problem, we have the solution to power problem and we are ready to work with government to be able to change Nigeria and Nigeria is going to be great again. Council for the regulation of engineering in Nigeria have just signed the Washington Accord which gives any Nigerian engineer the opportunity to practice anywhere in the world. We are ready and we are alert and we are ready to run. The country is ready and the enabling environment is being created presently by the present government that we have and we want to wish the president very well because we know that the policies that will encourage manufacturing in Nigeria is being done right now to encourage investors and manufacturers to be able to come up. A lot of fabrication is ongoing. Some of our young engineers have been able to design machines that can take both a fridge and also an air conditioning system, a two-in-one system designed by young engineers. We need to encourage them and we are speaking to government right now to encourage the engineers. Invite us, we are ready to give you ideas and solutions that will help change this nation Nigeria. We need to change. We are no more a consuming nation. We need to be a manufacturing nation and we need to go back to the way we were before where in Nigeria has been looked at as a giant of Africa.


All right everybody, good day. This is Andrew Connell. I'm sorry, I guess technically it's the second of our live streams that we're doing. But what I wanted to do is last week I did a dry run of this and this week I've spent a little bit more time like actually we're finding the process and stuff. And I'm looking forward to doing this again today or at least again doing it the first time I guess is for most of you are seeing this. And I'm looking forward to sharing with you like how this whole thing, you know, sharing with you this process and stuff. So this is my first kind of like live stream in a sense. And broadcasting this over to the Voitanos Facebook page as a Facebook live and I'm also doing it on the YouTube page as well. And the reason what I wanted to do with this is that I get a bunch of questions from people. Let me first kind of explain like what the idea here is behind the topic of what we're gonna cover today. I called this the behind the scenes of like processing pull requests and issues in the SP DevDocs issue list. And so one of the roles that I serve, that I myself serve with the patterns and practices core group is that I triage and I process a lot of the pull requests and issues that come from the SP DevDocs repository. This is the primary repository for all things SharePoint development related. So developers can come here and they can ask questions, submit bugs, submit documentation updates as well as pull requests to update and to make modifications to the documentation. And in addition to that, all comments that are left on the developer docs for the SharePoint developer docs on docs.microsoft.com, they all are added as issues to this issue list. So everything kind of goes here that SharePoint developer related. So what I want to do today is I want to kind of show you what my experience is like as one of the people responsible for, I don't know how you want to say it. I like to refer to it as babysitting, but it's also like maintaining and triaging and cleaning up all this stuff with the issue list. So before we get started though, I thought it would be a good idea to kind of take a second here and kind of just introduce myself real quick. So my name is Andrew Connell. I'm a SharePoint MVP or Microsoft M365 MVP. And I've been doing this now for like 15 some odd years. And like I said, one of the roles that I serve on the Patterns and Practices group, well, it seems like everybody else on Patterns and Practices, they own a project of something like the Office 365 CLI or stuff like that. I don't own anything like that. I don't own a project. Instead, I spent a lot of my time on the documentation, updating the docs, creating new articles, cleaning up the docs, and then also triaging the issues that come into the issue list. So the issue list that we're gonna spend time looking at today, you can see that if you go to aka.ms slash spdev-issues, that's gonna take you to the issue list. So what I wanna do is I wanna switch over, let's jump over to a demo. And let's take a look here at what the issue list looks like and the stuff that we have here. Now, what I wanna do is I kinda wanna run through a couple things before we do this. Now, one of the things that I do every, a couple times a week, I'm gonna jump over here to the task management thing that I use. So this app here, this is a think of this like my little to-do list. This is what I use to maintain tasks for my business and different work related things. And I have this task that is set up as a recurring task and it actually shows up once every three days. I think it's like Monday, Wednesday, Friday is when it shows up on my list. And it's just a reminder of things that I need to run through. We're gonna run through these. I'm gonna run through a couple of these. I'm just gonna show you what this experience is like. And, but before I do that, I kinda wanna give you a little bit of an overview of the issue list. You can kinda see some stuff that's in there. So, if I come over here to the issue list here, I've got a bunch of issues. And I've got a couple that I've already singled out that I wanna highlight for you that I think are good examples of either a good issue or a bad issue. And what I mean by bad issues, I mean like, this role that I serve and a lot of people serve in this issue list, this is not the primary like support vehicle for Microsoft in terms of SharePoint developers, right? The way that's done really is you have to have a support contract with Microsoft. If you've got a developer problem, you need to have a support contract. And what this is, think of this more as like community-based help, okay? When you do this, I know we've gotten pushback on this when I've said this in the past, but I really hope that people can understand what we mean by this. If when someone submits an issue and somebody is taking the time to try and help you, think about it that the easier I can make your job to help triage the problems that I'm having, the better that you can do, the better you can do with this, the better that, let's see, the better that you can make my life and make it easier for me to help you, the more inclined I am to be able to help. And so what I mean by that is, if I've got to sit there and look at what you've submitted, you just give me an issue that says, like, does not work right here, like this one that you see, right? So this one says does not work after days of banging my head against the wall, I followed the instructions to the letter, but it simply does not work. There is absolutely nothing to go on here, all right? So the docs have, the only reason the docs were published is because the article worked at the time. So it seems to me that this is, and because this is like, we don't see this a lot showing up, seems to me that this individual just is having a problem getting their stuff to work, but there's absolutely zero context around this, there's zero code that's been provided, there's zero screenshots, there's zero errors, what doesn't work, right? We don't know what works with this. I mean, they could simply say, I'm trying to type this into my iPad using a text editor or something like that, and it's not working. It's not the context. So like for an issue like this that we would see, we come in and we already see somebody has already said, please provide issues you're facing. I'm gonna go in and I have a comment that I've already created here. I'm gonna go ahead and copy this, and nope, that's not what's supposed to happen. Copy, oh, I see what it's doing. There, now. So I'm just putting a comment here. It says, you haven't probably enough information to assist without some context, or reproduction steps, screen captures, or there's not much we can do to help you. And so what I'm gonna do with this is I'm gonna go ahead and leave it as, I'm gonna drop the comment in, but then I'm gonna come over here and modify the labels. So I'm gonna remove the triage, and I'm gonna say this needs context and detail, and we can tell that because of the page they posted it on it's related to the SharePoint frameworks, I am gonna go ahead and categorize it as a general SharePoint framework question that shows up. So what's gonna happen here? So we have a bot that runs behind the scenes, and you see another label was just added to this guy. What this did, we have a bot that runs behind the scenes. It was watching that I put the label of context detail, and what it does is it's added in an extra bit of text here that basically is telling them, you gotta help us out here. You gotta give us more info than what you've given us, because there's not much we can do to help you with this. What that will do is that also adds the author needs feedback. Now what this is gonna end up doing is it's gonna, if the user has email notifications turned on in GitHub on their account, they'll get an email with this, and it's effectively going to start a timer, a 14-day timer. They've got seven days to respond, right?  If you ask a question and you never follow up, we come back to you and try and help you and then you never respond to us, there's nothing to go on. So we might as well just delete the issue or close the issue. But, so what we do here is that we start this timer, and this bot that Rahan's behind the scenes says, I'm gonna give you seven days to respond. And if you don't respond with this author feedback on here, another label will get, another comment will be added with another label that says no recent activity. That effectively is saying, stale issue, man. I mean, if this is stale, you haven't done anything to help us. So what we're gonna end up doing is we're gonna go for another seven days and if you don't respond, we're simply gonna close the issue and just say, look, if you really have a problem and you want us to engage, you gotta play the game, right? In a sense, both sides have to be helpful here. And that timer will get abandoned if the original poster of this issue responds. If they respond at any point during that 14-day window, then the author feedback will get removed and that timer just goes away, all right? So nothing is gonna end up happening with that. So that's one way we keep this issue list kind of clean and keep people from getting this thing all messy. Let me come back over here. Let me show you what I do, one of the things I do with this and see this link here where it says needs triage. So I'm gonna go ahead and open up a tab for needs triage and I want you to see like what this does. So when a new issue gets created, if it gets created by someone coming to this issue list and clicking on new issue or if they've added a comment from the docs, any new issues that get added to this list are gonna get flagged or tagged with needs triage, okay? And so what that does when it says needs triage, that's going to get filtered. Basically it tells somebody like me that someone needs to take a look at this and somehow categorize it or do whatever. Now, one common misconception that people see with this, actually let me say one more thing before I do that. If it was a comment that was left from the developer documentation at docs.microsoft.com, it'll also get this label of docs comment, okay? Now, one common misconception that I see, that I see at least because I'm the one that does most of this stuff and triaging these items that come in is that some people think that I'm gonna answer every single question that comes in and that's simply not gonna happen. My sweet spot is SharePoint Framework stuff, maybe REST API stuff. I don't wanna enumerate all the things that I feel like I've got a strong background on but I have a strong background in specific areas and those are the areas that I focus on with the issue list and responding. However, I can at least identify what all these different, what the different things are that show up in this list and I can add specific categories to it or flag it if it's a question or something like that. So, let me see if I have any here that I wanted to highlight. Let's see, this one right here. So, this one where it says rendering a custom web part is not happening between the navigation of two pages. So, let me open up another tab with this. And what this issue is, this is somebody who is, has basically, I'll give you a quick summary of it but they have a web part, they put it on a page and then they wanna be able to jump between, they wanna be able to navigate with this web part being on multiple pages and they go from one page to next page to next page and they're having a trouble with the web part is not like the page lifecycle is not or the web part lifecycle is not being consistent with them. Like, sometimes it's doing the on a knit, sometimes it's not doing, it's doing the on dispose, sometimes it's not. It seems to me like it's a page router issue. Let me get my, I have my notes here and one note and of course one note is saving these, pasting my notes here as, it's pasting my notes here as images and so my responses aren't coming across correctly. So what I'm gonna do here is I have this response that basically came back to them. I wrote this up previously, so I'm saving you guys from the time but effectively I'm just, I'm saying, to me it smells like you're running into an issue with something called the page router so I explain kind of what that is and then I have a couple other questions related to it and so what I'm gonna do is I'll go ahead and I'm gonna drop the comment here because I can tell us a SharePoint framework. I'm then gonna come over here to the labels here. I'm gonna remove triage and I can tell this is a SharePoint framework question and I'm just gonna leave it as a, and also gonna have a needs follow-up here. Need some feedback here because I did have a question for them like saying what exactly are you trying to do? And so what that will do is that's expecting this person to come back and say, help, let me know what this is. They did flag this question as you can see at the top. They did flag it as a bug but not really sure if it really is a bug or not yet. I'm just asking another question here but I'm not gonna go through and flag it or add a label that says it is a bug or it is not a bug just yet. We got other issues here that I wanted to highlight so like what is this one I wanted to highlight? 5591, so this is a good one. So another thing, another one of the issues I have or one of the things that I do is on a weekly basis, let's say if someone came in and let's say a couple of days ago I went and I looked at this issue and I, which I did, scroll down here, I came back and I was like, there wasn't no issue while ago, check the version that you're doing and then I added that author needs feedback that you see right here. That's all fine and good. The author needs feedback thing is all fine and good but a little bit farther down, they did respond but to me they, so when they responded what it did was, remember what I said earlier it removes the author feedback label and then it adds in the needs attention label and so what that means, what I can do when I use that needs attention is that if somebody's responded, one of the things that I do is I go back and look for updates where people have responded, we've asked them to respond and they have responded. Now it may not be me that asked them to respond, maybe somebody else, but regardless they were asked to respond, they've responded and maybe it's something that I can go back and I can address or it's a good highlight for somebody else. So in this case here, they had some stuff that they said that they went in, they gave me some stuff, I was like, you still gotta give me more context, you haven't told me about the prompts. Now what I mean by this about these prompts is that if I come over here and I create a new issue, so this person had created an issue, so they did that by coming over here and clicking on the new issue link and what this button does is it takes you to a form where you choose one of the different types of issues you can create. Now this issue list is for developer issues, right? Developer issues, developer questions, developer issues. So if you come in and you're trying to ask a question about the docs or something, what we do is we try and like guide you in specific places if this is not the right place for you. So for example, with this one, if I'm looking for a question related to developer documentation, then I'm gonna send them over to the docs. If I've got somebody else, like let's say I've got this one about tech community, if you submit a question here that is not developer related to SharePoint, like for example, if you send me a developer question related, if you send, sorry, not me, if you send the issue list, submit an issue, a developer question related to Azure or Microsoft Graph, or if it's related to, and I mean specifically related to those things, like I mean there's obviously overlaps with stuff, but if it's not SharePoint developer related, and it's like an end user issue, or it's a administrative issue or configuration issue, we're gonna flag it as it's not a developer issue, and that'll automatically close the issue because we can't do anything about that here in this issue list. And I know it seems kind of silly, but it is what it is. If there is a real bug that is found here, Microsoft isn't gonna come to this issue list, and a developer, even a Microsoft engineer, can't say, this is a real bug in the UI, we need to fix it. It actually has to go into a different process. I get it, in my opinion, it's kind of stupid, it's big company stuff, big corporate kind of stuff and everything, stuff they gotta figure out, but it is what it is, and so we guide you and say look, if you've got an end user problem, go to tech community, that's where it should go. If you're trying to do a feature request, again, that doesn't belong here either, we're gonna send you over to user voice, that's where Microsoft triage is, potential things that you could do, right? So, or things that do submissions or changes that you can request. If we see it as a feature request, then we tag it as a feature request, it'll put a comment in the issue that says, hey, this should be done as a user voice submission, and then it closes the issue. The one in this case that was frustrating to me, that I kind of jumped on this, I made a comment of in that issue, which I told the person, hey, look, you didn't give us any context. When you created this new issue here, we have this section here about like a developer environment, and it talks all about, here are the different things that we need from you. Let me put this in preview mode, you can see a little bit better.  What framework are you using? What's your operating system? What tooling are you using? I'm gonna show you where we're gonna make an update to this in just a minute, but it doesn't give us any context. What version of node do you have installed if you're doing SharePoint framework stuff? Without that information, there's not a whole lot that we can do with this, right? So what we did, what we're doing here, I guess, not what we did, but what we're doing with this, is what I mentioned to them in their issue, was I said, we need more context, you deleted a lot of the prompts in the section in the original post. So again, I tagged them again with context, I need context detail and attention and that was automatically added the author feedback. Again, the person responded with just a giant gulp drop and our gulp output drop and with another error here, but the main root of the question was, I mean, I had a lot of feedback for this person or a response that I had and I'm gonna go ahead and paste that in actually and just right here. So let me go ahead and paste that in. That's a typo. First, you haven't, that's what I meant. Okay, so effectively what I did here is I just said, look, you haven't given us enough context and that's why I was talking about my last reply. So that's the first thing. Second of all, I saw an issue with what they posted and thirdly, I just said you've got a lot of, there's a lot of stuff in this project and if you're not externalizing some stuff, then you're building a gigantic bundle. So I'll go ahead and drop this comment in here, trying to prompt them again and I'll do the exact same thing. I'm gonna remove attention to detail and I'm gonna say, yep, we still need feedback on this one, okay? And I know it can seem like we're being nagging, whatever, but I mean, if I keep asking, we keep asking questions, this is the way that we communicate these things to you. So let's look at it. We got any other ones here. I do have a couple other ones I wanted to highlight. 55, it was 55, we had 5589. Is that one still showing up as a triage, 59, five? No, I don't see that, so let's do it. Let's open, nope, that one's specific. I wanna come back to that in a second. Oh, here's one. So this is kind of a compliment. Command and Run, super duper fast, sweet. And as you can see, Bo says, hey, it's great, kind words, yep, sweet, okay. Everyone's kind of like saying nice stuff here, but appreciate it, but it doesn't really go in, there's nothing really to act on here. So we'll just be friendly, hey, thank you very much. That's awesome, so I'm gonna come over here. I'm just gonna close this thing, go ahead and remove the triage, and I'm just gonna go ahead and close the issue because I mean, there's really nothing to do with this. But hey, love the compliment, love good feedback. Another one here with this one, add in permissions at the list level, let's go through this. My goal when I sit down to do this is to get through to where there's nothing left on the triage. I want all of those done. All the triages should be completely done. Let's just double check and make sure a couple things here. Let me make a quick change here. It looks like I've got a problem on my stream. I can improve this a bit. Getting a little bit of a warning here about my feed. This is my frame rate's too high. Again, it's part of my newness of doing this. I have to go back and look at that because it doesn't look like my frame rate's too high, but it actually looks like I have it set to 30 frames a second but it's telling me to do that, but I have that. So my camera's not set up to be, I don't know. Anyway, okay, add in permission at the list level. Can it be done? Okay, so this one you kind of need a little more context with, but I know what this one is. I looked at it ahead of time. Someone's basically saying, can I do add-in permissions at a list level or at a web level? Add-in permissions with add-ins, they are to an entire site collection. So I'm just gonna go ahead and just comment on this. Unfortunately no, at the TLV, at the site collection. There we go. So because they're applied there, unfortunately no. So I'll go ahead and comment. And what this is, this is a question about add-ins. And it was a question that has been answered. Now what's cool about that is that now that it's been flagged as answered, is that we have the bot will kick in and it will wait, I think like three days, maybe five days. But if the answer remains, if the person didn't have any kind of a follow-up to their question and it's marked as answered, then it'll automatically close the issue. So it'll get that out of the way. But I won't see that again, which is good. So then I can go back to my issue list. Didn't mean to close that. There we go. And now you can see it's gone. So here let's go through and open some other stuff here. So this one we'll look at in just a minute. Let's look at this one. This one says getting started with Power Automate, link doesn't work. Clicked on the link, it didn't work. I was seeing it yesterday. It looks like the link is working now. So okay, everything's fixed. So this is not really, there's really nothing we can do with this. So I'm just gonna leave it as, what was it? I guess it was by design. I'll just leave it as by design. And so I'm just gonna go ahead and close that issue out. And let's see, what else we got here? How about fix for dev-office-com? What does that mean? Accessed dev-office-com up. It's a dupe of 55.97. Is that the other one that we have here? Yep, okay. So what this one did is that this issue, they're reporting a problem with a URL. And you can see here that this guy, so this is a Beau Cameron, Beau who's also on the PNP team, Beau jumped in and said, this is a duplicate issue. So what we try and do is we try and keep the issue list from getting a lot of duplicate issues of showing up. And so the way that we do that is what I'll do is that if there is an issue, we call it out as being a dupe and see how Beau put in this pound and with the number in there. What's cool about that is if you come over here and look at this issue at 55.97, when he did pound 55.97, GitHub automatically linked this issue to the other one. And notice here that when Beau did that, you can see that it added this extra entry into the list. So what's cool about this then, and I can also see that someone's already submitted a pull request to fix this. All right, cool. So I'll come back to that in a minute, but because this is a dupe, I'm gonna come over here and remove triage. And we actually have a tag for dupe. And what that will do is you'll notice that that's gonna automatically get closed by our bot. All right, so let's see, what else we got here? And property of two strings, let's just double check with that one.  This person, there was absolutely, there's no context here. So I have one for this. And notice this person has created an issue, but they deleted our entire template and just put an error in this and then a picture.  There's absolutely nothing here we can do with this. They didn't do it from the docs. They actually did it by coming to the issue list, creating a new issue. And so they had to have deleted that template. Frankly, that's really irritating because it shows that they're not taking any time to help. So what I'm gonna do is I'm gonna come over here and I'm gonna tag it as an issue. I'm gonna put a, that's something with tooling, but I'm also gonna say something about context, right? And so that's gonna flag it back to them saying, you've given us absolutely no context and I actually have a response that I already typed up for this person. So I'm just gonna leave it as that. So there we go. So asking for context. All right, so now where are we with our issue list? We are, all right, sweet. I've done everything I normally wanna do with this. Now this last one here, this is gonna apply to a pull request. And so I'm gonna switch gears for a second and I wanna look at pull requests. So this is something else that I do on a, I try, I do this on like a weekly basis here. Wow, people have been updating the last few minutes too. Well, not a few minutes, I guess three hours. Okay. So these pull requests, this is stuff that where people have made a change and they've submitted it to the repo for someone to look at to merge their changes into the live website. These are really, and so all this stuff is really good. Now one of the things that I do is that, again, one of the things I look at is I, here we go. Look for any PRs with review changes requested and then I also close any issues that are listed as please close. So if I open this guy up, one of the things this will do is if someone has, not everybody has access to be able to close stuff, but if you have an issue and you put the hashtag please-close, then when we see that, I'll look at the issue and I can go ahead and close these things for you. So there are some people who don't have right access to the issue list, but they can tell that this thing doesn't need to be open and that's how they end up getting closed. All right, so that was one thing. But then the other thing that I do is I come over here and I look at where we had a pull request with reviews changed, the review was changes requested.  So this one where it says fixed broken links and Office UI, so Office UI fabric. So let's go to this. Now look at what this guy did. So this is a beautiful pull request that was submitted. When you create a new pull request, you're gonna get this experience that you see here. And you get this template that gets put in and it's like, is it a new article or is it a content fix that you're doing? And so what, and forgive me if I mispronounce your name, but when I went in, is it fully spelled out here? Yeah, so what Nandeep did is he went in and he deleted the one that said new issue or new article and just checked off the one that says content fix. Fantastic, so I know you're fixing something. Second thing, are there any related issues? The template gives you a way to go through and to link to different issues and see where he's got pound 55.97. Well, if you go back to the issue that we were looking at before, here's where he went through and he had put the hashtag in the actual PR 55.97 and what that did is that added in a link into the issue so that now we have this nice cross-linking thing going back and forth. That's great because by seeing that, that's gonna allow us to see very easily find stuff and to fix any kind of an issue that's showing up or to be able to automatically close this. When I went through and I looked at this, I can see the commit that he did and when I went and I looked at his change and forget all this red text, this is just formatting stuff that's going on with GitHub so it's not a big deal. But if you look here, let's see if I can find my changes. All right, so see the red part is what he had submitted in his change. Oh no, sorry, the green part is what he had submitted. So notice here there's this en-us so most people can't tell what this stuff but as somebody who's worked a lot with the Microsoft documentation, I know what their rules are and what they're going to be expecting us to do. And so in this case here, I know that the developer.microsoft.com site has something that will automatically reroute to the proper localized content based on the user's HTTP request headers, the user agent. It's coming at another user agent, the local for their current browser. So I know that they do not want us to put any of the locales in the URL. So if I went to this URL right here, right to where it says, well that was the URL he had actually changed. Sorry, this is what the content was originally set up as. This is what his change was and you can see this better if I go to files changed. So left side is what the content used to be, right side is what he had changed it to. And what he had changed it to was he had actually put in the en-us right in this area and that's why when you saw in the conversation I had with him, I saw the en-us and I said, please remove the locale link. That set dynamically, blah, blah. Now, when I did that as I reviewed it, it actually said, I'm requesting you to make changes. Well, he's already come back and he's already addressed those things. He actually had it in two spots. He went in and he removed the locale from his changes right here in this comment. He fixed it. I can go and I can look at the content that he's modified so I can see up here, files changed, I'll go look at the content. Yep, sure enough, no en-us, no en-us, fantastic. So review changes, everything looks good. So I'll just say, yep, I approve it. Okay, so everything has now been approved. So there's my approval for the change I requested and now I can go in and I can merge this into master. So when I say confirm merge, now watch what happens. Notice that the open switched to merge and if I go over to that other issue that he had cross-linked, it's now closed because it shows that I went through and I just closed it because it got merged. And you can see here, actually if I refresh this, you'll see that this PR will show as merged. There, so see the PR is now as this is merged. Now what that means, what's gonna happen with this is that his changes have now been applied to the master branch the way the developer docs work. There is a live branch and then Microsoft is responsible for taking what's in master, putting it in live, which makes it go out to the public site. So you won't see these changes right now. If you're watching this live, you'll see those, these changes show up like in a little bit, okay? Okay, so now let's go back and let's look at what other PRs do we have here? So we got a couple other ones that anybody make these changes for me yet. So I'll go open up these three real range. I've seen nothing since then. So maybe just, I'm gonna close that. Same thing with this one, change requested. Nothing since I did that. So I'm just gonna close it, changes requested, nothing. Yeah, okay, so nothing I can do with those guys. So these three. So let's take a look at these. So I'm gonna go over here, let's look at these PRs. All right, well it's in this one, broken link, fixes a broken link. All right, let's take a look at that. Web parts, web dash parts. Let's go look at that doc broke. Oh, that's not there. That's gonna be over here. And we can just check this. There's different ways of checking this. I have a fast way of doing it. So we're gonna go find the section on web parts and just click into one of them. Yep, web dash parts. Let's switch guidance to this. Yep, valid link. Cool, so I'll come over here. Everything looks good. Review them, approve, submit, merge, confirm, merged. All right, sweet. Let's go look at the next one. How about, let's do mention library can be hosted from site app catalog. I jump around with these things sometimes. So for the initial article, what may think you can only do this? Tell this, check the crime changed. Let's look at it, what did he say again? So from the initial article commit content, one may think you can only render SharePoint library components from the tenant app catalog. However, I've been testing this and not correct. You can also host as close as site app catalogs, maybe useful in the sense that you have a site collection for, I'm not gonna do this one just yet. I'm gonna come back to that one because I believe that that's not supported off top of my head. I may be wrong, I'm just, I'm just flustered because we're live. I'll look at that later though. Here we go, a partial fix for this guy. All right, so I have proposed these changes because when trying to navigate, I'm trying to leverage this on an extension using Yoma and I had issues when the code solution was in. Let's just see how big of a change he's talking about. These are code changes. All right, I'm not gonna do this one right now because that's gonna, I wanna review it. I don't wanna just run through that. Let's look at this one real quick. Window Location Query, is this the one I just looked at? A better one to use the URL query. Query does query to search. I don't know about this. All right, so I'm just gonna comment on this because we don't wanna just make a change just cause someone thinks it should be changed. Like we've had some, some people will submit stuff saying, I don't like the way you did the sample. Here's a better way to do it. That requires somebody to go through and review the sample and that can take some time. So it would help if it's more than just, I think it'd be better. Let's see, so that's the list of all of them. How would I go about submitting a pull request, right? So I have one where I've actually, I've already gone through and I made some changes this morning. So I'm gonna come over here to my GitHub account where I had forked the SP DevDocs issue list. Here we go. And I have a branch which will update build issues. Okay, so what I had done is I was updating, this branch is 100 commits behind master. Wow. Okay, so now I am not, if it's 100 commits behind, there's no way I'm gonna go through and just refresh this. We'll do this in a different video at different time. But basically what I was doing in this list or in this is change. Actually, let me do this real quick. You guys aren't gonna see this as I'm not gonna, I can share my screen with this. Let me do that. So let me change this. So let me show you what I'm gonna do here. Let me get my windows set up correctly. And then I'm gonna explain what I did. So how do I, let's add another screen capture. So let's switch to VS Code, but that's not the right one. Hold on, let me get the VS Code on the right repo. So here's what I did. This morning before this, before I did, we started this live stream. I actually went in and I wanted to, I wanted to show you how to go about submitting changes to the submitting a pull request. But in order to do that, I needed to make some changes. And so do code. And so I made some changes this morning to the repo. There we go. So now you can see my code. So I made some changes to this, this morning. Let's make that look bigger so you guys can see that. Well, that might be too big. Oh boy, that's really big. To the templates, because the templates originally were having like, they were inconsistent on the context. And so what I did is I just, I added some other stuff to make things to give it a little bit more context. But clearly we've made a bunch of changes by merging pull requests in and somebody else has been making changes to the main master list. And so my stuff is now out of sync with what the repo and the main repo is. Not my fork is out of sync with theirs. If that's the case, you saw that it said that my branch was a hundred commits behind. So we're gonna fix that. And the way that you fix that is by refreshing your fork because you only wanna add stuff to the top of the branch. You don't wanna go through and add your stuff if you're way behind, okay? So here's how I'm gonna fix that.  So I'm gonna come over here and do a get checkout master. Okay, now, but the next thing I wanna do now, so watch my hands with this, okay? I've got stuff on my local laptop right here or right there, or actually, yeah, it's right back there. My changes, my local copy is a clone of my GitHub accounts fork of the Microsoft SP DevDocs issue list. And you saw that in the browser a second ago. So what I need to do in order to submit my update is I need my fork to be equal to what's going on in the main one. So to do that, I need to go to my laptop down here and pull everything, the latest stuff from the Microsoft repo down into my fork, push those back up to my fork in my GitHub account and then push those up to the Microsoft repo, okay? So if you just Google refresh a fork, it'll make sense. Basically, I just need to make myself current. So I'll do that by saying, and I have a remote that's already been set up, a remote, so if I do a get remote-v, I have a origin which is pointing to my GitHub account and I have an upstream remote pointing to the SharePoint DevDocs. So what I'm gonna say is I want to get pull from upstream master branch. That's gonna pull in all the stuff that I don't have in my fork from the SharePoint one. I'm gonna take that and I'm gonna push that to my origin which is what the default is. So now my master is gonna be equal to the same place. They're now equal up in GitHub. But remember, I have my changes on a separate branch. So I'm gonna check out my branch. What did I call it? Update, yeah, update build issues. So this guy now, my update build issues is behind master because we just pulled new stuff into master. I need to get my stuff. So like if this is my stuff that's on my laptop, this branch right here has a couple changes right here. The problem is though is that master has stuff above it. I should only, a really good pull request should only add stuff to the top because if it's down here, I could create a conflict and there's no way that somebody is gonna merge those in. I would never merge in the submission if someone didn't have that cleaned up because basically you're saying, hey, I made some changes.  No, no, no. If you're gonna contribute, you need to fully contribute. So what I'm gonna do is I'm gonna say take everything from master and push it into this branch. And the way I'm gonna do that is by saying I want to rebase my branch off the tip of master. So take my stuff and put it onto the top. Get rebase off master. There, so now I did that. So now if I do a get log and let's just do, I'll just do one line to keep things clean. I can see get master. Okay, you can't see it here. I can see Nendeep did some stuff. There you go. There's Nendeep's thing right there as well. Fix broken links. Okay, so I've got my changes, get log. So we can see the changes that other people had done and then that's old. Okay, so now I should be able to say get push. Now what this is gonna do is this is gonna push my changes back up to, back up to my fork. All right, cool. Now let's go back to our browser. All right. And you should be able to see that. Nope, it just switched it back. Go back to browser. Cool. Now I'm gonna refresh. Much better. This branch is even with master. Actually, why aren't my changes ahead of it? Well, that's now frustrating because I made some changes this morning. Man, I'm gonna lose my stuff. It appears I've lost my changes. Oh, well, at least you get to see. So I'll go back and I will fix that. You know what? We'll just fix it right now, ladies and gents. Let's go back to our changes, configure. Let's go back and switch back over to VS Code. Close this up. What changes was I making? We had, I had under the feature requests. Nope, we didn't wanna do anything with feature requests. Close that out. Custom. Environment details. This is where I was making the request here. So environment details. I wanted to ask not only your operating system, I also wanted to get, we also wanted to ask for, I know none of this stuff should have a space in front of it. It is target, target environment. And that is, for example, SharePoint Server 2016, SharePoint Server 2019, SharePoints online. Just leave it like that. A couple of things I remember I changed before as well. I wanted to make all of these show up as ores. So we'll just do space or. And then I also wanted these to be bolded at the beginning. Just to kind of clean it up a bit. So stars, stars. There we go. Environment, environment details, I just do that. So target environment. So what we'll do is I will copy all of this and from custom. I want that exact, I want it to mirror what is in the bug request. Really don't understand why I lost my stuff. It doesn't matter, we're fixing it, but so we wanted that feature requested matter. And I think issue template was the base one that we had. Yep. And we will save our changes like that. Sweet. So here we go. Issue template. All right. So fix up. Let's see. Update issue templates for. Consistency added target environment as guidance. Might be misspelled. And. Duped. Across all issues for. All right. So I will save my changes. Sweet.  Oh, you know what I did? I think I already know what I did. I think I picked the wrong branch. Make sure it did. All right. So let's go back to our demo back to our browser. So let me switch over to browser. I know exactly what I did. I am on the wrong branch. Fix up issue templates. One commit ahead five behind. Okay. That's what I did wrong. So you guys are not going to see this. I'm going to do this really fast. So anyway, I may change this morning when I just said refresh the, refresh the branch and it said I was a hundred things behind.  There was no way that that was the case. I should have, that should have been, I should have caught that. I was only like four or five behind. And which I basically refreshed the wrong branch. That's why I didn't see my changes. My changes were already there. So if I come over here, you can't see this but I'm just going to jump back and forth. I need to say get check out fix up issue templates. Get rebase off master. Get push. All right. So what you're going to see, there we go. So that's the one fix up template. This is the one I want to look at. So I'm going to go to this, this branch. I'm one commit ahead. And if I look at the list of commits, I look at the list of commits, fix up. Here's the one that I had too fast. Here's the one that I had updated this morning or I added this morning. Right. And then there's the detail added additional prompt for target environment and all that stuff. All right, cool. Here's how you go through and you submit a pull request. You can do it one of two ways. You can do it from your branch and your repo or you can go to the main one. Like here, this is the main SP dev docs. And I want to go through and I can say go through and compare and create a pull request. Now let's see the best way of doing this. Make sure you can actually spell. So here, these are the comments from my commit. So I'm going to cut those out and I'm going to put them down here. We have a section down here that says what's in the pull request? These two things are in the pull request. I can get rid of the guidance section here because it even says at the very bottom you can delete this paragraph after reading it. Come back up here to the top. What kind of a category is this? This is a, it's not really a content fix but that's kind of where it goes. Delete this line, I will do that. Delete this paragraph and you're done, got it. Related issues, there are no related issues but I'm not going to delete this. I'm just going to say this is not applicable and then I will create the pull request. What this is doing is it's going to modify the templates that people when they create a new issue. So that now I'll go ahead and merge this in. Come on. So what's going on here is that you can't merge, there's a build process that's going on with the share with the all docs.microsoft.com. Everything's going to build and if there's ever an error during the build then it'll flag this as being a bad build. So right now this is, I can't merge this until this completes, okay? So let me jump over here. I see some people have left a couple comments so why don't I see if I can go find those comments. To me, I'm jumping over here on another browser. Oh, you can see, so let me go, come on. Facebook's taking a second to render here. Come on Facebook. Oh, no comments, just some comments and stuff but yeah, cool. Looks like some stuff might happen with our Facebook video. Oh, look at that. I did screw it up with YouTube. Apparently you have to click go live.  Bad gummit. Oh, well, this is what it is. Here we go, but check it out. Our update over here, it shows, ta-da, we can merge the pull request. I will say merge pull request and I will confirm the merge. Ta-da, all the changes have been done. So now if I come over here to our issues list and if I create a new issue and if I say I got a bug report, we now have a new thing in the template that will prompt people to say Oh, come on. Because we were getting this as a thing, target environment, SharePoint 2016, 2019, SharePoint Online. Ta-da, cool.  I didn't know you had to do that. I thought that the app I was using would automatically do that. That's dumb. But anyway, just, I'm a newbie. I didn't do it, my bad. All right, that's everything that I wanted to cover today. I guess I don't really have too much of a call to action. I'm curious what you thought about the live stream. Again, like I said, I've never really, I've never really done this before. So we're not, not really done this before, but I've really, I haven't done this before. But today, so what were we doing today? The whole thing that I was doing today that I wanted to focus on was all about kind of taking you behind the scenes and what it looks like to triage poor requests and issues with the SP deb docs issue list. Hope that gave you a little bit of insight into how this works. And I hope you might have learned something. And so with that, thank you very much for taking the time to watch this today. And I will, if you got any questions or something, if you got any questions related to this, please feel free to comment on this video either on the YouTube channel or on Facebook. Might have to go back to that YouTube stream and delete it and upload the video that after I download it from Facebook.  But yeah, I guess with that, I got nothing left. So with that, I will leave everybody to their days and we'll see everybody next time we do this. Thanks a lot.


Hey guys, John Hammond here looking at Bandit level 31 from over the wire some of the new levels I just released so I have already get clone the repository noted in the Online page here got it in a temporary directory that we're working out of so let's check out the repository see what they have here We have this read me file which we can see and says this time your task is to push a file to the remote repository With key.tex as a file name the condense may I come in on the branch master? So the current branch that we are on yep As we can see yeah, okay cool. So let's create a file. Let's call this key.text with that contents It's fine. It doesn't need a backup file. So we can save that create it cool. It exists So now I just would just normally get add the directory. I would get commit Except it tells me on branch master. We're up to date nothing to commit working directories clean So I thought that was weird So what I did was I tried to get add key.text like that file explicitly and then I said Oh, the following paths are ignored by one of your dot get ignore files key.text So that kind of trip me up for a second But that is just a point here for your learning There is such thing as a get ignore file and those files will not be noted in Any commits or pushes that you try to make to your repository looks like they're trying to ignore anything That's a dot text file. So the note is you can use tash I'm sorry. I was gonna say tack and dash at the same time. And in fact, I did I said tash So you can get add key.text tack f to force it and then it does it just fine So now we can get commit ignore that warning error and we can just say add at the file or whatever Message that we want here. So now we can get push bring it to the repository Say yes, it will need the password so we can go ahead and supply that we've got it saved Throw it in our clipboard paste it in and you can see here. It gives back some interesting notes. Well done Here's the password for the next level and this guy will get us to bandit 30. So let's keep track of that bandit 32 Again, I've got this saved because I've been doing it earlier, but that's it That was the solution that we all really needed for this level bandit 31 Not crazy hard, right? But just to teach you and show you how to go ahead and upload files to the get repository Add the files commit them in push, but without noticing that get ignore file Nothing particularly happened. So maybe if you just didn't realize it that may trip you up. So cool things Hey, if you didn't see it before I have set up a discord server and That community has been really really awesome to talk some more about some of these challenges Play them live with other people for the first time we're going through them Same thing for any capture flag game that may be on we can just collaborate talk and be in that community of Programmers CTF hackers and just really cool people. So please link in the description come hang out and jam with us Another note. I want to include is a shout out to my supporters on patreon. You guys are phenomenal and And thank you so much everything that you do $1 a month on patreon will give you a shout out just like this at the end of every video $5 a month on patreon will give you early access to all my videos on YouTube before I release them Normally I record videos in bulk and then YouTube will gradually release them one by one So if you want the content right away just $5 a month and that's the easy way to get it I'll hope to bring out more incentives as we move along I think the discord server is awesome now because I've got some real community like Always engaging instant message conversation as to what people want to see and what we can bring to the table So that's that's really cool. Hey, if you did like this video, please you press that like button Maybe leave me a comment if you're willing to subscribe and check me out on discord patreon in my website www.johnhamman.org See you soon