AIMEE_KNIGHT: I'm from Nashville.
AJ_O’NEAL: And Dan, who needs no introduction, why don't you kick us off?
AJ_O’NEAL: Let's do it.
This episode is brought to you by Dexecure, a company that helps developers make websites load faster automatically. With Dexecure, you no longer need to constantly chase new compression techniques. Let them do the work for you and focus on what you love doing, building products and features. Not only is Dexecure easy to integrate, it makes your website 40% faster, increases website traffic, and better yet, your website running faster than your competitors. Visit dexecure.com slash JSJabber to learn more about how their products work.
AIMEE_KNIGHT: I also feel like this should have probably been admittedly moved to one of our earlier episodes because this is actually really important and the source of a lot of bugs.
AIMEE_KNIGHT: It's also been a pretty popular, like whenever you have like trick interview questions, this is a pretty popular one.
AJ_O’NEAL: There's nothing that's a trick about this.
AJ_O’NEAL: Rust or Go.
DAN_SHAPPIR: Yeah, it's indeed the source of a lot of bugs. And again, the sense that when you're passing in an object, because you're not passing in the actual object, you're passing in a reference to that object, it doesn't get copied over. And when you're making changes to that object, you're influencing code that's outside your function. So there is effectively a side effect here. It's not immutable. And I've seen a lot of cases in which functions modify objects that they don't really own. So they get some sort of, let's say, an options object as a parameter, and then for convenience sake they calculate something and put it in a property on that object. And they disregard the fact that maybe that external code that invoked them, you know, assumes that the object has a particular structure or values in its fields and all of a sudden the function itself has modified it unexpectedly. And in that type of a scenario, you probably will want to clone that object inside that function. And one nice thing about ES6, quote unquote, or ES 2020 or 2021 or whatever, is that now with the spread operator on objects, it's actually fairly easy to do a shallow clone of an object. So if you've got an object, let's say X, you can do just open curly brackets, dot, dot, dot X, close curly brackets, and you've got a shallow copy of that X object. And this way you can clone that object inside of your function, and then do with it whatever you want.
AJ_O’NEAL: That's not any different than object on a sign, right? Is this syntax sugar?
DAN_SHAPPIR: Yeah, well, there's also a semantic difference because you're creating an object rather than modifying one, but for practical purposes, it's essentially identical. Any comments on this before we move on?
AIMEE_KNIGHT: I don't think we're very good there.
DAN_SHAPPIR: I actually have a comment myself, and something that's kind of related to that is that people are often confused by a const reference to an object then modifying the object that it's referenced.
AIMEE_KNIGHT: Oh, yeah, this is, this is.
DAN_SHAPPIR: Yeah, this is this is again, it's the same sort of thing, because again, again, the const here is the reference, the reference cannot be changed, not the object which is being referenced. That object is wholly mutable. If you want the object itself to be immutable, you need to do something like an object freeze on it. So yeah, so it's kind of related and certainly confusing to a lot of people when, when they see constitutes in this way. Some people even consider it a sort of a bug in the language. I think.
DAN_SHAPPIR: I would say it's dead to me.
DAN_SHAPPIR: So it's actually actually let me let me interrupt you. It actually sort of got fixed then arguments doesn't behave this way anymore.
AJ_O’NEAL: Oh, I'm gonna test that real quick.
AJ_O’NEAL: To be clear, it should not exist. It should throw syntax errors when you put commas back to back to back by accident.
AJ_O’NEAL: Well, it depends on how you iterate, because it behaves differently with different iterator constructs in the language, which is
AJ_O’NEAL: So I think that this is one of those things you should know so that you don't use it because I just, I don't believe that there is a legitimate use case for this. I think if you're going to do essentially what's a hash map, then you should be using an object and object dot keys or object dot values and that remembering the differences between for each and for in and for of and for, and how they all behave differently, I don't personally feel like that is a lot of value.
AJ_O’NEAL: Well, but there's a lot of stuff that you do theoretically and pedagogically. That's like, Oh, it's cool to know this, but if it doesn't have a practical application, I like, what do you call that? Cytogenesis. Like something exists because you reference it as existing, but not, I mean, it's like, knowledge that didn't get garbage collected because somebody said it was knowledge that shouldn't get garbage collected. It's one of those circular dependent circular reasoning like because somebody comes up with a theoretical case for it does not make it a practical case.
DAN_SHAPPIR: Well like I said I put it in the should know bucket rather than the must know bucket and it's a very it's even arguable whether it's something that you you know
AJ_O’NEAL: I agree that you should know because you're going to come across code or if nothing else, perhaps a mistake that you make where you accidentally hit the comma twice and your linter doesn't actually delete it because technically it's not a mistake in the language. It should be a syntax error, but technically it isn't. So at some point you're going to come across where you put like a comma behind something and a comma before it, or you put two commas in a row or whatever, and you're going to end up with a sparse array and you need to know this behavior exists and you need to know why your array is off by one or whatever. So I agree that it's something that you should know. I'm just saying you should know it so that you don't use it and that when you come across it, you know how to fix it.
AIMEE_KNIGHT: It's pretty uncommon.
DAN_SHAPPIR: My next entry is also something that you should know in order not to use. But before we get there, did you actually get around to test the arguments object that we spoke about before?
AJ_O’NEAL: I did, and you are in fact correct. And I am surprised because I have been, you know, a long time use stricter ever since before it was implemented in Firefox even when it was, you know, first being introduced in linters, I was a use stricter. And so I was familiar with a number of the use stricts fixes but I was not familiar with that one. And I'm happy to announce, if I'm not mistaken, if you use ESM, one of the benefits of ESM is that you don't have to put use strict at the top of your code.
AIMEE_KNIGHT: That's true.
AJ_O’NEAL: It runs in strict mode. So I am happy to see that they reintroduced strict mode after taking it out when they reintroduced ESM.
AJ_O’NEAL: There's the difference between not defined and undefined and null.
AJ_O’NEAL: I would love to hear why that is.
DAN_SHAPPIR: Because I believe that you should use things for what they're intended because at the very least you convey intent. When I see somebody use a map, I know that, Hey, they're going to be using this thing as a map. If I see somebody using an object, well, they might be using it as a map, but they might just be using it as an object. I need to read the code in order to understand.
AJ_O’NEAL: Um, so my question is, cause I've never used a map and part of the reason I've never used any of these new map and set and all that is because just sounds complicated, like what I've got works. Why do I need a different tool? Like what does it benefit me? My fear is this, it's just going to make debugging harder and portability harder and understanding between communicating with people. More difficult. I get what you're saying. If it says, you know, map, then you know, well, you hope that it's being used as a map intentionally. But as far as I understand, there's no optimization that you get from it. There's it just makes it more complicated, makes the enumeration of properties weirder. It just like, well, screws up the way things used to be. But I don't, I don't really know. I don't, that's my, that's, that's my, from briefly looking at it once years ago and not having looked at it since.
DAN_SHAPPIR: Well, I would say, I would say like this, first of all, the old way continues to work and will always work because there's just so much code out there that just depends on it. And you know, you're perfectly, it's perfectly legitimate to just, you know,
AJ_O’NEAL: it would have to be a type language to not work like you'd have to change the language even more.
AJ_O’NEAL: I would say the core use case of this would have been something like add event listener, remove event listener, where you need to find the function, which in the olden days, you just had to store them in an array and then loop through the array until you find found the function that triple equal the function you were handling to see if that had already been added or if you could remove it. But that's mostly, you know, internal stuff that lowly web developers didn't do.
DAN_SHAPPIR: Yeah. But I can give you another example. Let's say that you want to add some arbitrary data, not string data, just arbitrary data on top of HTML elements. So if, you know, the way that you might do it now is either just, you know, modify those elements themselves, which kind of breaks encapsulation and does all sorts of bad things can result in memory leaks or whatnot. Or you give them all IDs and use these IDs as keys into a map that maps to them. So what you want to do is keep the data, your own data on a separate object from the HTML element, but be able to easily get from that HTML element to that other object that html element to that other object which contains your own private data. And like I said, with maps, it's really easy to do. And without maps, you either have to really break encapsulation or jump to a lot of hoops to achieve something similar. And it's not such a weird...
AJ_O’NEAL: Well, not really a lot of hoops so much as an order and loop.
AJ_O’NEAL: PS Steve, did I get a chuckle from you silently there? Cause I thought that was a really good bad joke. I mean, dad joke.
STEVE_EDWARDS: No, you did not. Yeah. You did not get one for me.
AJ_O’NEAL: Sorry. It was that bad. Yikes. Okay.
DAN_SHAPPIR: Hi Steve. Cool to have you along.
STEVE_EDWARDS: Oh, thanks. I'm just listening since I came in late.
AJ_O’NEAL: So also on our show today, we have Steve Edwards.
STEVE_EDWARDS: Hello from where am I from? Oh yeah. Portland where it's very cold.
DAN_SHAPPIR: One of my picks at the end will be the Tel Aviv weather. So just you wait, you'll be really jealous.
STEVE_EDWARDS: Oh, I'm always jealous of people where it's warm. So anyway, moving along, the next one that I have on.
AJ_O’NEAL: I had one more thing on that. One more thing. Which is that, you know, we're talking about compiler or VM optimizations and all that. There is in fact a way to free up memory on an object, depending on how it's done and where it's done, et cetera. If you assign null to something, especially if you assign null to it, within the function in which it was created. It will get reaped by the virtual machine at that time rather than waiting for the garbage collection pass. It depends, you can do things that will break that, if you have other references to it or it's been put into a closure or whatever. But if you, and some weird reason, you want to make garbage collection happen sooner. I don't know if the delete operator will do that, but I imagine that in some cases it may, probably in the same cases where assigning null will work, but I have personally observed that assigning null can cause a free quote unquote.
Did you work your tail off to get that senior developer gig just to realize that senior dev doesn't actually mean dream job? I've been there too. My first senior developer job was at a place where all of our triumphs were the bosses and all the failures were ours. The second one was a great place to continue to learn and grow, only for it to go under due to poor management. And now I get job offers from great places to work all the time. Not only that, but the last job interview I actually sat in was a discussion about how much my podcast had helped the people interviewing me. If you're looking for a way to get into your dream job, then join our Dev Heroes Accelerator. Not only will we help you get the kind of exposure that makes you attractive to your dream employer, but you'll be able to ask them for top dollar as well. Check it out at devherosexcelerator.com.
DAN_SHAPPIR: Well, it's a strong hint to the engine that that's what you want to happen. But I don't know if this is a part of the specification or just an implementation detail on the part of V8 or something.
AJ_O’NEAL: Yeah, well, likewise with what you're saying, I don't think that those are part of the specification or maybe it is in like ES 20, whatever, whatever. But it was something that like it came out of a talk from Douglas Crawford that this was popularized the whole, you know, problem with the delete operator. And then the Chrome team, a lot of the stuff that he said within months was no longer valid. And then the Chrome team came out with a tech talk and they talked about how they do all these optimizations that shouldn't be possible because they detect in your code when you're using something in a particular way and it should matter or it shouldn't matter. So like a lot of this stuff isn't specced in the spec. It's just anecdotal. We assume everybody's using V8. So somebody somewhere said, you know, the V8 team said this. And so we repeat it and we say, oh, this is how it works. Or we've observed it in Chrome or whatever. But yeah, I mean, like it may be different in nitro. It might be different in, I know what's the newest whatever monkey from Mozilla.
DAN_SHAPPIR: I like to say that it's when you got the best engineers from Google and Apple and the open source community competing head on on who can build the best engine for your favorite programming language, good things happen.
AJ_O’NEAL: Yes. Yes.
AIMEE_KNIGHT: No, you haven't really used it.
AJ_O’NEAL: I don't know it by the term property descriptors. I mean, I know what it is. I mean, the best example would be anytime you have an array and you access dot length.dot length calls a function that returns the number, or if you assign to dot length, it calls a function which truncates the array. But it looks like a property, but it's actually a function.
AJ_O’NEAL: And in general, I hate it when people do this because usually whatever the thing is, isn't documented and you can't console.log to figure out what the heck it does or what its functions are. Like for example, Google's OAuth library is probably one of those poorly documented libraries in all of history. There's like lots of features that it has that you literally, they're not in the official documentation but they're somewhere. And if you console.log any of the objects, like the user object, for example, you get a bunch of garbage that's like minified. So the object will have like a.underscoreY property or something like that. And that'll end up being the user. But what you're supposed to call is get user ID or something. And all of these, I don't know what they did. And maybe it's just prototypes. Maybe they're just making a class out of it or something. But I come, like I love to be able to debug things just by doing a console.log and trying to figure out what it is. But so often there's nothing about the object that is Googleable or that describes the object. So you have to know what the object is in order to go find the documentation and it may not exist. So I I'd like the idea that you can set things to non innumerable other than the very basic primitives that were part of the language from the beginning, like array that makes sense that dot length is non innumerable. I mean, personally, I think it should show up in object dot keys. I don't know whether it does or not, but no, it doesn't. Yeah. But this bike, how do you enumerate things that are non innumerable? Do you know, is there a way to do it?
DAN_SHAPPIR: I think that if you look at the, if you do the console log, you actually now, at least in DevTools, should be able to see the non-enumerable properties as well. Again, you can test it. But look, when constructing an API, sometimes, you know, if you're constructing an API that's supposed to resemble some sort of a collection, that means that people will enumerate over it, that it does make sense to specify certain things that you don't want to be enumerated as being having a numeral being set to false. But very few people actually use it. By the way, the way that you specify all of these, I did mention it before, because when you just do x.y equals seven, you create a property and you get the default values for all of these. So by default it's configurable and by default it's enumerable, and by default it's also writable, which is the next attribute that I was gonna mention. If you want to specify values other than these, then you use object defined property, or if you want to create multiple properties, at once you use object.definedproperties plural, and then you can explicitly set these attributes.
AIMEE_KNIGHT: I kind of googled. Yeah, go for it. I was going to say I googled because I was also curious of AJ's question about how do you get non-annumerable properties. And it looks like object has a method get own property names that returns a new mobile and non innumerable properties
AJ_O’NEAL: That's you
DAN_SHAPPIR: Let's see It's always the hack yeah, and we rely on these hats I kind of mentioned the next attribute which is writable which kind of controls whether it's a read-only or read-write attribute or alternatively, you can actually set getters and setters. There are other ways to specify getters and setters, but you can also do them using this way. And then you can either use, create, you know, something that is effectively like controlled your functions, but behaves as if it's a property, a simple property like the array length, which AJ mentioned before.
AJ_O’NEAL: Because we love to have side effects on reading a value, right?
DAN_SHAPPIR: For sure. To be honest, I've come to the point. I know that the getters and setters were a big thing in object-oriented programming. And there was like a point in time where everybody thought that by putting a ton of getters and setters, they were quote-unquote, doing good encapsulation. And I always hated it.
AJ_O’NEAL: Yeah. I didn't really get that. It just seemed like a lot of extra code for a value.
AJ_O’NEAL: So I, this, this is with the defined property and divine properties, I view these the same way that I view prototype. The average person shouldn't touch it. It should only be for people that are implementing libraries that are patching the language itself. Like, uh, you know, if you're, if you're creating a library, that's a polyfill library, that is maybe an appropriate case for defined property and defined properties. I hope that people don't use this in their regular day-to-day code or to show off their ninja skills?
AJ_O’NEAL: You underestimate how many people like to look cool.
DAN_SHAPPIR: I've given up on looking cool a long time ago.
AJ_O’NEAL: Well, that's great, Dan, and I value you for that. Makes you a lot cooler in my eyes, even ice cold.
AJ_O’NEAL: Now, I think there's an exception to that. Correct me if I'm wrong, but I think the submit event will only bubble as far as the form.
DAN_SHAPPIR: Well, there are a couple of events that behave somewhat differently. So for example, the focus event, I think, doesn't bubble at all, as I recall.
AJ_O’NEAL: Is that just on inputs? Is that the only place that you have focus?
AJ_O’NEAL: So is that still valid with use strict and yes, 20 X DX or is that taken out?
AJ_O’NEAL: Well, I know, but sometimes these things are deprecated like the blank tag. Like I think that the, what is the, the, the synchronous XML HTTP request sync has been either deprecated or removed or.
DAN_SHAPPIR: It's still there. That's the way that events still work in the browsers and you can just test it. We'll put a link in the show notes for an excellent article that covers both of these. And, and I, uh, and you can actually, it contains code, you know, a live code examples that you can actually use. And it shows that this stuff totally, totally still works.
AJ_O’NEAL: And was there a reason it was useful? I didn't catch that part.
DAN_SHAPPIR: Like I said, I have no idea why it was added into the language other than to handle special cases where you as a containing object need to be informed that something is going to happen and you don't want your contained element to cancel it for whatever reason. Anyway, so it used to be that that third element, that third argument to add event listener was just this boolean value. Turns out that now because they wanted to support additional options, it's also possible to pass in an object which is an options object. So you can use it to specified certain other named behaviors. So that third parameter can now just be an object and it can have several fields. The one field is a capture field, which is set when when set to true behaves exactly like passing true and instead of that object to begin with. So it's therefore, you could say backward compatibility is an alternative, more modern way of achieving the same effect. But there are two other attributes there that from my perspective are are much more useful the first one is actually fairly easy to understand it's called once and if you specify that Then that event will be triggered once and then immediately removed so instead of remove event listener You know if you just want to be invoked once instead of doing the ad and then having to do the remove yourself You can just specify once there and it will be invoked once and that's it. It's removed automatically for you.
AJ_O’NEAL: Well, that's cool. I didn't know about that, but that's a common pattern. People have all these once functions that add and remove. So now we don't have those.
AJ_O’NEAL: Do you forgot to talk about all of the memory leaks that happened with that event listener?
DAN_SHAPPIR: Yeah, I don't think we'll have time, but that's actually a topic that can come up at the very end of this list. But before that, I want to mention another attribute, the last one, which actually doesn't yet exist. It isn't supported on any browser that I know. I think it's behind a flag or something on V8. And I'm really looking forward to it being implemented. And that's the signal attribute, which is related to the abort controller object. What I dislike about add event listener is the fact that doing a remove event listener is really annoying. Unlike a set timer, for example, which returns an ID value that you can use for the cancel, with add EventListener, you don't get this sort of thing. If you want to remove an event listener, you have to specify the exact same parameters that you use during the addEventListener. The same event name, the exact same reference to the handler method, and the exact same options in the third parameter if you specified them. Otherwise, you're not removing it, which means that you have to keep reference to that handler function that you provided, because you will want to use it for removing. It's really annoying. And again, one of the reasons why the once attribute was so useful, because it removes that annoyance, at least when you only want to invoke that handler only once. Well, it turns out that they are looking to introduce a much nicer way of doing this. If you create an abort controller object, it has a signal property. If you pass that, the value of that into the add event listener, will, you know, again, not get supported. But if you, in the future, if you pass that, then when you abort that abort controller, it will cancel the event listener, which will make it much easier to cancel event listeners. And as an extra benefit, you can use that signal in multiple event listeners, so you can cancel a whole bunch of event listeners by just doing that single abort operation. And I think that's really useful and cool. But unfortunately, not yet really supported anywhere. So something to look forward to. Do we have time to discuss anything more? I think we are kind of approaching the end of the episode now.
AJ_O’NEAL: All right. Well, Dan, how do people get in touch with you? Oh, wait.
DAN_SHAPPIR: Yeah. And if they don't follow me on Twitter, then what's wrong with them? And they should follow me on Twitter and I follow back. So you know.
AIMEE_KNIGHT: I can't hear.
Hey folks, if you love this podcast and would like to support the show, or if you wish you could listen without the sponsorship messages, then you're in luck. We're setting up new premium podcast feeds where you can get all of the episodes released after Christmas 2020 without the ads signing up will help us pay for editing and production and you can go sign up at devchat.tv slash premium.
AJ_O’NEAL: All right, Amy, go ahead.
AIMEE_KNIGHT: It’s been a while. I feel like I haven't been on the show for a couple weeks because work has just been busy and per usual, I just keep picking like infrastructure picks. Although some of this is not necessarily infrastructure because that leads me to the pick. So it's a short article.
DAN_SHAPPIR: You keep moving into higher paid brackets and the picks reflected.
AIMEE_KNIGHT: So this is understanding the different types of load balancers because I feel like this can get confusing and there's load balancers that at different layers. So it's an article on understanding that. And that will be my pick for today. I kind of have like another pick, but I don't know. I guess I'll just say my pick is kind of what we were talking about before the show. I feel like people like to use buzzwords and they end up conflating things and not explaining them properly. And it's confusing to newcomers. So my pick is going to be not using buzzwords unless you really know what they mean. So that's it for me.
AJ_O’NEAL: Excellent. So tell us a buzzword we should be using.
AIMEE_KNIGHT: Okay. So as I'm digging more and more into Kubernetes and understanding like horizontal scaling, vertical scaling, all this different type of stuff, it came to me that a lot of people in the past have completed service oriented architecture and microservices and they are not the same thing and people should not be throwing these words around unless they really know the difference.
AJ_O’NEAL: Everything's a microservice Amy.
AIMEE_KNIGHT: It's not, microservices are at the infrastructure level service oriented architecture is at the application level.
AJ_O’NEAL: We need to get, oh gosh, I'm blanking on his name right now. The event loop guy, or not event loop, the event driven services guy, gosh. I'll remember later. Anyway, we need to get a show.
DAN_SHAPPIR: Either that or just get Amy to be the guest on an episode.
AIMEE_KNIGHT: Infrastructure for newbies.
DAN_SHAPPIR: Yeah, something like that.
AJ_O’NEAL: Okay, Ethan Garofalo or Garfafalo or? The name sounds familiar. I've been his friend for years, but I can't. Nobody knows his last name.
AIMEE_KNIGHT: I'm just so tired of people throwing these words around and they're not the same thing. And it's confusing to people. And like new people entering the industry just, ugh. Please don't.
AJ_O’NEAL: Well, I'm gonna, on that note, I'm going to pick Ethan. I'm gonna find his name in his YouTube channel and throw it in here in a second, but I'll let somebody else go first. Steve, could you go?
STEVE_EDWARDS: No, I was gonna leave me out since I'm really not here today. I didn't really contribute anything, so I was kind of bailed out.
AJ_O’NEAL: Not even contributing to the picks? So sad.
STEVE_EDWARDS: I don't have one to contribute. I've been thinking about it.
STEVE_EDWARDS: And just listening to Dan's words of wisdom all day.
DAN_SHAPPIR: All day, all day.
STEVE_EDWARDS: Well, I'll hour let's put it that way.
DAN_SHAPPIR: AJ, what you said about X mission reminds me of something. You remember how there was this, a while back, this thing where I think it was the FBI or some agency that wanted information off of an iPhone and Apple wouldn't give them the ability to, you know, and gain access to that iPhone. So they were kind of, they weren't able to actually read those exchanges or emails. You remember that story?
AJ_O’NEAL: I do and I'm very skeptical of it. I think that Apple had ulterior motives, but. Well,
DAN_SHAPPIR: it turns out that the Russian government was much more effective about these sort of things because one of the protesters had like this information on her, so there are protests going on in Russia right now and the Russian police is really cracking down on them and they wanted some information off of the iPhone of one of the protesters, one of the girl who was protesting there. So they managed to crack her iPhone. Do you know how they did that?
AJ_O’NEAL: I'm guessing they did it like in the TV shows where they spray something over the fingerprint scanner and then make a silicone mold and then press it against it.
DAN_SHAPPIR: No, easier actually. They told her that if she didn't give them the password, they would electrocute her.
AJ_O’NEAL: Oh, how quaint.
DAN_SHAPPIR: It turns out that that works.
AJ_O’NEAL: Yeah, that brings to mind the XKCD about encryption and security. The one where they say what people think, oh no, 4096 bit encryption foiled again. Our evil plans are ruined. What happens in reality? Give us the password or we'll hit you with a wrench.
DAN_SHAPPIR: Yes, so yeah, that's effectively what happened there. You know, we're joking, but it's not that funny really.
AJ_O’NEAL: Well, it's, yeah, I don't know if they have due process of law like we have here and that is kind of scary and sad and all of that.
DAN_SHAPPIR: I wouldn't bet on it. Let's put it this way.
AJ_O’NEAL: Yeah. Well, anyway, on that note, I've actually been defanging my phone, meaning getting rid of Facebook, Amazon, Netflix, and Google, which, gosh, knows how many apps those companies own. It's probably 90% of the ones I have on my phone, even though they don't carry their logo on it. But I have been defanging my phone.
AJ_O’NEAL: I just, I'm skeptical of Apple. Like I am switching to some of their stuff. Like I'm switching from Gmail to iCloud because I realized like, yeah, Gmail was really cool back in 2004, but now doesn't actually offer any particular advantage over anything else anymore. Like it's kind of weird. Some of these technologies are really great. You forget why you actually use them.
DAN_SHAPPIR: Yeah, I think that this is a, you know, I definitely don't think that Apple is doing this for altruistic reasons, but I think that this might be a situation where Apple is doing something which is positive for a wholly, you know, wholly for its own benefit, but the outcome is actually beneficial.
AJ_O’NEAL: Yeah. Well, I, yeah, I'm just, I'm just skeptical of them as on by default. I don't remember if they even gave you a little thing to warn you about it or whatever they must have. But if you have an iPhone, there's a thing called exposure notifications, which is quote-unquote for COVID-19 tracking. But basically, I mean, that came out of nowhere really quickly on the phone and it's a tracking thing. And so I turned that off. And then if you go into, there is a privacy settings in your in your, um, it's probably closer to get good enough privacy on an iPhone than it is to get good enough privacy on an Android phone, but you can get a completely de-Google the Android phone and the battery will last like twice as long, but anyway, in the iPhone, there is a privacy setting and you can go in there and see location services and you can turn off a lot of that stuff that it just makes no sense for it to be using your location. I mean, things like uh, SoundHound or, or Shazam or Redbox. I mean, well, no Redbox. That kind of makes sense. Cause you're going to be going to where the Redbox locations, but you'll find there's a whole bunch of stuff that you forgot you had turned on location. It says while using, but it's like, if you've ever opened the app the entire time, you've not rebooted it. Or even if you have rebooted it, like you double tap the home screen, all of those things are open. So technically you're using all of them. So I don't know if that's what while using means. But there's tons of stuff using your location all the time. And then if you also look at a Bluetooth, that's how a lot of these apps do contact tracing. Like you just walk by somebody else that has one of these Bluetooth app apps on, and then it signals or something, and you'll find like all sorts of stuff in there where you just, you know, clicked allow absentmindedly. And you're like, why is Shazam using Bluetooth or like, why is group me using Bluetooth or, you know, there's just a bunch of stuff where it's like, this makes no sense, like Chick-fil-A. Maybe they have a Bluetooth sensor in the register, but why would Chick-fil-A be using Bluetooth? Just ton of stuff like that. It's kind of really scary.
DAN_SHAPPIR: Yeah, well, it's turning into a long, big section, but because of what you said, I'll mention one more thing. And so just so you know that in Israel, in order to, you know, with this whole COVID thing, they wanted people who were exposed to people who actually got the virus to go into quarantine. And the way that they actually went about it is that the Israeli equivalent of the FBI actually started tracking the locations via the phones of all Israelis using the various cell towers. And if you were in the proximity of somebody who was identified as being positive for COVID for let's say more than X amount of minutes. You would actually get an SMS from the government telling you, you need to go into quarantine and you would then be expected to be in quarantine for the next two weeks. And if they found out that you broke quarantine, you could get fined for, you know, a large amount of money.
AJ_O’NEAL: That just sounds too scary to me because it, because it starts with good intentions, but there's no accountability. Like how can you say that that person was or wasn't there. I mean, it gets to the point where it's just, it's too many levels removed from reality. Like I could digitally, I can send you an SMS and say whatever I wanna say. Like, how do I prove to the person that's being persecuted in this way that they actually were in proximity of X person? I don't have any doubt that it starts out with good, well, I actually do have some doubt depending on what region of the world it's in, that it starts out with good intentions. Certainly it's publicized as good intentions. But once you open Pandora's box, once you say, okay, well now anytime we want to, we can tell you that you're basically under house arrest because we said so. Where's the accountability? Where's the, where's the transparency to be able to prove that these things happened and it wasn't just, well, you have unpopular ideas and so you need to stay at home now.
DAN_SHAPPIR: That's totally accurate what you just said and all I would say in response is remember everything that happened in the US following 9-eleven and that was crazy and I can't believe that we let that happen and I I Can't believe that it's continuing till this day, but that was Anyway,
DAN_SHAPPIR: yeah anyway how to help your stuff. So I think that more or less concludes everything no.
AJ_O’NEAL: Oh, yeah I was concluded a while ago, but Hopefully the rambling doesn't bother people. If they stayed this long, if you listen this long, it's your own fault. It's your own problem. You could have stopped. Yeah, we're way back.
AJ_O’NEAL: And I would say gals, but Amy's gone. So TRD adios. Peace.
Bandwidth for this segment is provided by Cashfly, the world's fastest CDN. To deliver your content fast with Cashfly, visit cachefl.com to learn more.