

{"id":4728,"date":"2016-12-18T14:43:42","date_gmt":"2016-12-18T19:43:42","guid":{"rendered":"https:\/\/rud.is\/b\/?p=4728"},"modified":"2018-03-07T17:30:07","modified_gmt":"2018-03-07T22:30:07","slug":"package-update-longurl-0-3-0-is-hitting-cran-mirrors","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","title":{"rendered":"Package update: longurl 0.3.0 is hitting CRAN mirrors"},"content":{"rendered":"<p>The <a href=\"https:\/\/github.com\/hrbrmstr\/longurl\"><code>longurl<\/code><\/a> 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 client-side-based and a very thin, highly-focused wrapper around the <code>httr::HEAD()<\/code> function.<\/p>\n<h3>Why <code>longurl<\/code>?<\/h3>\n<p>On the D&amp;D alignment scale, short links are <a href=\"https:\/\/en.wikipedia.org\/wiki\/Alignment_(Dungeons_%26_Dragons)#Chaotic_evil\">chaotic evil<\/a>. [<em>Full-disclosure: I use shortened links all the time, so the pot is definitely kettle-calling here<\/em>]. Ostensibly, they are for making it easier to show memorable links on tiny, glowing rectangles or printed prose but they are mostly used to directly track you and mask other tracking parameters that the target site is using to keep tabs on you. Furthermore, short URLs are also used by those with even more malicious intent than greedy startups or mega-corporations.<\/p>\n<p>In retrospect, giving a third-party API service access to URLs you are interested in expanding just exacerbated the tracking problem, but many of these third-party URL expansion services do use some temporal caching of results, so they can be a bit faster than doing this in a non-caching package (but, there&#8217;s nothing stopping you putting caching code around it if you are using it in a &#8220;production&#8221; capacity).<\/p>\n<h3>How does the updated package work without a URL expansion API?<\/h3>\n<p>By default, <code>httr<\/code> &#8220;verb&#8221; requests use the <code>curl<\/code> package and that is a wrapper for <code>libcurl<\/code>. The <code>httr<\/code> verb calls set the <em>&#8220;please follow all HTTP status 3xx redirects that are found in responses&#8221;<\/em> option (this is the <code>libcurl<\/code> <code>CURLOPT_FOLLOWLOCATION<\/code> equivalent option). There are other options that can be set to help configure minutae around how redirect following works. So, just by calling <code>httr::HEAD(some_url)<\/code> you get built-in short URL expansion (if what you passed in was a short URL or a URL with a redirect).<\/p>\n<p>Take, for example, this innocent link: <code>http:\/\/lnk.direct\/zFu<\/code>. We can see what goes on under the covers by passing in the <code>verbose()<\/code> option to an <code>httr::HEAD()<\/code> call:<\/p>\n<pre id=\"longurl-httr-head-ex\"><code class=\"language-r\">httr::HEAD(&quot;http:\/\/lnk.direct\/zFu&quot;, verbose())\r\n\r\n## -&gt; HEAD \/zFu HTTP\/1.1\r\n## -&gt; Host: lnk.direct\r\n## -&gt; User-Agent: libcurl\/7.51.0 r-curl\/2.3 httr\/1.2.1\r\n## -&gt; Accept-Encoding: gzip, deflate\r\n## -&gt; Cookie: shorturl=4e0aql3p49rat1c8kqcrmv4gn2\r\n## -&gt; Accept: application\/json, text\/xml, application\/xml, *\/*\r\n## -&gt; \r\n## &lt;- HTTP\/1.1 301 Moved Permanently\r\n## &lt;- Server: nginx\/1.0.15\r\n## &lt;- Date: Sun, 18 Dec 2016 19:03:48 GMT\r\n## &lt;- Content-Type: text\/html; charset=UTF-8\r\n## &lt;- Connection: keep-alive\r\n## &lt;- X-Powered-By: PHP\/5.6.20\r\n## &lt;- Expires: Thu, 19 Nov 1981 08:52:00 GMT\r\n## &lt;- Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\n## &lt;- Pragma: no-cache\r\n## &lt;- Location: http:\/\/ow.ly\/Ko70307eKmI\r\n## &lt;- \r\n## -&gt; HEAD \/Ko70307eKmI HTTP\/1.1\r\n## -&gt; Host: ow.ly\r\n## -&gt; User-Agent: libcurl\/7.51.0 r-curl\/2.3 httr\/1.2.1\r\n## -&gt; Accept-Encoding: gzip, deflate\r\n## -&gt; Accept: application\/json, text\/xml, application\/xml, *\/*\r\n## -&gt; \r\n## &lt;- HTTP\/1.1 301 Moved Permanently\r\n## &lt;- Content-Length: 0\r\n## &lt;- Location: http:\/\/bit.ly\/2gZq7qG\r\n## &lt;- Connection: close\r\n## &lt;- \r\n## -&gt; HEAD \/2gZq7qG HTTP\/1.1\r\n## -&gt; Host: bit.ly\r\n## -&gt; User-Agent: libcurl\/7.51.0 r-curl\/2.3 httr\/1.2.1\r\n## -&gt; Accept-Encoding: gzip, deflate\r\n## -&gt; Accept: application\/json, text\/xml, application\/xml, *\/*\r\n## -&gt; \r\n## &lt;- HTTP\/1.1 301 Moved Permanently\r\n## &lt;- Server: nginx\r\n## &lt;- Date: Sun, 18 Dec 2016 19:04:36 GMT\r\n## &lt;- Content-Type: text\/html; charset=utf-8\r\n## &lt;- Content-Length: 127\r\n## &lt;- Connection: keep-alive\r\n## &lt;- Cache-Control: private, max-age=90\r\n## &lt;- Location: http:\/\/example.com\/IT_IS_A_SURPRISE\r\n## &lt;- \r\n## -&gt; HEAD \/IT_IS_A_SURPRISE HTTP\/1.1\r\n## -&gt; Host: example.com\r\n## -&gt; User-Agent: libcurl\/7.51.0 r-curl\/2.3 httr\/1.2.1\r\n## -&gt; Accept-Encoding: gzip, deflate\r\n## -&gt; Cookie: _csrf\/link=g3iBgezgD_OYN0vOh8yI930E1O9ZAKLr4uHmVioxwwQ; mc=null; dmvk=5856d9e39e747; ts=475630; v1st=03AE3C5AD67E224DEA304AEB56361C9F\r\n## -&gt; Accept: application\/json, text\/xml, application\/xml, *\/*\r\n## -&gt; \r\n## &lt;- HTTP\/1.1 200 OK\r\n## ...\r\n## &lt;- <\/code><\/pre>\n<p>We can reduce the clutter and see that it follows multiple redirects from multiple URL shorteners:<\/p>\n<p><center><img decoding=\"async\" style=\"max-width:100%\" src=\"https:\/\/rud.is\/dl\/HEADs.svg\"\/><\/center><\/p>\n<p>Here&#8217;s what the output of a request to <code>longurl::expand_urls()<\/code> returns:<\/p>\n<pre id=\"longurl-ex\"><code class=\"language-r\">longurl::expand_urls(&quot;http:\/\/lnk.direct\/zFu&quot;)\r\n## # A tibble: 1 \u00d7 3\r\n##                orig_url                        expanded_url status_code\r\n##                   &lt;chr&gt;                               &lt;chr&gt;       &lt;int&gt;\r\n## 1 http:\/\/lnk.direct\/zFu http:\/\/example.com\/IT_IS_A_SURPRISE         200<\/code><\/pre>\n<p><em>NOTE: the link does actually go <strong>somewhere<\/strong>, and somewhere not malicious, political or preachy (a rarity in general in this post-POTUS-election world of ours).<\/em><\/p>\n<h3>What else is different?<\/h3>\n<p>The <code>longurl::expand_urls()<\/code> function returns a <code>tbl_df<\/code> and now includes the HTTP status code of the final, resolved link. You can also pass in a custom HTTP referrer since many (<em>many<\/em>) sites will change behavior depending on the referrer.<\/p>\n<h3>What&#8217;s next?<\/h3>\n<p>This bug-fix release had to go out fairly quickly since the package was essentially broken. With the new foundation being built on client-side machinations, future enhancements will be to pull more features (in the machine learning sense) out of the <code>curl<\/code> or <code>httr<\/code> requests (I may switch directly to using <code>curl<\/code> if I need more granular data) and include some basic visualizations for both request trees (mostly likely using the <code>DiagrammeR<\/code> and <code>ggplot2<\/code> packages). I may try to add a caching layer, but I believe that&#8217;s more of a situation-specific feature folks should add on their own, so I may just add a &#8220;check hook&#8221; capability that will add an extra function call to a cache checking function of your choosing.<\/p>\n<p>If you have a feature request, please add it to the <a href=\"https:\/\/github.com\/hrbrmstr\/longurl\">github repo<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 client-side-based and a very thin, [&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":true,"_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":[810],"class_list":["post-4728","post","type-post","status-publish","format-standard","hentry","category-r","tag-post"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Package update: longurl 0.3.0 is hitting CRAN mirrors - 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\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Package update: longurl 0.3.0 is hitting CRAN mirrors - rud.is\" \/>\n<meta property=\"og:description\" content=\"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 client-side-based and a very thin, [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-18T19:43:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-07T22:30:07+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rud.is\/dl\/HEADs.svg\" \/>\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=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Package update: longurl 0.3.0 is hitting CRAN mirrors\",\"datePublished\":\"2016-12-18T19:43:42+00:00\",\"dateModified\":\"2018-03-07T22:30:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/\"},\"wordCount\":568,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/dl\\\/HEADs.svg\",\"keywords\":[\"post\"],\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/\",\"name\":\"Package update: longurl 0.3.0 is hitting CRAN mirrors - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/dl\\\/HEADs.svg\",\"datePublished\":\"2016-12-18T19:43:42+00:00\",\"dateModified\":\"2018-03-07T22:30:07+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#primaryimage\",\"url\":\"https:\\\/\\\/rud.is\\\/dl\\\/HEADs.svg\",\"contentUrl\":\"https:\\\/\\\/rud.is\\\/dl\\\/HEADs.svg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2016\\\/12\\\/18\\\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Package update: longurl 0.3.0 is hitting CRAN mirrors\"}]},{\"@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":"Package update: longurl 0.3.0 is hitting CRAN mirrors - 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\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","og_locale":"en_US","og_type":"article","og_title":"Package update: longurl 0.3.0 is hitting CRAN mirrors - rud.is","og_description":"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 client-side-based and a very thin, [&hellip;]","og_url":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","og_site_name":"rud.is","article_published_time":"2016-12-18T19:43:42+00:00","article_modified_time":"2018-03-07T22:30:07+00:00","og_image":[{"url":"https:\/\/rud.is\/dl\/HEADs.svg","type":"","width":"","height":""}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Package update: longurl 0.3.0 is hitting CRAN mirrors","datePublished":"2016-12-18T19:43:42+00:00","dateModified":"2018-03-07T22:30:07+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/"},"wordCount":568,"commentCount":5,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/dl\/HEADs.svg","keywords":["post"],"articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","url":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/","name":"Package update: longurl 0.3.0 is hitting CRAN mirrors - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/dl\/HEADs.svg","datePublished":"2016-12-18T19:43:42+00:00","dateModified":"2018-03-07T22:30:07+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#primaryimage","url":"https:\/\/rud.is\/dl\/HEADs.svg","contentUrl":"https:\/\/rud.is\/dl\/HEADs.svg"},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2016\/12\/18\/package-update-longurl-0-3-0-is-hitting-cran-mirrors\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Package update: longurl 0.3.0 is hitting CRAN mirrors"}]},{"@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-1eg","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":6193,"url":"https:\/\/rud.is\/b\/2017\/08\/29\/rpad-domain-repurposed-to-deliver-creepy-and-potentially-malicious-content\/","url_meta":{"origin":4728,"position":0},"title":"Rpad Domain Repurposed To Deliver Creepy (and potentially malicious) Content","author":"hrbrmstr","date":"2017-08-29","format":false,"excerpt":"I was about to embark on setting up a background task to sift through R package PDFs for traces of functions that \"omit NA values\" as a surprise present for Colin Fay and Sir Tierney: [Please RT]#RStats folks, @nj_tierney & I need your help for {naniar}!When does R silently drop\/omit\u2026","rel":"","context":"In &quot;Cybersecurity&quot;","block_context":{"text":"Cybersecurity","link":"https:\/\/rud.is\/b\/category\/cybersecurity\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/08\/Plot_Zoom.png?fit=868%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/08\/Plot_Zoom.png?fit=868%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/08\/Plot_Zoom.png?fit=868%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2017\/08\/Plot_Zoom.png?fit=868%2C1200&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":12114,"url":"https:\/\/rud.is\/b\/2019\/03\/26\/rome-was-not-built-in-a-day-but-widgetcard-was\/","url_meta":{"origin":4728,"position":1},"title":"Rome Was Not Built In A Day But widgetcard Was!","author":"hrbrmstr","date":"2019-03-26","format":false,"excerpt":"I saw a second post on turning htmlwidgets into interactive Twitter Player cards and felt somewhat compelled to make creating said entities a bit easier so posited the following: Wld this be useful packaged up, #rstats?https:\/\/t.co\/sfqlWnEeJVhttps:\/\/t.co\/troKzmzTNv(TLDR\/V: Single function to turn an HTML widget into a deployable interactive Twitter card) pic.twitter.com\/uahB52YfE2\u2014\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":11859,"url":"https:\/\/rud.is\/b\/2019\/02\/03\/r-package-update-urlscan\/","url_meta":{"origin":4728,"position":2},"title":"R Package Update: urlscan","author":"hrbrmstr","date":"2019-02-03","format":false,"excerpt":"The urlscan? package (an interface to the urlscan.io API) is now at version 0.2.0 and supports urlscan.io's authentication requirement when submitting a link for analysis. The service is handy if you want to learn about the details \u2014 all the gory technical details \u2014 for a website. For instance, say\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":6491,"url":"https:\/\/rud.is\/b\/2017\/09\/28\/sodd-stackoverflow-driven-development\/","url_meta":{"origin":4728,"position":3},"title":"SODD \u2014 StackOverflow Driven-Development","author":"hrbrmstr","date":"2017-09-28","format":false,"excerpt":"I occasionally hang out on StackOverflow and often use an answer as an opportunity to fill a package void for a particular need. docxtractr and qrencoder are two (of many) packages that were birthed from SO answers. I usually try to answer with inline code first then expand the functionality\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":10901,"url":"https:\/\/rud.is\/b\/2018\/06\/15\/build-httr-functions-automagically-from-manual-browser-requests-with-the-middlechild-package\/","url_meta":{"origin":4728,"position":4},"title":"Build httr Functions Automagically from Manual Browser Requests with the middlechild Package","author":"hrbrmstr","date":"2018-06-15","format":false,"excerpt":"You can catch a bit of the @rOpenSci 2018 Unconference experience at home w with this short-ish 'splainer video on how to use the new middlechild package (https:\/\/github.com\/ropenscilabs\/middlechild) & mitmproxy to automagically create reusable httr verb functions from manual browser form interactions.","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":11527,"url":"https:\/\/rud.is\/b\/2018\/09\/17\/access-the-internet-archive-advanced-search-scrape-api-with-wayback-a-links-to-a-new-vignette-pkgdown-site\/","url_meta":{"origin":4728,"position":5},"title":"Access the Internet Archive Advanced Search\/Scrape API with wayback (+ links to a new vignette &#038; pkgdown site)","author":"hrbrmstr","date":"2018-09-17","format":false,"excerpt":"The wayback? package has had an update to more efficiently retrieve mementos and added support for working with the Internet Archive's advanced search+scrape API. Search\/Scrape The search\/scrape interface lets you examine the IA collections and download what you are after (programmatically). The main function is ia_scrape() but you can also\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\/4728","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=4728"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/4728\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=4728"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=4728"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=4728"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}