Josiah Parry
Josiah Parry
  • 37
  • 98 956
R's new exploit: how it works & other ways you're vulnerable
A vulnerability in the R programming language was discovered. I show how it works as well as other ways that you can be exploited by using features of the R programming language. We go over:
- abusing .onLoad()
- hiding bad intentions in S3 generics
- and how compiled code can hide things
The exploit is because promises can be stored in an rda or rds files. These unexecuted pieces of code can then be evaluated on your computer. But this doesn't surprise me or worry me. There are many other ways that you can be hacked using R.
Twitter: JosiahParry
GitHub: github.com/josiahParry
LinkedIn: linkedin.com/in/josiahparry
0:00 - R 4.4
0:10 - Vulnerability
0:45 - using the exploit
0:55 - explanation
1:25 - avoiding it
2:25 - exploiting .onLoad
3:00 - using http requests
3:30 - hiding side-effects with S3
3:59 - compiled code
4:30 - closing
zhlédnutí: 2 127

Video

Parse JSON with Rust & Serde
zhlédnutí 465Před měsícem
Parsing JSON in Rust is easy with the serde and serde_json crates. In this video we'll parse a json file of todo tasks. You'll learn how to create a struct, derive Deserialize and Serialize to work with serde as well as how to use serde_json to process text into your struct. Rust Code: gist.github.com/JosiahParry/cd1e132e91603df468b7043a52b26e88 Twitter: JosiahParry GitHub: github.c...
Rust & R: Decoding Geohashes into sf objects | Pt. 2
zhlédnutí 184Před měsícem
Part 1: czcams.com/video/yaxfqpECIZ0/video.html Code: github.com/JosiahParry/geohash Geohash Rust Crate: docs.rs/geohash Follow me on Twitter: JosiahParry Connect with me on LinkedIn: linkedin.com/in/josiahparry In this second part of our live coding series, we further explore the fusion of Rust and R in geospatial data processing. We make a function that decodes geohashes into boun...
Rust 101: Quick VS Code Setup in Under 2 Minutes
zhlédnutí 386Před měsícem
No fluff or frills instructions to set up VS Code to be used with Rust all within 90 seconds (84 to be exact). I go over how to install the rust-analyzer and the other extensions that you need as well as a simple keybinding that can be helpful for checking or running your rust code. Extensions you need: - rust-analyzer - even better TOML - crates Follow me on: Twitter: JosiahParry G...
Build a geohash R package using Rust
zhlédnutí 457Před měsícem
We cover more advanced Rust concepts to build a package to perform geohashing in R. You'll learn how to: • Using match statements for control flow • Creating and working with custom structs • Deriving traits for added functionality on your structs • Implementing the From trait for custom structs • Destructure tuples • Vectorization across two variables • Handling NAs effectively • Generating da...
Building UwU: Rust-based UUIDs for R
zhlédnutí 388Před 2 měsíci
I tackle a problem from twitter and develop Rust-based R package called {uwu} for generating UUIDs. In this video, I dive into the world of rust R via extendr, showing you how I transform a tweet problem into a functional solution. GitHub Repository: github.com/JosiahParry/uwu Tweet: x.com/merm_bot/status/1781022234519216364 extendr tutorial: extendr.github.io/user-guide/heckin-case-converter.h...
1 billion row challenge in Rust using Apache Arrow
zhlédnutí 6KPřed 2 měsíci
I walk through how I did the One Billion Row challenge using Rust and the Apache Arrow DataFusion query engine. Code: github.com/JosiahParry/youtube-tutorials/blob/main/onebrc/src/main.rs DataFusion: docs.rs/datafusion 1brc: github.com/gunnarmorling/1brc Follow me on twitter: JosiahParry
Valve: R belongs in production
zhlédnutí 1,8KPřed 10 měsíci
R belongs in production. Valve is designed to make R even more powerful. Valve auto-scales `{plumber}` APIs concurrently using Rust libraries Axum, Tokio, and Deadpool. Learn to make your R code fly in production! Sponsor me on Github: github.com/sponsors/JosiahParry/ Valve: valve.josiahparry.com/ Plumber: www.rplumber.io/ Video Repo: github.com/JosiahParry/youtube-tutorials/tree/main/intro-valve
S3 Objects and Functions in R
zhlédnutí 3,2KPřed 11 měsíci
Understand R's S3 Object System and deepen your knowledge of R. This video breaks down base R object to the most fundamental aspects showing that a data.frame is just a list, a factor is an integer vector, and matrixes aren't real. Then learn how to write generic functions to create class specific functions using inheritance. Resources: Advanced R by Hadley Wickham adv-r.hadley.nz/base-types.ht...
Be a better R programmer with this add-in: {codegrip}
zhlédnutí 1,4KPřed rokem
{codegrip} has single handedly made me a more efficient R programmer. See how to install this R package and configure the add in to restructure your code for you. github.com/lionel-/codegrip
RAW STRINGS IN R?!
zhlédnutí 499Před rokem
Raw strings have been in R for a while now and no one told me?! Unbeliavble. Take a minute to learn how to make raw strings in R and make your life a lot easier. One tidbit to make you a better R programmer. josiahparry.com/posts/2023-01-19-raw-strings-in-r.html
Making R 300x times faster!
zhlédnutí 4,2KPřed rokem
Someone came to me with some slow R code and asked if Rust could make it faster. Here is how I made their R code 300 times faster using Rust. After, someone schools me and makes the code 2000 times faster using base R and data.table. Sometimes an over emphasis on the tidyverse and data frames can make folks write slower code! 0:00 - Intro 1:00 - The problem 1:35 - Reviewing the code 2:50 - Func...
Geohash: coding from scratch - Part 2
zhlédnutí 1,6KPřed rokem
Geohashes are everywhere locations are collected. Here we implement the geohash algorithm from scratch in R. Part 1: czcams.com/video/vGKs-c1nQYU/video.html R implementation: github.com/JosiahParry/youtube-tutorials/blob/main/geohash/geohash.R Rust implementation: github.com/JosiahParry/youtube-tutorials/blob/main/geohash/geohash.rs GM Morton's original geohash: dominoweb.draco.res.ibm.com/repo...
Geohash: the algorithm inside and out - Part 1
zhlédnutí 7KPřed rokem
Most videos only show you how to use a geohash-not how to create one. I'm changing that. Geohashes are everywhere. Twitter's "Algorithm" keeps track of location solely with geohashes. Why are they so powerful? Part 1 of 2 GM Morton's original geohash: dominoweb.draco.res.ibm.com/reports/Morton1966.pdf Slides: josiahparry.github.io/youtube-tutorials/geohash/slides.html Written notes: josiahparry...
R and Rust - getting started with extendr
zhlédnutí 1,6KPřed rokem
Write R packages using Rust. Rust is fast, type safe, and memory efficient. The rextendr R package and extendr rust crate lets you interact with R objects and Rust objects at the same time. Start making R packages faster by writing extendr libraries. This video will show you the absolute basics. If you don't know rust, this might help make a bit more sense of it. But it is by no means a guide t...
Demystifying . . . (dots): R package dev fundamentals
zhlédnutí 1,9KPřed rokem
Demystifying . . . (dots): R package dev fundamentals
Write R functions like a pro in 6 minutes
zhlédnutí 1,1KPřed rokem
Write R functions like a pro in 6 minutes
Write surprisingly fast for loops in R
zhlédnutí 1,2KPřed rokem
Write surprisingly fast for loops in R
Hot Spot Analysis: the Fundamentals (Gi & Gi*)
zhlédnutí 1,8KPřed rokem
Hot Spot Analysis: the Fundamentals (Gi & Gi*)
Hot Spot Analysis in R: GIS Fundamentals
zhlédnutí 4,7KPřed rokem
Hot Spot Analysis in R: GIS Fundamentals
Introduction to Spatial Lags for Spatial Analysis
zhlédnutí 4,9KPřed rokem
Introduction to Spatial Lags for Spatial Analysis
Aggregate points to a fishnet in R (sf)
zhlédnutí 896Před rokem
Aggregate points to a fishnet in R (sf)
SLICED! Live Machine Learning
zhlédnutí 721Před 3 lety
SLICED! Live Machine Learning
Creating a t test with R
zhlédnutí 489Před 3 lety
Creating a t test with R
ANOVA in R
zhlédnutí 1KPřed 3 lety
ANOVA in R
Turn your R model into a RESTful API [Part 3]
zhlédnutí 1,8KPřed 3 lety
Turn your R model into a RESTful API [Part 3]
Calling your own API - Put your R model into production [Part 4]
zhlédnutí 1,4KPřed 3 lety
Calling your own API - Put your R model into production [Part 4]
Put your R model into production - making functions [Part 2]
zhlédnutí 1,1KPřed 3 lety
Put your R model into production - making functions [Part 2]
Put your R model into production [Part 1]
zhlédnutí 1,9KPřed 3 lety
Put your R model into production [Part 1]
Making your R Markdown Pretty
zhlédnutí 41KPřed 3 lety
Making your R Markdown Pretty

