

{"id":6154,"date":"2017-08-13T08:28:42","date_gmt":"2017-08-13T13:28:42","guid":{"rendered":"https:\/\/rud.is\/b\/?p=6154"},"modified":"2018-03-07T17:07:06","modified_gmt":"2018-03-07T22:07:06","slug":"r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/","title":{"rendered":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R"},"content":{"rendered":"<p>(General reminder abt &#8220;R\u2076&#8221; posts in that they are heavy on code-examples, minimal on expository. I try to design them with 2-3 &#8220;nuggets&#8221; embedded for those who take the time to walk through the code examples on their systems. I&#8217;ll always provide further expository if requested in a comment, so don&#8217;t hesitate to ask if something is confusing.)<\/p>\n<p>I had to check something on the macOS systems across the abode today and &#8212; on a lark &#8212; decided to do all the &#8220;shell&#8221; scripting in R vs <code>bash<\/code> for a change. After performing the tasks, it occurred to me that not all R users on macOS realize there are hidden gems of information spread across the &#8220;boring&#8221; parts of the filesystem in SQLite databases. So, I put together a small example that:<\/p>\n<ul>\n<li>identifies all the top-level apps in <code>\/Applications<\/code><\/li>\n<li>extracts code signing information from them into a tibble<\/li>\n<li>grabs the <a href=\"https:\/\/support.apple.com\/en-us\/HT202491\">Gatekeeper<\/a> whitelist database<\/li>\n<li>uses an internal SQLite transformation function inside a <code>dplyr<\/code> chain<\/li>\n<li>merges the info and gives you a basis to explore your apps<\/li>\n<li>shows off the <em>wicked cool<\/em> <code>processx<\/code> package by @gaborcsardi that you should be using in place of <code>system()<\/code> \/ <code>system2()<\/code><\/li>\n<\/ul>\n<p>A quick note about this Gatekeeper database: If an app is not already recognized by macOS and you allow it to run your local system is updated to &#8220;whitelist&#8221; this app so you don&#8217;t get the notification in the future. Apple maintains a large signature list that gets updated throughout the year on your system and your own list is merged with it.<\/p>\n<p>A second quick note (I guess I&#8217;m doing more expository than promised :-) about <code>QUOTE()<\/code>: In certain <code>dplyr<\/code> \/ <code>dbplyr<\/code> contexts, what looks like local function calls are actually passed over to the SQL side vs used locally. Even though <code>quote()<\/code> is an internal R function, the use of the lowercase version of it would still go over to the SQL side vs be eval&#8217;d locally. However, to avoid confusing others, I try to uppercase conflicts like this when they occur.<\/p>\n<pre id=\"gatekeeper01\"><code class=\"language-r\">library(processx)\r\nlibrary(stringi)\r\nlibrary(docxtractr) # install_github(&quot;hrbrmstr\/docxtractr&quot;)\r\nlibrary(tidyverse)\r\n\r\nlist.files(&quot;\/Applications&quot;, pattern = &quot;app$&quot;, full.names = TRUE) %&gt;% \r\n  map_df(~{\r\n    message(.x)\r\n    res &lt;- run(&quot;codesign&quot;, args = c(&quot;-dvvv&quot;, .x), error_on_status = FALSE)\r\n    if (any(grepl(&quot;not signed at all&quot;, res$stderr))) {\r\n      list(Executable = .x)\r\n    } else {\r\n      stri_split_lines(res$stderr)[[1]] %&gt;% \r\n        keep(~grepl(&quot;=&quot;, .)) %&gt;% \r\n        stri_split_fixed(&quot;=&quot;, 2, simplify = TRUE) -&gt; res\r\n      as.list(set_names(res[,2], res[,1]))\r\n    }\r\n  }) %&gt;% \r\n  mcga() %&gt;% \r\n  mutate(short_name = stri_replace_last_fixed(basename(executable), &quot;.app&quot;, &quot;&quot;)) -&gt; my_apps\r\n\r\nglimpse(my_apps)\r\n## Observations: 102\r\n## Variables: 20\r\n## $ executable                  &lt;chr&gt; &quot;\/Applications\/1Password 6.app\/Con...\r\n## $ identifier                  &lt;chr&gt; &quot;com.agilebits.onepassword4&quot;, &quot;com...\r\n## $ format                      &lt;chr&gt; &quot;app bundle with Mach-O thin (x86_...\r\n## $ codedirectory_v             &lt;chr&gt; &quot;20200 size=29594 flags=0x0(none) ...\r\n## $ hash_type                   &lt;chr&gt; &quot;sha256 size=32&quot;, &quot;sha256 size=32&quot;...\r\n## $ candidatecdhash_sha1        &lt;chr&gt; &quot;e21ac2a66473feec6276b448fc518678d...\r\n## $ candidatecdhash_sha256      &lt;chr&gt; &quot;8cf4cb4bdbea3b4d4f9e293e1aee1edb7...\r\n## $ hash_choices                &lt;chr&gt; &quot;sha1,sha256&quot;, &quot;sha1,sha256&quot;, &quot;sha...\r\n## $ cdhash                      &lt;chr&gt; &quot;8cf4cb4bdbea3b4d4f9e293e1aee1edb7...\r\n## $ signature_size              &lt;chr&gt; &quot;8915&quot;, &quot;8936&quot;, &quot;4610&quot;, &quot;8528&quot;, &quot;4...\r\n## $ authority                   &lt;chr&gt; &quot;Apple Root CA&quot;, &quot;Apple Root CA&quot;, ...\r\n## $ timestamp                   &lt;chr&gt; &quot;Jul 17, 2017, 10:18:00 AM&quot;, &quot;Jul ...\r\n## $ info_plist_entries          &lt;chr&gt; &quot;32&quot;, &quot;31&quot;, &quot;30&quot;, &quot;17&quot;, &quot;30&quot;, &quot;18&quot;...\r\n## $ teamidentifier              &lt;chr&gt; &quot;2BUA8C4S2C&quot;, &quot;XZZXE9SED4&quot;, &quot;94KV3...\r\n## $ sealed_resources_version    &lt;chr&gt; &quot;2 rules=12 files=2440&quot;, &quot;2 rules=...\r\n## $ internal_requirements_count &lt;chr&gt; &quot;1 size=220&quot;, &quot;1 size=192&quot;, &quot;1 siz...\r\n## $ signed_time                 &lt;chr&gt; NA, NA, &quot;Jul 13, 2017, 6:40:13 PM&quot;...\r\n## $ library_validation_warning  &lt;chr&gt; NA, NA, NA, &quot;OS X SDK version befo...\r\n## $ platform_identifier         &lt;chr&gt; NA, NA, NA, NA, &quot;2&quot;, NA, NA, &quot;2&quot;, ...\r\n## $ short_name                  &lt;chr&gt; &quot;1Password 6&quot;, &quot;Alfred 3&quot;, &quot;Amazon...\r\n\r\n# this is macOS atekeeper whitelist db\r\ndb &lt;- src_sqlite(&quot;\/private\/var\/db\/gkopaque.bundle\/Contents\/Resources\/gkopaque.db&quot;)\r\n\r\ndb\r\n## src:  sqlite 3.19.3 [\/private\/var\/db\/gkopaque.bundle\/Contents\/Resources\/gkopaque.db]\r\n## tbls: conditions, merged, whitelist\r\nwhitelist &lt;- tbl(db, &quot;whitelist&quot;)\r\n\r\n# they are binary blobs, but we need them as text, so use SQLite&#039;s &quot;QUOTE()&quot; function\r\nmutate(whitelist, current = QUOTE(current)) %&gt;% \r\n  select(current) %&gt;% \r\n  collect() %&gt;% \r\n  mutate(\r\n    cdhash = stri_replace_first_fixed(current, &quot;X&#039;&quot;, &quot;&quot;) %&gt;% \r\n      stri_replace_last_fixed(&quot;&#039;&quot;, &quot;&quot;) %&gt;% \r\n      stri_trans_tolower()\r\n  ) -&gt; gatekeeper_whitelist_hashes\r\n\r\nmy_apps &lt;- left_join(my_apps, gatekeeper_whitelist_hashes)\r\n\r\n# Unsigned apps\r\nfilter(my_apps, is.na(cdhash)) %&gt;% \r\n  select(short_name)\r\n\r\n# you can see your own output here ;-)\r\n\r\n# App organization\r\nselect(my_apps, identifier) %&gt;% \r\n  mutate(\r\n    identifier = stri_split_fixed(identifier, &quot;.&quot;, simplify = TRUE)[,2],\r\n    identifier = ifelse(identifier == &quot;&quot;, &quot;UNSPECIFIED&quot;, identifier)\r\n  ) %&gt;% \r\n  count(identifier, sort=TRUE)\r\n## # A tibble: 47 x 2\r\n##        identifier     n\r\n##             &lt;chr&gt; &lt;int&gt;\r\n##  1          apple    37\r\n##  2    UNSPECIFIED    10\r\n##  3      microsoft     6\r\n##  4  eclecticlight     3\r\n##  5         google     3\r\n##  6         amazon     2\r\n##  7      agilebits     1\r\n##  8 antonycourtney     1\r\n##  9       appscape     1\r\n## 10   audacityteam     1\r\n## # ... with 37 more rows\r\n\r\n\r\n# Which apps have code-signing validation warnings\r\nfilter(my_apps, !is.na(library_validation_warning)) %&gt;% \r\n  select(short_name, library_validation_warning)\r\n## # A tibble: 7 x 2\r\n##        short_name\r\n##             &lt;chr&gt;\r\n## 1    Amazon Music\r\n## 2        Audacity\r\n## 3         firefox\r\n## 4         RStudio\r\n## 5             VLC\r\n## 6 Webcam Settings\r\n## 7     WordService\r\n## # ... with 1 more variables: library_validation_warning &lt;chr&gt;<\/code><\/pre>\n<p>NOTE: One could easily extend this example to look for apps across the filesystem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>(General reminder abt &#8220;R\u2076&#8221; posts in that they are heavy on code-examples, minimal on expository. I try to design them with 2-3 &#8220;nuggets&#8221; embedded for those who take the time to walk through the code examples on their systems. I&#8217;ll always provide further expository if requested in a comment, so don&#8217;t hesitate to ask if [&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":[780,91],"tags":[810],"class_list":["post-6154","post","type-post","status-publish","format-standard","hentry","category-macos","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>R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &amp; R - 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\/2017\/08\/13\/r\u2076-exploring-macos-applications-with-codesign-gatekeeper-r\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &amp; R - rud.is\" \/>\n<meta property=\"og:description\" content=\"(General reminder abt &#8220;R\u2076&#8221; posts in that they are heavy on code-examples, minimal on expository. I try to design them with 2-3 &#8220;nuggets&#8221; embedded for those who take the time to walk through the code examples on their systems. I&#8217;ll always provide further expository if requested in a comment, so don&#8217;t hesitate to ask if [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2017\/08\/13\/r\u2076-exploring-macos-applications-with-codesign-gatekeeper-r\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-13T13:28:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-03-07T22:07:06+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=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R\",\"datePublished\":\"2017-08-13T13:28:42+00:00\",\"dateModified\":\"2018-03-07T22:07:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/\"},\"wordCount\":359,\"commentCount\":3,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"keywords\":[\"post\"],\"articleSection\":[\"macOS\",\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/\",\"name\":\"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper & R - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"datePublished\":\"2017-08-13T13:28:42+00:00\",\"dateModified\":\"2018-03-07T22:07:06+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2017\\\/08\\\/13\\\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R\"}]},{\"@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":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper & R - 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\/2017\/08\/13\/r\u2076-exploring-macos-applications-with-codesign-gatekeeper-r\/","og_locale":"en_US","og_type":"article","og_title":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper & R - rud.is","og_description":"(General reminder abt &#8220;R\u2076&#8221; posts in that they are heavy on code-examples, minimal on expository. I try to design them with 2-3 &#8220;nuggets&#8221; embedded for those who take the time to walk through the code examples on their systems. I&#8217;ll always provide further expository if requested in a comment, so don&#8217;t hesitate to ask if [&hellip;]","og_url":"https:\/\/rud.is\/b\/2017\/08\/13\/r\u2076-exploring-macos-applications-with-codesign-gatekeeper-r\/","og_site_name":"rud.is","article_published_time":"2017-08-13T13:28:42+00:00","article_modified_time":"2018-03-07T22:07:06+00:00","author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R","datePublished":"2017-08-13T13:28:42+00:00","dateModified":"2018-03-07T22:07:06+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/"},"wordCount":359,"commentCount":3,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"keywords":["post"],"articleSection":["macOS","R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/","url":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/","name":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper & R - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"datePublished":"2017-08-13T13:28:42+00:00","dateModified":"2018-03-07T22:07:06+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R"}]},{"@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-1Bg","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":12645,"url":"https:\/\/rud.is\/b\/2020\/02\/06\/prying-r-script-files-away-from-xcode-et-al-on-macos\/","url_meta":{"origin":6154,"position":0},"title":"Prying &#8220;.R&#8221; Script Files Away from Xcode (et al) on macOS","author":"hrbrmstr","date":"2020-02-06","format":false,"excerpt":"As the maintainer of RSwitch --- and developer of my own (for personal use) macOS, iOS, watchOS, iPadOS and tvOS apps --- I need the full Apple Xcode install around (more R-focused macOS folk can get away with just the command-line tools being installed). As an Apple Developer who insanely\u2026","rel":"","context":"In &quot;macOS&quot;","block_context":{"text":"macOS","link":"https:\/\/rud.is\/b\/category\/macos\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12878,"url":"https:\/\/rud.is\/b\/2021\/01\/16\/new-swiftr-chapter-up-building-an-r-backed-swiftui-macos-app\/","url_meta":{"origin":6154,"position":1},"title":"New SwiftR Chapter Up: Building an R-backed SwiftUI macOS App","author":"hrbrmstr","date":"2021-01-16","format":false,"excerpt":"Last week I introduced a new bookdown series on how to embed R into a macOS Swift application. The initial chapters focused on core concepts and showed how to build a macOS compiled, binary command line application that uses embedded R for some functionality. This week, a new chapter is\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":12185,"url":"https:\/\/rud.is\/b\/2019\/05\/12\/quick-hit-updates-to-quicklookr-and-rdatainfo\/","url_meta":{"origin":6154,"position":2},"title":"Quick Hit: Updates to QuickLookR and {rdatainfo}","author":"hrbrmstr","date":"2019-05-12","format":false,"excerpt":"I'm using GitUgh links here b\/c the issue was submitted there. Those not wishing to be surveilled by Microsoft can find the macOS QuickLook plugin project and {rdatainfo} project in SourceHut and GitLab (~hrbrmstr and hrbrmstr accounts respectively). I hadn't touched QuickLookR? or {rdatainfo}? at all since 2016 since it\u2026","rel":"","context":"In &quot;macOS&quot;","block_context":{"text":"macOS","link":"https:\/\/rud.is\/b\/category\/macos\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":11637,"url":"https:\/\/rud.is\/b\/2018\/11\/09\/escaping-the-macos-10-14-mojave-sandbox-with-r-rstudio\/","url_meta":{"origin":6154,"position":3},"title":"Escaping the macOS 10.14 (Mojave) Filesystem Sandbox with R \/ RStudio","author":"hrbrmstr","date":"2018-11-09","format":false,"excerpt":"If you're an R\/RStudio user who has migrated to Mojave (macOS 10.14) or are contemplating migrating to it, you will likely eventually run into an issue where you're trying to access resources that are in Apple's new hardened filesystem sandboxes. Rather than reinvent the wheel by blathering about what that\u2026","rel":"","context":"In &quot;macOS&quot;","block_context":{"text":"macOS","link":"https:\/\/rud.is\/b\/category\/macos\/"},"img":{"alt_text":"Photo by Alexander Dummer on Unsplash","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/alexander-dummer-261098-unsplash.jpg?fit=1200%2C801&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/alexander-dummer-261098-unsplash.jpg?fit=1200%2C801&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/alexander-dummer-261098-unsplash.jpg?fit=1200%2C801&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/alexander-dummer-261098-unsplash.jpg?fit=1200%2C801&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/11\/alexander-dummer-261098-unsplash.jpg?fit=1200%2C801&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":12866,"url":"https:\/\/rud.is\/b\/2021\/01\/04\/bringing-r-to-swift-on-macos\/","url_meta":{"origin":6154,"position":4},"title":"Bringing R to Swift on macOS","author":"hrbrmstr","date":"2021-01-04","format":false,"excerpt":"Over Christmas break I teased some screencaps: A more refined #rstats #swift \"SwiftR\" example. Simple Image view + some text views, a color picker and a button that runs R-in-Swift code (like {reticulate} does for Python in R)Note no ssd\/hd storage round-trip for the plot.Code snippet: https:\/\/t.co\/fWaHnztUgd pic.twitter.com\/y5m1I16tCB\u2014 Caliban's War\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4772,"url":"https:\/\/rud.is\/b\/2016\/12\/22\/pipes-everywhere\/","url_meta":{"origin":6154,"position":5},"title":"Pipes (%>%) Everywhere","author":"hrbrmstr","date":"2016-12-22","format":false,"excerpt":"An R user asked a question regarding whether it's possible to have the RStudio pipe (%>%) shortcut (Cmd-Shift-M) available in other macOS applications. If you're using Alfred then you can use this workflow for said task (IIRC this requires an Alfred license which is reasonably cheap). When you add it\u2026","rel":"","context":"In &quot;Alfred&quot;","block_context":{"text":"Alfred","link":"https:\/\/rud.is\/b\/category\/alfred\/"},"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\/6154","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=6154"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/6154\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=6154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=6154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=6154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}