

{"id":12288,"date":"2019-06-07T11:14:27","date_gmt":"2019-06-07T16:14:27","guid":{"rendered":"https:\/\/rud.is\/b\/?p=12288"},"modified":"2019-06-07T11:14:45","modified_gmt":"2019-06-07T16:14:45","slug":"reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work","status":"publish","type":"post","link":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/","title":{"rendered":"Reader Challenge: Have Some Fun with Apple&#8217;s WWDC 2019 Keynote Subtitles &#038; Show Your Work"},"content":{"rendered":"<p>I was <a href=\"https:\/\/twitter.com\/hrbrmstr\/status\/1135626710089707521\">pretty brutal to Apple earlier this week<\/a> in a Twitter thread that I tried to craft so it occurred in-line with the WWDC live stream (which might be something you want to remember as\/if you read on). I really don&#8217;t care about &#8220;memojis&#8221; and I have serious dismay over what is a pretty obvious fact that Apple intends to dumb down computing by shifting most folks from Macs to iPads. Their new &#8220;Pro&#8221; is for design folks and I&#8217;m not holding my breath for them to re-embrace the developer\/data science communities with better laptops or smaller <a href=\"https:\/\/www.cnet.com\/news\/new-apple-mac-pro-design-inspires-cheese-grater-jokes-and-theyre-gouda\/\">cheese graters<\/a>.<\/p>\n<p>The &#8220;meh&#8221; hardware\/software announcements aren&#8217;t the worst parts of these events. The TED-esque scripting (including many failed attempts at faux &#8220;authentic&#8221; humor) is also becoming quite tedious. I joked about analyzing the &#8220;adverbs per minute&#8221; but it took a few days for their <a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2019\/101\/\">WWDC 2019 keynote video<\/a> <strong>with<\/strong> a subtitle track to emerge. As a result, current time constraints prevent a dive into the subtitles themselves, <strong>but<\/strong> that doesn&#8217;t mean <em>you<\/em> can&#8217;t have some fun with them.<\/p>\n<p>Read on to see how I scraped the subtitles or skip to the end to read more about this &#8220;Reader Challenge&#8221;.<\/p>\n<h3>Not So Subtle Subtitle Scraping<\/h3>\n<p>If you go to the aforelinked WWDC video URL you&#8217;ll see control on the lower right to add a subtitle track. If you do that with browser Developer Tools open you&#8217;ll see what that does:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12290\" data-permalink=\"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/01-subtitle-index\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?fit=1404%2C740&amp;ssl=1\" data-orig-size=\"1404,740\" 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=\"01-subtitle-index\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?fit=510%2C268&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=510%2C268&#038;ssl=1\" alt=\"webdevtools subtitle index screen shot\" width=\"510\" height=\"268\" class=\"aligncenter size-large wp-image-12290\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=530%2C279&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=150%2C79&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=300%2C158&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=768%2C405&amp;ssl=1 768w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=500%2C264&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=1200%2C632&amp;ssl=1 1200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=400%2C211&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=800%2C422&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?resize=200%2C105&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?w=1404&amp;ssl=1 1404w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?w=1020&amp;ssl=1 1020w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>These are <a href=\"https:\/\/www.w3.org\/TR\/webvtt1\/\">WebVTT<\/a> formatted subtitles which have a format\/syntax that enable them to be displayed at the correct playback timecode. We can see how many of them there are by looking at the end of the file:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12291\" data-permalink=\"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/02-subtitle-count\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?fit=652%2C236&amp;ssl=1\" data-orig-size=\"652,236\" 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=\"02-subtitle-count\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?fit=510%2C185&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=510%2C185&#038;ssl=1\" alt=\"count of subtitles\" width=\"510\" height=\"185\" class=\"aligncenter size-large wp-image-12291\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=530%2C192&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=150%2C54&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=300%2C109&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=500%2C181&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=400%2C145&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?resize=200%2C72&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/02-subtitle-count.png?w=652&amp;ssl=1 652w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>So, there are 621 of them and each are requested individually (and super-fast, in-parallel). What do these individual requests look like? Just select one of them to take a look. They&#8217;re just plain text responses (it&#8217;s not a super-intricate format).<\/p>\n<p>Let&#8217;s grab one of them to the clipboard and use the <a href=\"https:\/\/cinc.rud.is\/web\/packages\/curlconverter\/\">{curlconverter} package<\/a> to turn that into an <code>httr::GET()<\/code> request via the <code>straighten()<\/code> and <code>make_req()<\/code> functions:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12289\" data-permalink=\"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/03-subtitle-curl\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?fit=1280%2C924&amp;ssl=1\" data-orig-size=\"1280,924\" 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=\"03-subtitle-curl\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?fit=510%2C369&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=510%2C369&#038;ssl=1\" alt=\"\" width=\"510\" height=\"369\" class=\"aligncenter size-large wp-image-12289\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=530%2C383&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=150%2C108&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=300%2C217&amp;ssl=1 300w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=768%2C554&amp;ssl=1 768w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=500%2C361&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=1200%2C866&amp;ssl=1 1200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=400%2C289&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=800%2C578&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?resize=200%2C144&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?w=1280&amp;ssl=1 1280w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/03-subtitle-curl.png?w=1020&amp;ssl=1 1020w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>I went ahead and wrapped it into a fairly-well-named function, but the <code>GET<\/code> request is virtually untouched from the aforementioned process. I just added the <code>{idx}<\/code> template into the request URL so we can <code>glue()<\/code> the right index into it. It is likely that some headers could have been eliminated but I just went with what <code>{curlconverter}<\/code> processed and returned this time.<\/p>\n<pre><code class=\"language-r\">library(stringi)\nlibrary(subtools) # https:\/\/github.com\/hrbrmstr\/subtools ; (ORIG: https:\/\/github.com\/fkeck\/subtools)\nlibrary(tidytext)\nlibrary(purrrogress) # tidy progress bars for free!\nlibrary(tidyverse)\n\n#' Fetches a subtitle by index from the 2019 Apple WWDC Keynote subtitle stream\nget_subtitle &lt;- function(idx = 1) {\n\n  st_url &lt;- \"https:\/\/p-events-delivery.akamaized.net\/3004qzusahnbjppuwydgjzsdyzsippar\/vod3\/cc2\/eng4\/prog_index_{idx}.webvtt\"\n  st_url &lt;- glue::glue(st_url)\n\n  httr::GET(\n    url = st_url,\n    httr::add_headers(\n      `sec-ch-ua` = \"Google Chrome 75\",\n      `Sec-Fetch-Mode` = \"cors\",\n      Origin = \"https:\/\/developer.apple.com\",\n      `User-Agent` = \"Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/75.0.3770.80 Safari\/537.36\",\n      Referer = \"https:\/\/developer.apple.com\/videos\/play\/wwdc2019\/101\/\",\n      `Sec-Fetch-Dest` = \"empty\",\n      `Sec-Fetch-Site` = \"cross-site\"\n    )\n  ) -&gt; res\n\n  out &lt;- httr::content(res, as = \"text\", encoding = \"UTF-8\")\n  out &lt;- stringi::stri_split_lines(out)\n\n  purrr::flatten_chr(out)\n\n}\n<\/code><\/pre>\n<p>Let&#8217;s see what one looks like:<\/p>\n<pre><code class=\"language-r\">(tmp &lt;- get_subtitle(1))\n## [1] \"WEBVTT\"                                          \n## [2] \"X-TIMESTAMP-MAP=MPEGTS:181083,LOCAL:00:00:00.000\"\n## [3] \"\"                                                \n## [4] \"3\"                                               \n## [5] \"00:00:21.199 --&gt; 00:00:22.333\"                   \n## [6] \"&gt;&gt; FEMALE SPEAKER:\"                              \n## [7] \"Don't stay up too late.\"                         \n## [8] \"\"                                                \n## [9] \"\"                 \n<\/code><\/pre>\n<p>Looking good! But, it&#8217;s just plain characters and I don&#8217;t feel like writing a subtitle parser. And, I dont&#8217; have to! Fran\u00e7ois Keck has the <a href=\"https:\/\/github.com\/fkeck\/subtools\">{subtools} package<\/a> which we can use. But, it (used to) only work on <em>files<\/em>. It <a href=\"https:\/\/github.com\/hrbrmstr\/subtools\">now<\/a> works on character vectors as well (but you&#8217;ll need to install it from my fork until the PR is merged). Let&#8217;s turn this set of noise into something we can use:<\/p>\n<pre><code class=\"language-r\">as_subtitle(tmp, format = \"webvtt\") %&gt;% \n  flatten_df()\n\n## # A tibble: 1 x 4\n##   ID    Timecode.in  Timecode.out Text                                \n##   &lt;chr&gt; &lt;chr&gt;        &lt;chr&gt;        &lt;chr&gt;                               \n## 1 3     00:00:21.199 00:00:22.333 &gt;&gt; FEMALE SPEAKER: Don't stay up to\u2026\n<\/code><\/pre>\n<p><em>So tidy!<\/em><\/p>\n<p>We now need to get all of the subtitles. We&#8217;ll do that fast since the video player retrieves them even faster than this iteration does:<\/p>\n<pre><code class=\"language-r\"># no crawl delay b\/c the video player grabs these even faster than this code does\nmap(1:621, with_progress(get_subtitle)) %&gt;% # with_progress gets you a progress bar for free\n  map(as_subtitle, format = \"webvtt\") %&gt;% \n  flatten_df() %&gt;% \n  as_tibble() -&gt; apple_subs\n\napple_subs\n## # A tibble: 3,220 x 4\n##    ID    Timecode.in  Timecode.out Text                               \n##    &lt;chr&gt; &lt;chr&gt;        &lt;chr&gt;        &lt;chr&gt;                              \n##  1 3     00:00:21.199 00:00:22.333 &gt;&gt; FEMALE SPEAKER: Don't stay up t\u2026\n##  2 4     00:01:10.933 00:01:11.933 &gt;&gt; MALE SPEAKER: Come on.          \n##  3 5     00:01:36.500 00:01:37.166 &gt;&gt; MALE SPEAKER: All right.        \n##  4 6     00:01:40.966 00:01:41.733 &gt;&gt; MALE SPEAKER: Yes.              \n##  5 7     00:01:45.733 00:01:46.666 &gt;&gt; MALE SPEAKER: Woo.              \n##  6 8     00:01:46.733 00:01:47.833 This is good.                      \n##  7 9     00:01:49.566 00:01:52.666 (Music playing)                    \n##  8 10    00:02:05.200 00:02:12.533 (Applause)                         \n##  9 10    00:02:05.200 00:02:12.533 (Applause)                         \n## 10 11    00:02:14.400 00:02:15.566 &gt;&gt; TIM COOK: Wow.                  \n## # \u2026 with 3,210 more rows\n<\/code><\/pre>\n<p>Streaming subtitles aren&#8217;t error-free and often get duplicated, let&#8217;s see if that&#8217;s the case:<\/p>\n<pre><code class=\"language-r\"><br \/># Any dups?\ndistinct(apple_subs) \n## # A tibble: 2,734 x 4\n##    ID    Timecode.in  Timecode.out Text                               \n##    &lt;chr&gt; &lt;chr&gt;        &lt;chr&gt;        &lt;chr&gt;                              \n##  1 3     00:00:21.199 00:00:22.333 &gt;&gt; FEMALE SPEAKER: Don't stay up t\u2026\n##  2 4     00:01:10.933 00:01:11.933 &gt;&gt; MALE SPEAKER: Come on.          \n##  3 5     00:01:36.500 00:01:37.166 &gt;&gt; MALE SPEAKER: All right.        \n##  4 6     00:01:40.966 00:01:41.733 &gt;&gt; MALE SPEAKER: Yes.              \n##  5 7     00:01:45.733 00:01:46.666 &gt;&gt; MALE SPEAKER: Woo.              \n##  6 8     00:01:46.733 00:01:47.833 This is good.                      \n##  7 9     00:01:49.566 00:01:52.666 (Music playing)                    \n##  8 10    00:02:05.200 00:02:12.533 (Applause)                         \n##  9 11    00:02:14.400 00:02:15.566 &gt;&gt; TIM COOK: Wow.                  \n## 10 12    00:02:15.633 00:02:18.166 Thank you.                         \n## # \u2026 with 2,724 more rows\n\napple_subs &lt;- distinct(apple_subs)\n<\/code><\/pre>\n<p>There were dups, but not anymore!<\/p>\n<p>You can get that data frame via: <a href=\"http:\/\/rud.is\/dl\/2019-wwdc-keynote-subtitles.csv.gz\">http:\/\/rud.is\/dl\/2019-wwdc-keynote-subtitles.csv.gz<\/a>.<\/p>\n<p>I wanted to see if these looked OK so I dumped just the text to a file and open them up in Sublime Text to spot check:<\/p>\n<pre><code class=\"language-r\"><br \/>apple_subs %&gt;%\n  pull(Text) %&gt;% \n  write_lines(\"\/tmp\/subs.txt\") \n\nsystem(\"subl \/tmp\/subs.txt\") # dblchk\n<\/code><\/pre>\n<p><a href=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?ssl=1\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"12292\" data-permalink=\"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/04-subtitle-check\/\" data-orig-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?fit=1180%2C1350&amp;ssl=1\" data-orig-size=\"1180,1350\" 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=\"04-subtitle-check\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?fit=510%2C583&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=510%2C583&#038;ssl=1\" alt=\"\" width=\"510\" height=\"583\" class=\"aligncenter size-large wp-image-12292\" srcset=\"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=530%2C606&amp;ssl=1 530w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=131%2C150&amp;ssl=1 131w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=262%2C300&amp;ssl=1 262w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=768%2C879&amp;ssl=1 768w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=500%2C572&amp;ssl=1 500w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=150%2C172&amp;ssl=1 150w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=400%2C458&amp;ssl=1 400w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=800%2C915&amp;ssl=1 800w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?resize=200%2C229&amp;ssl=1 200w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?w=1180&amp;ssl=1 1180w, https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/04-subtitle-check.png?w=1020&amp;ssl=1 1020w\" sizes=\"auto, (max-width: 510px) 100vw, 510px\" \/><\/a><\/p>\n<p>Since we have a good capture of what was spoken, we can start the analysis process:<\/p>\n<pre><code class=\"language-r\">distinct(apple_subs) %&gt;% \n  filter(!grepl(\"^\\\\(|^&gt;&gt;\", Text)) %&gt;%\n  unnest_tokens(word, Text) %&gt;% \n  anti_join(get_stopwords()) %&gt;% \n  count(word, sort=TRUE)\n## Joining, by = \"word\"\n## # A tibble: 2,408 x 2\n##    word      n\n##    &lt;chr&gt; &lt;int&gt;\n##  1 now     246\n##  2 can     205\n##  3 new     142\n##  4 like    119\n##  5 just    106\n##  6 app      77\n##  7 great    74\n##  8 apple    69\n##  9 right    64\n## 10 apps     59\n## # \u2026 with 2,398 more rows\n<\/code><\/pre>\n<p>And, that&#8217;s when I&#8217;ve run out of time.<\/p>\n<h3>Reader Challenge<\/h3>\n<p>You&#8217;ve got the cleaned WWDC 2019 Keynote subtitle track and access to my brutal WWDC 2019 Twitter thread. What fun can you have with it? I&#8217;d still like to know the adverbs-per-&#8216;n&#8217; (and what kind they were). But, what else can you discover? Is there a pattern of emotional manipulation through word choices at different times? Did they change tone\/style throughout the event? What other questions can you ask and tease out with data?<\/p>\n<p>Drop links to your creations (and separate links to code) in the comments and I&#8217;ll re-broadcast them on Twitter and gather them all up into a new post to see what y&#8217;all came up with.<\/p>\n<h3>FIN<\/h3>\n<p>There&#8217;s no deadline as I can keep on curating as new submissions come in. While this is most assuredly an R-focused blog there is no restriction on the tools you use as well.<\/p>\n<p>Hopefully this will be a fun\/creative exercise for folks. If you have any questions about the scraping process or about the WebVTT format don&#8217;t hesitate to ping me here or on Twitter (@hrbrmstr).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I was pretty brutal to Apple earlier this week in a Twitter thread that I tried to craft so it occurred in-line with the WWDC live stream (which might be something you want to remember as\/if you read on). I really don&#8217;t care about &#8220;memojis&#8221; and I have serious dismay over what is a pretty [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":3,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":""},"categories":[91],"tags":[],"class_list":["post-12288","post","type-post","status-publish","format-standard","hentry","category-r"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Reader Challenge: Have Some Fun with Apple&#039;s WWDC 2019 Keynote Subtitles &amp; Show Your Work - 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\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Reader Challenge: Have Some Fun with Apple&#039;s WWDC 2019 Keynote Subtitles &amp; Show Your Work - rud.is\" \/>\n<meta property=\"og:description\" content=\"I was pretty brutal to Apple earlier this week in a Twitter thread that I tried to craft so it occurred in-line with the WWDC live stream (which might be something you want to remember as\/if you read on). I really don&#8217;t care about &#8220;memojis&#8221; and I have serious dismay over what is a pretty [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/\" \/>\n<meta property=\"og:site_name\" content=\"rud.is\" \/>\n<meta property=\"article:published_time\" content=\"2019-06-07T16:14:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-06-07T16:14:45+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index-530x279.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=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/\"},\"author\":{\"name\":\"hrbrmstr\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"headline\":\"Reader Challenge: Have Some Fun with Apple&#8217;s WWDC 2019 Keynote Subtitles &#038; Show Your Work\",\"datePublished\":\"2019-06-07T16:14:27+00:00\",\"dateModified\":\"2019-06-07T16:14:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/\"},\"wordCount\":809,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#\\\/schema\\\/person\\\/d7cb7487ab0527447f7fda5c423ff886\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/01-subtitle-index-530x279.png\",\"articleSection\":[\"R\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/\",\"url\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/\",\"name\":\"Reader Challenge: Have Some Fun with Apple's WWDC 2019 Keynote Subtitles & Show Your Work - rud.is\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/01-subtitle-index-530x279.png\",\"datePublished\":\"2019-06-07T16:14:27+00:00\",\"dateModified\":\"2019-06-07T16:14:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/01-subtitle-index.png?fit=1404%2C740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/rud.is\\\/b\\\/wp-content\\\/uploads\\\/2019\\\/06\\\/01-subtitle-index.png?fit=1404%2C740&ssl=1\",\"width\":1404,\"height\":740,\"caption\":\"webdevtools subtitle index screen shot\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/rud.is\\\/b\\\/2019\\\/06\\\/07\\\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/rud.is\\\/b\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reader Challenge: Have Some Fun with Apple&#8217;s WWDC 2019 Keynote Subtitles &#038; Show Your Work\"}]},{\"@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":"Reader Challenge: Have Some Fun with Apple's WWDC 2019 Keynote Subtitles & Show Your Work - 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\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/","og_locale":"en_US","og_type":"article","og_title":"Reader Challenge: Have Some Fun with Apple's WWDC 2019 Keynote Subtitles & Show Your Work - rud.is","og_description":"I was pretty brutal to Apple earlier this week in a Twitter thread that I tried to craft so it occurred in-line with the WWDC live stream (which might be something you want to remember as\/if you read on). I really don&#8217;t care about &#8220;memojis&#8221; and I have serious dismay over what is a pretty [&hellip;]","og_url":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/","og_site_name":"rud.is","article_published_time":"2019-06-07T16:14:27+00:00","article_modified_time":"2019-06-07T16:14:45+00:00","og_image":[{"url":"https:\/\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index-530x279.png","type":"","width":"","height":""}],"author":"hrbrmstr","twitter_card":"summary_large_image","twitter_misc":{"Written by":"hrbrmstr","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#article","isPartOf":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/"},"author":{"name":"hrbrmstr","@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"headline":"Reader Challenge: Have Some Fun with Apple&#8217;s WWDC 2019 Keynote Subtitles &#038; Show Your Work","datePublished":"2019-06-07T16:14:27+00:00","dateModified":"2019-06-07T16:14:45+00:00","mainEntityOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/"},"wordCount":809,"commentCount":1,"publisher":{"@id":"https:\/\/rud.is\/b\/#\/schema\/person\/d7cb7487ab0527447f7fda5c423ff886"},"image":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index-530x279.png","articleSection":["R"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/","url":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/","name":"Reader Challenge: Have Some Fun with Apple's WWDC 2019 Keynote Subtitles & Show Your Work - rud.is","isPartOf":{"@id":"https:\/\/rud.is\/b\/#website"},"primaryImageOfPage":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#primaryimage"},"image":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#primaryimage"},"thumbnailUrl":"https:\/\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index-530x279.png","datePublished":"2019-06-07T16:14:27+00:00","dateModified":"2019-06-07T16:14:45+00:00","breadcrumb":{"@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#primaryimage","url":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?fit=1404%2C740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2019\/06\/01-subtitle-index.png?fit=1404%2C740&ssl=1","width":1404,"height":740,"caption":"webdevtools subtitle index screen shot"},{"@type":"BreadcrumbList","@id":"https:\/\/rud.is\/b\/2019\/06\/07\/reader-challenge-have-some-fun-with-apples-wwdc-2019-keynote-subtitles-show-your-work\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/rud.is\/b\/"},{"@type":"ListItem","position":2,"name":"Reader Challenge: Have Some Fun with Apple&#8217;s WWDC 2019 Keynote Subtitles &#038; Show Your Work"}]},{"@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-3cc","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":3787,"url":"https:\/\/rud.is\/b\/2015\/11\/13\/beware-of-sideloading-f-lux-for-ios-from-files-obtained-on-sharingtorrent-sites\/","url_meta":{"origin":12288,"position":0},"title":"Beware of sideloading f.lux for iOS from files obtained on sharing\/torrent sites","author":"hrbrmstr","date":"2015-11-13","format":false,"excerpt":"Apple made the @justgetflux folks remove their [iOS sideloaded app](https:\/\/justgetflux.com\/sideload\/) due to the use of private APIs (which are a violation of the Apple Developer agreement). The ZIP archive has been pulled from their site (and it really has, too). This \"sideloading\"\u2014i.e. installing directly to your device after compiling it\u2026","rel":"","context":"In &quot;Apple&quot;","block_context":{"text":"Apple","link":"https:\/\/rud.is\/b\/category\/apple\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/rud.is\/b\/wp-content\/uploads\/2015\/11\/image.png?fit=400%2C368&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":13042,"url":"https:\/\/rud.is\/b\/2021\/04\/25\/a-small-macos-big-sur-to-extract-indicators-of-compromise\/","url_meta":{"origin":12288,"position":1},"title":"A Small macOS (Big Sur+) App to Extract Indicators of Compromise","author":"hrbrmstr","date":"2021-04-25","format":false,"excerpt":"There's a semi-infrequent-but-frequent-enough-to-be-annoying manual task at $DAYJOB that involves extracting a particular set of strings (identifiable by a fairly benign set of regular expressions) from various interactive text sources (so, not static documents or documents easily scrape-able). Rather than hack something onto Sublime Text or VS Code I made a\u2026","rel":"","context":"In &quot;Information Security&quot;","block_context":{"text":"Information Security","link":"https:\/\/rud.is\/b\/category\/information-security\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1498,"url":"https:\/\/rud.is\/b\/2012\/07\/12\/security-privacy-of-mountain-lions-dictation-feature\/","url_meta":{"origin":12288,"position":2},"title":"Security &#038; Privacy Of Mountain Lion&#8217;s Dictation Feature","author":"hrbrmstr","date":"2012-07-12","format":false,"excerpt":"With Gizmodo doing a post hyping Mountain Lion's new dictation feature it's probably a good time to note that folks in regulated environments or who just care about security & privacy a bit more than others should not enable or use this feature for the dictation of sensitive information. From\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":12841,"url":"https:\/\/rud.is\/b\/2020\/11\/18\/apple-silicon-big-sur-rstudio-r-field-report\/","url_meta":{"origin":12288,"position":3},"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":[]},{"id":13498,"url":"https:\/\/rud.is\/b\/2022\/07\/10\/rust-cli-for-apples-weatherkit-rest-api\/","url_meta":{"origin":12288,"position":4},"title":"Rust CLI For Apple&#8217;s WeatherKit REST API","author":"hrbrmstr","date":"2022-07-10","format":false,"excerpt":"Apple is in the final stages of shuttering the DarkSky service\/API. They've replaced it with WeatherKit, which has both an xOS framework version as well as a REST API. To use either, you need to be a member of the Apple Developer Program (ADP) \u2014 $99.00\/USD per-year \u2014 and calls\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":5796,"url":"https:\/\/rud.is\/b\/2017\/04\/07\/r%e2%81%b6-rstudio-server-client-make-an-app-for-that\/","url_meta":{"origin":12288,"position":5},"title":"R\u2076 \u2014 RStudio Server Client? Make An App For That!","author":"hrbrmstr","date":"2017-04-07","format":false,"excerpt":"RStudio is a great way to work through analyses tasks, and I suspect most folks use the \"desktop\" version of the product on their local workstations. The fine folks at RStudio also make a server version (the codebase for RStudio is able to generate server or desktop and they are\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\/12288","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=12288"}],"version-history":[{"count":0,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/posts\/12288\/revisions"}],"wp:attachment":[{"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/media?parent=12288"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/categories?post=12288"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rud.is\/b\/wp-json\/wp\/v2\/tags?post=12288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}