Komentáře

  • @vacon04
    @vacon04 Před 6 dny

    Hey thank you for the video. I saw that you also already have the docker instructions in the package website. I'm hoping to run a simple app with plumber in production in the next few weeks. I was going to just use caddy as a load balancer for multiple plumber instances but I think using Valve should provide better functionality out of the box. Thanks again!

    • @josiahparry
      @josiahparry Před 6 dny

      Just make sure that your Docker container has enough vCPU to handle multiple threads and ensure that you don't over-allocate them as well! And you can also use a load balancer in front of multiple Valve apps

    • @vacon04
      @vacon04 Před 5 dny

      @@josiahparry thanks! I have a cloud instance with 8 vcpus so it should be good. I'm not expecting massive traffic either and the computations that R has to do are very quick. I just want to make the UX as good as possible. I think 4 workers max should be good enough for my purposes. In case more is needed well that's the beauty of your package, I can just reload with more workers and if should be good to go =)

  • @rafabws
    @rafabws Před 9 dny

    That was one of the best video tutorials I've seen lately, super informative and easy to follow! I cannot wait to test this out with some different datasets. Thanks for the amazing work!

  • @jiojio97
    @jiojio97 Před 10 dny

    Hi, i'm trying to implementing the algorithm in java and following the same steps i got the same results, so i guess i'm reimplementing it correctly. The only problem is, if i try to use any lat/long coordinates for example, my home adddress lat/long, got a geohash that is totally far away from the addres used. In fact if i use some online tool the hash generated is totally different and correct.

    • @josiahparry
      @josiahparry Před 8 dny

      You got the order wrong! Its long lat! Classic mistake. :) longitude is the x axis and latitude is the y axis

  • @mukulbhave9376
    @mukulbhave9376 Před 21 dnem

    super clear ,easy and concise walkthrough. Amazing

  • @mitchbet
    @mitchbet Před 25 dny

    I'm curious how this works. Is it loading the whole file into memory before doing the aggregation? Or the query planner smart enough that it knows it only needs to load 1 line at a time (and then handles keeps track of the required aggregations accordingly)

  • @kamertonaudiophileplayer847

    It isn't fair.

  • @manzyzuzajnr3508
    @manzyzuzajnr3508 Před měsícem

    There a chance to show us how to do species distribution modelling using Biomod2 or SDM package

  • @NicholasTierney
    @NicholasTierney Před měsícem

    Great video, Josiah! For benchmarking, just a fun FYI in case you didn't know, you can do `summary(benchmark_obj, relative = TRUE)` and it will compare the two in relative terms, which is neat!

  • @brentonbills5946
    @brentonbills5946 Před měsícem

    Wish i knew more R 😅. Looks useful for helping out the R community with rust 🙂

  • @brentonbills5946
    @brentonbills5946 Před měsícem

    Nice library 🎉.

  • @BrianPondiGeoGeek
    @BrianPondiGeoGeek Před měsícem

    Clear explanation.

  • @superslash7254
    @superslash7254 Před měsícem

    What it boils down to is that R is at its core a fully featured programming language. To some degree it will always be inherently unsafe, as will any other programming language, simply because by nature they have to be in order to function. Much like a good quality knife is also able to cut you as well as your dinner. There are some shenanigans at play here, but it still pales in comparison to the likes of Java's Fracturiser hidden in minecraft mods or malicious executables.

  • @davidbosak7503
    @davidbosak7503 Před měsícem

    This whole thing seems suspicious to me. A contract threat research company sets out to find a way to exploit R, and then, (Wa-La!) finds it! Then advertises it like crazy! And in the write-up they specifically reference the usage of R in the Pharmaceutical industry, and even links to a talk by R/Pharma. This whole thing feels like a set up. Was HiddenLayer contracted to do this? By who? Very suspicious that a *potential* exploit got as much coverage as way more damaging *actual* exploits.

    • @superslash7254
      @superslash7254 Před měsícem

      Especially when the exploit basically boils down to blindly running completely unknown code. This is the coding version of downloading random executables from the internet and running them as administrator. Or to use a physical metaphor it's like saying household appliances are unsafe because someone told you to stick a fork in the socket and you did it. P.s. "Voila". Because the french were so rich they had to use extra letters just to show off.

  • @joshstat8114
    @joshstat8114 Před měsícem

    I emailed Hadley and he said, you don't have to update R to 4.4.0. Someone in reddit said, it is no use to update R if you use RDS/RDA files from unknown source. Also, for a follow up question, is it possible to combine C, FORTRAN, C++ and Rust code together in one package? I tried to combine C++ and Rust but failed to debugged my R package but I know there's a certain package that uses C and C++ together (EBImage as an example).

    • @josiahparry
      @josiahparry Před měsícem

      You can use all of them together it just requires extra work on your behalf to make sure they dont conflict with eachother. These tools aren't designed to work out of the box with eachother.

    • @joshstat8114
      @joshstat8114 Před měsícem

      @@josiahparry yeah you're right. I tried both C and C++ and in order to be working, you need to call the C code from C++. And yes, it is such a pain.

  • @skeleton_craftGaming
    @skeleton_craftGaming Před měsícem

    What is R used for? Like with syntax like that I understand why it is used [That might be the most beautiful code I've ever seen] But for what like what is its practical applications?

    • @josiahparry
      @josiahparry Před měsícem

      Biomedical research, econometrics, data engineering, machine learning, big geospatial analysis, interactive dashboards, nlp, web scraping, idk whatever you want to do you can do

    • @superslash7254
      @superslash7254 Před měsícem

      R's biggest strength is data engineering. Cleaning, analyzing, and reporting tabular data can be done with a fraction of the code and a fraction of the runtime in R compared to pretty much any other language. Data.table is several times faster than Pandas, and Collapse is even faster still. The nature of the interactive console also makes it incredibly easy to really get hands-on with the data step by step before cementing an optimized pipeline.

    • @skeleton_craftGaming
      @skeleton_craftGaming Před měsícem

      @@superslash7254 hmm.. like I said that is some beautiful syntax

  • @JasonMitchellofcompsci
    @JasonMitchellofcompsci Před měsícem

    I don't get how it is a huge vulnerability. When you download code from the internet it can run code. cmd() or similar is a common resource in nearly every programming language. There is nearly no scripted programming language where a downloaded module couldn't do that. I guess it might better let them obfuscate because it is calling it indirectly? In general you should assume all downloaded code can run anything within userland within the same user on the machine. Launching a calculator is just something code can do. Any module in any programming language could probably delete all your files or send them off to some server.

    • @josiahparry
      @josiahparry Před měsícem

      I think the idea is that these are data formats and you might think you're loading data but actually you're loading a promise to unexecuted code. Then that code is executed instead of being a piece of data already. It feels like a feature not a bug but alas, you shouldn't need to have a binary file to store unexecuted code.

  •  Před měsícem

    1:26 I can confirm that note LOL

  • @vlemvlemvlem3659
    @vlemvlemvlem3659 Před měsícem

    I'll be sure to never share this with my legal/sec department. They'd freak out at your blatant use of the R-word (whispers 'risk'). On the other hand, I've been able to take away their dread by filling out copious forms in the past so should they be exposed to your scary talk I know what to do. After all, everyone knows killer-bureaucracy is what truly keeps our corporate networks safe

    • @josiahparry
      @josiahparry Před měsícem

      LOL!! I love this so much. Yeah....I'm sure they're allowing far scarier things than **manually** inspected R packages from CRAN. And, as always, its not the language that's dangerous...it's the developers. You can allow SQL injections using just about any language / tool out there. It is up to the developer to prevent them.

  • @rising1underground
    @rising1underground Před měsícem

    Thanks for the content. As an R user i don't usually think about this but very informative context!

  • @pizzaprosciuttofunghi
    @pizzaprosciuttofunghi Před měsícem

    Very interesting!

  • @pizzaprosciuttofunghi
    @pizzaprosciuttofunghi Před měsícem

    Very interesting!

  • @spacelem
    @spacelem Před měsícem

    I do write plenty of for loops in R, but they're typically in places where either the speed really doesn't matter (e.g. `for (i in vars) ggplot(...)`) or where there's no way to vectorise the body (e.g. in stochastic simulations where there's a load of stuff going on and the loop depends on what happened in the previous loop, and I'm not that good at using `reduce()`). Typically I do what's easiest to read, and usually when something can be vectorised, it's easier to read that way anyway. If I need it to be fast, I have Julia, which says for loops are good actually since all the code is JITted, although Julia makes vectorising code trivial with its dot syntax (e.g. `log.(x)`).

  • @pizzaprosciuttofunghi
    @pizzaprosciuttofunghi Před měsícem

    This is so cool!

  • @user-hl1fk6lw8k
    @user-hl1fk6lw8k Před měsícem

    Thanks for the intuitive tutorial. But I would like to point out that str::len() method counts bytes instead of characters. Non-alphanumerical characters will return inappropriate results, i.e. nchar2("你好世界") (Hello World in Chinese) returns 12 instead of 4. Interestingly, NA values are 2 bytes. One should use str::chars().count() to count at a higher computation cost than str::len().

  • @vlemvlemvlem3659
    @vlemvlemvlem3659 Před měsícem

    I'm currently in an R youtube rabbit hole and this one has been an absolute joy. I tip my fedora to your excellent content, good sir

  • @jorgegomezabrante8780
    @jorgegomezabrante8780 Před měsícem

    sudo dnf install helix

  • @gaborbakos9012
    @gaborbakos9012 Před měsícem

    A very cool video! I find loops easier to understand and use than the apply functions. However I always had a bad feeling about using them as they are supposed to be inefficient. This video made me feel better about my terrible loopy loops :).

  • @priyanshnegi03
    @priyanshnegi03 Před měsícem

    Really great explanation! Saw both part 1 and 2 and now I understand geohashing clearly. Thank you.

  • @orgs804
    @orgs804 Před měsícem

    which theme is that?

    • @josiahparry
      @josiahparry Před měsícem

      I think it’s from material and it’s the material pale night high contrast

  • @user-hl1fk6lw8k
    @user-hl1fk6lw8k Před měsícem

    How does one document functions exported from rextendr::document() so the document is readable and can be a reference used in Rstudio? Seeing the arguments are referred to as C objects?

    • @josiahparry
      @josiahparry Před měsícem

      I'm not sure I follow with the last part of "arguments are referred to as C objects" There's a couple ways to do this. Personally, I like to write wrappers around my Rust functions so I can do better argument validation with {rlang}. So I use roxygen comments like normal. But you can also use roxygen comments in rust too!! You just add `///` which is a doc comment in rust. For example above the function write /// This is my function title /// /// this is my function description /// @param x a list /// @export

  • @JordiRosell
    @JordiRosell Před měsícem

    2:02, 16:19, etc What are you typing here to autocomplete typing? Is it some VS code Rust extension?

    • @josiahparry
      @josiahparry Před měsícem

      Are you referring to the type hints? That’s the inlay hints from the rust analyzer!

    • @JordiRosell
      @JordiRosell Před měsícem

      ​@@josiahparry yeah. I'm just starting / willing to start in rust, so this is why I ask newie questions.

    • @josiahparry
      @josiahparry Před měsícem

      @@JordiRosell would a video on setting up VS Code for Rust help? TL;DR install the following extensions - rust-analyzer - Better Toml - todo tree (personal opinion on this one)

  • @joshstat8114
    @joshstat8114 Před 2 měsíci

    I was wondering if there is a linear algebra library in extendr (Rust), like RcppArmadillo

    • @josiahparry
      @josiahparry Před 2 měsíci

      check out faer! faer-rs.github.io/

  • @richardbennett4365
    @richardbennett4365 Před 2 měsíci

    Nice brief code, but on my machine I'm getting an error with the pretty: implementation Display statement.

    • @richardbennett4365
      @richardbennett4365 Před 2 měsíci

      I got the code debugged. I just have a Code issue where the buffer for the lines of the Terminal needs increasing, and I think I would also like to `tee` the output to file as well as STDOUT.

    • @josiahparry
      @josiahparry Před 2 měsíci

      ah so this was an editor issue?

  • @richardbennett4365
    @richardbennett4365 Před 2 měsíci

    Nice video, and this man has an accent similar to Will of SpaceRex. I like the presentation. The only thing i caught at the end was again a young man in the field of computer science, the third one (and one is from the UK so its not just North American English), who doesn't use the past participle form with have. He said "I've ran" instead of "I've run." It seems to be a phenomenon among younger folks, and I wonder if this grammatical form is just not taught in schools anymore, or is it how people, like his parents or friends are speaking in this region of the world. But, i have noticed Elliott Minns of another CZcams channel (@Dreams Of Code) also using the past tense form of the verb with an auxiliary and not the past participle form of the verb. But, it's the message and content that matters. Good job.

  • @shobhitarya1637
    @shobhitarya1637 Před 2 měsíci

    Very well explained.Thank you

  • @porlando12
    @porlando12 Před 2 měsíci

    R dev here trying to broaden my horizons and wow I'm blown away with the performance! Keep making these!

  • @blaisepascal3905
    @blaisepascal3905 Před 2 měsíci

    Thank you for this nice video! What plugin do you use in VS Code to have the option of running/debugging just above the main function?

    • @josiahparry
      @josiahparry Před 2 měsíci

      It's just the rust-analyzer! I have it mapped to shift+cmd+enter my keybindings.json file though { "key": "shift+cmd+enter", "command": "rust-analyzer.run" }

    • @blaisepascal3905
      @blaisepascal3905 Před 2 měsíci

      @@josiahparry Thanks!

  • @user-sl5ds8kn5x
    @user-sl5ds8kn5x Před 2 měsíci

    Super clear and interesting to follow, Thank you!

  • @lanceferrer9023
    @lanceferrer9023 Před 2 měsíci

    what happens if your function returns Vec<T>, where T is, say, struct Person { name: String , age: i32 }?

    • @josiahparry
      @josiahparry Před 2 měsíci

      You'll need to make sure that the struct is compatible with R using the #[extendr] attribute macro on the structs impl. Then, if you plan on returning the result to R, you should collect them as a list instead of Vec<T>. We need to think with two hats on at the same time: Rust and R. R doesn't have arbitrary types. It does, though, let you store a list of external pointers and thats what #[extendr] does. See: extendr.github.io/user-guide/extendr-macro.html#exporting-impl-blocks You might have some code like x.iter().map(|xi| { make Person }).collect::<List>() I do this extensively in github.com/JosiahParry/rsgeo/

  • @difflocktwo
    @difflocktwo Před 2 měsíci

    noob here. could you make your own unclass method for matrices to return the values the way you did it my assigning $dims to NULL?

    • @josiahparry
      @josiahparry Před 2 měsíci

      no you can't make a method because it's not an s3 generic. But you could make an `unclass_matrix()` function though!

  • @ElonTusk..
    @ElonTusk.. Před 2 měsíci

    subbed, keep up dwag

  • @howardbaek5413
    @howardbaek5413 Před 3 měsíci

    Solid video Josiah. Would be interested to see your take on the R6 OOP system next!

  • @YuheiKuratomi
    @YuheiKuratomi Před 3 měsíci

    Thank you. Great video. I think I can use dots much better now.

  • @elbarzwalid7344
    @elbarzwalid7344 Před 3 měsíci

    amazing content

  • @HorrorInsides-dm8fc
    @HorrorInsides-dm8fc Před 3 měsíci

    Hi Josiah - do we know why interleaving is being done?

    • @josiahparry
      @josiahparry Před 3 měsíci

      The interleaving is done to create a z-coordinate in a z-order curve (en.wikipedia.org/wiki/Z-order_curve#Coordinate_values) which helps identify a 2 dimensional position with only one value

  • @HorrorInsides-dm8fc
    @HorrorInsides-dm8fc Před 3 měsíci

    Keep up the good work Josiah. This is fantastic. Hope to see you hit the 100K subscriber soon.

  • @joshstat8114
    @joshstat8114 Před 3 měsíci

    Is there any cookbook for `extendr` and `rextendr`? Also, how to set up `extendr` or `extendrsrc` in R markdown? When I run a chunk in extendr, it works and saved in environment however, when I knit the rmd file, it failed

  • @wyattstevens8574
    @wyattstevens8574 Před 4 měsíci

    2:17 You forgot Plus codes!

    • @josiahparry
      @josiahparry Před 4 měsíci

      Never heard of them! They sound like an S2 derivative of placekeys! Thanks for sharing <3

    • @wyattstevens8574
      @wyattstevens8574 Před 4 měsíci

      ​@@josiahparryI don't think that's what it's from, but Google Maps uses it. It could be an S2 variant, but I don't know.