

{"id":12869,"date":"2021-01-08T09:00:47","date_gmt":"2021-01-08T14:00:47","guid":{"rendered":"https:\/\/rud.is\/b\/?p=12869"},"modified":"2021-01-08T09:00:47","modified_gmt":"2021-01-08T14:00:47","slug":"safety-checking-locally-installed-package-urls","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/","title":{"rendered":"Safety Checking Locally Installed Package URLs"},"content":{"rendered":"<p>I went completely daft this week and broke my months-long Twitter break due to the domestic terror event in my nation&#8217;s capitol. I&#8217;ll likely be resuming the break starting today.<\/p>\n<p>Whilst keeping up with the final descent of the U.S. into a fully failed state, I also noticed that a debate from months ago on CRAN URL checks was still going strong.<\/p>\n<p>I briefly chimed in those months ago and this week on the dangers of short URLs (which was not exactly the core topic of the debate which centered around HTTP URL redirects which is a feature of the protocol that URL shorteners happen to take advantage of).<\/p>\n<p>Short URLs make it easier to type a URL out or remember a URL (if you can still get a decent, short keyword to use after the <code>\/<\/code>) but they&#8217;re <em>dangerous<\/em>. In case you&#8217;re one of the R folks who challenge my security chops, perhaps you&#8217;ll <a href=\"https:\/\/www.schneier.com\/blog\/archives\/2016\/04\/security_risks_11.html\">believe Bruce<\/a>.<\/p>\n<p>NOTE: Regular ol&#8217; URLs can be, and are dangerous, too, especially if they&#8217;re used in an <code>http:\/\/<\/code> context vs an <code>https:\/\/<\/code> context or run by daft folks who think they&#8217;re capable of making a system fully impervious to attackers.<\/p>\n<p>The pandemic has made &#8220;cyber&#8221; fairly hectic, so my plan to wrap up a safety checker and local package URLs re-writer into a small, usable tool\/package has no ETA on completion. However, that doesn&#8217;t mean you can&#8217;t gain visibility into the number, types, and safety of URLs in your locally installed packages.<\/p>\n<p>The code below has exposition in the comments \u2013 and you can find it <a href=\"http:\/\/rud.is\/r-code\/url-checker.R\">here<\/a> as well \u2014 so I&#8217;ll close with it vs my usual &#8220;FIN&#8221;.<\/p>\n<p>Stay safe out there, folks; and \u2014 to my not-so-&#8216;United&#8217;-after-all States readers \u2014 stay strong! The nightmare of the last four years is almost over (though the cleanup \u2014 now both physical and metaphorical \u2014 is going to take a long time).<\/p>\n<pre><code class=\"language-r\">library(urltools)\nlibrary(stringi)\nlibrary(tidyverse)\n# we're also using {clipr} and {tools} but via ::: and ::\n\n# fairly comprehensive list of URL shorteners\nshorteners &lt;- read_lines(\"https:\/\/github.com\/sambokai\/ShortURL-Services-List\/raw\/master\/shorturl-services-list.txt\")\n\n# opaque function baked into {tools}\n# NOTE: this can take a while\ndb &lt;- tools:::url_db_from_installed_packages(rownames(installed.packages()), verbose = TRUE)\n\nas_tibble(db) %&gt;% \n  distinct() %&gt;%  # yep, even w\/in a pkg there may be dups from ^^\n  mutate(\n    scheme = scheme(URL), # https or not\n    dom = domain(URL)     # need this later to be able to compute apex domain\n  )  %&gt;% \n  filter(\n    dom != \"..\", # prbly legit since it will be a relative \"go up one directory\" \n    !is.na(dom)  # the {tools} url_db_from_installed_packages() is not perfect\n  ) %&gt;% \n  bind_cols(\n    suffix_extract(.$dom) # break them all down into component atoms\n  ) %&gt;% \n  select(-dom) %&gt;% # this is now 'host' from ^^\n  mutate(\n    apex = sprintf(\"%s.%s\", domain, suffix) # apex domain\n  ) %&gt;% \n  mutate(\n    is_short = (host %in% shorteners) | (apex %in% shorteners) # does it use a shortener?\n  ) -&gt; db\n\ndb\n## # A tibble: 12,623 x 9\n##    URL        Parent    scheme host  subdomain domain suffix apex  is_short\n##    &lt;chr&gt;      &lt;chr&gt;     &lt;chr&gt;  &lt;chr&gt; &lt;chr&gt;     &lt;chr&gt;  &lt;chr&gt;  &lt;chr&gt; &lt;lgl&gt;   \n##  1 https:\/\/g\u2026 albersus\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n##  2 https:\/\/g\u2026 albersus\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n##  3 https:\/\/w\u2026 AnomalyD\u2026 https  www.\u2026 www       usenix org    usen\u2026 FALSE   \n##  4 https:\/\/w\u2026 AnomalyD\u2026 https  www.\u2026 www       jstor  org    jsto\u2026 FALSE   \n##  5 https:\/\/w\u2026 AnomalyD\u2026 https  www.\u2026 www       usenix org    usen\u2026 FALSE   \n##  6 https:\/\/w\u2026 AnomalyD\u2026 https  www.\u2026 www       jstor  org    jsto\u2026 FALSE   \n##  7 https:\/\/g\u2026 AnomalyD\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n##  8 https:\/\/g\u2026 AnomalyD\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n##  9 https:\/\/g\u2026 AnomalyD\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n## 10 https:\/\/g\u2026 AnomalyD\u2026 https  gith\u2026 NA        github com    gith\u2026 FALSE   \n## # \u2026 with 12,613 more rows\n\n# what packages do i have installed that use short URLS?\n# a nice thing to do would be to file a PR to these authors\n\nfilter(db, is_short) %&gt;% \n  select(\n    URL,\n    Parent,\n    scheme\n  )\n## # A tibble: 5 x 3\n##   URL                         Parent                   scheme\n##   &lt;chr&gt;                       &lt;chr&gt;                    &lt;chr&gt; \n## 1 https:\/\/goo.gl\/5KBjL5       fpp2\/man\/goog.Rd         https \n## 2 http:\/\/bit.ly\/2016votecount geofacet\/man\/election.Rd http  \n## 3 http:\/\/bit.ly\/SnLi6h        knitr\/man\/knit.Rd        http  \n## 4 https:\/\/bit.ly\/magickintro  magick\/man\/magick.Rd     https \n## 5 http:\/\/bit.ly\/2UaiYbo       ssh\/doc\/intro.html       http  \n\n# what protocols are in use? (you'll note that some are borked and\n# others got mangled by the {tools} function)\n\ncount(db, scheme, sort=TRUE)\n## # A tibble: 5 x 2\n##   scheme     n\n##   &lt;chr&gt;  &lt;int&gt;\n## 1 https  10007\n## 2 http    2498\n## 3 NA       113\n## 4 ftp        4\n## 5 `https     1\n\n# what are the most used top-level sites?\n\ncount(db, host, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n))\n## # A tibble: 1,108 x 3\n##    host                      n     pct\n##    &lt;chr&gt;                 &lt;int&gt;   &lt;dbl&gt;\n##  1 docs.aws.amazon.com    3859 0.306  \n##  2 github.com             2954 0.234  \n##  3 cran.r-project.org      450 0.0356 \n##  4 en.wikipedia.org        220 0.0174 \n##  5 aws.amazon.com          204 0.0162 \n##  6 doi.org                 181 0.0143 \n##  7 wikipedia.org           132 0.0105 \n##  8 developers.google.com   114 0.00903\n##  9 stackoverflow.com       101 0.00800\n## 10 gitlab.com               86 0.00681\n## # \u2026 with 1,098 more rows\n\n# same as ^^ but apex\n\ncount(db, apex, sort=TRUE) %&gt;% \n  mutate(pct = n\/sum(n)) \n## # A tibble: 743 x 3\n##    apex                  n     pct\n##    &lt;chr&gt;             &lt;int&gt;   &lt;dbl&gt;\n##  1 amazon.com         4180 0.331  \n##  2 github.com         2997 0.237  \n##  3 r-project.org       563 0.0446 \n##  4 wikipedia.org       352 0.0279 \n##  5 doi.org             221 0.0175 \n##  6 google.com          179 0.0142 \n##  7 tidyverse.org       151 0.0120 \n##  8 r-lib.org           137 0.0109 \n##  9 rstudio.com         117 0.00927\n## 10 stackoverflow.com   102 0.00808\n## # \u2026 with 733 more rows\n\n# See all the eavesdroppable, interceptable, \n# content-mutable-by-evil-MITM-network-operator URLs\n# A nice thing to do would be to fix these and issue PRs\n\nfilter(db, scheme == \"http\") %&gt;% \n  select(URL, Parent)\n## # A tibble: 2,498 x 2\n##    URL                                                 Parent              \n##    &lt;chr&gt;                                               &lt;chr&gt;               \n##  1 http:\/\/www.winfield.demon.nl                        antiword\/DESCRIPTION\n##  2 http:\/\/github.com\/ropensci\/antiword\/issues          antiword\/DESCRIPTION\n##  3 http:\/\/dirk.eddelbuettel.com\/code\/anytime.html      anytime\/DESCRIPTION \n##  4 http:\/\/arrayhelpers.r-forge.r-project.org\/          arrayhelpers\/DESCRI\u2026\n##  5 http:\/\/arrow.apache.org\/blog\/2019\/01\/25\/r-spark-im\u2026 arrow\/doc\/arrow.html\n##  6 http:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/API\/RES\u2026 aws.s3\/man\/accelera\u2026\n##  7 http:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/API\/RES\u2026 aws.s3\/man\/accelera\u2026\n##  8 http:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/dev\/acl\u2026 aws.s3\/man\/acl.Rd   \n##  9 http:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/API\/RES\u2026 aws.s3\/man\/bucket_e\u2026\n## 10 http:\/\/docs.aws.amazon.com\/AmazonS3\/latest\/API\/RES\u2026 aws.s3\/man\/bucketli\u2026\n## # \u2026 with 2,488 more rows\n\n# find the abusers of \"http\" URLs\n\nfilter(db, scheme == \"http\") %&gt;% \n  select(URL, Parent) %&gt;% \n  mutate(\n    pkg = stri_match_first_regex(Parent, \"(^[^\/]+)\")[,2]\n  ) %&gt;% \n  count(pkg, sort=TRUE)\n## # A tibble: 265 x 2\n##    pkg                        n\n##    &lt;chr&gt;                  &lt;int&gt;\n##  1 paws.security.identity   258\n##  2 paws.management          152\n##  3 XML                      129\n##  4 paws.analytics            78\n##  5 stringi                   70\n##  6 paws                      57\n##  7 RCurl                     51\n##  8 igraph                    49\n##  9 base                      47\n## 10 aws.s3                    44\n## # \u2026 with 255 more rows\n\n# send all the apex domains to the clipboard\n\nclipr::write_clip(unique(db$apex))\n\n# go here to paste them into the domain search box\n# most domain\/URL checker APIs aren't free for more \n# than a cpl dozen URLs\/domains\n\nbrowseURL(\"https:\/\/www.bulkblacklist.com\")\n\n# paste what you clipped into the box and wait a while\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>I went completely daft this week and broke my months-long Twitter break due to the domestic terror event in my nation&#8217;s capitol. I&#8217;ll likely be resuming the break starting today. Whilst keeping up with the final descent of the U.S. into a fully failed state, I also noticed that a debate from months ago on [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[],"class_list":["post-12869","post","type-post","status-publish","format-standard","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Safety Checking Locally Installed Package URLs - rud.is<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Safety Checking Locally Installed Package URLs - rud.is\" \/>\n<meta property=\"og:description\" content=\"I went completely daft this week and broke my months-long Twitter break due to the domestic terror event in my nation&#8217;s capitol. I&#8217;ll likely be resuming the break starting today. Whilst keeping up with the final descent of the U.S. into a fully failed state, I also noticed that a debate from months ago on [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2021-01-08T14:00:47+00:00\" \/>\n<meta name=\"author\" content=\"hrbrmstr\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"hrbrmstr\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Safety Checking Locally Installed Package URLs\",\"datePublished\":\"2021-01-08T14:00:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/\"},\"wordCount\":328,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/\",\"name\":\"Safety Checking Locally Installed Package URLs - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"datePublished\":\"2021-01-08T14:00:47+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2021\\\/01\\\/08\\\/safety-checking-locally-installed-package-urls\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Safety Checking Locally Installed Package URLs\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/\",\"name\":\"rud.is\",\"description\":\"&quot;In God we trust. All others must bring data&quot;\",\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/rud.is\\\/b\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\",\"name\":\"hrbrmstr\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\",\"width\":460,\"height\":460,\"caption\":\"hrbrmstr\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2023\\\/10\\\/ukr-shield.png?fit=460%2C460&ssl=1\"},\"description\":\"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7\",\"sameAs\":[\"http:\\\/\\\/rud.is\"],\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/author\\\/hrbrmstr\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Safety Checking Locally Installed Package URLs - rud.is","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/","og_locale":"en_US","og_type":"article","og_title":"Safety Checking Locally Installed Package URLs - rud.is","og_description":"I went completely daft this week and broke my months-long Twitter break due to the domestic terror event in my nation&#8217;s capitol. I&#8217;ll likely be resuming the break starting today. Whilst keeping up with the final descent of the U.S. into a fully failed state, I also noticed that a debate from months ago on [&hellip;]","og_url":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/","og_site_name":"rud.is","article_published_time":"2021-01-08T14:00:47+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Safety Checking Locally Installed Package URLs","datePublished":"2021-01-08T14:00:47+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/"},"wordCount":328,"commentCount":4,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/","url":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/","name":"Safety Checking Locally Installed Package URLs - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2021-01-08T14:00:47+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2021\/01\/08\/safety-checking-locally-installed-package-urls\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Safety Checking Locally Installed Package URLs"}]},{"@type":"WebSite","@id":"https:\/\/rud.is\/b\/#website","url":"https:\/\/rud.is\/b\/","name":"rud.is","description":"&quot;In God we trust. All others must bring data&quot;","publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/rud.is\/b\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886","name":"hrbrmstr","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1","width":460,"height":460,"caption":"hrbrmstr"},"logo":{"@id":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/10\/ukr-shield.png?fit=460%2C460&ssl=1"},"description":"Don't look at me\u2026I do what he does \u2014 just slower. #rstats avuncular \u2022 ?Resistance Fighter \u2022 Cook \u2022 Christian \u2022 [Master] Chef des Donn\u00e9es de S\u00e9curit\u00e9 @ @rapid7","sameAs":["http:\/\/rud.is"],"url":"https:\/\/rud.is\/b\/author\/hrbrmstr\/"}]}},"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p23idr-3lz","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":4622,"url":"https:\/\/rud.is\/b\/2016\/08\/08\/counting-u-s-expatriation-with-r-a-k-a-a-decade-of-desertion\/","url_meta":{"origin":12869,"position":0},"title":"Counting [U.S.] Expatriation with R (a.k.a. a Decade of Desertion)","author":"hrbrmstr","date":"2016-08-08","format":false,"excerpt":"2016-08-13 UPDATE: Fortune has a story on this and it does seem to be tax-related vs ideology. @thosjleeper suggested something similar as well about a week ago. If you're even remotely following the super insane U.S. 2016 POTUS circus election you've no doubt seen a resurgence of _\"if X gets\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/08\/RStudio-1.png?fit=1200%2C669&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/08\/RStudio-1.png?fit=1200%2C669&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/08\/RStudio-1.png?fit=1200%2C669&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/08\/RStudio-1.png?fit=1200%2C669&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2016\/08\/RStudio-1.png?fit=1200%2C669&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":14227,"url":"https:\/\/rud.is\/b\/2023\/07\/15\/keeping-track-of-urls-shared-on-bluesky\/","url_meta":{"origin":12869,"position":1},"title":"Keeping Track Of URLs Shared On Bluesky","author":"hrbrmstr","date":"2023-07-15","format":false,"excerpt":"While the future of Bluesky is nowhere near certain, it is most certainly growing. It's also the largest community of users for the AT Protocol. Folks are using Bluesky much the same way as any online forum\/chat. One of those ways is to share URLs to content. For the moment,\u2026","rel":"","context":"In &quot;Javascript&quot;","block_context":{"text":"Javascript","link":"https:\/\/rud.is\/b\/category\/javascript\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4728,"url":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","url_meta":{"origin":12869,"position":2},"title":"Package update: longurl 0.3.0 is hitting CRAN mirrors","author":"hrbrmstr","date":"2016-12-18","format":false,"excerpt":"The longurl package has been updated to version 0.3.0 as a result of a bug report noting that the URL expansion API it was using went pay-for-use. Since this was the second time a short URL expansion service either went belly-up or had breaking changes the package is now completely\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11082,"url":"https:\/\/rud.is\/b\/2018\/07\/22\/new-apache-drill-udf-for-processing-twitter-tweet-text\/","url_meta":{"origin":12869,"position":3},"title":"New Apache Drill UDF for Processing Twitter Tweet Text","author":"hrbrmstr","date":"2018-07-22","format":false,"excerpt":"There are many ways to gather Twitter data for analysis and many R and Python (et al) libraries make full use of the Twitter API when building a corpus to extract useful metadata for each tweet along with the text of each tweet. However, many corpus archives are minimal and\u2026","rel":"","context":"In &quot;Apache Drill&quot;","block_context":{"text":"Apache Drill","link":"https:\/\/rud.is\/b\/category\/apache-drill\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11088,"url":"https:\/\/rud.is\/b\/2018\/07\/26\/two-new-apache-drill-udfs-for-processing-urils-and-internet-domain-names\/","url_meta":{"origin":12869,"position":4},"title":"Two new Apache Drill UDFs for Processing UR[IL]s  and Internet Domain Names","author":"hrbrmstr","date":"2018-07-26","format":false,"excerpt":"Continuing the blog's UDF theme of late, there are two new UDF kids in town: drill-url-tools? for slicing & dicing URI\/URLs (just going to use 'URL' from now on in the post) drill-domain-tools? for slicing & dicing internet domain names (IDNs). Now, if you're an Apache Drill fanatic, you're likely\u2026","rel":"","context":"In &quot;Apache Drill&quot;","block_context":{"text":"Apache Drill","link":"https:\/\/rud.is\/b\/category\/apache-drill\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":10848,"url":"https:\/\/rud.is\/b\/2018\/05\/30\/os-secrets-exposed-extracting-extended-file-attributes-and-exploring-hidden-download-urls-with-the-xattrs-package\/","url_meta":{"origin":12869,"position":5},"title":"OS Secrets Exposed: Extracting Extended File Attributes and Exploring Hidden Download URLs With The xattrs Package","author":"hrbrmstr","date":"2018-05-30","format":false,"excerpt":"Most modern operating systems keep secrets from you in many ways. One of these ways is by associating extended file attributes with files. These attributes can serve useful purposes. For instance, macOS uses them to identify when files have passed through the Gatekeeper or to store the URLs of files\u2026","rel":"","context":"In &quot;R&quot;","block_context":{"text":"R","link":"https:\/\/rud.is\/b\/category\/r\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/comments?post=12869"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12869\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=12869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=12869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=12869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}