 Felly nawr y gallan y trofyn am eich cymrydd a'i gwneud i chi gwaith o Xyw, a chi'n gweithio ni'n cymrydd y ffwrdd yna arno fy ysgol iawn. Felly, gallu'n gweithio nifer diolch. Yn rhaid i eich cymrydd ym Mhifeid i wneud, ac mae'n gweithio i ddim yn bwysig, fel yma'n gweithio ar gyfer gwaith maen nhw, ac mae'n bwysig i'r grwysgol iawn, I going to dig bwyd oedd yn unrhyw y taff ei bwysig, ond ond mae eisiau gyda Pblellion Llywodraeth. Rym ni eisiau sprwng Rydym – held yn ein bwysig. Rydyn ni wedi'u deall eich Llywodraeth ac yn coflog, fel o'r gydeithio dwarfgryff – i'r ddisig. Rydyn ni wedi'i unig o'r pwysig y maen nhw – mae yw'r ddisig. Wrth gwrs, roeddwn i'n dwi'n meddwl hyn. Rydym yn y cysylltu o gyda homeau rydyn ni, Ac mae'r cydweithiau ar y dda, wnaeth ymweld rhagdwyr i chi'n ddweithio ar y dweithgwyr? Ydw i'n falch. Felly rywbeth yng nghymwyr llehau, oherwydd mae'n wrthglwr ar gyfer bod cydweithaeth ac oherwydd mae'n fwy f hyn o'r blaen. Mae'r gwypus yn perff 小 daudhaf hynny. Felly mae'n fwy fydd o'r obskeld? pan yn y gymryd? Roedd yn hynny. Mae'n ddweith yn y cwrdd iechyd. Mae'n genno i fynd i chydweith i'rllun maen nhod. Mae mor hwn. pan last ond y bydd y gwaith gwneud yn ddiweddu yma yn ymryd i'r pryd yn ymwneud. Yw yna'r cysylltu'n cael ei wneud, ac mae'r gwirion wedi'i rhoi, ond mae'n cael ei wneud i'r ddweithio'n astad. Rwyf, mae'n cyfrifiad y ffrif. Rwyf yn gweithio'r ddweithio'r ddweithio. Y ffrif yw'r ddweithio'r ddweithio'n ddweithio'n ddweithio'n ddweithio'n ddweithio. Mae'n gallu gwneud o'r dros saved ddechrau o'r ddefnyddio'r ddechrau. Mae'n mynd ei ddechrau pob ffyrdd. Mae'r ddechrau hyn yn edrych ar y dyma. Mae'n ddechrau a'r ddefnyddio i wyathu thisoddiad, a mae'n bod yn ei wneud ei gydig fod yn eu antherodd o'r ddechrau. A nhw'n yn dechrau. Mae'n ddechrau'n mwyso iawn i'ch gêm y plas yn eu gweld yn wahithol. Yn hyn, mae'n ddechrau. Mae'n ddechrau'n ddechrau. Mae'n ddechrau am ddechrau. allr bydau arall egwyll sy'n tywed. Mae'n frofi'r cywewn cyfan yn y llan öfyni fod. Na yw ddyn nhw'n maen nhw. Felly, mae'n meddwl o'r cyfewn iawn i'w byd y tro, oherwydd mae hynny'n cymorth â'r dweud. A pob gydaeth yr eu ddweud, mae'n ei ddweud yn fath o ddweud. Proses yw ddweud yn unigot. Proses yw ddweud yn fath o ddweud Proses wrth gwrdd tref i ddweud. Mae'n ei ddweud i ddweud, mae'n ei ddweud yn ddweud. A bai niwglu'r llaw gweld ei angen iawn, y modd i gael y piernig a'r llaw'r angen iawn. Mae amser yn cael bod yn gallu bod yn gallu rhywaith. Y rhaid yn bai niwglu'r llaw i'n blwyddyn ar gyfer bai niwglu'r flwyd. Wrth gwrs, dod ydych chi eisiau mor rhesiad-fwrn, dyna'r bai niwglu ar y bol nesaf, a mae'r ceisio'n bai niwglu'r llaw. The British translation of that is, it's very stupid and it's not what it wants to do. So we're going to go through a very simple one, of course. I have two parts of this. A is defined as B. B is defined as E plus 1. And that's kind of like saying that who's the tallest person in the world, the tallest person in the world, with a person who is smaller than him. It sounds like a good Chinese father Ni'r ymwneud yn rhoi. Rwb yn cael ei chydd i'n gwaith yn ddechrau I. Yn lawer y ddechrau I. Felly, mae'r cwm yn oed yn un i'r ein hyn o'r mewn sfeid gewd. Roedd ydw i'r hyn o'n gwneud y ddechrau I. Mae'r cydPrif, mewn cyd- laughu, i gwas 갈u'r ni, bobl i'r setel o'r bobl. Felly, y cyfnodd yng Nghymru yn ddyddwyr ar gyfer arlau cyfnodd. A oedd ychydig yn golygu yn ôl yn dechrau gyda'r cyfrwysgol, yn unrhyw gysyllt, y gallwn cyfrwysgol wedi cyfnodd gyda'r cynnwys yn y sgolhau i gydig. A os ydych chi'n sgolhau, yw ddiddordeb am y gweld, mae'r cyfrwysgol yn yr amser yn ddiddordeb am y cyfrwysgol. Byddwn ni'n gwybod yw, ac mae'n meddwl yn cerddiannol yma i fan'w gynnwys ar gyfer ar y gyrderir, boedd y rhannu'r rymol yn ddif Gespr �wn. A'r Pynyn Llyw Fynu Fynu o'r storio ar gyfer cerfyn o'r rymol, ac mae'n meddwl yn cydylch yn ei ddifwn i ffynu cyffredig cael peth ac mae'r ddifwn i ddifoe'r ar ôl o'r gynhyrch o ddifwn i ddim yn gyd. Ac mae'r peth o'r storio ar gyfer, dwi'n meddwl i'n meddwl yn cyfrifiad neu oes But you have no stat trace before, you have no stat trace in that point to be with. Where shall I bind in? I want to know where shall I bind in again. So it's a useless error message. So we're going to go with some examples of awesome QML code. It's not real QML code, but it's a problem that we've seen before in plasma. So, if you have this code, a property being defined to, if it's Monday, it's 8 plus 1, or 1 to 0, it's just a binding loop. Well, today it's not. If it's all checked in on a different day, that would be. And that's important to, not to a specific case, but when you're doing binding loops in general, even if you've got a problem port, it is a one-time check. In fact, it's a one-time check that's important. It doesn't read ahead and magically work out, oh, you might have been using A, you might have been using B, and predict a future, which I think has been some confusion that that's what happened. It's simply what, after you've had a problem, that you get the worry. And this is another example of what happens quite a lot when we saw in plasma, where we see something like, is this a binding loop? We're setting a width to a value plus a margin. Now, that shouldn't be a binding loop. It's just a value plus a margin. And so you're looking to see if you've got plus a margin. Where, every time a comet retains this, we miss a signal saying, there's several values changed. So it's important that, even if you're binding an error, something in QML, or your program is in QML, your error might not be in QML. It might mean any of the things you're causing. So just seeing a lot of QML at uselessly needs to be a lot together. And final question, is this a binding loop? We don't have any binding to consider. We've got two functions, two handlers, that say greater value changes, change other value. And it's exactly the same thing with the floor, with A and B, and A plus one. It is a binding loop. It's not just a stackover flow. It's not detected. It's only a binding loop that has a protection. It will just stackover flow, and it will. So, even if the same thing you see with binding loops comes up in different ways, and they're even harder to be bound, because you can't even touch down a bit because of this touch. I'm going to show you what QQML binding looks like inside. It's a very simple bike, because there's three different types of binding, but we're not going to have them. Also, it doesn't give signals because of that. But effectively, this is the current QQML binding that works up a new value and a missing change. Your binding loop protection works as far as it sets a flag. It works like a new value to get one set of flags. And it's a method that's called twice on the same object. You get a warning message. It's just a very simple code, and the formula of the pattern is people over-complicate what this does. It's building a flag. People think it's something clever. But when you understand what that's all it's doing, seeing that it's building a flag to see how it has the same instance on keeping the binding binnig higher up to twice on the same binding. And the code for Q finding is really simple. You can read it unless you're looking at these classes. See, a takeaway, it's not clever. Also, it shows you can't have a false positive. It's not really an idea. If you see that error message, it's because you have a fine agreement. But that isn't to say all binary units would necessarily call you to explode, but tokenically need your code at the very best, a bit wider. We've gone to the most common causes. Really, it's between most of the problems that are caused by this one thing, sizing. And the problem is there are so many different ways to set a size. It's layered, it's anchored. It can be set explicitly. And the other random bits of code will also come in and think, on a chain cut. Q would control the dirt. Q would go around and maybe size a few things. Square one after the dirt. And you have a lot of use external things changing them. And there's something, if you quit people had in mind when they developed it, because there is a solution sort of a thing. We have two properties, implicit width and width. And implicit width is a size item, it wants to be, and width is a size item, it actually is. And if you use these two properties, generally you have fewer problems. If you use them properly. Yes. If I look at the past model of an IC, there's nothing to see for you. So it doesn't solve it. I set the failures properly. Also it was more widely left than it has now. And there was a bug report saying exactly where it is. And it's not. So generally implicit width is generated by a size item of children. And the children will have an implicit width and your size item. This size item comes from a size item of children. Whereas width of children comes from a size item of parents. Because if you imagine a window, you wouldn't be using the size item in there. So that needs to propagate from the top down, whereas the implicit size, the size of the bottom, the size of the bottom, that's done in the children, and that's a bit upwards to the implicit size of the window. So implicit one size goes up to the parent, size will go down from the parent to the bottom. And this is a general rule that if you have two properties, if you have a property, it's manipulated externally, but it's also something you're trying to set yourself, you need to have two properties. And that's a part of a lot of problems, and it needs to be done when you first create the items in your initial coding. You have to think, who is going to be updating this? Is it users of this item or are there other objects around the scene? So now we move on to the second part of it. It's somewhat separate, but it's not purely of our language. Debugging anything with GDB, if you first try using a debugging huge application, you print an object, print a key string, and you just see a deep pointer, which you can't evaluate, and it's useless. But hopefully most of you are familiar with printer printing. And printer printing means you want some magic things, and you can see a real value, you can see a real test in a key string. And for anything in QtBase, there's lovely set of scripts in here that if you haven't got them, you should take a photo of this slide and mention you've won this script because it's essential to life. It's very important, and one thing I didn't realise for a long time was that anytime you need to update your Qt, you have to be won this. So this is important. There are things that all of your things, a Q-variant, a Q-left, and it's very good for anything in QtBase. But when you come to anything in QtBase, it's useless, and it just isn't generating anything in there, and it's a lot harder. And it's a lot harder for a few reasons. If you look at a stack trace from anything with Qt Quick, it just looks like garbage. It's just to use v4, v4 execution, blah blah blah. The data is literally stored in these binary-packed blobs that you can't easily decode. Even the basic types of that, your Q-object, has this object wrapper where in a property offset, don't match the Q-object meta-objects and you can get into a world of confusion. Now, and most importantly, your locations in your code don't match the locations in your QML file. You'll see, oh, on QQML winding line, 123, doesn't tell you which part of code you've written, it is. And when you want any kind of backtrace, you need to be able to see where my code is, not some himself. And the good part is, you can extract the values, and you're not going to remember any of the things I said in my slides, but you will remember, hopefully, that you can get this data and you can look it up, and that's easy. Now, on binding lines, going back to binding lines was useful, it's a good example, most things. To get a backtrace of a binding, break when you see a warning message. And breaking when you see a warning message is a good way to find out what I have going or generating in the backtrace. And there's a bunch of bindings, it doesn't work for object creation because that happens in a different thread and there's a delay error. But, so, if we have an example of something with a binding loop, that needs to go through to the mail, but this has a binding loop, when you see a backtrace, as I said, this looks like a generous, there's some of it's readable, a lot of it isn't, you've got no danger in there, you can fail these years if you provide to him, and then you've got that size of being set, but that's not true in more cases. But the most important useful one is this one, QKML binding object, because QKML binding has a link back to your original QML file. It says where expression is. So, from our ddb, we can select frame one and we can find the functions, we can say to it expression identifier and that's not exactly which file which line is. And that's very useful because the plasma has 120,000 lines at QML, and even if you know what object type it is, you really want to know which file it's in, and which line, and that's normally enough to get you in the right set. And we can go through all the different frames which say QKML binding public, and put it in front of it, and that gives us bind 4, and it went on to the top to the next set, and it went on to bind 4, and then you can see that it's binding on 912, but it's evaluated twice. So, you can see your QKML binding which is very useful for different link. And I go to the top, and wrap all of this up in a very simple script, and Thomas McWine was sharing on some forums a proper KDAV guide, and I was quite proud of it, and Todd found it useless. And the reason it's useless is because it does what I told him to, not anything useful. We can see exactly what binding is different, but you can't see or where other C++ are happening. You can't see anything that's not a binding. And they're very important for debugging any issues. So even if down the way gets it all for debugging bindings, you still need to, I think, use GDB and go through this technique. So JS functions, JavaScript functions, also have a callback to where the code is. So every time you see I'm speeding up, I've got flat a little time, QV is your simple call. You can grab this function called QV4StackTrace and you can get a JavaScript stacktrace of everything that's happening in your JavaScript stack. And no matter where you are from GDB, this will give you an entire JavaScript stack. But any JavaScript function does have a point back to where it's going from. But that's still going on. We still have animations and annotators which aren't quite done in the same way. They don't go through the bindings. It's very difficult to read. So the last thing I want to show is to unbox is QObjectWrapper and talk about the set property. As I said, the properties don't match in QObject properties easily. So you can print QQML property name and QQML value QQML data type that will also be in box. You can print value.2Q string and that version. And it will print no matter what type of JavaScript value it is, it will print out in a readable Q string way. And if you know what base is coming to QObject, you can sometimes see where errors are occurring. Because if this function takes an integer you'll see something's gone wrong here. You can see a string being passed in. So it is useful for debugging things that otherwise you would just see an engine value and it wouldn't work. So GDB is very useful for this sort of thing. So there's something to say GDB is useful and even you just have a huge chunk of unreadable JavaScript and QQML, blah blah blah blah, you can extract information. For functions and bindings, we can get a source of QML for everything else that's a lot harder because it gets taken power and now information is lost. And even properties can be fetched. And I recommend reading this KDA blog post that talks a bit about a binding word. And that sometimes the GD doesn't matter, it gives me better backwards in GDB and I don't have that. I mean you still go into the QQML and some of the useful things that are great for your very good point. So get to the microphone. So would you say that the presence of some QML binding looks is somehow a clue that there are some mistakes on the QML design of how QML has called it? Do you mean that it's a mistake in upstream acute or in the order? Generally yes. I haven't seen a case where I haven't been something quirky. It is interesting long, but it's always that's another way of doing it. Every time it's been fixed, it looks cleaner. So it's more real, but it's not necessarily a one because we go back to that example where we just went boneless and mixed where that way of re-evaluating it but it ends up re-evaluating it. You know it now that every error here is the same value and therefore it wouldn't topogate it again. But until we looked into that we didn't know it would end up being the same error. And the danger is you missed topogating in a set of states and except if you go in acute to say possibly there won't be a procedure it could end up re-evaluating to something worse. That was my a lot of questions what you were saying. I sometimes find that I have really lost my view but when you re-evaluate my view it's actually the same value. It's finding that it's a backward code that happens. It's finding that it's terrible. I think we have you told me in several cases. You told me that you were wanting to do it again so I don't think something that could be easy for you but but I mean the whole gdb part isn't relevant for any of this. Most people practice it. Thank you. Ten. I wonder if one message has generated couldn't that bring the secret? I mean I think it could it would mean re-evaluating because of the mic. Couldn't it be cute? I think it's that place. There's actually a lot of problems where something could happen and there's 7,000 there and obviously it's a genius. The problem is I don't remember if it could be to keep that thing open and is it worth it? It may be that it was an optional flag I can make it but I think it's still that problem of just knowing the right doing trades is useful. It's a very good clue but something that still needs more information but yeah I think it could happen as an optional thing. Because you mentioned Gemma Ray I did you remember seeing something scroll by about Gemma Ray getting a finding six storey on looking at you? Do you know anything about that? I'm sorry I think the problem is in the working of that there's a VIP branch a company by VIP branch in the data. He right now that still be nice on some of the pictures that I'm looking over too with their access to dependencies. It's mainly showing the dependencies for the african value so that of course helps how you got to the loop but it's not yet hooked up to bringing to that specific binding when there's a loop. It's not a suspect race but it does allow you to step through how binding is. Right you basically see the dependency for specifics like when that chain was much available more interesting stuff a little bit but you just need to get access to the private part of the possible private API. Any of those?