

{"id":11427,"date":"2018-08-24T05:01:26","date_gmt":"2018-08-24T10:01:26","guid":{"rendered":"https:\/\/rud.is\/b\/?p=11427"},"modified":"2018-08-24T09:32:04","modified_gmt":"2018-08-24T14:32:04","slug":"friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/","title":{"rendered":"Friday #rstats twofer: Finding macOS 32-bit apps &#038; Processing Data from System Commands"},"content":{"rendered":"<p>Apple has <a href=\"https:\/\/support.apple.com\/en-us\/HT208436\">run the death bell<\/a> on 32-bit macOS apps and, if you&#8217;re running a recent macOS version on your Mac (which you <em>should<\/em> so you can get security updates) you likely see this alert from time-to-time:<\/p>\n<p><a href=\"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/macos-high-sierra-32-bit-app-alert\/\" rel=\"attachment wp-att-11428\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"11428\" data-permalink=\"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/macos-high-sierra-32-bit-app-alert\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/macos-high-sierra-32-bit-app-alert.jpg?fit=840%2C314&amp;ssl=1\" data-orig-size=\"840,314\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"macos-high-sierra-32-bit-app-alert\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/macos-high-sierra-32-bit-app-alert.jpg?fit=510%2C191&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/macos-high-sierra-32-bit-app-alert.jpg?resize=510%2C191&#038;ssl=1\" alt=\"\" width=\"510\" height=\"191\" class=\"aligncenter size-full wp-image-11428\" \/><\/a><\/p>\n<p>If you&#8217;re like me, you click through that and keep working but later ponder just how many of those apps you have. They are definitely going away, so knowing if your favourite app is on the chopping block is likely a good idea.<\/p>\n<p>You can get this information via the &#8220;About This Mac&#8221;\u0362&#8221;System Report&#8221; app and sorting via one of the table fields.<\/p>\n<p>R folks are data folks and we know we can do better than that. But, first we need to get the data. Thankfully, we can get this via the <a href=\"https:\/\/ss64.com\/osx\/system_profiler.html\"><code>system_profiler<\/code><\/a> command-line utility since it can both display user-friendly information in the terminal and also generate an XML version of the information to work with. We won&#8217;t need to head to the terminal for this work, though, since there are many ways to execute the command from R and read the generated output.<\/p>\n<h3>Executing System Calls from R<\/h3>\n<p>Base R provides two core methods for issuing a system call:<\/p>\n<ul>\n<li><code>system()<\/code><\/li>\n<li><code>system2()<\/code><\/li>\n<\/ul>\n<p>Note that there are other functions provided with a base R installation that can also issue system commands and process the &#8220;piped&#8221; output, but we&#8217;ll focus on these deliberate invocation ones.<\/p>\n<p>Functions in two other packages can also assist with this task and we&#8217;ll include a look at:<\/p>\n<ul>\n<li><code>processx::run()<\/code><\/li>\n<li><code>sys::exec_internal()<\/code><\/li>\n<\/ul>\n<p>as well.<\/p>\n<p>Why leave base R for this task? Truthfully, we really don&#8217;t <em>need<\/em> to, but both <code>sys<\/code> and <code>processx<\/code> have other tasks which do make them handy tools in your package toolbox. Having said that, keep reading since we&#8217;re going to end up <em>not<\/em> choosing the built-in functions for this task.<\/p>\n<p>This is the command line we need to execute:<\/p>\n<pre><code class=\"language-bash\">system_profiler -xml -detailLevel full SPApplicationsDataType\n<\/code><\/pre>\n<p>Let&#8217;s load up all the packages we&#8217;ll be needing and execute this command-line all four ways, then briefly discuss the differences:<\/p>\n<pre><code class=\"language-r\">library(sys)\nlibrary(processx)\nlibrary(microbenchmark)\nlibrary(xml2)\nlibrary(tidyverse)\n\nsystem(\n  command = \"system_profiler -xml -detailLevel full SPApplicationsDataType\",\n  intern = TRUE\n) -> apps_system\n\nstr(apps_system)\n##  chr [1:10665] \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\" ...\n\nsystem2(\n  command = \"system_profiler\",\n  args = c(\"-xml\", \"-detailLevel\", \"full\", \"SPApplicationsDataType\"),\n  stdout = TRUE\n) -> apps_system2\n\nstr(apps_system2)\n##  chr [1:10665] \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\" ...\n\nprocessx::run(\n  command = \"system_profiler\",\n  args = c(\"-xml\", \"-detailLevel\", \"full\", \"SPApplicationsDataType\"),\n  spinner = TRUE\n) -> apps_processx_run\n\nstr(apps_processx_run)\n## List of 4\n##  $ status : int 0\n##  $ stdout : chr \"XML STRING THAT prism.js won't let me show\"\n##  $ stderr : chr \"\"\n##  $ timeout: logi FALSE\n\nsys::exec_internal(\n  cmd = \"system_profiler\",\n  args = c(\"-xml\", \"-detailLevel\", \"full\", \"SPApplicationsDataType\")\n) -> apps_sys_exec_internal\n\nstr(apps_sys_exec_internal)\n## List of 3\n##  $ status: int 0\n##  $ stdout: raw [1:331133] 3c 3f 78 6d ...\n##  $ stderr: raw(0) <\/code><\/pre>\n<p>The core difference between <code>system()<\/code> and the rest is that <em>you<\/em> need to <a href=\"https:\/\/stat.ethz.ch\/R-manual\/R-devel\/library\/base\/html\/shQuote.html\"><code>shQuote()<\/code>?<\/a> for <code>system()<\/code> whereas that&#8217;s taken care of for you by the others (so they&#8217;re a bit safer by default since you&#8217;re more than likely going to forget to <code>shQuote()<\/code>).<\/p>\n<p>You can definitely notice the main differences in return objects. The built-in functions just give us the character data from the standard output stream (<code>stdout<\/code>) and the last two return a more structured object that provides more explicit information about the job we just executed. The base ones can provide this detail, but it&#8217;s a twisty maze of remembering which options do what vs the more (IMO) straightforward approach both <code>processx<\/code> and <code>sys<\/code> take.<\/p>\n<p>You&#8217;ll also notice a difference in <code>stdout<\/code> between <code>processx<\/code> and <code>sys<\/code> with the latter giving us a raw vector vs a character vector. This gives us a great deal of power and flexibility. It also turns out to be a great choice for processing command-line-generated XML data. Here&#8217;s why:<\/p>\n<pre><code class=\"language-r\">microbenchmark(\n  sys = xml2::read_xml(apps_sys_exec_internal$stdout),\n  processx = xml2::read_xml(apps_processx_run$stdout)\n)\n## Unit: milliseconds\n##      expr      min       lq      mean    median        uq      max neval\n##       sys 4.086492  4.60078  9.085143  5.508814  5.906942 207.6495   100\n##  processx 9.510356 10.98282 14.275499 12.054810 13.292234 163.9870   100<\/code><\/pre>\n<p>It turns out <code>xml2::read_xml()<\/code> makes much quicker work of the raw vector data (though, I mean, <em>really<\/em>&mdash;are we really going to care about those ~5ms IRL?).<\/p>\n<p>We&#8217;ll move on to the real reason for the post, but definitely explore both <code>sys<\/code> and <code>processx<\/code> since they are both super-handy packages.<\/p>\n<h3><em>&#8220;Can we please just find the 32-bit apps already?&#8221;<\/em><\/h3>\n<p>No problem. Well, actually, there is a minor annoyance. These are <a href=\"https:\/\/developer.apple.com\/library\/archive\/documentation\/Cocoa\/Conceptual\/PropertyLists\/UnderstandXMLPlist\/UnderstandXMLPlist.html\">property list XML files<\/a> and I&#8217;ll confess that I truly hate this format. There are &#8220;dictionary arrays&#8221; of <code>key<\/code> and <code>value<\/code> nodes, but those nodes are siblings vs directly associated pairs. So, we have to use the sibling relationship to work with them. It&#8217;s not <em>hard<\/em>, per se, just (again, IMO) suboptimal.<\/p>\n<p>Let&#8217;s take a look at it:<\/p>\n<pre><code class=\"language-r\">apps <- read_xml(apps_sys_exec_internal$stdout)\n\nxml_find_all(apps, \"\/\/array\/dict\")\n## {xml_nodeset (476)}\n##  [1] <dict>\\n  <key>_SPCommandLineArguments<\/key>\\n  <array>\\n    <string> ...\n##  [2] <dict>\\n  <key>_name<\/key>\\n  <string>Sublime Text<\/string>\\n  <key>h ...\n##  [3] <dict>\\n  <key>_name<\/key>\\n  <string>System Preferences<\/string>\\n   ...\n##  [4] <dict>\\n  <key>_name<\/key>\\n  <string>Google Chrome Canary<\/string>\\n ...\n##  [5] <dict>\\n  <key>_name<\/key>\\n  <string>Google Chrome<\/string>\\n  <key> ...\n##  [6] <dict>\\n  <key>_name<\/key>\\n  <string>Dropbox<\/string>\\n  <key>has64B ...\n##  [7] <dict>\\n  <key>_name<\/key>\\n  <string>Keypad<\/string>\\n  <key>has64Bi ...\n##  [8] <dict>\\n  <key>_name<\/key>\\n  <string>Garmin WebUpdater<\/string>\\n  < ...\n##  [9] <dict>\\n  <key>_name<\/key>\\n  <string>LaTeXiT<\/string>\\n  <key>has64B ...\n## [10] <dict>\\n  <key>_name<\/key>\\n  <string>CocoaPacketAnalyzer<\/string>\\n  ...\n## [11] <dict>\\n  <key>_name<\/key>\\n  <string>Janetter<\/string>\\n  <key>has64 ...\n## [12] <dict>\\n  <key>_name<\/key>\\n  <string>VMware Fusion<\/string>\\n  <key> ...\n## [13] <dict>\\n  <key>_name<\/key>\\n  <string>Photo Library Migration Utility ...\n## [14] <dict>\\n  <key>_name<\/key>\\n  <string>Setup Assistant<\/string>\\n  <ke ...\n## [15] <dict>\\n  <key>_name<\/key>\\n  <string>Siri<\/string>\\n  <key>has64BitI ...\n## [16] <dict>\\n  <key>_name<\/key>\\n  <string>Software Update<\/string>\\n  <ke ...\n## [17] <dict>\\n  <key>_name<\/key>\\n  <string>Spotlight<\/string>\\n  <key>has6 ...\n## [18] <dict>\\n  <key>_name<\/key>\\n  <string>Stocks<\/string>\\n  <key>has64Bi ...\n## [19] <dict>\\n  <key>_name<\/key>\\n  <string>SystemUIServer<\/string>\\n  <key ...\n## [20] <dict>\\n  <key>_name<\/key>\\n  <string>UniversalAccessControl<\/string> ...\n## ...<\/code><\/pre>\n<p>Let&#8217;s look at a sample record using <code>xml_view()<\/code> from the <code>htmltidy<\/code> package:<\/p>\n<pre><code class=\"language-r\">xml_find_all(apps, \"\/\/array\/dict[key='_name']\")[1] %>% \n  htmltidy::xml_view()<\/code><\/pre>\n<p><a href=\"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/screen-shot-2018-08-24-at-4-58-41-am\/\" rel=\"attachment wp-att-11431\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"11431\" data-permalink=\"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/screen-shot-2018-08-24-at-4-58-41-am\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&amp;ssl=1\" data-orig-size=\"1640,836\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"xml_view\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=510%2C260&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?resize=510%2C260&#038;ssl=1\" alt=\"\" width=\"510\" height=\"260\" class=\"aligncenter size-full wp-image-11431\" \/><\/a><\/p>\n<p>Be wary of using <code>xml_view()<\/code> on giant XML structures since it&#8217;ll freeze up RStudio for a bit and even slows down Chrome since the resultant, composed DOM object can get ginormous.<\/p>\n<p>Now we know we can use <code>has64BitIntelCode<\/code> for filtering once we get to the data. Let&#8217;s read in all the apps, cherry-picking the fields and then just look at the 32-bit apps:<\/p>\n<pre><code class=\"language-r\">xml_find_all(apps, \"\/\/array\/dict[key='_name']\") %>% \n  map_df(~{\n    list(\n      name = xml_find_first(.x, \".\/\/string\") %>% xml_text(),\n      path = xml_find_first(.x, \".\/\/key[.='path']\/following-sibling::string\") %>% xml_text(),\n      is_64bit = xml_find_first(.x, \".\/\/key[.='has64BitIntelCode']\/following-sibling::string\") %>% xml_text() \n    )\n  }) %>% \n  filter(is_64bit == \"no\") %>% \n  arrange(name) %>% \n  select(-is_64bit)\n## # A tibble: 30 x 2\n##    name                      path                                           \n##    <chr>                     <chr>                                          \n##  1 AAM Registration Notifier \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  2 AAM Registration Notifier \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  3 AAM Updates Notifier      \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  4 AAMLauncherUtil           \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  5 ACR_9_10                  \/Library\/Application Support\/Adobe\/Uninstall\/A\u2026\n##  6 Adobe Application Manager \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  7 adobe_licutil             \/Applications\/Utilities\/Adobe Application Mana\u2026\n##  8 Audacity                  \/Applications\/Audacity.app                     \n##  9 COCM_1_0_32               \/Library\/Application Support\/Adobe\/Uninstall\/C\u2026\n## 10 COPS_1_0_32               \/Library\/Application Support\/Adobe\/Uninstall\/C\u2026\n## # ... with 20 more rows<\/code><\/pre>\n<p>The Adobe helper apps are longstanding 32-bit &#8220;offenders&#8221;. Many of these death-row apps fall into the &#8220;helper&#8221; category and will hopefully get some attention by their developers. I do find it amusing that Apple <em>kinda<\/em> wants <strong>us<\/strong> to prod the developers to get their collective acts together.<\/p>\n<h3>FIN<\/h3>\n<p>This exhaustive search finds all of the 32-bit apps residing on your system. If you just want to see the one&#8217;s you&#8217;ve <em>executed<\/em> and macOS has kept track of, you can drop to a command-line and do:<\/p>\n<pre><code>sudo Rscript -e 'knitr::kable((dplyr::select(dplyr::tbl(dplyr::src_sqlite(\"\/var\/db\/SystemPolicyConfiguration\/ExecPolicy\"), \"legacy_exec_history_v3\"), responsible_path)))'<\/code><\/pre>\n<p>You need elevated privileges to access those files, so please <em>read that whole line<\/em> to make sure I&#8217;m not having you <code>rm -rf \/<\/code>.<\/p>\n<p>Remember to take some time to explore the <code>sys<\/code> and <code>processx<\/code> packages and perhaps bundle up the salient bits of this post into a script so you can occasionally check to see the 32-bit eradication progress.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Apple has run the death bell on 32-bit macOS apps and, if you&#8217;re running a recent macOS version on your Mac (which you should so you can get security updates) you likely see this alert from time-to-time: If you&#8217;re like me, you click through that and keep working but later ponder just how many of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":11431,"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":[663,780,91],"tags":[],"class_list":["post-11427","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-apple","category-macos","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Friday #rstats twofer: Finding macOS 32-bit apps &amp; Processing Data from System Commands - 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\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Friday #rstats twofer: Finding macOS 32-bit apps &amp; Processing Data from System Commands - rud.is\" \/>\n<meta property=\"og:description\" content=\"Apple has run the death bell on 32-bit macOS apps and, if you&#8217;re running a recent macOS version on your Mac (which you should so you can get security updates) you likely see this alert from time-to-time: If you&#8217;re like me, you click through that and keep working but later ponder just how many of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2018-08-24T10:01:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-08-24T14:32:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1640\" \/>\n\t<meta property=\"og:image:height\" content=\"836\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Friday #rstats twofer: Finding macOS 32-bit apps &#038; Processing Data from System Commands\",\"datePublished\":\"2018-08-24T10:01:26+00:00\",\"dateModified\":\"2018-08-24T14:32:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/\"},\"wordCount\":854,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1\",\"articleSection\":[\"Apple\",\"macOS\",\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/\",\"name\":\"Friday #rstats twofer: Finding macOS 32-bit apps & Processing Data from System Commands - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1\",\"datePublished\":\"2018-08-24T10:01:26+00:00\",\"dateModified\":\"2018-08-24T14:32:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2018\\\/08\\\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1\",\"width\":1640,\"height\":836},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2018\\\/08\\\/24\\\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Friday #rstats twofer: Finding macOS 32-bit apps &#038; Processing Data from System Commands\"}]},{\"@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":"Friday #rstats twofer: Finding macOS 32-bit apps & Processing Data from System Commands - 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\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/","og_locale":"en_US","og_type":"article","og_title":"Friday #rstats twofer: Finding macOS 32-bit apps & Processing Data from System Commands - rud.is","og_description":"Apple has run the death bell on 32-bit macOS apps and, if you&#8217;re running a recent macOS version on your Mac (which you should so you can get security updates) you likely see this alert from time-to-time: If you&#8217;re like me, you click through that and keep working but later ponder just how many of [&hellip;]","og_url":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/","og_site_name":"rud.is","article_published_time":"2018-08-24T10:01:26+00:00","article_modified_time":"2018-08-24T14:32:04+00:00","og_image":[{"width":1640,"height":836,"url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","type":"image\/png"}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Friday #rstats twofer: Finding macOS 32-bit apps &#038; Processing Data from System Commands","datePublished":"2018-08-24T10:01:26+00:00","dateModified":"2018-08-24T14:32:04+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/"},"wordCount":854,"commentCount":0,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","articleSection":["Apple","macOS","R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/","url":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/","name":"Friday #rstats twofer: Finding macOS 32-bit apps & Processing Data from System Commands - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","datePublished":"2018-08-24T10:01:26+00:00","dateModified":"2018-08-24T14:32:04+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","width":1640,"height":836},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2018\/08\/24\/friday-rstats-twofer-finding-macos-32-bit-apps-processing-data-from-system-commands\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Friday #rstats twofer: Finding macOS 32-bit apps &#038; Processing Data from System Commands"}]},{"@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":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/08\/Screen-Shot-2018-08-24-at-4.58.41-AM.png?fit=1640%2C836&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p23idr-2Yj","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":10991,"url":"https:\/\/rud.is\/b\/2018\/07\/06\/visualizing-macos-app-usage\/","url_meta":{"origin":11427,"position":0},"title":"Visualizing macOS App Usage with a Little Help from osqueryr &#038; mactheknife","author":"hrbrmstr","date":"2018-07-06","format":false,"excerpt":"Both my osqueryr and macthekinfe packages have had a few updates and I wanted to put together a fun example (it being Friday, and all) for what you can do with them. All my packages are now on GitHub and GitLab and I'll be maintaining them on both so I\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\/2018\/07\/app-lod-tree-1.png?fit=1200%2C1197&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/07\/app-lod-tree-1.png?fit=1200%2C1197&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/07\/app-lod-tree-1.png?fit=1200%2C1197&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/07\/app-lod-tree-1.png?fit=1200%2C1197&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2018\/07\/app-lod-tree-1.png?fit=1200%2C1197&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":12537,"url":"https:\/\/rud.is\/b\/2019\/10\/28\/spelunking-macos-screentime-app-usage-with-r\/","url_meta":{"origin":11427,"position":1},"title":"Spelunking macOS &#8216;ScreenTime&#8217; App Usage with R","author":"hrbrmstr","date":"2019-10-28","format":false,"excerpt":"Apple has brought Screen Time to macOS for some time now and that means it has to store this data somewhere. Thankfully, Sarah Edwards has foraged through the macOS filesystem for us and explained where these bits of knowledge are in her post, Knowledge is Power! Using the macOS\/iOS knowledgeC.db\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":6154,"url":"https:\/\/rud.is\/b\/2017\/08\/13\/r%e2%81%b6-exploring-macos-applications-with-codesign-gatekeeper-r\/","url_meta":{"origin":11427,"position":2},"title":"R\u2076 \u2014 Exploring macOS Applications with codesign, Gatekeeper &#038; R","author":"hrbrmstr","date":"2017-08-13","format":false,"excerpt":"(General reminder abt \"R\u2076\" posts in that they are heavy on code-examples, minimal on expository. I try to design them with 2-3 \"nuggets\" embedded for those who take the time to walk through the code examples on their systems. I'll always provide further expository if requested in a comment, so\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":13039,"url":"https:\/\/rud.is\/b\/2021\/04\/24\/making-macos-universal-apps-with-universal-golang-static-libraries\/","url_meta":{"origin":11427,"position":3},"title":"Making macOS Universal Apps in Swift with Universal Golang Static Libraries","author":"hrbrmstr","date":"2021-04-24","format":false,"excerpt":"There are a plethora of amazingly useful Golang libraries, and it has been possible for quite some time to use Go libraries with Swift. The advent of the release of the new Apple Silicon\/M1\/arm64 architecture for macOS created the need for a new round of \"fat\"\/\"universal\" binaries and libraries to\u2026","rel":"","context":"In &quot;Go&quot;","block_context":{"text":"Go","link":"https:\/\/rud.is\/b\/category\/go\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":14475,"url":"https:\/\/rud.is\/b\/2023\/09\/30\/avoid-libwebp-electron-woes-on-macos-with-positron\/","url_meta":{"origin":11427,"position":4},"title":"Avoid libwebp Electron Woes On macOS With positron","author":"hrbrmstr","date":"2023-09-30","format":false,"excerpt":"If you've got ? on this blog (directly, or via syndication) you'd have to have been living under a rock to not know about the libwebp supply chain disaster. An unfortunate casualty of inept programming just happened to be any app in the Electron ecosystem that doesn't undergo bleeding-edge updates.\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\/2023\/09\/resource-database-Ix86EQm6HDQ-unsplash.jpg?fit=960%2C1200&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/09\/resource-database-Ix86EQm6HDQ-unsplash.jpg?fit=960%2C1200&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/09\/resource-database-Ix86EQm6HDQ-unsplash.jpg?fit=960%2C1200&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2023\/09\/resource-database-Ix86EQm6HDQ-unsplash.jpg?fit=960%2C1200&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":12841,"url":"https:\/\/rud.is\/b\/2020\/11\/18\/apple-silicon-big-sur-rstudio-r-field-report\/","url_meta":{"origin":11427,"position":5},"title":"Apple Silicon + Big Sur + RStudio + R Field Report","author":"hrbrmstr","date":"2020-11-18","format":false,"excerpt":"It's been a while since I've posted anything R-related and, while this one will be brief, it may be of use to some R folks who have taken the leap into Big Sur and\/or Apple Silicon. Stay to the end for an early Christmas ?! Big Sur Report As #rstats\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":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/11427","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=11427"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/11427\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media\/11431"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=11427"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=11427"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=11427"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}