(Re)discovering SPL

Video in TIB AV-Portal: (Re)discovering SPL

Formal Metadata

(Re)discovering SPL
Alternative Title
Php And Friends - Rediscoveringspl
Title of Series
CC Attribution 2.0 Belgium:
You are free to use, adapt and copy, distribute and transmit the work or content in adapted or unchanged form for any legal purpose as long as the work is attributed to the author in the manner specified by the author or licensor.
Release Date
Production Year

Content Metadata

Subject Area
Website Right angle Number
Revision control Inclusion map Interface (computing) Infinite conjugacy class property MIDI Source code Sturm's theorem Wireless LAN Library (computing) Social class Condition number
Group action MP3 Code Source code Sheaf (mathematics) Function (mathematics) Counting Mereology Ultimatum game Mathematics Bit rate Mixed reality Different (Kate Ryan album) Endliche Modelltheorie Recursion Abstraction Exception handling MP3 Structural load Computer file Interior (topology) Electronic mailing list Bit Hecke operator Special unitary group Instance (computer science) Regulärer Ausdruck <Textverarbeitung> Discounts and allowances Type theory Sample (statistics) Oval Phase transition Interface (computing) Right angle Modul <Datentyp> Hacker (term) Data structure Point (geometry) Filter <Stochastik> Ocean current Digital filter Functional (mathematics) Game controller Computer file Adaptive behavior Letterpress printing Directory service Online help Field (computer science) Element (mathematics) Number Revision control Chain Iteration Alphabet (computer science) Data structure Form (programming) User interface Multiplication Information Key (cryptography) Interface (computing) Counting Basis <Mathematik> Database Directory service Limit (category theory) System call Logic Function (mathematics) Network topology Statement (computer science) Iteration Object (grammar)
Point (geometry) Filter <Stochastik> Digital filter Functional (mathematics) Context awareness Sequel Variety (linguistics) Chemical equation Multiplication sign Control flow Function (mathematics) Goodness of fit Bit rate Read-only memory Semiconductor memory Different (Kate Ryan album) Befehlsprozessor Data structure Implementation Recursion Vulnerability (computing) Injektivität Area Priority queue Interface (computing) Electronic mailing list Variance Instance (computer science) System call Element (mathematics) Cache (computing) Array data structure Radius Software Personal digital assistant Function (mathematics) Network topology Video game Website Iteration Quicksort Solvable group Data structure Recursion Spacetime
Game controller Functional (mathematics) Run time (program lifecycle phase) Code Multiplication sign Sheaf (mathematics) Online help Parameter (computer programming) Number Element (mathematics) Time domain Programmer (hardware) Different (Kate Ryan album) String (computer science) Data structure Error message Exception handling Physical system Form (programming) Area Noise (electronics) Scaling (geometry) Inheritance (object-oriented programming) Software developer Electronic mailing list Data storage device Bit Database Instance (computer science) System call Benchmark Category of being Type theory Computer configuration Logic Personal digital assistant Function (mathematics) Network topology Normal (geometry) Object (grammar) Quicksort Whiteboard Row (database)
Point (geometry) State observer Functional (mathematics) System call Copula (linguistics) Run time (program lifecycle phase) Computer file Multiplication sign View (database) Source code Parameter (computer programming) Heegaard splitting Different (Kate Ryan album) Object (grammar) Software design pattern Software framework Error message Exception handling Social class Area Default (computer science) Information Structural load Poisson-Klammer Bit Directory service Variable (mathematics) System call Type theory Array data structure Word Process (computing) Personal digital assistant Website Right angle Object (grammar) Exception handling Reading (process) Local ring Resultant Asynchronous Transfer Mode
Radio-frequency identification Software developer Blog Software developer Multiplication sign Blog Interpreter (computing) Website Bit Maxima and minima Cartesian coordinate system Library (computing)
Inheritance (object-oriented programming) Code Multiplication sign Device driver Mereology Benchmark RAID Subject indexing Numeral (linguistics) Personal digital assistant Semiconductor memory String (computer science) Cloning Website Summierbarkeit Right angle Quicksort Object (grammar) Extension (kinesiology) Physical system Library (computing)
the rest of OK and last stock hopefully the best 1 and somebody question how many of you have actually used the SPL I'm
actually amazed by the number of that let me rephrase that how many of you have used SPL without going nuts I will that less hence could have noted that this is the problem when we are dealing with SBO because of Bill is truly truly awesome only the documentation is in that's so when you actually want to start to do something with SPL and which I you going to look for not StackOverflow and some other it's like the speed of that right the speed really has the most awesome documentation if you don't know anything you know what you want to do except for the SPO so if I go to the website
such as PL I get something like this so called introduction says centerpiece the library is a collection of interfaces and classes that are meant to solve common problems right the is OK doesn't say anything while some people say this is not fair because this is the old version that's true nowadays that have a new interface so would look something like this and it
has 2 more paragraphs by atleast 2 more sentences and this also 1 extra user contribution on there as well yeah then still not helping and this is pretty much the best you kept from that spilled the condition so and this is
the problem there is not enough documentation to actually use the SPL and with the there is there isn't a lot of examples on how to do stuff with it and sometimes they're plain wrong that so much on the speed of that anymore but all books and everything sometimes anything they don't make any sense or they actually wrong so today I'm going to try and talk a little bit about the things that you know we can make them so how many of you have ever seen in a spilled because and only 1 just talks like this if you look at some of them are actually doing is built up so moles of the stocks are about 5 from the it's now about interfaces there about iterators about data structures exceptions as a miscellaneous functionality that because that is what covers the SPL and today I'm not going to talk about that I'm going to talk about all the fun and freaky stuff that is happening with the SPL inside and don't get me wrong there's a lot of things that will be W. T. F 2 then add however I don't want to scare you away from SBL but I wanted to demonstrate to you that if you want to use SPL there are things that you know it doesn't make it always sense and I want to know help you would get and and see if we can cover the basis the so let's start interfaces because this is probably the most important part of SBO and how many of you know about the traversal phase good how many of you actually try to implement 1 how many of you succeeded the update other business but the thing is traversable from a point if you cannot be implemented this star it can but us becomes and so what's the point as well you can traversable interfaces so you can use things like instance off to detect if an object is to 1st of all enough and what do we need to visible because if you going do for each 1 of reversible get then it does magic things I with the major things I mean you can completely customize the way how for each iterates over something reversible which is really awesome because you can do all kinds of really cool suffered and but again it's reversible we cannot implement directly however there something else we can do we can use iterative it's right there is an interface and this is basically our user interface to make an object reversible so if you want to do addressable objects we use Iterator interface for that and iterate interface has 5 different methods current key Next we want valid I they make pretty much sense if you know how for each worked and this pretty much makes sense the not besides an iterator and this the Committee no not really but they can be have grouped into different forms 1st of all we have something called filter iterative and filter iterators are really nice because of field iterator can get another iterator and filters out the outcome so what you can do for instance in say and i want to filter out every 2nd element of an item so if we have an iterator that iterates over the alphabet we can iterate uh we can filtering through field iterative says I want only the a and only the sea on only the E. etc. so you can do all kinds of really cool stuff adapt by filtering out elements to filter the rate I'm not a fun thing is that you can actually chained together so you can have multiple iterators it all works with the output of the iterative off the at another type of iterator and when the news that a lot right now is called iterator aggregates so we iterate and is something that that is also an interface but is an iterator by itself but can be of use as iterated because it knows how to get an iterator so what happens there is that if you want to iterate over an object that is that it implements iterative aggregates what you can do here is saying OK iterate over this object I'm not an iterative myself but I know how to get it the this is mostly before doing things that you know have objects that and on data the bytes Albert's um can fetch external reduce OK I so as an example on how to use iterators can anyone read this code I think you all pretty much understand what this says you're right we open the directory we read the fossil that directory and reprint every file in that directory right everyone is written code like this most probably right OK so suppose I have a new Silicon Valley startups I have made this apt goal Austin at 1 . 0 perfect I'm making millions out of this the now customer comes and says you know what this is all nice eyes can see all the father my directory but now I only want to see all the MP3 3 files in my directory so anyone an idea how to do that the you OK but if you don't know about iterators well yeah you something like this probably right everybody saying all I'm not doing that really this is your code to deal with that's so so what we do is we create a hack like OK this filter out only and files so we use we use a regular expression was or something similar to filter out 3 files perfect works perfectly however what if we want to filter out and 3 and get back files what if we want to filter out and the tree falls in the larger than 6 megabytes what if you don't want to filter at all what if we want to search subdirectories what if you want to search multiple directories and yeah let's accounts anyone and so you know you get a statement should get all kinds of really weird stuff that would deal with every day so what we call maintain without even tested our Sebastien about that we'll come tested but you can't maintain it and doesn't matter if you're not the 1 who has to maintain its but that controls on account even reuse it you know that is the code and you know let's stick with that so let's change that into iterative so we do the same thing only we show off we use iterative so even if you don't understand anything about iterators you can understand that a directory iterative gives you an iterator that iterates over the directory right but now you can see that the for each iterates and outputs so every value is not so much the file name but is actually an object with all kind of cool stuff like the pot farming file information etc. when we have that question about you know can we feel the stuff we show we can do that we do something like this so here we have the field iterate action because we have the directory iterator and we go see that inside the regular expression so to
filter out everything and all adult and tree that anyone see real difference between this discount an economy for what would really exchange here and suggestions yeah I would see that you know the heck we did is now not inside the for each but it outside yes so if we can see this this for each look as obvious logic and only this is much much uh complex and I show here but now we can do all kinds of really cool stuff so suppose we have the regular expression here and we going feet that 1 into a file size iterated doesn't even exist but suppose it would exist if you create something customer yourself you see straight away what it does it filters out all folic files between 0 and 6 megabytes what does limit iterated don't any ideas yes but I can't make it easier than that it really it's just like you know my score well with offset the limit it does the same year so it gives you from the current directory MP3 files that are between 6 of between 0 and 6 megabytes and it'll show you that the 3 and the 3 file starting from the 5th 1 the chick section but still the for each new stays the same you don't have to touch anything inside the business logic it only gets a list of elements that it has to work with right OK this is the most important thing about iterators if you'd understand this had done that so you know with with stuff like this this more than enough however n we can do things because they're more usable you know we can use it iterators wherever we want because of the iterated does not only work on the Directory stuff we have it works on any iterators it works on elements we get from a database it works on you know whatever you get from a RESTful API doesn't matter it's possible because now we can test a limited were just a regular expression it were just a directed with work so we can test more in isolation it's also more maintainable because we just no need to adapt the basis called this talk about countable this is really fun because this is the 1st official SPL operates at its interface that's there and on the website and the countable works a bit like this so as an example I haven't iterator and an iterator online I leave out the thing that I but it gets 3 elements and every 1 2 and 3 and then there's a print count iterative what would be the output any ideas 3 no actually it is 1 because it's only 1 iterator that's a sexually and a counted here right so only 1 object inside when I implement accountable I need to implement a count function what will happen now I use 5 elements in here what would be output of count the yeah exactly 5 because what kind us currencies sees that if you're counting and object it will detect if that object In implements countable and if it does so it will call its current function so you can do whatever you want you know to to make can't do your being you know whatever everyone i'm but there's a catch and this is what hurts a lot of people so do the same thing I have 5 elements again I have my countable iterator I don't see that into a filter juridical the limit iterator offsets 0 number 3 so what will it do it'll it'll it'll give you uh at least 3 elements right so what what can we the the the OK the fact that after I accept every number until then no actually it will be 1 and the reason for this is that what we are counting is not my countable iterator but it's limited to rates and the limit iterated does not implement countable wt affront the OK welcome that SBL I'm gonna loads more of this and so these are the tricky things the things that you will find out in 5 minutes of working with SPL and will make your screen and and you know go back to Python or can rather like which I so yeah so this is what makes the the SPL really really hard to use so let's talk about iterators themselves and there are lots of there really cool it it is there this is I think this is the lowest that's currently even available in 5 . 6 on an insurance in 7 are additional interface if there exists no the so we have things like append iterator at the every iterator and all kind of cool stuff however if you gonna look up in the documentation to see what what's uh what a directory iterated dust if had it doesn't sometimes makes sense however there's a really cool trick um amateur if you already seen it today and but this is a website called alexa . php of that and if you looking day this is actually you know the source code the seed code off PHP and if you gonna take look in SPL directory there's an internal directory and its internal directory and basically gives you a piece P Model of what the of dust so for instance if I gave going to take a look at append iterated and here it's just pretty much a PHP version of what that at append iterator actually is because it meant it up and iterator is program and see that actually model fits through PHP 1st so if you don't understand what an iterated does you can looking here for 2 know to get a little bit more than a familiarity with its what's going on internally and don't really crazy iterators there like an Iterator iterator the Sun's recursively of writer and so why are they calling it recursive iterator because there's already a recursive iterator on so that must be a recursive Iterator iterator and yes there is 1 and there's something called recursive call that iterator which was also if you do scrabble a lot and always training at and so you know explain this to somebody who never used SPO I'm going to try a soft and so we added this what sometimes make things hard in this field know as well so let's start with Iterator iterator the Iterator iterator basically does what it says the iterates over iterates uh over its
all items actually wanted dusted there turned traversable thinks and thinks this is this really global him into an iterator and I told you before that there's an Iterator interface but there's also something called an iterator aggregate interface and the filter iterator like the limited to rate only accepts the instable interface so it's tied as iterator so if my iterator would be an iterator aggregates I 1st have to basically converted into an iterator by doing something like this but if it's an instance of a tree aggregates I get real iterator from it absolutely does not make any sense but this is the way how things work internally so what they do is this say OK I got iterator i'm gonna feed that into Iterator iterator to convert it to all a really traitor and I can do stuff like limited greater 14 so if you see Iterator iterator somewhere in ago they have no idea why chances are the quota of that piece of software didn't either but sort on the website I you know just edit and you mostly find uh when dealing with the radius so it happens a lot yeah so recursive whenever iterator any idea what it does the naming hasn't the you think finally yet so let's try so then every iteration which iterates of I an area it's full bar and other internal every cooks walks and that's so when I iterate over this what will be the outputs so why are exactly full bar a bar my best OK so there's something called a recursive every iterator so I use that instead right so at least it's because so that would now would be full bar that's and only the now you really going to Ruby and go the variance you have to do a recursive Iterator iterator before that I have widened you people know this this is this is because we know this then it works automatically right so now you see why people lose SBL but not yet here's the thing the recursive iterators they only at the possibility to recursively iterate over data but you still need to improvements that functionality yourself the recursive Iterator iterator actually does that for you so if you really lazy you can just showed in a recursive Iterator iterator headed intellectually work life and so to be honest my advice would be to be 7 people in US stopped working peace be 7 start working as yell at me note that this is this is what what happens a lot in in SPL this is what makes it really hard to work with so we can go back filtered through the anyone but the tiny everybody's like delivery what is easy self it's a recursive iterator so it will do everything except recursively but it gives you the possibility the things recursively at its a filter iterator so it actually injection iterator and filters out stuff and it uses a callback for that which is really awesome so now what we can do is we can create a simple filter iterator by just adding a call back to it it works exactly as you would expect from now on but again if you start with SBL doesn't make any sense at all a iterators variety that the thing is now a lot of quirks in it but but they're easily solvable but it means you know the breaks I would really say OK let's give it a try on peace be 7 but you know I'm the documentation is not really up to date that makes really hot naming is verry confusing but there's something called the caching iterated which does everything except caching literally and wide it can do catching but not in the way you think that this recursive iterator we already discussed that 1 and as a sequel iterator which obviously is not an iterator but an interface it's but as stated before you know and I'm gonna talk about old scary stuff and iterators aware that really really but you have to get past this part and that then they're really really also really tried at least you know if you get something that could be all understood to but it's probably not you it's S. Patel at that point of the really messed things up I data structures this walls also a lot of really cool data structures inside things like a spilled doubly linked list sp aspect as value and priority queues and everything which is really awesome I'm not really gonna talk about that because it's it's way too complex to actually uh and tell you about that there's a really good talk about uh uh from peptic a lot I think would us a book about this work is really recommend to see that 1 time the thing is every data structure has its strengths and its weaknesses and they can be the but um there are basically a trade off between you know how much time and how much memory the something use so 1 data structure can be really really fast but takes up a lot of memory some data structures are really small memory wise but this long time to find items or to add items or whatever the thing is peace be areas a really good there are really and well for most cases they are the best but data structure you can use because they're internally they are stored in in a way that's you know has a really good time and space trade so if you don't know please use areas unless you really benchmark whatever you're doing so don't say 0 you know what I am and we want to do well like all kinds of really freaky stuff would areas just use SPL a fixed area what you can but that's a really good way to should a 7 foot because it has its uses but you really have to understand how it's how it's being used and and and how it's you know working internal I spectacle so doesn't a really cool things like more of a pop quiz about the difference uh data structures that are inside so as an example I just want to show you on some as well and to see if you can guess which kind of data structures these are so which 1 I'm actually yet easy enough this is a step this 1 and as the crowd yeah no it's
actually SPL Q I sort of but I have to apologize for my Dutch fellow Members for this 1 the the S SBL
drunk linked lists but this is a SPL English but then again they're using both parents of government like this 1
so yeah a spilled object storage and i it exists my
favorite especially when I'm flying a lot as we have our the 2 this 1 is and the she is
SPL he because SPL internally user tree system I could use another type of people that would not be appropriate for this problem I think and this 1 already talked talked about it but a scale fixed array while they actually told me no that's not true because those uh the settlers can actually move a little bit while that might be true but you know probably picking them up and you know thinking noise so it's fixed enough that the thing is with SPL data structures really really use them wisely don't use SPL steak on SPL you when you do random reads if you want to use elements 6 and 5 thousand and then 339 they also if you want to do 1 2 3 4 it's a trap so if you want to do sequential stuff but not for enemies so this is you know what you have to think about don't use fixed areas when boost because if you look at the benchmarks boards they are and their depends on a bit what you're doing but but you have a lot of things that you get with normal peace be areas which you can't get with a fixed area so you know please please please use them I think OK exceptions who is using exceptions the code cool so some of you on the but it's I think it is just leave your name and number so is all kind of cool exceptions in um the SPL and things like that function call that met and call them in fiction but there's actually no documentation on when to use 1 exception To be honest I try to figure out what is exactly it's attaches exception pretty much nobody knows all everybody gives a different answer so it's a bit things at and the thing is these exceptions are based 2 categories in logic exceptions and runtime exceptions that I'm really really glad if you're going to use a runtime exception when you need to throw up an exception to any future all alleged exception we need to troll logic exception so as an example the this is a function call if the string is the Spanish Inquisition you throw a new expect an expected value nobody expects the it takes a while at however this is false because an expected value exception is runtime exception they need to add a logic exception here so it will be invalid argued exceptions so nobody was expecting that right and they're they're on I'm so the thing is in this case it should have been a modern exceptions now what is the difference between a runtime section and what I would say is that if you as a developer have control over the exception it's logic if you don't have any control it and for instance In this function so the 1st Saints imposition invented as an argument exception that is a lot logic exception because you as a programmer have control over what you call the full method with right the at least I hope you don't just get user data in there but on but then again if we have like a safe record here on that stage erected into the database and you know what's happening database could be full all flying on fire stolen no so there's all kind of exceptions that can happen outside of the control of the developer those cases you know a runtime exception could occur and what happens of what could happen in this case and suppose it takes a user 5 minutes or 15 minutes to enter a formal goes to save records safe record sets up sorry runtime exception because there was a lack in network traffic or whatever go back and fill out the form again because I didn't say you know what could happen here is that if distinct shows a runtime exception OK so let's wait a 2nd try again good at 5 times and then say to the user listen like a tried 5 times and you know the database is still fire sorry but I can't say that all you can do things like you know pull back into a acuity and say later or whatever so with the help of things like time exceptions and logic exceptions you can actually you know not say or an exception has occurred that error which is actually try to recover from certain hours and this is why things like them exceptions article care sort of time then I always recommend is never true exception because if you cho the general exception
you are like the same type of the same customer that goes into Übertragung says of the site doesn't work please fix and you know something is wrong death you know but there is no information about what's wrong you know what what happened whatsoever but so please do not do it and but always catch exception 1 way or another because they're always than the nice words in idiots so there that actually shows exceptions when they should have things like runtime exception or much exceptional whatever so at least gets them but never tried the that's FBI has got all kinds of miscellaneous functionality I'm things like SQL overloading which don't we have to deal with any more because everything is composer right now hopefully I they have things like a still fall info process which is really awesome because the directory iterate etc. uses as we'll follow invoke classes so you get all the file uh functionality inside a neat object the same thing with follow object which have the actual file inside so you can do things like reading and writing directly on objects you things like every Jacksonians even interfaces like SQL Server SPL subject to create uh um observer a design pattern everything the on the wall that the users but you don't see it real and this really cool thing with automotive anyone ever use other modes for must be 0 cool OK so for those of you what does this do so the thing is must be or the mode register can register function just like discussions go the load is and want to you know the ultimate step and the FBl local function is the default on loaded SPL users so what would happen if you registered fold of another that results in this case in anodic exceptions which makes sense because you know it's already there so there's no need to register OK so what does a spilled not manages to chosen error exception something it removes all the automotive it destroys literally don't stack and such housing fire I don't don't even try that it's literally in the SPL uh source code if the argument is as the old road call destroy the whole last actually removal of I'm not sure if this was like the book stuff left over because in my opinion it shouldn't be there is there I don't think it's documented well because you can literally does not work and I've spent like a few times dealing with this issue uh myself so this is why I want to know and tell you about it but all kinds of really really freaky stuff anyone working with every object so every objects are objects that acts like area but in the same time they are not objects that x like area that they do work a little bit differently and ended that the thing is is it's really subtle but it's a big difference it can make a big difference so as an example I have an area with full and that's I say variable follow B is the way I had something to be what will be a what will be the the ideas full and by our only full on the right because what happens is a and B points to the same variable but because we add something to be it's it's a copula accident splits out the true errors into 2 separate variables so a is left alone and be will be added best look at this makes sense however if we use an area object and from you know the you point of view it looks pretty pretty similar like areas you can use the square brackets and all and so at full bar to a I do the same thing I assigned a to B as well I had something to be and what do I get FIL matched well that's right so even if you use and I know some frameworks really like to to hide the fact they are using every objects it can mess up your hold very weak current whatever because what happens here the they are basically the same object so they're referencing the same object and and they're not splits split as soon as you uh uh change something so you have to be really really careful with stuff like that so how can we make a spilled easier because everything I told you does not really want you to you know make use of the SPL um there's a really good way to do that have written a book about it I can
actually say it's the 1st and only book about SBL now it's so it it in detail describes everything it should been interpretation that also gives you all this kind of freaky stuff that he she don't have to trip over it and however commercial stuff site of adoption of the SPL
will only happen when developers can complete and become more familiar with it how old do you think SPL is like 3 years old yeah so that's like 10 years 10 + years no that's that's a long time there's actually no reason you know I understand where you can't say OK I can't move to PHP 5 . 5 because of you know hosting you can use SPL right now so you can know triple repress right now what in production as of now it works and but we can only make it happen if people are more created by its and there is no real way to do it because of deprivation socks the Baroque posts on minimum and aren't really that good so here's the thing if you don't use the SPL just to see if all pretty stop reading here true what I say today blog about it the more people work about it the easier it is to find even you know posted on StackOverflow I don't care of that application because you can do it now sell yourself with the user contribution notes and if you know a bit about seeing everything you can even find the quirks and maybe even sold them yourself it's most of the time it's that simple but nobody really thinks effort to do that that's a bit of a shame the so these things you can do yourself right now any questions
could too much this 1 OK I would use the percentage by their the quality
of that so say is no the references and then you have you know and and sorry it's completely no so B is clone a yes sometimes site I even get confused now in this case means clone a because you get to separate the of right of objects in that case right this why couldn't pronounce ampersand because it's OK any more questions but I see somewhere in the light yes of course why is an extension on its it started out as a library as the as the but APEC 0 I think there it sort of as a parent and then it's sort and you the the people I think if you think about what we do know that the sum I think about 5 . 1 they decided it was a little but the this find and you all that the yeah and and the thing as well is that are things in SPL like the drivers will never think it's also used on other parts of the system so like at the time uh use reversible uh symbolic somehow use profitable as well and that code is actually inside their you know the the SPL extension so it's it's a base you know interwoven nowadays so but I think it's a good at a good thing because you know if the FBl is always enable people should use the OK 9 1 1 you all of the world the yeah well the SPL the accelerator is um more like what you see as an air raid on on the sea level it reserves for a certain amount of uh slots for you that you can use so it's it doesn't grow dynamically you can make it grow but if you really shouldn't and and let's say the and then what they do in the a small of the the and they all the yeah and what what happens then is because it is less of its more compact you can't use string keys it's full numeric indexation so you you're missing a lot of you know of optional and an additional stuff and and it really depends you really should benchmark to see if it if it really has more memory or less because it really depends on the situation OK anymore this book and uh and they knew the
thank thank mn