{ "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "items": [ { "originId": "com.sixcolors.931113_features_of_ios_13_files_improvements", "fingerprint": "b321d04b", "id": "Ai/HDbZBn/DqS4YSFb8RbnuS8su16El+mi83Mpt/WqQ=_16d88a4dca2:50e96:18991ffa", "author": "Jason Snell", "summary": { "direction": "ltr", "content": "

\"\"\n
Funny how something as basic as inserting a thumbdrive can feel like a colossal victory.
\n

\n

The Finder places files and folders at the center of the Mac, but on iOS, apps are at the center. Still, managing documents is a fact of life in many cases, and over the past few years Apple has been evolving the Files app to become a more full-featured file browser utility. In iOS 13, Files takes a huge step forward in numerous areas\u2026 though there\u2019s still more to be done.

\n

Perhaps most important is the simple fact that Files can now see destinations that aren\u2019t cloud services or other apps. You can add local SMB file servers to Files by tapping the ellipsis icon in the Browse pane and choosing Connect to Server, then entering the address of your SMB server. While you\u2019re connected, that server will appear in the Shared segment of the Browse pane. (Strangely, Files doesn\u2019t use Bonjour to detect nearby servers and display them, as Finder does.) I have a Mac mini on my home network that I use as a file server, and it\u2019s been a delight to access files on it, directly, from within Files and apps that use Apple\u2019s file interface.

\n

\"\"\n
Browsing a local SMB server in column view, as you do.
\n

\n

USB drives are also supported. It\u2019s kind of hard to believe that I\u2019m celebrating USB disk access in late 2019, but here we are. You can attach USB drives to any device running iOS 13, but this feature certainly feels best when you plug a USB-C cable or thumbdrive directly into an iPad Pro. As an iPad Pro user, that\u2019s a moment that really makes the iPad Pro feel like it\u2019s been welcomed into the community of personal computers. And if you\u2019re someone who has ever been handed a thumbdrive by a colleague who expects you to access it on your iPad, well, now you can do that instead of sheepishly admitting that it\u2019s completely useless to you. I\u2019ve used this feature to attach my portable audio recorder directly to my iPad to import recordings, something I previously had to use a breakout box to accomplish.

\n

You can even create new folders now. Yes. It\u2019s true. And there\u2019s a new Column View, which is an approach to file browsing that I\u2019ve never liked on macOS, but actually makes more sense to me on iOS for some reason.

\n

\"shortcuts-ios11-iphone\"\n
Tap and hold to view everything you can do to a given file.
\n

\n

iOS 13 also lets users perform many more actions on files than ever before by tapping and holding on an icon to reveal a contextual menu. Among the actions found here are options to compress files into an archive, decompress zip files, edit tags, preview a file in Quick Look, and display an Info pane with detailed information about a file\u2019s attributes\u2014basically, the stuff you\u2019d expect from a file browser is mostly there. (It\u2019s a bit strange that you can\u2019t set items from Shortcuts to display directly in this contextual menu, as you can in the share sheets elsewhere on iOS 13. Instead, you have to tap and hold on a file, choose Share, and then pick a Shortcuts item.

\n

Files separates iOS storage into two buckets, On My iPad/iPhone and iCloud Drive. On My iPad is basically what you\u2019d consider \u201cthe hard drive\u201d on a Mac\u2014it\u2019s local storage that is not synced over the cloud. If you want to save a huge file on your iPad and not have it swamp your current connection in an attempt to sync all that data to the cloud, put it in On My iPad/iPhone. If you want it available everywhere, put it in iCloud Drive.

\n

Alas, not all is sunshine and roses in the land of iOS file access. Files is still a remarkably immature app. It sometimes fails to update file listings, frequently stalls out and provides me with a blank or incomplete listing, and, most frustratingly, the Save to Files extension for third-party apps fails to provide any feedback about the progress of a file transfer. That unreliability, combined with a slow file transfer to a remote server, leads to some pretty uncomfortable moments when you have no idea if your file is going to arrive or if the whole thing has failed silently.

\n

Apple\u2019s taken a few cues from the Mac in building up Files, so it\u2019s time to take a few more. Progress indicators are vital. Allowing the user to get a detailed view about what\u2019s transferring and how long it will take are must-have features, but when I try to save items within third-party apps, all I get is an endless spinner with no feedback. I realize this isn\u2019t an issue with the Files app itself\u2014it does show a little circular upload/download progress bar\u2014but it is an issue with Apple\u2019s greater approach to file transfers.

\n

Still, Files has come a long way. It has gone from being an iCloud Drive client app to a neither-fish-nor-fowl representation of Apple\u2019s ambivalence to file management on iOS to what it is today\u2014a pretty capable file browser that\u2019s still got plenty of room for improvement. Files in iOS 13 is a major upgrade\u2014I just hope Apple doesn\u2019t consider the job done.

" }, "alternate": [ { "href": "https://sixcolors.com/post/2019/10/13-features-of-ios-13-files-improvements/", "type": "text/html" } ], "crawled": 1569955568802, "title": "13 Features of iOS 13: Files improvements", "published": 1569952320000, "origin": { "streamId": "feed/http://feedpress.me/sixcolors", "htmlUrl": "https://www.sixcolors.com/", "title": "Six Colors" }, "unread": false, "readTime": 4981, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572579193115 }, { "originId": "tag:daringfireball.net,2019://1.36188", "fingerprint": "ae19d945", "id": "ZTHt7g74IlVC5A2IgEvcn/aop5teo99gzFaGU2TCGxs=_16e052937dc:173f1:d4506071", "updated": 1572042321000, "author": "John Gruber", "summary": { "direction": "ltr", "content": "What\u2019s the point of having only two buttons and all that unused whitespace on the left side?" }, "alternate": [ { "href": "https://daringfireball.net/2019/10/mails_message_action_toolbar_in_ios_13", "type": "text/html" } ], "crawled": 1572044617692, "title": "\u2605 The Curious Design of Mail\u2019s Message Action Toolbar in iOS 13", "published": 1572042320000, "origin": { "streamId": "feed/http://daringfireball.net/index.xml", "htmlUrl": "https://daringfireball.net/", "title": "Daring Fireball" }, "content": { "direction": "ltr", "content": "

David Ingram, writing for NBC News:

\n
\n

Shannon Watts always replied to emails the same way: by touching\nthe reply icon, tucked in a familiar spot near the bottom right\ncorner of her iPhone. Then, one day a few weeks ago, the icon\nwasn\u2019t there\u2009\u2014\u2009and neither was the email. It was deleted by\naccident.

\n

It\u2019s happened dozens of times since, frustrating Watts and many\nother iPhone users who\u2019ve been tripped up by a minor change rolled\nout last month by Apple, a company renowned for its\nforward-thinking design.

\n

In the newest version of the iPhone email app, the trash icon is\nnow where the reply icon used to be. And they\u2019re too close\ntogether for some people.

\n
\n

The change is perfectly illustrated and summarized in this tweet by Craig Hockenberry:

\n
\n

Muscle memory is a bitch.

\n

\n
\n

Things worth noting:

\n\n

The new toolbar in iOS 13 Mail is just strange. The old toolbar had discrete buttons for Flag, Move, Trash/Archive, Reply, and New Message. Now it\u2019s just Trash and Reply, with all of the other functionality stashed in the new Reply action sheet, pictured here half-height and full-height. That new \u201cReply\u201d action sheet is really a \u201cDo Something With This Message\u201d sheet\u2009\u2014\u2009I\u2019m not sure what the icon for this should be, but the Reply icon seems like an odd choice. I know a few people who assumed that iOS 13 removed the ability to move messages to other mailboxes because the folder button was removed from the toolbar. They\u2009\u2014\u2009reasonably!\u2009\u2014\u2009never thought to look for it by tapping what clearly looks like the old familiar Reply icon.

\n

The Print command has long been stashed in the Reply action sheet\u2009\u2014\u2009so arguably it\u2019s always been more of a \u201cDo Something With This Message\u201d button than just a \u201cReply or Forward\u201d button. But the iOS 13 Mail toolbar takes this to an extreme. It\u2019s one thing to put new features (for which there\u2019s no room on the toolbar) in the Reply action sheet; it\u2019s another to move commands like Flag and Move that already had positions on the toolbar.

\n

I like the new \u201cDo Something With This Message\u201d action sheet in and of itself a lot\u2009\u2014\u2009it\u2019s an interesting design to fit more functionality in the limited screen real estate of the iPhone. There are a lot of apps that have run out of space in their toolbars that could borrow from this design. I particularly like that in the new action sheet, all the actions are labeled with words in addition to icons. But iOS 13 should have included a first-run explainer showing users where these features moved to.

\n

And it just seems odd to me that they moved all these features there in the first place. The iPhone really only has room for five toolbar buttons. Flag, Move, Trash, Reply, and New Message seemed like good ones. What\u2019s the point of having only two buttons and all that unused whitespace on the left side? In addition to the fact that it\u2019s not intuitive to look for Flag and Move commands behind a button that clearly looks like \u201cReply\u201d, it\u2019s also a bit frustrating to me that there\u2019s no longer a way to just create a new message from this screen\u2009\u2014\u2009you have to go back one level in the navigation controller to the list of messages to create a new (non-reply) message.

\n

At the very least, if the toolbar is only going to have these two buttons, why not place the Trash button on the far left, and put the whitespace between the two buttons? That would eliminate inadvertent taps on the Trash button from either pre-iOS 13 muscle memory or from proximity to the Reply button.

" }, "visual": { "url": "http://b.vimeocdn.com/ts/451/794/451794956_1280.jpg", "width": 1280, "height": 720, "contentType": "image/jpeg" }, "unread": false, "readTime": 3129, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572579174490 }, { "originId": "tag:daringfireball.net,2019:/linked//6.36197", "recrawled": 1572296763725, "updateCount": 1, "fingerprint": "298625a9", "id": "ZTHt7g74IlVC5A2IgEvcn/aop5teo99gzFaGU2TCGxs=_16e13f9b1a7:19a2c:d4506071", "updated": 1572296240000, "author": "John Gruber", "alternate": [ { "href": "https://www.apple.com/airpods-pro/", "type": "text/html" } ], "crawled": 1572293161383, "title": "Apple\u2019s AirPods Pro Web Page: Scrolljacking Hell", "published": 1572289670000, "origin": { "streamId": "feed/http://daringfireball.net/index.xml", "htmlUrl": "https://daringfireball.net/", "title": "Daring Fireball" }, "content": { "direction": "ltr", "content": "

The AirPods Pro \u201coverview\u201d web page is a strange beast. It pegs my 2015 MacBook Pro\u2019s CPU\u2009\u2014\u2009even when I\u2019m not scrolling. I closed the tab a few minutes ago and my fan is still running. The animation is very jerky and scrolling feels so slow. There\u2019s so much scrolljacking that you have to scroll or page down several times just to go to the next section of the page. The animation is at least smooth on my iPad and iPhone, but even there, it feels like a thousand swipes to get to the bottom of the page. It\u2019s a design that makes it feel like they don\u2019t want you to keep reading.

\n

Disable JavaScript (easily toggled if you enable Safari\u2019s Develop menu) and the page is easy to read and looks great. I can\u2019t recall an example where scrolljacking makes a website so much worse.

\n

Update: Nick Heer (of Pixel Envy fame) messaged me to point out that the iPad Pro product page gives the AirPods Pro page a run for its money for top spot in the Scrolljacking Hall of Shame. The iPad Pro page doesn\u2019t peg my MacBook Pro\u2019s CPU, but it scrolls the view horizontally while you scroll vertically.

\n
\n\u00a0\u2605\u00a0\n
" }, "visual": { "url": "http://cdn1.sbnation.com/entry_photo_images/9188405/LG_G_Flex-3_large_verge_medium_landscape.jpg", "width": 640, "height": 426, "contentType": "image/jpg" }, "unread": false, "readTime": 6570, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572579162176 }, { "originId": "tag:daringfireball.net,2019:/linked//6.36201", "fingerprint": "dec1a24f", "id": "ZTHt7g74IlVC5A2IgEvcn/aop5teo99gzFaGU2TCGxs=_16e15437a6d:19e93:d4506071", "updated": 1572313520000, "author": "John Gruber", "alternate": [ { "href": "https://popular.info/p/facebook-allows-prominent-right-wing", "type": "text/html" } ], "crawled": 1572314774125, "title": "Facebook Allows Prominent Right-Wing Website to Break the Rules", "published": 1572313519000, "origin": { "streamId": "feed/http://daringfireball.net/index.xml", "htmlUrl": "https://daringfireball.net/", "title": "Daring Fireball" }, "content": { "direction": "ltr", "content": "

Judd Legum, writing for Popular Info:

\n
\n

The Daily Wire, the right-wing website founded by pundit Ben\nShapiro, is a cesspool of misogyny, bigotry, and misinformation.\nIts toxic content is also fantastically successful on Facebook,\nwith each story reaching more people than any other major media\noutlet. A Popular Information investigation reveals some of this\nsuccess is attributable to a clandestine network of 14 large\nFacebook pages that purport to be independent but exclusively\npromote content from The Daily Wire in a coordinated fashion.

\n

This kind of \u201cinauthentic coordinated behavior\u201d violates\nFacebook\u2019s rules. Facebook has taken down smaller and less\ncoordinated networks that promoted liberal content. But Facebook\ntold Popular Information that it will continue to allow this\nnetwork to operate and amplify The Daily Wire\u2019s content.

\n
\n

As a complete sidenote to the main point of this\u2009\u2014\u2009that Facebook is a right-wing company\u2009\u2014\u2009notice how nice and clean and fast the Popular Info website is. The best websites these days aren\u2019t from web publishers\u2009\u2014\u2009they\u2019re from mailing list publishers with websites.

\n
\n\u00a0\u2605\u00a0\n
" }, "unread": false, "readTime": 1124, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572579157406 }, { "originId": "tag:daringfireball.net,2019://1.36209", "recrawled": 1572448047706, "updateCount": 2, "fingerprint": "3576a6cd", "id": "ZTHt7g74IlVC5A2IgEvcn/aop5teo99gzFaGU2TCGxs=_16e1b466c6b:1b876:d4506071", "updated": 1572447167000, "author": "John Gruber", "summary": { "direction": "ltr", "content": "Apple invited a few dozen media folks to New York today for a briefing and early access to the new AirPods Pro. My initial impression: I like them." }, "alternate": [ { "href": "https://daringfireball.net/2019/10/airpods_pro_first_impressions", "type": "text/html" } ], "crawled": 1572415630443, "title": "\u2605 AirPods Pro First Impressions", "published": 1572407940000, "origin": { "streamId": "feed/http://daringfireball.net/index.xml", "htmlUrl": "https://daringfireball.net/", "title": "Daring Fireball" }, "content": { "direction": "ltr", "content": "

Apple invited a few dozen media folks to New York today for a briefing and early access to the new AirPods Pro. My initial impression: I like them.

\n

I left for home around 2:30 in the afternoon, and wore the AirPods Pro for the next three hours: on the subway in Manhattan, waiting (briefly, mercifully) in the cacophonous Penn Station, on the train ride home to Philadelphia, walking home through Center City Philadelphia, and then in my house. The subway, a train ride, and busy city streets are pretty good tests for noise cancellation.

\n

Noise cancellation worked really well for me. I own a pair of Bose over-the-ear noise canceling wireless headphones, but almost exclusively wear them only on airplanes and trains. Wearing noise-canceling earbuds on the subway and walking through the city is going to take some getting used to. It\u2019s so good you really do lose sense of your surrounding aural environment.

\n

I was a dummy and didn\u2019t take my Bose headphones on my trip today, so I can\u2019t say how they compare side-by-side on the train, but there\u2019s no question how AirPods Pro compare to regular AirPods. The difference is like night and day. Amtrak trains are pretty noisy\u2009\u2014\u2009especially at what we in the U.S. so adorably consider \u201chigh speeds\u201d\u2009\u2014\u2009but with AirPods Pro the clackety-clack rumble was effectively blocked out.

\n

The \u201cTransparency\u201d mode is interesting and a little mind-bending. It really does make it possible to conduct a conversation while still enjoying the benefits of noise cancellation. Because the silicone tips seal against your inner ear, when you turn AirPods Pro noise cancellation completely off, you really can\u2019t hear much around you. They\u2019re like earplugs. Transparency lets you hear parts of the world around you. One obvious use case for this: jogging or running and maybe just plain walking on streets where you want to hear the sounds of traffic.

\n

My corner store has a noisy refrigeration unit. With AirPods Pro on\u2009\u2014\u2009playing nothing\u2009\u2014\u2009I couldn\u2019t hear it at all. I couldn\u2019t tell that my dishwasher was running even though I was sitting right across from it in my kitchen. As someone who doesn\u2019t generally write while listening to music, I\u2019m likely to use AirPods Pro, playing nothing, just to tune out the world around me in a noisy space.

\n

The force sensor\u2009\u2014\u2009the flat section on the earbuds stem that faces forward when in your ear\u2009\u2014\u2009is effectively a button. But it\u2019s not a button. It doesn\u2019t actually move, and it doesn\u2019t provide haptic feedback. But it acts like a button and\u2009\u2014\u2009most importantly\u2009\u2014\u2009sounds like a button. When you press it, the AirPod Pro plays a click. I use the singular AirPod there because the click only plays in the bud whose force sensor you pressed. The effect is uncannily like clicking a real button. In a similar way to how force touch trackpads on modern MacBooks and Touch ID iPhone home buttons feel like they truly click, the AirPods Pro force sensors feel like actual clicking buttons. They actually have more of a premium clicky feel than the truly clicking buttons on Apple\u2019s wired EarPods, even though they don\u2019t actually click. It\u2019s uncanny, and Apple at its best.

\n

Another nice Apple-at-its-best touch: in Control Center on iOS, you can long-press the volume control while wearing AirPods Pro to get a nice little three-way selector to choose between noise cancellation, off, and transparency. The selection indicator animates nicely, the sounds are delightful (although you can\u2019t hear them in the movie linked above), and you can change the setting both by tapping another option or by dragging the selection indicator. It\u2019s a simple little interaction done exquisitely well.

\n

Force sensor actions:

\n\n

By default, press-and-hold toggles between regular noise cancellation and transparency modes. That means, by default, the only way to invoke Siri is through the \u201cHey Siri\u201d verbal command. But if you want to invoke Siri through a long-press, you can change that in the Bluetooth section of Settings on your iPhone or iPad. And, you can change it per-ear\u2009\u2014\u2009so you can have your left AirPod Pro toggle transparency and the right one invoke Siri.

\n

Also in the Bluetooth settings is the Ear Tip Fit Test. It\u2019s very easy. Put the AirPods Pro in your ears, and start the test. It plays a song for about five seconds and decides whether you have a good fit with the current size tips. There\u2019s nothing \u201csmart\u201d about the silicone tips themselves\u2009\u2014\u2009the AirPods Pro don\u2019t \u201cknow\u201d which size tips you\u2019re currently wearing. The Fit Test just tells you if the current ones in your ear are a good fit. For me, the default medium tips feel best and the Ear Tip Fit Test consistently agrees. For my son, the medium tips felt uncomfortable, and the Fit Test agreed they weren\u2019t a good fit. For him, the small tips felt better and the Fit Test agreed. According to Apple, many people have differently-shaped ears and might need a different tip size for each ear, and if that\u2019s the case the Fit Test will suggest it.

\n

Swapping the tips is easy, but it takes a bit more pull than I expected to pop them off. Don\u2019t be afraid\u2009\u2014\u2009the tips seem rugged. And replacement tips from Apple will cost only $4\u2009\u2014\u2009truly cheap.

\n

The AirPods Pro case is about 15% larger by volume than the regular AirPods case. That\u2019s unfortunate, but it\u2019s not noticeable in a regular pants pocket, and it still fits in the fifth pocket of a pair of Levi\u2019s 501 jeans.

\n

Battery life, so far, is exactly in line with Apple\u2019s stated specs. My review unit started at 75% (both the buds and the case). After three straight hours of use, the buds were down to about 10%. So if three hours of use consumed two-thirds of the battery, a full charge should last about 4.5 hours\u2009\u2014\u2009which is exactly Apple\u2019s claim.

\n

Comfort-wise, my ears felt fine after those three consecutive hours of use. It\u2019s a very different feeling compared to regular AirPods, but I like it. I\u2019ve never had a problem with regular AirPods falling out of my ears, but AirPods Pro feel way more secure. Without question, how they feel is subjective\u2009\u2014\u2009so the good news is you can request a try-on in any Apple Store.

" }, "visual": { "url": "http://cdn1.sbnation.com/entry_photo_images/9188405/LG_G_Flex-3_large_verge_medium_landscape.jpg", "width": 640, "height": 426, "contentType": "image/jpg" }, "unread": false, "readTime": 4178, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572579133239 }, { "originId": "tag:blogger.com,1999:blog-8954608646904080796.post-8772112161384908748", "fingerprint": "80075e70", "thumbnail": [ { "url": "https://1.bp.blogspot.com/-pMon836tLyo/XatsZ0Tv9MI/AAAAAAAADTs/90dBB5-ohkk2yOW4--zh7M0p_JicFuC4QCLcBGAsYHQ/s72-c/017.jpg", "width": 72, "height": 72 } ], "id": "v0v+7Ya8tssIZvd3/pcnFRr3HwvY/5YK3FGc2t65c0Y=_16de5ccc6bb:ffbc:d4506071", "updated": 1571515782582, "author": "Edward Feser", "alternate": [ { "href": "http://edwardfeser.blogspot.com/2019/10/masculinity-and-marvel-movies.html", "type": "text/html" } ], "crawled": 1571518465723, "title": "Masculinity and the Marvel movies", "published": 1571515740000, "origin": { "streamId": "feed/http://edwardfeser.blogspot.com/feeds/posts/default", "htmlUrl": "http://edwardfeser.blogspot.com/", "title": "Edward Feser" }, "content": { "direction": "ltr", "content": "
Some time back, John Haldane gave a Thomistic Institute talk here in Los Angeles on the theme of evil in the movies and in the movie industry.\u00a0 During the Q and A (at about the 40 minute mark, and again after the 1:16 mark) the subject of superhero movies came up, and Haldane was critical of their current prevalence.\u00a0 In developing this criticism, he draws a useful distinction between fantasyand imagination.
\u00a0
Imagination, as Haldane uses the term, is a way of exploring aspects of reality and possibilities that are grounded in reality, even though it makes use of scenarios that are fictional or even impossible.\u00a0 Imagination is healthy and can increase our understanding of the moral and social worlds.\u00a0 Fantasy, by contrast, is unanchored in reality, and indeed it reflects a flight from reality and the discipline it imposes and responsibility that it entails.\u00a0 Haldane gives as an example the movie Pretty Woman, an absurdly unrealistic portrayal of prostitution and human relationships.

Fantasy can be harmless in small doses, Haldane allows, but when a culture becomes dominated by it, that is a sign that it has become decadent and unwilling to face reality.\u00a0 And the prevalence of superhero movies, Haldane says, is an indication that American society is increasingly retreating into fantasy and away from reality.\u00a0 He rejects the suggestion that such movies can be compared to the myths of the gods in ancient cultures.\u00a0 Such myths, he says, are essentially exercises in imagination, whereas superhero movies are sheer fantasy.

I think there is some truth to this analysis, but only some.\u00a0 Some superhero movies are indeed exercises in fantasy, but some are, in my view, clearly exercises in imagination.\u00a0

Not long after hearing Haldane\u2019s talk, I happened to come across a 1978 television interview with the late Harlan Ellison during which (beginning just before the 5 minute mark) Ellison criticizes the movies Close Encounters of the Third Kind and Star Wars, and modern American society in general, on exactly the same grounds raised by Haldane.\u00a0 He doesn\u2019t use Haldane\u2019s terminology, and in fact partially inverts it.\u00a0 Ellison uses \u201cfantasy\u201d to mean what Haldane means by \u201cimagination,\u201d and he uses the expression \u201cspace opera\u201d to refer to one type of what Haldane calls \u201cfantasy.\u201d\u00a0 But in substance, the distinction and the sort of points Haldane and Ellison are making are identical.

(Side note: Remember when you could find extended intelligent discussion like this on television?\u00a0 Remember when you could casually smoke on television, as Ellison does during the interview?\u00a0 Remember Laraine Newman, another guest on the show who also contributes to the discussion?)

Interestingly, though, Ellison was also well-known to be an enthusiast for comics, including superhero comics, and even wrote them from time to time (though this doesn\u2019t come up in the interview).\u00a0 I don\u2019t think there is any inconsistency there.

Suppose that, like me and like Haldane (though unlike Ellison) you are a conservative Catholic.\u00a0 Then, I would suggest, it is easy to see that there are themes in many superhero movies, and especially in the Avengers series that is currently the most popular of all, that are clearly reflections of imagination rather than fantasy.

Take the characters who, in the Avengers movies as in the comics, have been regarded as \u201cthe Big Three\u201d: Captain America, Thor, and Iron Man.\u00a0 Captain America represents patriotism, the military virtues, the earnest decency of the common man, and in general a Norman Rockwell style nostalgia for a simpler time.\u00a0 Thor \u2013 as part of the Asgardian pantheon ruled by stern Odin, to whom he must prove his worthiness \u2013 represents the higher realm spoken of by religion, and our obligations to the divine patriarchal authority who governs it.\u00a0 Iron Man is a business magnate who represents confident masculinity, superior ability and great wealth, and the noblesse obligeand rebuke to egalitarianism implied by them.\u00a0 These are deeply conservative themes, and it is astounding that these characters are as popular as they are in a society increasingly suffocated by political correctness.

Or maybe not.\u00a0 For such themes have appeal because they reflect human nature, and human nature does not change however much we try to paper over it with ideology and propaganda, and however corrupt human behavior and human societies become as a result.\u00a0 People will yearn in at least an inchoate way for the traditional institutions and ideals without which they cannot fulfill their nature, even when they are told they ought not to and have halfway convinced themselves that they ought not to.

I would suggest that the Marvel movies have the appeal they do at least in part precisely because they both convey these traditional ideals, but do so in a way that is fantastic enough that the offense to political correctness is not blatant.\u00a0 A film series whose heroes are a square patriotic soldier, the son of a heavenly Father come to earth, and a strutting capitalist alpha male sounds like something tailor-made for a Red State audience, and the last thing that would attract A-list actors and billions in investment from a major studio.\u00a0 Put these characters in colorful costumes, scenarios drawn from science fiction, and a little PC window dressing (such as portraying their girlfriends as a soldier, a scientist, and a businesswoman, respectively), and suddenly even a Blue State crowd can get on board.

Now, there are no traditional ideals more battered in contemporary Western society than masculinity, and the paternal role that is the fulfilment of masculinity.\u00a0 But these are precisely the key themes of many of the Marvel movies.\u00a0 The longing for a lost father or father figure is the core of all of the Spider-Man movies, as I noted in a post from a few years back.\u00a0 (In the Spider-Man movies that have appeared since that post was written, Tony Stark has become the father figure whose instruction and example Peter Parker strives to live up to.)\u00a0 The theme is also central to the Guardians of the Galaxy series, to Black Panther, to the Daredevil movie and Netflix series, and to the Luke Cage and Iron Fist Netflix series.\u00a0 The Thormovies are largely about the conflicted relationships Thor and Loki have with their father Odin, whose approval each of them nevertheless seeks.\u00a0 The bad consequences of rebellion against a father or father figure is the theme of the original Spider-Man series (wherein Peter initially refuses to heed his Uncle Ben\u2019s admonitions), of the first Thormovie, and of Avengers: Age of Ultron(whose wayward son is the robotic Ultron, at odds with his \u201cfather\u201d Stark).

The Hulk movies are largely about the consequences of failure as a father (whether Bruce Banner\u2019s father in the original Hulk movie, or Betty Ross\u2019s father in The Incredible Hulk).\u00a0 Ant-Manis essentially about two men (Scott Lang and Hank Pym) who have partially failed as fathers and are trying to make up for it.\u00a0 The Punisher Netflix series is essentially about a husband and father seeking vengeance for the family that was taken from him.

But it is the two stars of the Marvel movies \u2013 Tony Stark/Iron Man and Steve Rogers/Captain America \u2013 who are the most obvious examples of idealized masculinity.\u00a0 And their character arcs through the series are about realizing that ideal.\u00a0 Each of them starts out as an imperfect specimen of the masculine ideal, albeit in very different ways.\u00a0 With Stark it is a vice of deficiency and with Rogers it is a vice of excess.\u00a0 But by the end of their arcs, in Avengers: Endgame, each achieves the right balance.\u00a0 (It might seem odd to think of Rogersrather than Stark as the one prone to a kind of excess.\u00a0 Bear with me and you\u2019ll see what I mean.)

On the traditional understanding of masculinity, a man\u2019s life\u2019s work has a twofold purpose.\u00a0 First, it is ordered toward providing for his wife and children.\u00a0 Second, it contributes something distinctive and necessary to the larger social order of which he and his family are parts.\u00a0 Society needs farmers, butchers, tailors, manual laborers, soldiers, scholars, doctors, lawyers, etc. and a man finds purpose both by being a husband and father and by filling one of these social roles.\u00a0 Though the traditional view regards women as \u201cthe weaker sex\u201d and as less assertive than men, it understands a man\u2019s worth and nobility in terms of the extent to which his strength and assertiveness are directed toward the service of others.

Liberal individualism, both in its libertarian form and its egalitarian form, replaced this social and other-directed model of a man\u2019s life\u2019s work with an individualist and careerist model, on which work is essentially about self-expression and self-fulfillment \u2013 making one\u2019s mark in the world, gaining its attention and adulation, attaining fame, power and influence, and so forth. \u00a0Nor is it even about providing for wife and children, since sex and romance too came to be regarded as a means of self-fulfillment rather than the creation of the fundamental social unit, the family.\u00a0 (Feminism took this corrupted individualist understanding of the meaning of a man\u2019s work and relationships and, rather than critiquing it, urged women to ape it as well.)

In the first two Iron Man movies, Stark is initially a specimen of this individualist mentality.\u00a0 His work is oriented toward attaining wealth, fame, and power.\u00a0 He uses women as playthings.\u00a0 He has a conflicted relationship with his late father, and is contemptuous of authority in general.\u00a0 He is judged by SHIELD to be \u201cvolatile, self-obsessed, and [unable to] play well with others.\u201d\u00a0 But he is gradually chastened by the consequences of his hubris \u2013 by being captured and injured in the first Iron Man movie; by being forced to face up to the limitations on his power to stop an alien invasion like the one that occurred in Avengers; and by the miscalculation that led to Ultron\u2019s rebellion and the many deaths it caused.\u00a0 By Captain America: Civil War, Stark is humbled enough to accept government oversight, and being left defeated and near-dead by Thanos in Avengers: Infinity War completes his chastening.\u00a0

By Avengers: Endgame Stark has become a family man.\u00a0 \u00a0By way of time travel, he makes peace of a sort with his father.\u00a0 In the first Avengers movie, he had casually dismissed Rogers\u2019 talk of the need for self-sacrifice with the confidence that an alternative solution would always be possible for a clever person like himself.\u00a0 By contrast, in Endgame, he sees that he needs to lay down his life in order to save his wife and daughter and the world in general, and he willingly does it.\u00a0 To be sure, he is in no way neutered. \u00a0He retains his masculine assertiveness, strength, and self-confidence.\u00a0 But they are now directed toward the service of something larger than himself.

Rogers, by contrast, is from the first Captain America movie onward driven by a sense of duty to his country and to the social order more generally, and is willing to sacrifice everything for it, including even his own happiness and indeed his own life.\u00a0 He is also a perfect gentleman, and his only interest where women are concerned is with the one he would like to marry and settle down with if only he had the chance.\u00a0 Like Stark, he is relentlessly assertive, confident, and competent, but unlike Stark these traits are from the start directed toward the service of a larger good.\u00a0

Rogers\u2019 flaw is that he is if anything a bit tooabsorbed in this larger good.\u00a0 At least initially, he is too much the man of action and the good soldier, with all the virtues but also with the flaws that that entails.\u00a0 He is a little too deferential to authority.\u00a0 In the first Avengers movie he glibly asserts: \u201cWe have orders.\u00a0 We should follow them\u201d \u2013 only to find out that perhaps he should have questioned them.\u00a0 The way institutions and authorities can become corrupted is impressed upon him far more dramatically in Captain America: Winder Soldier, to the point that in Civil War it is Rogers who is urging Stark to be more skeptical of authority.\u00a0

In general, Rogers\u2019 optimistic \u201ccan do\u201d spirit sometimes borders on na\u00efvet\u00e9, and it takes the catastrophe of Infinity War to teach him that the good guys don\u2019t always win and that some problems can only be managed or mitigated rather than solved.\u00a0 For much of the series, Rogers also has little life outside some military or quasi-military organization \u2013 the army, SHIELD, the Avengers.\u00a0 Without a war to fight, he doesn\u2019t know what to do with himself.\u00a0 He is square, prone to speechifying, and awkward with women \u2013 in Winter Soldier proclaiming himself \u201ctoo busy\u201d for romance, preferring to lose himself in one mission after the other.\u00a0 Only after near-death and victory in a \u201cmother of all battles\u201d in Endgamedoes he become convinced that he has the right to retire and \u201ctry some of that life Tony was telling me to get\u201d \u2013 traveling back in time to marry the woman he thought he\u2019d lost forever.\u00a0

The theme of the parallels and differences between the two characters provides a backbone to the Marvel movies.\u00a0 Both Stark and Rogers are supremely confident and competent.\u00a0 They are both natural leaders.\u00a0 Each stubbornly insists on pursuing the course he is convinced is the correct one.\u00a0 They are too similar in these respects \u2013 though also too different in the other ways just described \u2013 to like each other much at first.\u00a0 The world is not big enough for both egos.\u00a0 They learn to like and respect each other only gradually, through many ups and downs.

Hence, in the first Avengers movie, Stark is jealous of the admiration that his father had had for Rogers, and Rogers is amazed that Howard Stark could have had a son as frivolous and unworthy as Tony.\u00a0 By Civil War, Rogers ends up having to defend the man who had (under mind control) murdered Howard \u2013 defending him from Tony, who seeks to avenge his father and now (temporarily) judges Rogers unworthy of his father\u2019s admiration.\u00a0 Stark starts out arrogantly rejecting any government control over his activity as Iron Man, only to insist on government control in Civil War.\u00a0 Rogers starts out dutifully following orders in the first Captain America and Avengers movies, only stubbornly to reject government control over the team in Civil War.\u00a0 In Age of Ultron, Rogers criticizes Stark for acting independently of the team, and in Civil War, Stark criticizes Rogers for acting independently of the team.\u00a0 Rogers feels guilt for failing to prevent the death of Bucky, his comrade-in-arms.\u00a0 Stark feels guilt for failing to prevent the death of Peter Parker, to whom he has become a father figure.\u00a0 Rogers lays down his life in the first Captain America movie, only to get it back.\u00a0 Stark preserves his life against all odds throughout the whole series, only to lay it down in the last Avengers movie.\u00a0

I submit that its complex portrayal of these competing models of masculinity is part of what makes the Marvel series of movies a genuine exercise in imagination rather than fantasy, in Haldane\u2019s sense of the terms.\u00a0

One wonders, however, whether this will last.\u00a0 A few years ago, Marvel\u2019s comics division notoriously reoriented their titles to reflect greater \u201cdiversity\u201d and political correctness \u2013 an experiment that critics labeled \u201cSJW Marvel\u201d and that resulted in a dramatic decline in sales.\u00a0 The trend has been partially reversed and did not at the time affect the movies, where much more money is at stake.\u00a0 But there are signs that a milder form of the \u201cSJW Marvel\u201d approach will make its way into the Marvel Cinematic Universe in the next phase of movies.\u00a0

For example, the title character of Captain Marvelis portrayed with little emotion, no love interest, and lacking any of the femininity, vulnerability, and complexity of characters like Scarlett Johannsen\u2019s Black Widow or Elizabeth Olsen\u2019s Scarlet Witch.\u00a0 As Kyle Smith noted in National Review, Brie Larson portrays her instead as \u201cfiercer than fierce, braver than brave\u2026 insouciant, kicking butt, delivering her lines in an I-got-this monotone\u2026 amazingly strong and resilient at the beginning, middle, and end. \u00a0This isn\u2019t an arc, it\u2019s a straight line.\u201d\u00a0 Into the bargain, this C-list character, dropped into the Marvel Cinematic Universe out of nowhere, is suddenly proclaimed \u201cthe most powerful character\u201d in that universe.

In short, Captain Marvel is transparently an exercise in feminist wish fulfilment.\u00a0 More to the present point, it is sheer fantasy in Haldane\u2019s sense, rather than imagination \u2013 a portrayal of the way a certain mindset wishes the world to be, rather than a fanciful representation of the way it really is.\u00a0 And, as Smith points out, its title character is for that reason completely boring.\u00a0 (Contrast this with Marvel\u2019s Netflix series Jessica Jones, which \u2013 despite its own feminist undercurrents \u2013 is not boring, and whose female characters are well-rounded and interesting.)\u00a0

If future Marvel movies follow in this identity politics oriented direction, they will in fact become what Haldane (in my view mistakenly) thinks they already are.

Further reading:

Pop culture roundup
" }, "unread": true, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/7badfd54-6d65-421b-9a23-93dec726a308", "label": "Test for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/fbdcd69b-7e27-4b6a-bfed-6584b944155d", "label": "\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578985412 }, { "originId": "tag:blogger.com,1999:blog-8954608646904080796.post-8613145924738251081", "fingerprint": "473d1ae4", "thumbnail": [ { "url": "https://1.bp.blogspot.com/-P_7aCRZVVKo/XbollnDDTuI/AAAAAAAADUU/y6TgUEudc0EU89QnGt1IxZ1Frdro3GwVQCLcBGAsYHQ/s72-c/047.jpg", "width": 72, "height": 72 } ], "id": "v0v+7Ya8tssIZvd3/pcnFRr3HwvY/5YK3FGc2t65c0Y=_16e1f35113f:1cfaa:d4506071", "updated": 1572480433981, "author": "Edward Feser", "alternate": [ { "href": "http://edwardfeser.blogspot.com/2019/10/new-from-editiones-scholasticae.html", "type": "text/html" } ], "crawled": 1572481601855, "title": "New from Editiones Scholasticae", "published": 1572480420000, "origin": { "streamId": "feed/http://edwardfeser.blogspot.com/feeds/posts/default", "htmlUrl": "http://edwardfeser.blogspot.com/", "title": "Edward Feser" }, "content": { "direction": "ltr", "content": "
Editiones Scholasticae, the publisher of my books Scholastic Metaphysics and Aristotle\u2019s Revenge, informs me that both of them will within a few days be available in eBook versions.\u00a0 Also new from the publisher is a German translation of my book Philosophy of Mind. \u00a0(Previously they had published German translations of The Last Superstition and Five Proofs of the Existence of God.) \u00a0Take a look at Editiones Scholasticae\u2019s new webpage for further information, as well as for information about other new releases from the publisher.\u00a0 You will find both new works by contemporary writers in the Scholastic tradition, and reprints of older and long out of print works in that tradition.\u00a0 (The original webpage is still online as well.)
" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/qEtBNTmNKQvUro7McqHPXL-2OOM=/0x0:6720x4480/1310x873/cdn.vox-cdn.com/uploads/chorus_image/image/59664621/marshall_majorIII_aniconinthemaking_product_rgb_highres_2.0.jpg", "width": 1310, "height": 878, "contentType": "image/jpeg" }, "unread": false, "readTime": 2725, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/7badfd54-6d65-421b-9a23-93dec726a308", "label": "Test for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/fbdcd69b-7e27-4b6a-bfed-6584b944155d", "label": "\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.unsaved", "label": "Unsaved" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578978618 }, { "keywords": [ "Apple", "Business" ], "originId": "http://www.loopinsight.com/?p=100501", "fingerprint": "5554fc75", "id": "A4VVV8iwf2HD21qpAa7ABDI8MY8lm8dIbsVbE6sVKNA=_16e226a819a:1e01f:d4506071", "author": "Dave Mark", "summary": { "direction": "ltr", "content": "Kif Leswing, CNBC:\n
\nUnder the argument for an iPhone subscription, which some people call Apple Prime after the Amazon program of the same name, Apple would bundle hardware upgrades with services like iCloud storage or Apple TV+ content and hardware for a single monthly fee. This would let it switch iPhone sales from a transactional model to a subscription model, potentially driving the stock price up without having to increase product sales or prices dramatically.\n
\nAnd:\n
\n\u2033In terms of hardware as a service or as a bundle, if you will, there are customers today that essentially view the hardware like that because they\u2019re on upgrade plans and so forth,\u201d Cook said during an earnings call. \u201cSo to some degree that exists today.\u201d\n
\nAnd, most importantly:\n
\n\u201cMy perspective is that will grow in the future to larger numbers. It will grow disproportionately\u201d\n
\nI had the chance to be on John Gruber's show (recorded yesterday, guessing it'll drop today or tomorrow, assuming John is not too horrified with the results), and we were talking about this, peripherally. John mentioned the future possibility of Apple Prime, a concept similar to Amazon Prime. From the article:\n
\nUnder the argument for an iPhone subscription, which some people call Apple Prime after the Amazon program of the same name, Apple would bundle hardware upgrades with services like iCloud storage or Apple TV+ content and hardware for a single monthly fee.\n
\nI suspect we'll all eventually be subscribing from a menu of services, including column A, software, column B, traditional services, and column C, hardware. Intriguing.\u221e Read this on The Loop" }, "alternate": [ { "href": "https://www.cnbc.com/2019/10/30/apple-lays-groundwork-for-iphone-or-apple-prime-subscription.html", "type": "text/html" } ], "crawled": 1572535435674, "title": "Apple is laying the groundwork for an iPhone subscription", "published": 1572532001000, "origin": { "streamId": "feed/http://www.loopinsight.com/feed/", "htmlUrl": "https://www.loopinsight.com", "title": "The Loop" }, "content": { "direction": "ltr", "content": "

Kif Leswing, CNBC:

\n
\n

Under the argument for an iPhone subscription, which some people call Apple Prime after the Amazon program of the same name, Apple would bundle hardware upgrades with services like iCloud storage or Apple TV+ content and hardware for a single monthly fee. This would let it switch iPhone sales from a transactional model to a subscription model, potentially driving the stock price up without having to increase product sales or prices dramatically.

\n
\n

And:

\n
\n

\u2033In terms of hardware as a service or as a bundle, if you will, there are customers today that essentially view the hardware like that because they\u2019re on upgrade plans and so forth,\u201d Cook said during an earnings call. \u201cSo to some degree that exists today.\u201d

\n
\n

And, most importantly:

\n
\n

\u201cMy perspective is that will grow in the future to larger numbers. It will grow disproportionately\u201d

\n
\n

I had the chance to be on John Gruber\u2019s show (recorded yesterday, guessing it\u2019ll drop today or tomorrow, assuming John is not too horrified with the results), and we were talking about this, peripherally. John mentioned the future possibility of Apple Prime, a concept similar to Amazon Prime. From the article:

\n
\n

Under the argument for an iPhone subscription, which some people call Apple Prime after the Amazon program of the same name, Apple would bundle hardware upgrades with services like iCloud storage or Apple TV+ content and hardware for a single monthly fee.

\n
\n

I suspect we\u2019ll all eventually be subscribing from a menu of services, including column A, software, column B, traditional services, and column C, hardware. Intriguing.

\n

\u221e Read this on The Loop

" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/fhKs50EFS0SJPjSjfCR7lXwcMfs=/0x0:2040x1360/1310x873/cdn.vox-cdn.com/uploads/chorus_image/image/59667903/acastro_180508_1777_google_IO_0002.0.jpg", "width": 1310, "height": 873, "contentType": "image/jpeg" }, "unread": false, "readTime": 20737, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578952687 }, { "keywords": [ "Apple" ], "originId": "https://9to5mac.com/?p=617610", "fingerprint": "48affe9c", "id": "BmoAzSEWHFzR01wyxBZAhNEo11Vy8oDR1qKDe+tKVEQ=_16e1de23321:1c6e5:d4506071", "author": "Chance Miller", "summary": { "direction": "ltr", "content": "
\n

Microsoft is planning several updates to its Outlook app for iPhone and iPad. As explained by The Verge, Microsoft will roll out features such as iPad Split View, smart folders, and more to the Outlook app over the coming weeks.

\n

more\u2026

\n

The post Microsoft Outlook for iPhone and iPad adding Split View, Do Not Disturb, more appeared first on 9to5Mac.

" }, "alternate": [ { "href": "https://9to5mac.com/2019/10/30/microsoft-outlook-split-view-more/", "type": "text/html" } ], "crawled": 1572459393825, "title": "Microsoft Outlook for iPhone and iPad adding Split View, Do Not Disturb, more", "published": 1572458509000, "origin": { "streamId": "feed/http://9to5mac.com/feed/", "htmlUrl": "https://9to5mac.com", "title": "9to5Mac" }, "unread": false, "readTime": 13858, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578905515 }, { "keywords": [ "Miscellaneous" ], "originId": "https://nshipster.com/device-identifiers", "fingerprint": "5e66b947", "id": "08l+9ftpGejQ9f/2DZ6dom5rSnNJJO9OCox6I3nUnWg=_16e22ccc11a:1e495:d4506071", "updated": 1572505200000, "author": "Mattt", "summary": { "direction": "ltr", "content": "

For every era, there\u2019s a monster that embodies the anxieties of the age.

" }, "alternate": [ { "href": "https://nshipster.com/device-identifiers/", "type": "text/html" } ], "crawled": 1572541874458, "title": "Device Identifiers and Fingerprinting on iOS", "published": 1572505200000, "origin": { "streamId": "feed/http://nshipster.com/feed.xml", "htmlUrl": "https://nshipster.com/", "title": "NSHipster" }, "content": { "direction": "ltr", "content": "

For every era,\nthere\u2019s a monster that embodies the anxieties of the age.

\n

At the dawn of the Holocene,\nour ancestors traced the contours of shadows cast by the campfire\nas they kept watch over the darkness.\nOnce we learned to read the night sky for navigation,\nsailors swapped stories of sea creatures like\nLeviathan and\nSiren\nto describe the dangers of open ocean\n(and the perils to be found on unfamiliar shores).

\n

Frankenstein\u2019s monster\nwas as much the creation of Mary Shelley\nas it was a spiritual collaboration with\nLuigi Galvani.\nAnd Bram Stoker\u2019s\nfictionalized account of the mummy\u2019s curse\nwas more a response to the\nEgyptomania\nand European colonialism\nof the nineteenth century\nthan any personal account of the Middle Kingdom.

\n

More recently,\nthe \u201cmonster ruins a beach party\u201d\ntrope of the 1960s\narose from concerns of teenager morality.\nWhile the\nMartians\nwho invaded those same drive-in double features\nserved as a proxy for Cold War fears at the height of the\nSpace Race.

\n
\n

All of which begs the question:\n\u201cWhat monster best exemplifies our present age?\u201d

\n

Consider the unnamed monster from the film\nIt Follows:\na formless, supernatural being that relentlessly pursues its victims\nanywhere on the planet.

\n

Sounds a bit like the state of\nad tech\nin 2019, no?

\n\n
\n

This week on NSHipster \u2014\nin celebration of our favorite holiday\n\ud83c\udf83 \u2014\nwe\u2019re taking a look at the myriad ways that\nyou\u2019re being tracked on iOS,\nboth sanctioned and unsanctioned,\nhistorically and presently.\nSo gather around the campfire,\nand allow us to trace the contours of the unseen, formless monsters\nthat stalk us under cover of Dark Mode.

\n
\n

\nThe Cynicism of Marketing and Advertising Technology

\n

Contrary to our intuitions about natural selection in the marketplace,\nhistory is littered with examples of\ninferior-but-better-marketed products winning out over superior alternatives:\nVHS vs. Betamax,\nWindows vs. Macintosh,\netc.\n(According to the common wisdom of business folks, at least.)\nRegardless,\nmost companies reach a point where\n\u201cif you build it, they will come\u201d\nceases to be a politically viable strategy,\nand someone authorizes a marketing budget.

\n

Marketers are tasked with growing market share\nby identifying and communicating with as many potential customers as possible.\nAnd many \u2014\neither out of a genuine belief or formulated as a post hoc rationalization \u2014\ntake the potential benefit of their product\nas a license to flouting long-established customs of personal privacy.\nSo they enlist the help of one or more\nadvertising firms,\nwho promise to maximize their allocated budget and\nprovide some accountability for their spending\nby using technology to\ntarget,\ndeliver, and\nanalyze\nmessaging to consumers.

\n

Each of these tasks is predicated on a consistent identity,\nwhich is why advertisers go to such great lengths to track you.

\n\n

\nApple-Sanctioned Identifiers

\n

Apple\u2019s provided various APIS to facilitate user identification\nfor various purposes:

\n

\nUniversal Identifiers (UDID)

\n

In the early days of iOS,\nApple provided a uniqueIdentifier property on UIDevice \u2014\naffectionately referred to as a\nUDID\n(not to be confused with a UUID).\nAlthough such functionality seems unthinkable today,\nthat property existed until iOS 5,\nuntil it was\ndeprecated and replaced by identifierForVendor in iOS 6.

\n

\nVendor Identifiers (IDFV)

\n

Starting in iOS 6,\ndevelopers can use the\nidentifierForVendor property on UIDevice\nto generate a unique identifier that\u2019s shared across apps and extensions\ncreated by the same vendor\n(IDFV).

\n
import UIKit\n        let idfv = UIDevice.current.identifierForVendor // BD43813E-CFC5-4EEB-ABE2-94562A6E76CA\n        
\n\n

\nAdvertising Identifiers (IDFA)

\n

Along with identifierForVendor came the introduction of a new\nAdSupport framework,\nwhich Apple created to help distinguish\nidentification necessary for app functionality\nfrom anything in the service of advertising.

\n

The resulting\nadvertisingidentifier property\n(affectionately referred to as\nIDFA by its associates)\ndiffers from identifierForVendor\nby returning the same value for everyone.\nThe value can change, for example,\nif the user resets their Advertising Identifier\nor erases their device.

\n
import AdSupport\n        let idfa = ASIdentifierManager.shared().advertisingIdentifier\n        
\n

If advertising tracking is limited,\nthe property returns a zeroed-out UUID instead.

\n
idfa.uuidString == "00000000-0000-0000-0000-000000000000" // true if the user has limited ad tracking\n        
\n\n\n

\nDeviceCheck

\n

identifierForVendor and advertisingIdentifier\nprovide all the same functionality as the uniqueIdentifier property\nthey replaced in iOS 6,\nsave for one:\nthe ability to persist across device resets and app uninstalls.

\n

In iOS 11,\nApple quietly introduced the\nDeviceCheck framework,\nwhich allows developers to assign two bits of information\nthat are persisted by Apple\nuntil the developer manually removes them.

\n

Interacting with the DeviceCheck framework should be familiar to\nanyone familiar with APNS:\nafter setting things up on App Store Connect and your servers,\nthe client generates tokens on the device,\nwhich are sent to your servers to set or query two bits of information:

\n
import DeviceCheck\n        let device = DCDevice.current\n        if device.isSupported {\n        device.generateToken { data, error in\n        if let token = data?.base64EncodedString() {\n        send token to your server\n        }\n        }\n        }\n        
\n

Based on the device token and other information sent by the client,\nthe server tells Apple to set each bit value\nby sending a JSON payload like this:

\n
{\n"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",\n"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",\n"timestamp": 1572531720,\n"bit0": true,\n"bit1": false\n}\n
\n

To retrieve those two bits at a later point in time,\nthe server sends a payload without bit0 and bit1 fields:

\n
{\n"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",\n"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",\n"timestamp": 1572532500\n}\n
\n

If everything worked,\nApple\u2019s servers would respond with a 200 status code\nand the following JSON payload:

\n
{\n"bit0" : true\n"bit1" : false,\n"last_update_time" : "2019-10"\n}\n
\n\n

\nFingerprinting in Today\u2019s iOS

\n

Despite these affordances by Apple,\nadvertisers have continued to work to circumvent user privacy protections\nand use any and all information at their disposal\nto identify users by other means.

\n

Over the years,\nApple\u2019s restricted access to information about\ndevice hardware,\ninstalled apps,\nnearby WiFi networks.\nThey\u2019ve required apps to request permission to\nget your current location,\naccess your camera and microphone,\nflip through your contacts, and\nfind and connect to Bluetooth accessories.\nThey\u2019ve taken bold steps to prevent user tracking in Safari.

\n

For lack of this information,\ncompanies have had to get creative,\nlooking to forge unique identities from the scraps of what\u2019s still available.\nThis process of identification by a combination of external factors\nis known as fingerprinting.

\n

The unfortunate reality is that we can be uniquely identified\nby vanishingly small amounts of information.\nFor example,\nindividuals within a population can be singled out by as few as\nfour timestamped coordinates\n(de Montjoye, Hidalgo, Verleysen, & Blondel, 2013)\nor little more than a birthday and a ZIP code\n(Sweeney, 2000).

\n

Every WWDC since 2012 has featured a session about Privacy,\nbut the only mention of fingerprinting specifically was\na brief discussion in 2014\nabout how to avoid doing it.

\n

By our count,\na determined party could use conventional, unrestricted APIs\nto generate a few dozen bits of randomness:

\n

\nLocale Information (~36 bits)

\n

Locale information is the greatest source of identifying information\non Apple platforms.\nThe combination of your\npreferred languages, region, calendar, time zone,\nand which keyboards you have installed\nsay a lot about who you are \u2014\nespecially if you have less conventional preferences.

\n
import Foundation\n        Locale.current.languageCode\n        log2(Double(Locale.isoLanguageCodes.count)) // 9.217 bits\n        Locale.current.regionCode\n        log2(Double(Locale.isoRegionCodes.count)) // 8 bits\n        Locale.current.calendar.identifier\n        // ~2^4 (16) Calendars\n        TimeZone.current.identifier\n        log2(Double(TimeZone.knownTimeZoneIdentifiers.count)) // 8.775 bits\n        UserDefaults.standard.object(forKey: "AppleKeyboards")\n        // ~2^6 (64) iOS keyboards\n        
\n\n

\nAccessibility (~10 bits)

\n

Accessibility preferences also provide a great deal of information,\nwith each individual setting contributing a single potential bit:

\n
UIAccessibility.isBoldTextEnabled\n        UIAccessibility.isShakeToUndoEnabled\n        UIAccessibility.isReduceMotionEnabled\n        UIAccessibility.isDarkerSystemColorsEnabled\n        UIAccessibility.isReduceTransparencyEnabled\n        UIAccessibility.isAssistiveTouchRunning\n        
\n

Of the approximately ~25% of users who take advantage of\nDynamic Type\nby configuring a preferred font size,\nthat selection may also be used to fingerprint you:

\n
let application = UIApplication.shared\n        application.preferredContentSizeCategory\n        
\n

\nHardware Information (~5 or ~6 bits)

\n

Although most of the juiciest bits have been locked down\nin OS updates over the years,\nthere\u2019s just enough to contribute a few more bits for purposes of identification.

\n

On iOS,\nyou can get the current model and amount of storage of a user\u2019s device:

\n
import UIKit\n        let device = UIDevice.current\n        device.name // "iPhone 11 Pro"\n        let fileManager = FileManager.default\n        if let path = fileManager.urls(for: .libraryDirectory, in: .systemDomainMask).last?.path,\n        let systemSize = try? fileManager.attributesOfFileSystem(forPath: path)[.systemSize] as? Int\n        {\n        Measurement<UnitInformationStorage>(value: Double(systemSize), unit: .bytes)\n        .converted(to: .gigabytes)  // ~256GB\n        }\n        
\n

With 14 supported iOS devices,\nmost having 3 configurations each,\nlet\u2019s say that this contributes about 32 possibilities, or 5 bits.

\n

You can go a few steps further on macOS,\nto further differentiate hardware by its processor count and amount of RAM:

\n
processInfo.processorCount // 8\n        Measurement<UnitInformationStorage>(value: Double(processInfo.physicalMemory),\n        unit: .bytes)\n        .converted(to: .gigabytes) // 16GB\n        
\n

It\u2019s hard to get a sense of\nhow many different Mac models are in use,\nbut a reasonable estimate would be on the order of 26 or 27.

\n

\nCellular Network (~2 bits)

\n

Knowing whether someone\u2019s phone is on Verizon or Vodaphone\ncan also be factored into a fingerprint.\nYou can use the CTTelephonyNetworkInfo class from the\nCoreTelephony framework\nto lookup the providers for devices with cellular service:

\n
import CoreTelephony\n        let networkInfo = CTTelephonyNetworkInfo()\n        let carriers = networkInfo.serviceSubscriberCellularProviders?.values\n        carriers?.map { ($0.mobileNetworkCode, $0.mobileCountryCode) }\n        
\n

The number of providers varies per country,\nbut using the 4 major carriers in United States\nas a guideline,\nwe can say carrier information would contribute about 2 bits\n(or more if you have multiple SIM cards installed).

\n

\nCommunication Preferences (2 bits)

\n

More generally,\neven knowing whether someone can send texts or email at all\ncan be factored into a fingerprint.\nThis information can be gathered without permissions via\nthe MessageUI framework.

\n
import MessageUI\n        MFMailComposeViewController.canSendMail()\n        MFMessageComposeViewController.canSendText()\n        
\n

\nAdditional Sources of Identifying Information

\n

If the use of digital fingerprinting seems outlandish,\nthat\u2019s just scratching the surface of how companies and researchers\nhave figured out how to circumvent your privacy.

\n

\nGeoIP and Relative Network Speeds

\n

Although access to geolocation through conventional APIs\nrequires explicit authorization,\nthird parties may be able to get a general sense of where you are in the world\nbased on how you access the Internet.

\n

Geolocation by source IP address\nis used extensively for things like region locking and localization.\nYou could also combine this information with\nping-time measurements\nto hosts in known locations\nto get a more accurate pinpoint on location (Weinberg, Cho, Christin, Sekar, & Gill, 2018):

\n
ping -c 5 99.24.18.13 # San Francisco, USA\n        \n--- 99.24.18.13 ping statistics ---\n5 packets transmitted, 5 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 11.900/12.184/12.895/0.380 ms\nping -c 5 203.47.10.37 # Adelaide, Australia\n        \n--- 203.47.10.37 ping statistics ---\n5 packets transmitted, 5 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 202.122/202.433/203.436/0.504 ms\n
\n

\nBattery Health

\n

It\u2019s unclear whether this is a concern in iOS,\nbut depending on how precise the results of UIDevice battery APIs are,\nyou may be able to use them to identify a device by its battery health.\n(Olejnik, Acar, Castelluccia, & Diaz, 2016)

\n
var timestampedBatteryLevels: [(Date, Float)] = []\n        if UIDevice.current.isBatteryMonitoringEnabled {\n        timestampedBatteryLevels.append((Date(), UIDevice.current.batteryLevel))\n        }\n        
\n\n

\nAnd so on\u2026

\n

Everything from your heartbeat, to your gait, to your\nbutt shape\nseem capable of leaking your identity.\nIt can all be quite overwhelming.

\n

I mean,\nif a motivated individual can find your home address by\ncross-referencing the reflection in your eyes against Google Street view,\nhow can we even stand a chance out there?

\n
\n

Much as we may bemoan the current duopoly of mobile operating systems,\nwe might take some solace in the fact that\nat least one of the players actually cares about user privacy.\nThough it\u2019s unclear whether that\u2019s a fight that can ever be won.

\n

At times,\nour fate of being tracked and advertised to\nmay seem as inevitable as the victims in It Follows.

\n

But let\u2019s not forget that,\nas technologists, as people with a voice,\nwe\u2019re in a position to fight back.

\n" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/BkK9uk46u1ujrjGO0Jav3PCQ3g0=/0x225:5363x3800/1310x873/cdn.vox-cdn.com/uploads/chorus_image/image/59608177/PIA22227_full.0.jpg", "width": 1310, "height": 873, "contentType": "image/jpeg" }, "unread": true, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/885f2e01-d314-4e63-abac-17dcb063f5b5", "label": "Programming" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/7badfd54-6d65-421b-9a23-93dec726a308", "label": "Test for NetNewsWire" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578876975 }, { "keywords": [ "Miscellaneous" ], "originId": "https://nshipster.com/device-identifiers", "fingerprint": "2f52765d", "id": "CmHb1hXBWguYpGAhzgwJM9xvPVSYJFbt7KLqF3nqYQ0=_16e22eb0ef0:1e551:d4506071", "updated": 1572505200000, "author": "Mattt", "summary": { "direction": "ltr", "content": "

For every era, there\u2019s a monster that embodies the anxieties of the age.

" }, "alternate": [ { "href": "http://feedproxy.google.com/~r/NSHipster/~3/hXb7k2avhFE/", "type": "text/html" } ], "canonical": [ { "href": "https://nshipster.com/device-identifiers/", "type": "text/html" } ], "crawled": 1572543860464, "title": "Device Identifiers and Fingerprinting on iOS", "published": 1572505200000, "origin": { "streamId": "feed/http://feeds.feedburner.com/NSHipster", "htmlUrl": "https://nshipster.com/", "title": "NSHipster" }, "content": { "direction": "ltr", "content": "

For every era,\nthere\u2019s a monster that embodies the anxieties of the age.

\n

At the dawn of the Holocene,\nour ancestors traced the contours of shadows cast by the campfire\nas they kept watch over the darkness.\nOnce we learned to read the night sky for navigation,\nsailors swapped stories of sea creatures like\nLeviathan and\nSiren\nto describe the dangers of open ocean\n(and the perils to be found on unfamiliar shores).

\n

Frankenstein\u2019s monster\nwas as much the creation of Mary Shelley\nas it was a spiritual collaboration with\nLuigi Galvani.\nAnd Bram Stoker\u2019s\nfictionalized account of the mummy\u2019s curse\nwas more a response to the\nEgyptomania\nand European colonialism\nof the nineteenth century\nthan any personal account of the Middle Kingdom.

\n

More recently,\nthe \u201cmonster ruins a beach party\u201d\ntrope of the 1960s\narose from concerns of teenager morality.\nWhile the\nMartians\nwho invaded those same drive-in double features\nserved as a proxy for Cold War fears at the height of the\nSpace Race.

\n
\n

All of which begs the question:\n\u201cWhat monster best exemplifies our present age?\u201d

\n

Consider the unnamed monster from the film\nIt Follows:\na formless, supernatural being that relentlessly pursues its victims\nanywhere on the planet.

\n

Sounds a bit like the state of\nad tech\nin 2019, no?

\n\n
\n

This week on NSHipster \u2014\nin celebration of our favorite holiday\n\ud83c\udf83 \u2014\nwe\u2019re taking a look at the myriad ways that\nyou\u2019re being tracked on iOS,\nboth sanctioned and unsanctioned,\nhistorically and presently.\nSo gather around the campfire,\nand allow us to trace the contours of the unseen, formless monsters\nthat stalk us under cover of Dark Mode.

\n
\n

\nThe Cynicism of Marketing and Advertising Technology

\n

Contrary to our intuitions about natural selection in the marketplace,\nhistory is littered with examples of\ninferior-but-better-marketed products winning out over superior alternatives:\nVHS vs. Betamax,\nWindows vs. Macintosh,\netc.\n(According to the common wisdom of business folks, at least.)\nRegardless,\nmost companies reach a point where\n\u201cif you build it, they will come\u201d\nceases to be a politically viable strategy,\nand someone authorizes a marketing budget.

\n

Marketers are tasked with growing market share\nby identifying and communicating with as many potential customers as possible.\nAnd many \u2014\neither out of a genuine belief or formulated as a post hoc rationalization \u2014\ntake the potential benefit of their product\nas a license to flouting long-established customs of personal privacy.\nSo they enlist the help of one or more\nadvertising firms,\nwho promise to maximize their allocated budget and\nprovide some accountability for their spending\nby using technology to\ntarget,\ndeliver, and\nanalyze\nmessaging to consumers.

\n

Each of these tasks is predicated on a consistent identity,\nwhich is why advertisers go to such great lengths to track you.

\n\n

\nApple-Sanctioned Identifiers

\n

Apple\u2019s provided various APIS to facilitate user identification\nfor various purposes:

\n

\nUniversal Identifiers (UDID)

\n

In the early days of iOS,\nApple provided a uniqueIdentifier property on UIDevice \u2014\naffectionately referred to as a\nUDID\n(not to be confused with a UUID).\nAlthough such functionality seems unthinkable today,\nthat property existed until iOS 5,\nuntil it was\ndeprecated and replaced by identifierForVendor in iOS 6.

\n

\nVendor Identifiers (IDFV)

\n

Starting in iOS 6,\ndevelopers can use the\nidentifierForVendor property on UIDevice\nto generate a unique identifier that\u2019s shared across apps and extensions\ncreated by the same vendor\n(IDFV).

\n
import UIKit\n        let idfv = UIDevice.current.identifierForVendor // BD43813E-CFC5-4EEB-ABE2-94562A6E76CA\n        
\n\n

\nAdvertising Identifiers (IDFA)

\n

Along with identifierForVendor came the introduction of a new\nAdSupport framework,\nwhich Apple created to help distinguish\nidentification necessary for app functionality\nfrom anything in the service of advertising.

\n

The resulting\nadvertisingidentifier property\n(affectionately referred to as\nIDFA by its associates)\ndiffers from identifierForVendor\nby returning the same value for everyone.\nThe value can change, for example,\nif the user resets their Advertising Identifier\nor erases their device.

\n
import AdSupport\n        let idfa = ASIdentifierManager.shared().advertisingIdentifier\n        
\n

If advertising tracking is limited,\nthe property returns a zeroed-out UUID instead.

\n
idfa.uuidString == "00000000-0000-0000-0000-000000000000" // true if the user has limited ad tracking\n        
\n\n\n

\nDeviceCheck

\n

identifierForVendor and advertisingIdentifier\nprovide all the same functionality as the uniqueIdentifier property\nthey replaced in iOS 6,\nsave for one:\nthe ability to persist across device resets and app uninstalls.

\n

In iOS 11,\nApple quietly introduced the\nDeviceCheck framework,\nwhich allows developers to assign two bits of information\nthat are persisted by Apple\nuntil the developer manually removes them.

\n

Interacting with the DeviceCheck framework should be familiar to\nanyone familiar with APNS:\nafter setting things up on App Store Connect and your servers,\nthe client generates tokens on the device,\nwhich are sent to your servers to set or query two bits of information:

\n
import DeviceCheck\n        let device = DCDevice.current\n        if device.isSupported {\n        device.generateToken { data, error in\n        if let token = data?.base64EncodedString() {\n        send token to your server\n        }\n        }\n        }\n        
\n

Based on the device token and other information sent by the client,\nthe server tells Apple to set each bit value\nby sending a JSON payload like this:

\n
{\n"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",\n"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",\n"timestamp": 1572531720,\n"bit0": true,\n"bit1": false\n}\n
\n

To retrieve those two bits at a later point in time,\nthe server sends a payload without bit0 and bit1 fields:

\n
{\n"device_token": "QTk4QkFDNEItNTBDMy00Qjc5LThBRUEtMDQ5RTQzRjNGQzU0Cg==",\n"transaction_id": "D98BA630-E225-4A2F-AFEC-BE3A3D591708",\n"timestamp": 1572532500\n}\n
\n

If everything worked,\nApple\u2019s servers would respond with a 200 status code\nand the following JSON payload:

\n
{\n"bit0" : true\n"bit1" : false,\n"last_update_time" : "2019-10"\n}\n
\n\n

\nFingerprinting in Today\u2019s iOS

\n

Despite these affordances by Apple,\nadvertisers have continued to work to circumvent user privacy protections\nand use any and all information at their disposal\nto identify users by other means.

\n

Over the years,\nApple\u2019s restricted access to information about\ndevice hardware,\ninstalled apps,\nnearby WiFi networks.\nThey\u2019ve required apps to request permission to\nget your current location,\naccess your camera and microphone,\nflip through your contacts, and\nfind and connect to Bluetooth accessories.\nThey\u2019ve taken bold steps to prevent user tracking in Safari.

\n

For lack of this information,\ncompanies have had to get creative,\nlooking to forge unique identities from the scraps of what\u2019s still available.\nThis process of identification by a combination of external factors\nis known as fingerprinting.

\n

The unfortunate reality is that we can be uniquely identified\nby vanishingly small amounts of information.\nFor example,\nindividuals within a population can be singled out by as few as\nfour timestamped coordinates\n(de Montjoye, Hidalgo, Verleysen, & Blondel, 2013)\nor little more than a birthday and a ZIP code\n(Sweeney, 2000).

\n

Every WWDC since 2012 has featured a session about Privacy,\nbut the only mention of fingerprinting specifically was\na brief discussion in 2014\nabout how to avoid doing it.

\n

By our count,\na determined party could use conventional, unrestricted APIs\nto generate a few dozen bits of randomness:

\n

\nLocale Information (~36 bits)

\n

Locale information is the greatest source of identifying information\non Apple platforms.\nThe combination of your\npreferred languages, region, calendar, time zone,\nand which keyboards you have installed\nsay a lot about who you are \u2014\nespecially if you have less conventional preferences.

\n
import Foundation\n        Locale.current.languageCode\n        log2(Double(Locale.isoLanguageCodes.count)) // 9.217 bits\n        Locale.current.regionCode\n        log2(Double(Locale.isoRegionCodes.count)) // 8 bits\n        Locale.current.calendar.identifier\n        // ~2^4 (16) Calendars\n        TimeZone.current.identifier\n        log2(Double(TimeZone.knownTimeZoneIdentifiers.count)) // 8.775 bits\n        UserDefaults.standard.object(forKey: "AppleKeyboards")\n        // ~2^6 (64) iOS keyboards\n        
\n\n

\nAccessibility (~10 bits)

\n

Accessibility preferences also provide a great deal of information,\nwith each individual setting contributing a single potential bit:

\n
UIAccessibility.isBoldTextEnabled\n        UIAccessibility.isShakeToUndoEnabled\n        UIAccessibility.isReduceMotionEnabled\n        UIAccessibility.isDarkerSystemColorsEnabled\n        UIAccessibility.isReduceTransparencyEnabled\n        UIAccessibility.isAssistiveTouchRunning\n        
\n

Of the approximately ~25% of users who take advantage of\nDynamic Type\nby configuring a preferred font size,\nthat selection may also be used to fingerprint you:

\n
let application = UIApplication.shared\n        application.preferredContentSizeCategory\n        
\n

\nHardware Information (~5 or ~6 bits)

\n

Although most of the juiciest bits have been locked down\nin OS updates over the years,\nthere\u2019s just enough to contribute a few more bits for purposes of identification.

\n

On iOS,\nyou can get the current model and amount of storage of a user\u2019s device:

\n
import UIKit\n        let device = UIDevice.current\n        device.name // "iPhone 11 Pro"\n        let fileManager = FileManager.default\n        if let path = fileManager.urls(for: .libraryDirectory, in: .systemDomainMask).last?.path,\n        let systemSize = try? fileManager.attributesOfFileSystem(forPath: path)[.systemSize] as? Int\n        {\n        Measurement<UnitInformationStorage>(value: Double(systemSize), unit: .bytes)\n        .converted(to: .gigabytes)  // ~256GB\n        }\n        
\n

With 14 supported iOS devices,\nmost having 3 configurations each,\nlet\u2019s say that this contributes about 32 possibilities, or 5 bits.

\n

You can go a few steps further on macOS,\nto further differentiate hardware by its processor count and amount of RAM:

\n
processInfo.processorCount // 8\n        Measurement<UnitInformationStorage>(value: Double(processInfo.physicalMemory),\n        unit: .bytes)\n        .converted(to: .gigabytes) // 16GB\n        
\n

It\u2019s hard to get a sense of\nhow many different Mac models are in use,\nbut a reasonable estimate would be on the order of 26 or 27.

\n

\nCellular Network (~2 bits)

\n

Knowing whether someone\u2019s phone is on Verizon or Vodaphone\ncan also be factored into a fingerprint.\nYou can use the CTTelephonyNetworkInfo class from the\nCoreTelephony framework\nto lookup the providers for devices with cellular service:

\n
import CoreTelephony\n        let networkInfo = CTTelephonyNetworkInfo()\n        let carriers = networkInfo.serviceSubscriberCellularProviders?.values\n        carriers?.map { ($0.mobileNetworkCode, $0.mobileCountryCode) }\n        
\n

The number of providers varies per country,\nbut using the 4 major carriers in United States\nas a guideline,\nwe can say carrier information would contribute about 2 bits\n(or more if you have multiple SIM cards installed).

\n

\nCommunication Preferences (2 bits)

\n

More generally,\neven knowing whether someone can send texts or email at all\ncan be factored into a fingerprint.\nThis information can be gathered without permissions via\nthe MessageUI framework.

\n
import MessageUI\n        MFMailComposeViewController.canSendMail()\n        MFMessageComposeViewController.canSendText()\n        
\n

\nAdditional Sources of Identifying Information

\n

If the use of digital fingerprinting seems outlandish,\nthat\u2019s just scratching the surface of how companies and researchers\nhave figured out how to circumvent your privacy.

\n

\nGeoIP and Relative Network Speeds

\n

Although access to geolocation through conventional APIs\nrequires explicit authorization,\nthird parties may be able to get a general sense of where you are in the world\nbased on how you access the Internet.

\n

Geolocation by source IP address\nis used extensively for things like region locking and localization.\nYou could also combine this information with\nping-time measurements\nto hosts in known locations\nto get a more accurate pinpoint on location (Weinberg, Cho, Christin, Sekar, & Gill, 2018):

\n
ping -c 5 99.24.18.13 # San Francisco, USA\n        \n--- 99.24.18.13 ping statistics ---\n5 packets transmitted, 5 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 11.900/12.184/12.895/0.380 ms\nping -c 5 203.47.10.37 # Adelaide, Australia\n        \n--- 203.47.10.37 ping statistics ---\n5 packets transmitted, 5 packets received, 0.0% packet loss\nround-trip min/avg/max/stddev = 202.122/202.433/203.436/0.504 ms\n
\n

\nBattery Health

\n

It\u2019s unclear whether this is a concern in iOS,\nbut depending on how precise the results of UIDevice battery APIs are,\nyou may be able to use them to identify a device by its battery health.\n(Olejnik, Acar, Castelluccia, & Diaz, 2016)

\n
var timestampedBatteryLevels: [(Date, Float)] = []\n        if UIDevice.current.isBatteryMonitoringEnabled {\n        timestampedBatteryLevels.append((Date(), UIDevice.current.batteryLevel))\n        }\n        
\n\n

\nAnd so on\u2026

\n

Everything from your heartbeat, to your gait, to your\nbutt shape\nseem capable of leaking your identity.\nIt can all be quite overwhelming.

\n

I mean,\nif a motivated individual can find your home address by\ncross-referencing the reflection in your eyes against Google Street view,\nhow can we even stand a chance out there?

\n
\n

Much as we may bemoan the current duopoly of mobile operating systems,\nwe might take some solace in the fact that\nat least one of the players actually cares about user privacy.\nThough it\u2019s unclear whether that\u2019s a fight that can ever be won.

\n

At times,\nour fate of being tracked and advertised to\nmay seem as inevitable as the victims in It Follows.

\n

But let\u2019s not forget that,\nas technologists, as people with a voice,\nwe\u2019re in a position to fight back.

\n\n\"\"" }, "visual": { "url": "http://www.blogcdn.com/www.engadget.com/media/2013/10/irlbanner-1382819058.jpg", "width": 620, "height": 194, "contentType": "image/jpeg" }, "unread": false, "readTime": 5062, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366", "label": "Weblogs" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578867134 }, { "originId": "https://inessential.com/2019/10/31/amateurs", "fingerprint": "a55a55f8", "id": "+jHfsXnBCVfCstSIW1WDumAyigT4rnsUPnI5WFxgnAU=_16e23877a2b:1e9e9:d4506071", "summary": { "direction": "ltr", "content": "

One thing I\u2019m weirdly proud of is my position as an amateur programmer.

\n

When I point that out, people say, \u201cWell, but\u2026\u201d \u2014\u00a0and I know where they\u2019re going, that after 25 years of professional experience I\u2019m not what you think of when you think of \u201camateur.\u201d

\n

And yet, it\u2019s still true. It\u2019s just that I\u2019ve come out the other side, and now I get to work on exactly what I want to, the way I want to, without any thoughts of trying to make money at it.

\n

I can take risks! I can work with anybody who shows up! It\u2019s a pure thrill. It\u2019s like writing single-malt apps.

\n

And I would wish for more people to find themselves in this position \u2014 eventually, anyway \u2014\u00a0because I want to see what they would make.

\n

PS The Dictionary app on my Mac says of the origin of the word \u201camateur\u201d:

\n
\n

late 18th century: from French, from Italian amatore, from Latin amator \u2018lover\u2019, from amare \u2018to love\u2019.

\n
\n

Spot-on.

" }, "alternate": [ { "href": "https://inessential.com/2019/10/31/amateurs", "type": "text/html" } ], "crawled": 1572554111531, "title": "Amateurs", "published": 1572553200000, "origin": { "streamId": "feed/http://ranchero.com/xml/rss.xml", "htmlUrl": "https://inessential.com/", "title": "inessential.com" }, "visual": { "url": "none" }, "unread": true, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/b35dbac9-ed46-4c6f-ab82-6798caa6b43d", "label": "Another for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572578844326 }, { "originId": "tag:blogger.com,1999:blog-8954608646904080796.post-6562845574025332924", "fingerprint": "57441f5a", "thumbnail": [ { "url": "https://1.bp.blogspot.com/-nSjfvVEYsOE/XZ6cEycVw3I/AAAAAAAADTI/UMdV1Seh7R8c0GdV2RgwjuAoJLW47it1gCLcBGAsYHQ/s72-c/074.jpg", "width": 72, "height": 72 } ], "id": "v0v+7Ya8tssIZvd3/pcnFRr3HwvY/5YK3FGc2t65c0Y=_16db6126dbf:685a:d4506071", "updated": 1570675865985, "author": "Edward Feser", "alternate": [ { "href": "http://edwardfeser.blogspot.com/2019/10/transubstantiation-and-hylemorphism.html", "type": "text/html" } ], "crawled": 1570717724095, "title": "Transubstantiation and hylemorphism", "published": 1570675860000, "origin": { "streamId": "feed/http://edwardfeser.blogspot.com/feeds/posts/default", "htmlUrl": "http://edwardfeser.blogspot.com/", "title": "Edward Feser" }, "content": { "direction": "ltr", "content": "
One of the key themes of the early modern philosophers\u2019 revolt against Scholasticism was a move away from an Aristotelian hylemorphist conception of the nature of physical substance to some variation or other of the mechanical philosophy.\u00a0 The other day I was asked a very interesting question: Can transubstantiation be formulated in terms of a mechanistic conception of physical substance rather than a hylemorphic one?\u00a0 My answer was that I would not peremptorily say that it cannot be, but that the suggestion certainly raises serious philosophical and theological problems.

Here\u2019s why.\u00a0 Hylemorphism in its most straightforward version roughly agrees with common sense about which of the things of everyday experience are distinct substances, which are different parts of the same substance, and which are aggregates rather than true substances.\u00a0 For example, it would say that a stone, a tree, and a dog are all distinct substances from one another; that a particular dog\u2019s nose and its right front leg are different parts of the same substance rather than distinct substances; and that a pile of stones is an aggregate rather than a substance in its own right.\u00a0 Of course, use of the term \u201csubstance\u201d in the technical Aristotelian sense isn\u2019t part of common sense, but even untutored common sense would surely involve the supposition that a stone, a tree, and a dog are all distinct things or objects, that the nose and leg of the dog are parts of a larger thing or object rather than separate things or objects, and that a pile of stones is a bunch of things or objects rather than a single object.\u00a0 At least to that extent, common sense would more or less agree with what I am calling a straightforward version of hylemorphism. \u00a0(See chapter 3 of Scholastic Metaphysics for exposition and defense of the hylemorphist account of substance.)

Now, the mechanical world picture that pushed aside the hylemorphist model tended radically to revise the common sense understanding of physical objects in one of two general ways, depending on how mechanism was spelled out.\u00a0 It reduced ordinary physical objects either to mere aggregates of their innumerably many component parts, or to mere modes of some larger blob of which theywere the parts.

Descartes and Spinoza essentially took the latter option.\u00a0 Though Descartes is often described as positing a plurality of extended substances alongside the plurality of thinking substances, his considered view seemed to be that strictly speaking, there is only a single extended substance, of which the ordinary objects of our experience are merely modifications.\u00a0 Spinoza more famously took such a position (or rather, he took it that Deus sive Naturawas the one substance of which the ordinary physical objects of our experience are all modes).\u00a0 On this view, a stone, a tree, and a dog are not really distinct substances, but merely distinct aspects of one and the same substance \u2013 in something like the way common sense regards the color, weight, and shape of a stone to be mere modes of one and the same object, the stone.

Atomist and corpuscularian versions of the mechanical philosophy went in the other direction.\u00a0 They essentially make either atoms or corpuscles the true substances, and ordinary objects mere aggregates of these purported substances.\u00a0 Just as a pile of rocks is not a true substance but merely a collection of substances (or as the hylemorphist would say, being a pile of rocks is a merely accidental form rather than a substantial form), so too a stone, a tree, or a dog is on this view merely a collection of particles.\u00a0 In effect, the particles are the true substances, and the stone, tree, or dog is like the pile \u2013 a relatively superficial arrangement of metaphysically more fundamental entities.

So, to come to transubstantiation, the idea, of course, is that in the Eucharist, while the accidents of bread and wine remain, the substance of bread and wine are miraculously replaced with that of Christ.\u00a0 Suppose, then, that we were to adopt Descartes\u2019 version of the mechanical philosophy, on which there is just one big physical substance underlying all the things ordinary perceptual experience reveals to us.\u00a0 That would entail that the substance that underlies the accidents of bread and wine that are about to be consecrated is the very same substance as that which underlies stones, trees, dogs, cats, human bodies, apples, oranges, the sun, the moon, water, lead, gold, and every other thing we see, hear, taste, touch, or smell.\u00a0

But in that case, when transubstantiation occurs, it is not just the substance underlying the accidents of bread and wine that is replaced, but the substance underlying all of these other things too.\u00a0 In other words, after transubstantiation occurs, it is really the body and blood of Christ that underlies what we perceive as stones, trees, dogs, cats, human bodies, the sun, the moon, water, etc.!\u00a0 Everything in the physical world would be transubstantiated.\u00a0 We would be left with a kind of pantheism.\u00a0 Absolutely every physical thing would have to treated with the same reverence that the Eucharist is, because every physical thing would be the Eucharist!

Another bizarre implication of this is that transubstantiation could occur only once.\u00a0 For only at the first time it occurs is the one physical substance replaced by that of Christ.\u00a0 If a priest were ever to try to consecrate bread and wine again, he would fail, because there is no longer any physical substance there to be replaced.\u00a0 It is alreadythe body and blood of Christ.

Suppose we went the other route, that of either atomism or corpuscularianism.\u00a0 Then, like stones, trees, and dogs, bread and wine would not be true substances but merely accidental collections of innumerably many true substances.\u00a0 They would be like a pile of rocks, only instead it would be fundamental particles (atoms or corpuscles, depending on your favored version of the mechanical philosophy) that would be piled up.\u00a0 But in that case, exactly what is the substance that is replaced when transubstantiation occurs?\u00a0 Neither the substance of the bread nor that of the wine can be what is replaced, because on this view they just aren\u2019ttrue substances in the first place.\u00a0

Should we say that it is each particle that makes up the aggregate that is transubstantiated (just as Catholic theology allows that many hosts at a time may be consecrated at Mass)?\u00a0\u00a0 But there are several problems with that suggestion.\u00a0 The first is that it is hard to know how to give a principled answer to the question what the boundaries are between those particles that make up the aggregate and those that are not part of it \u2013 and thus between those particles that are transubstantiated, and those that are not.\u00a0 The reason is that the boundaries of an aggregate are much less well defined than those of a substance.\u00a0 Is a stone that is two millimeters away from a pile of stones itself part of the pile or not?\u00a0 And is a particle that falls from the host part of that (purported) aggregate of particles or not?\u00a0

If we think of the host on the model of an Aristotelian substance, then we can say that a fallen particle is part of the host, like a body part that has been severed, as it were.\u00a0 But, again, if instead we think in terms of the model of a pile of stones or some other aggregate, the answer isn\u2019t as clear.

A second problem is that in Catholic theology, not any old matter can be used when consecrating the Eucharist.\u00a0 It has to be bread and wine, specifically.\u00a0 But on the interpretation under consideration, according to which bread and wine are not true substances, it is really the particles (either atoms or corpuscles) that are being consecrated.\u00a0 And the atoms or corpuscles that make up bread and wine are essentially the same as those that make up everything else (just as the stones that make up a pile can be essentially of the same type as those that are used instead to make up a wall).\u00a0 In that case, though, it would be hard to see why there is anything special about bread and wine.\u00a0 Why couldn\u2019t any old physical thing be consecrated, if every physical thing is essentially just the same kind of stuff in relatively superficial differences of configuration?

A third problem is that canon law says that a Catholic ought to receive communion at most only once (or in some special circumstances, perhaps twice) a day.\u00a0 But on the interpretation under consideration, one would in effect be consuming millions of consecrated hosts insofar as each of the millions of particles that make up what common sense regards as a single host was being independently transubstantiated.

Perhaps such problems could be solved, though I am doubtful.\u00a0 Anyway, the issue illustrates the unexpected implications that philosophical assumptions can have for theology.\u00a0 (And thus the caution that any Catholic ought to exercise before embracing philosophical novelties.\u00a0 The Scholastics knew what they were doing.)
" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/qEtBNTmNKQvUro7McqHPXL-2OOM=/0x0:6720x4480/1310x873/cdn.vox-cdn.com/uploads/chorus_image/image/59664621/marshall_majorIII_aniconinthemaking_product_rgb_highres_2.0.jpg", "width": 1310, "height": 878, "contentType": "image/jpeg" }, "unread": false, "readTime": 3562, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/7badfd54-6d65-421b-9a23-93dec726a308", "label": "Test for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/fbdcd69b-7e27-4b6a-bfed-6584b944155d", "label": "\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572500351314 }, { "keywords": [ "Xcode" ], "originId": "https://nshipster.com/metrickit", "recrawled": 1572363511019, "updateCount": 2, "fingerprint": "9be1d5cd", "id": "CmHb1hXBWguYpGAhzgwJM9xvPVSYJFbt7KLqF3nqYQ0=_16df9da832d:14579:d4506071", "updated": 1571641200000, "author": "Mattt", "summary": { "direction": "ltr", "content": "

At WWDC this year, Apple announced a coordinated effort between Xcode 11 and iOS 13 to bring new insights to developers about how their apps are performing in the field.

" }, "alternate": [ { "href": "http://feedproxy.google.com/~r/NSHipster/~3/o2-j6xKjBrA/", "type": "text/html" } ], "canonical": [ { "href": "https://nshipster.com/metrickit/", "type": "text/html" } ], "crawled": 1571854910253, "title": "MetricKit", "published": 1571641200000, "origin": { "streamId": "feed/http://feeds.feedburner.com/NSHipster", "htmlUrl": "https://nshipster.com/", "title": "NSHipster" }, "content": { "direction": "ltr", "content": "

As an undergraduate student,\nI had a radio show called\n\u201cGoodbye, Blue Monday\u201d\n(I was really into Vonnegut at the time).\nIt was nothing glamorous \u2014\njust a weekly, 2-hour slot at the end of the night\nbefore the station switched into automation.

\n

If you happened to be driving through the hills of Pittsburgh, Pennsylvania\nlate at night with your radio tuned to\nWRCT 88.3,\nyou\u2019d have heard an eclectic mix of\nContemporary Classical,\nAcid Jazz,\nItalian Disco, and\nBebop.\nThat, and the stilting, dulcet baritone of\na college kid doing his best impersonation of\nTony Mowod.

\n

Sitting there in the booth,\nwaiting for tracks to play out before launching into an\nFCC-mandated\nPSA\nor on-the-hour\nstation identification,\nI\u2019d wonder:\nIs anyone out there listening?\nAnd if they were, did they like it?\nI could\u2019ve been broadcasting static the whole time and been none the wiser.

\n

The same thoughts come to mind whenever I submit a build to App Store Connect\u2026\nbut then I\u2019ll remember that, unlike radio,\nyou can actually know these things!\nAnd the latest improvements in Xcode 11 make it easier than ever\nto get an idea of how your apps are performing in the field.

\n

We\u2019ll cover everything you need to know in this week\u2019s NSHipster article.\nSo as they say on the radio:\n\u201cDon\u2019t touch that dial (it\u2019s got jam on it)\u201d.

\n
\n

MetricKit is a new framework in iOS 13\nfor collecting and processing battery and performance metrics.\nIt was announced at WWDC this year\nalong with XCTest Metrics and the Xcode Metrics Organizer\nas part of a coordinated effort to bring new insights to developers\nabout how their apps are performing in the field.

\n
\n\n\n\"MetricKit\n\n
Diagram from WWDC 2019 Session 417: "Improving Battery Life and Performance"
\n
\n

Apple automatically collects metrics from apps installed on the App Store.\nYou can view them in Xcode 11\nby opening the Organizer (\u2325\u2318\u21e7O)\nand selecting the new Metrics tab.

\n

MetricKit complement Xcode Organizer Metrics by providing a programmatic way to\nreceive daily information about how your app is performing in the field.\nWith this information,\nyou can collect, aggregate, and analyze on your own in greater detail\nthan you can through Xcode.

\n

\nUnderstanding App Metrics

\n

Metrics can help uncover issues you might not have seen while testing locally,\nand allow you to track changes across different versions of your app.\nFor this initial release,\nApple has focused on the two metrics that matter most to users:\nbattery usage and performance.

\n

\nBattery Usage

\n\n\n\"MetricKit\n\n

Battery life depends on a lot of different factors.\nPhysical aspects like the age of the device and\nthe number of charge cycles are determinative,\nbut the way your phone is used matters, too.\nThings like CPU usage,\nthe brightness of the display and the colors on the screen,\nand how often radios are used to fetch data or get your current location \u2014\nall of these can have a big impact.\nBut the main thing to keep in mind is that\nusers care a lot about battery life.

\n

Aside from how good the camera is,\nthe amount of time between charges\nis the deciding factor when someone buys a new phone these days.\nSo when their new, expensive phone doesn\u2019t make it through the day,\nthey\u2019re going to be pretty unhappy.

\n

Until recently,\nApple\u2019s taken most of the heat on battery issues.\nBut since iOS 12 and its new\nBattery Usage screen in Settings,\nusers now have a way to tell when their favorite app is to blame.\nFortunately,\nwith iOS 13 you now have everything you need to make sure\nyour app doesn\u2019t run afoul of reasonable energy usage.

\n

\nPerformance

\n

Performance is another key factor in the overall user experience.\nNormally, we might look to stats like\nprocessor clock speed or frame rate\nas a measure of performance.\nBut instead,\nApple\u2019s focusing on less abstract and more actionable metrics:

\n
\n
Hang Rate
\n
How often is the main / UI thread blocked,\nsuch that the app is unresponsive to user input?
\n
Launch Time
\n
How long does an app take to become usable after the user taps its icon?
\n
Peak Memory & Memory at Suspension
\n
How much memory does the app use at its peak\nand just before entering the background?
\n
Disk Writes
\n
How often does the app write to disk,\nwhich \u2014 if you didn\u2019t already know \u2014 is a\ncomparatively slow operation\n(even with the flash storage on an iPhone!)\n
\n
\n

\nUsing MetricKit

\n

From the perspective of an API consumer,\nit\u2019s hard to imagine how MetricKit could be easier to incorporate.\nAll you need is for some part of your app to serve as\na metric subscriber\n(an obvious choice is your AppDelegate),\nand for it to be added to the shared MXMetricManager:

\n
import UIKit\n        import MetricKit\n        @UIApplicationMain\n        class AppDelegate: UIResponder, UIApplicationDelegate {\n        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n        MXMetricManager.shared.add(self)\n        return true\n        }\n        func applicationWillTerminate(_ application: UIApplication) {\n        MXMetricManager.shared.remove(self)\n        }\n        }\n        extension AppDelegate: MXMetricManagerSubscriber {\n        func didReceive(_ payloads: [MXMetricPayload]) {\n        ...\n        }\n        }\n        
\n

iOS automatically collects samples while your app is being used,\nand once per day (every 24 hours),\nit\u2019ll send an aggregated report with those metrics.

\n

To verify that your MXMetricManagerSubscriber\nis having its delegate method called as expected,\nselect Simulate MetricKit Payloads from the Debug menu\nwhile Xcode is running your app.

\n\n

\nAnnotating Critical Code Sections with Signposts

\n

In addition to the baseline statistics collected for you,\nyou can use the\nmxSignpost function\nto collect metrics around the most important parts of your code.\nThis signpost-backed API\ncaptures CPU time, memory, and writes to disk.

\n

For example,\nif part of your app did post-processing on audio streams,\nyou might annotate those regions with metric signposts\nto determine the energy and performance impact of that work:

\n
let audioLogHandle = MXMetricManager.makeLogHandle(category: "Audio")\n        func processAudioStream() {\n        mxSignpost(.begin, log: audioLogHandle, name: "ProcessAudioStream")\n        ...\n        mxSignpost(.end, log: audioLogHandle, name: "ProcessAudioStream")\n        }\n        
\n

\nCreating a Self-Hosted Web Service for Collecting App Metrics

\n

Now that you have this information,\nwhat do you do with it?\nHow do we fill that ... placeholder in our implementation of didReceive(_:)?

\n

You could pass that along to some paid analytics or crash reporting service,\nbut where\u2019s the fun in that?\nLet\u2019s build our own web service to collect these for further analysis:

\n

\nStoring and Querying Metrics with PostgreSQL

\n

The MXMetricPayload objects received by metrics manager subscribers\nhave a convenient\njsonRepresentation() method\nthat generates something like this:

\n
\n\n
{\n"locationActivityMetrics": {\n"cumulativeBestAccuracyForNavigationTime": "20 sec",\n"cumulativeBestAccuracyTime": "30 sec",\n"cumulativeHundredMetersAccuracyTime": "30 sec",\n"cumulativeNearestTenMetersAccuracyTime": "30 sec",\n"cumulativeKilometerAccuracyTime": "20 sec",\n"cumulativeThreeKilometersAccuracyTime": "20 sec"\n},\n"cellularConditionMetrics": {\n"cellConditionTime": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 20,\n"bucketStart": "1 bars",\n"bucketEnd": "1 bars"\n},\n"1": {\n"bucketCount": 30,\n"bucketStart": "2 bars",\n"bucketEnd": "2 bars"\n},\n"2": {\n"bucketCount": 50,\n"bucketStart": "3 bars",\n"bucketEnd": "3 bars"\n}\n}\n}\n},\n"metaData": {\n"appBuildVersion": "0",\n"osVersion": "iPhone OS 13.1.3 (17A878)",\n"regionFormat": "US",\n"deviceType": "iPhone9,2"\n},\n"gpuMetrics": {\n"cumulativeGPUTime": "20 sec"\n},\n"memoryMetrics": {\n"peakMemoryUsage": "200,000 kB",\n"averageSuspendedMemory": {\n"averageValue": "100,000 kB",\n"standardDeviation": 0,\n"sampleCount": 500\n}\n},\n"signpostMetrics": [\n{\n"signpostIntervalData": {\n"histogrammedSignpostDurations": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 50,\n"bucketStart": "0 ms",\n"bucketEnd": "100 ms"\n},\n"1": {\n"bucketCount": 60,\n"bucketStart": "100 ms",\n"bucketEnd": "400 ms"\n},\n"2": {\n"bucketCount": 30,\n"bucketStart": "400 ms",\n"bucketEnd": "700 ms"\n}\n}\n},\n"signpostCumulativeCPUTime": "30,000 ms",\n"signpostAverageMemory": "100,000 kB",\n"signpostCumulativeLogicalWrites": "600 kB"\n},\n"signpostCategory": "TestSignpostCategory1",\n"signpostName": "TestSignpostName1",\n"totalSignpostCount": 30\n},\n{\n"signpostIntervalData": {\n"histogrammedSignpostDurations": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 60,\n"bucketStart": "0 ms",\n"bucketEnd": "200 ms"\n},\n"1": {\n"bucketCount": 70,\n"bucketStart": "201 ms",\n"bucketEnd": "300 ms"\n},\n"2": {\n"bucketCount": 80,\n"bucketStart": "301 ms",\n"bucketEnd": "500 ms"\n}\n}\n},\n"signpostCumulativeCPUTime": "50,000 ms",\n"signpostAverageMemory": "60,000 kB",\n"signpostCumulativeLogicalWrites": "700 kB"\n},\n"signpostCategory": "TestSignpostCategory2",\n"signpostName": "TestSignpostName2",\n"totalSignpostCount": 40\n}\n],\n"displayMetrics": {\n"averagePixelLuminance": {\n"averageValue": "50 apl",\n"standardDeviation": 0,\n"sampleCount": 500\n}\n},\n"cpuMetrics": {\n"cumulativeCPUTime": "100 sec"\n},\n"networkTransferMetrics": {\n"cumulativeCellularDownload": "80,000 kB",\n"cumulativeWifiDownload": "60,000 kB",\n"cumulativeCellularUpload": "70,000 kB",\n"cumulativeWifiUpload": "50,000 kB"\n},\n"diskIOMetrics": {\n"cumulativeLogicalWrites": "1,300 kB"\n},\n"applicationLaunchMetrics": {\n"histogrammedTimeToFirstDrawKey": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 50,\n"bucketStart": "1,000 ms",\n"bucketEnd": "1,010 ms"\n},\n"1": {\n"bucketCount": 60,\n"bucketStart": "2,000 ms",\n"bucketEnd": "2,010 ms"\n},\n"2": {\n"bucketCount": 30,\n"bucketStart": "3,000 ms",\n"bucketEnd": "3,010 ms"\n}\n}\n},\n"histogrammedResumeTime": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 60,\n"bucketStart": "200 ms",\n"bucketEnd": "210 ms"\n},\n"1": {\n"bucketCount": 70,\n"bucketStart": "300 ms",\n"bucketEnd": "310 ms"\n},\n"2": {\n"bucketCount": 80,\n"bucketStart": "500 ms",\n"bucketEnd": "510 ms"\n}\n}\n}\n},\n"applicationTimeMetrics": {\n"cumulativeForegroundTime": "700 sec",\n"cumulativeBackgroundTime": "40 sec",\n"cumulativeBackgroundAudioTime": "30 sec",\n"cumulativeBackgroundLocationTime": "30 sec"\n},\n"timeStampEnd": "2019-10-22 06:59:00 +0000",\n"applicationResponsivenessMetrics": {\n"histogrammedAppHangTime": {\n"histogramNumBuckets": 3,\n"histogramValue": {\n"0": {\n"bucketCount": 50,\n"bucketStart": "0 ms",\n"bucketEnd": "100 ms"\n},\n"1": {\n"bucketCount": 60,\n"bucketStart": "100 ms",\n"bucketEnd": "400 ms"\n},\n"2": {\n"bucketCount": 30,\n"bucketStart": "400 ms",\n"bucketEnd": "700 ms"\n}\n}\n}\n},\n"appVersion": "1.0.0",\n"timeStampBegin": "2019-10-21 07:00:00 +0000"\n}\n
\n
\n

As you can see,\nthere\u2019s a lot baked into this representation.\nDefining a schema for all of this information would be a lot of work,\nand there\u2019s no guarantee that this won\u2019t change in the future.\nSo instead,\nlet\u2019s embrace the NoSQL paradigm\n(albeit responsibly, using Postgres)\nby storing payloads in a JSONB column:

\n
CREATE TABLE IF NOT EXISTS metrics (\n        id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n        payload JSONB NOT NULL\n        );\n        
\n

So easy!

\n

We can extract individual fields from payloads\nusing JSON operators\nlike so:

\n
SELECT (payload -> 'applicationTimeMetrics'\n        ->> 'cumulativeForegroundTime')::INTERVAL\n        FROM metrics;\n        -- interval\n        -- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        -- @ 11 mins 40 secs\n        -- (1 row)\n        
\n\n

\nAdvanced: Creating Views

\n

JSON operators in PostgreSQL can be cumbersome to work with \u2014\nespecially for more complex queries.\nOne way to help with that is to create a view\n(materialized or otherwise)\nto project the most important information to you\nin the most convenient representation:

\n
CREATE VIEW key_performance_indicators AS\n        SELECT\n        id,\n        (payload -> 'appVersion') AS app_version,\n        (payload -> 'metaData' ->> 'deviceType') AS device_type,\n        (payload -> 'metaData' ->> 'regionFormat') AS region,\n        (payload -> 'applicationTimeMetrics'\n        ->> 'cumulativeForegroundTime'\n        )::INTERVAL AS cumulative_foreground_time,\n        parse_byte_count(\n        payload -> 'memoryMetrics'\n        ->> 'peakMemoryUsage'\n        ) AS peak_memory_usage_bytes\n        FROM metrics;\n        
\n

With views,\nyou can perform\naggregate queries\nover all of your metrics JSON payloads\nwith the convenience of a schema-backed relational database:

\n
SELECT avg(cumulative_foreground_time)\n        FROM key_performance_indicators;\n        -- avg\n        -- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        -- @ 9 mins 41 secs\n        SELECT app_version, percentile_disc(0.5)\n        WITHIN GROUP (ORDER BY peak_memory_usage_bytes)\n        AS median\n        FROM key_performance_indicators\n        GROUP BY app_version;\n        -- app_version \u2502 median\n        -- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n        -- "1.0.1" \u2502 192500000\n        -- "1.0.0" \u2502 204800000\n        
\n\n

\nCreating a Web Service

\n

In this example,\nmost of the heavy lifting is delegated to Postgres,\nmaking the server-side implementation rather boring.\nFor completeness,\nhere are some reference implementations in\nRuby (Sinatra) and JavaScript (Express):

\n
\n
\n\n\n
\n
require 'sinatra/base'\n        require 'pg'\n        require 'sequel'\n        class App < Sinatra::Base\n        configure do\n        DB = Sequel.connect(ENV['DATABASE_URL'])\n        end\n        post '/collect' do\n        DB[:metrics].insert(payload: request.body.read)\n        status 204\n        end\n        end\n        
\n\n
\n

\nSending Metrics as JSON

\n

Now that we have everything set up,\nthe final step is to implement\nthe required MXMetricManagerSubscriber delegate method didReceive(_:)\nto pass that information along to our web service:

\n
extension AppDelegate: MXMetricManagerSubscriber {\n        func didReceive(_ payloads: [MXMetricPayload]) {\n        for payload in payloads {\n        let url = URL(string: "https://example.com/collect")!\n        var request = URLRequest(url: url)\n        request.httpMethod = "POST"\n        request.httpBody = payload.jsonRepresentation()\n        let task = URLSession.shared.dataTask(with: request)\n        task.priority = URLSessionTask.lowPriority\n        task.resume()\n        }\n        }\n        }\n        
\n
\n

When you create something and put it out into the world,\nyou lose your direct connection to it.\nThat\u2019s as true for apps as it is for college radio shows.\nShort of user research studies or\ninvasive ad-tech,\nthe truth is that\nwe rarely have any clue about how people are using our software.

\n\n

Metrics offer a convenient way to at least make sure that\nthings aren\u2019t too slow or too draining.\nAnd though they provide but a glimpse in the aggregate\nof how our apps are being enjoyed,\nit\u2019s just enough to help us honor both our creation and our audience\nwith a great user experience.

\n\n\"\"" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/06e5FJWgUfUSmDaPJIEZoGF1XOs=/0x68:2040x1136/fit-in/1200x630/cdn.vox-cdn.com/uploads/chorus_asset/file/10378819/DSCF3031.jpg", "width": 1200, "height": 628, "contentType": "image/jpeg" }, "unread": false, "readTime": 4744, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366", "label": "Weblogs" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572500250190 }, { "originId": "https://inessential.com/2019/10/22/netnewswire_5_0_3_for_mac_released", "fingerprint": "2c4d6d88", "id": "+jHfsXnBCVfCstSIW1WDumAyigT4rnsUPnI5WFxgnAU=_16df54dfcca:13322:d4506071", "summary": { "direction": "ltr", "content": "

\"NetNewsWire

\n

The main things in this release are 1) enhanced performance and 2) importing subscriptions from NetNewsWire 3 (since it won\u2018t run on Catalina).

\n

There are also a bunch of bug fixes \u2014 including a fix for the space bar behavior on Catalina \u2014 and there\u2019s a new feature: you can type the s key to star and unstar an article.

\n

For more details, read the change notes on the NetNewsWire blog.

" }, "alternate": [ { "href": "https://inessential.com/2019/10/22/netnewswire_5_0_3_for_mac_released", "type": "text/html" } ], "crawled": 1571778591946, "title": "NetNewsWire 5.0.3 for Mac Released", "published": 1571775505000, "origin": { "streamId": "feed/http://ranchero.com/xml/rss.xml", "htmlUrl": "https://inessential.com/", "title": "inessential.com" }, "visual": { "url": "http://www.blogcdn.com/www.engadget.com/media/2013/10/nvidia-shield-console-mode.jpg", "width": 620, "height": 340, "contentType": "image/jpg" }, "unread": false, "readTime": 5621, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/b35dbac9-ed46-4c6f-ab82-6798caa6b43d", "label": "Another for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572500226675 }, { "id": "AxO6mug+YPRclcA3EJcsykvvS1qcjXH62IXONGWCBII=_16db2add61b:afd:a4acdac", "originId": "58495.pz39s0 at https://www.imore.com", "fingerprint": "8fe463a6", "content": { "content": "

An Apple Support rep apparently said, "I do not know how this could of happened."

\n

\n

What you need to know

\n
  • An Apple Card user claims he was the victim of fraud.
  • \n
  • When he contacted Apple Support, they said, "I do not know how this could of happened."
  • \n
  • Apple Card touts an extra level of security with no numbers and no CVV.
  • \n

When Apple Card debuted, one of its biggest draws was Apple's focus on security. On Apple's website, it says, "It's hard to steal a credit card number when you can't see it." But that's apparently what happened to one Apple Card user who reached out to 9to5Mac, claiming they were the victim of fraud.

\n

The Apple Card user said they reached out to Apple Support and received this response:

\n
\n

I do not know how this could of happened. It's very rare for your card to be in two places at one time. Since our physical cards have no number on it, it's very hard for someone to copy it.

\n
\n

The Apple Card user confirmed the fraudulent charge after receiving an alert on his iPhone. The tricky thing is the purchase was apparently labeled as being nearby, but clicking on the map revealed it was hours away, 9to5Mac explained.

\n

On Apple's website, the company highlights the fact that the Apple Card doesn't have any numbers on it. "Not even a CVV. So that's one less thing to worry about when you hand over your card at a restaurant or store." But that doesn't guarantee it can't be stolen.

\n

9to5Mac speculates that the Apple Card user may have been the victim of skimming, which can potentially affect all credit cards and debit cards. It's a reminder to be extra vigilant when swiping your card at a gas station or ATM. Better yet, use Apple Pay when possible.

\n

\n
\n

Apple Card

\n

\n
\n

\"\"", "direction": "ltr" }, "title": "Apple Card user says he was the victim of fraud", "author": "Brandon Russell", "summary": { "content": "An Apple Support rep apparently said, "I do not know how this could of happened."\nWhat you need to know\nAn Apple Card user claims he was the victim of fraud.\nWhen he contacted Apple Support, they said, "I do not know how this could of happened."\nApple Card touts an extra level of security with no numbers and no CVV.\nWhen Apple Card debuted, one of its biggest draws was Apple's focus on security. On Apple's website, it says, "It's hard to steal a credit card number when you can't see it." But that's apparently what happened to one Apple Card user who reached out to 9to5Mac, claiming they were the victim of fraud.\nThe Apple Card user said they reached out to Apple Support and received this response:\nI do not know how this could of happened. It's very rare for your card to be in two places at one time. Since our physical cards have no number on it, it's very hard for someone to copy it.\nThe Apple Card user confirmed the fraudulent charge after receiving an alert on his iPhone. ...", "direction": "ltr" }, "alternate": [ { "href": "http://feeds.imore.com/~r/TheIphoneBlog/~3/DzBrQNf9PCU/apple-card-user-says-he-was-victim-fraud", "type": "text/html" } ], "canonical": [ { "href": "https://www.imore.com/apple-card-user-says-he-was-victim-fraud", "type": "text/html" } ], "crawled": 1570660800027, "published": 1570660313000, "origin": { "streamId": "feed/http://www.imore.com/rss.xml", "title": "iMore - The #1 iPhone, iPad, and iPod touch blog", "htmlUrl": "https://www.imore.com/" }, "unread": false, "readTime": 2216, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572500208603 }, { "keywords": [ "Development", "How To", "Xcode" ], "originId": "https://ericasadun.com/?p=6502", "fingerprint": "878bb7e8", "id": "eos9yhbovnwyH+gNY6NsrxoZIGI+1zv2KFTRDDBJycA=_16e0e491282:185ad:d4506071", "author": "erica", "summary": { "direction": "ltr", "content": "Most Xcode users quickly become familiar with the basics of the Find Navigator panel. With it, you can find text, regular expressions, and perform search-and-replace, whether matching or ignoring case. But that\u2019s just scratching the surface of the Find Navigator. I thought I\u2019d drop a few words today about search scopes. Controlled from the bottom [\u2026]" }, "alternate": [ { "href": "https://ericasadun.com/2019/10/27/fun-with-xcode-search-domains-excluding-match-text/", "type": "text/html" } ], "crawled": 1572197700226, "title": "Fun with Xcode Search Domains: Excluding match text", "published": 1572195876000, "origin": { "streamId": "feed/http://ericasadun.com/feed/", "htmlUrl": "https://ericasadun.com", "title": "Erica Sadun" }, "content": { "direction": "ltr", "content": "

Most Xcode users quickly become familiar with the basics of the Find Navigator panel.

\n

\"\"

\n

With it, you can find text, regular expressions, and perform search-and-replace, whether matching or ignoring case. But that\u2019s just scratching the surface of the Find Navigator.

\n

I thought I\u2019d drop a few words today about search scopes. Controlled from the bottom left, \u00a0under the search field, you can create narrowed searches. This enables you to, for example, search only in Swift files or exclude files containing the word Test.

\n

To get started, click the icon (two lines with three squares on a line between them) and then New Scope (the plus icon). Here, you can name the scope, limit the search extent, and add criteria for exactly which files should be included or not.

\n

\"\"

\n

The logic is straightforward. You choose where to look (the project, a folder, or through the entire SDK), and whether to include all conditions or some conditions:

\n

\"\"

\n

Each condition is based on the file name, path, extension, UTI (the kind of file, like image which is useful for finding vector assets), Workspace location (namely groups), or source control status (handy for finding newly applied changes.)

\n

Most of my conditions are file-name-based. And for those, you get the following matching conditions. The \u201cends with\u201d is an obvious win for extensions (although you can also use UTIs for that), and \u201cstarts with\u201d can help for projects organized in hierarchical ways.

\n

\"\"

\n

Now, interestingly enough, this list fails to offer \u201cdoes not contain\u201d but that\u2019s fairly easy to work around. Since Xcode supports regex matching, you can easily replicate \u201cdoes not contain\u201d with an appropriate regex:

\n

\"\"

\n

Change the file name to a path to exclude source file directories.

\n

You can create as many search domains as you like. At least, I haven\u2019t found an upper bound yet. I haven\u2019t found a way to reorder the find scopes, although if you\u2019re really controlling about this, you can pop into \u00a0your workspace (ProjectName.xcodeproj/project.xcworkspace/xcuserdata/username.xcuserdatad), convert your UserInterfaceState.xcuserstate to xml (plutil -convert xml1), and hand-edit it the way you need.

\n

There are lots of wonderful little Xcode tweaks like these throughout this monster of an IDE. What are some of your faves? If I have time this week, I\u2019ll share some of mine, such as the four-square \u2014 another of my favorite tools \u2014 and a few great ways to connect your editor to the navigator.

" }, "unread": false, "readTime": 3406, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" } ], "actionTimestamp": 1572499929438 }, { "keywords": [ "Apple" ], "originId": "https://9to5mac.com/?p=617536", "recrawled": 1572455791719, "updateCount": 1, "fingerprint": "77224d8", "id": "BmoAzSEWHFzR01wyxBZAhNEo11Vy8oDR1qKDe+tKVEQ=_16e1d065ad9:1c0f1:d4506071", "author": "Michael Potuck", "summary": { "direction": "ltr", "content": "
\n

Sonos has announced a new initiative today that makes it easy for existing customers to trade in older Sonos products for a nice discount on new ones. For Apple customers, the Trade Up program is a neat opportunity to bring Sonos\u2019 AirPlay 2 compatible speakers into your home.

\n

more\u2026

\n

The post Sonos pushing AirPlay 2 speaker lineup with new Trade Up program appeared first on 9to5Mac.

" }, "alternate": [ { "href": "https://9to5mac.com/2019/10/30/sonos-trade-in-program-airplay-2/", "type": "text/html" } ], "crawled": 1572444986073, "title": "Sonos pushing AirPlay 2 speaker lineup with new Trade Up program", "published": 1572442686000, "origin": { "streamId": "feed/http://9to5mac.com/feed/", "htmlUrl": "https://9to5mac.com", "title": "9to5Mac" }, "visual": { "url": "https://cdn.vox-cdn.com/thumbor/06e5FJWgUfUSmDaPJIEZoGF1XOs=/0x68:2040x1136/fit-in/1200x630/cdn.vox-cdn.com/uploads/chorus_asset/file/10378819/DSCF3031.jpg", "width": 1200, "height": 628, "contentType": "image/jpeg" }, "unread": false, "readTime": 4493, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572499889443 }, { "originId": "tag:blogger.com,1999:blog-8954608646904080796.post-4991449931465752891", "fingerprint": "7d99be14", "thumbnail": [ { "url": "https://1.bp.blogspot.com/-rGjQOQb89a8/XbS25YYbgeI/AAAAAAAADUI/s8Q4e0pTtX4qSTP3wrkt13VGV53Q8J0tQCLcBGAsYHQ/s72-c/092.jpg", "width": 72, "height": 72 } ], "id": "v0v+7Ya8tssIZvd3/pcnFRr3HwvY/5YK3FGc2t65c0Y=_16e0a232509:17e32:d4506071", "updated": 1572124724480, "author": "Edward Feser", "alternate": [ { "href": "http://edwardfeser.blogspot.com/2019/10/john-paul-ii-in-defense-of-nation-and.html", "type": "text/html" } ], "crawled": 1572128105737, "title": "John Paul II in defense of the nation and patriotism", "published": 1572124680000, "origin": { "streamId": "feed/http://edwardfeser.blogspot.com/feeds/posts/default", "htmlUrl": "http://edwardfeser.blogspot.com/", "title": "Edward Feser" }, "content": { "direction": "ltr", "content": "
In chapters 11-15 of his last book Memory and Identity, Pope St. John Paul II provides a lucid exposition of the idea of the nation as a natural social institution and of the virtue of patriotism, as these have been understood in traditional natural law theory and Catholic moral theology.\u00a0 The relevance to current controversies will be obvious.

What is the nation, and what is patriotism?\u00a0 John Paul begins by noting the connection between the nation and the family, where the former is in a sense an extension of the latter:

The Latin word patria is associated with the idea and the reality of \u201cfather\u201d (pater).\u00a0 The native land (or fatherland) can in some ways be identified with patrimony \u2013 that is, the totality of goods bequeathed to us by our forefathers\u2026 Our native land is thus our heritage and it is also the whole patrimony derived from that heritage.\u00a0 It refers to the land, the territory, but more importantly, the concept of patria includes the values and spiritual content that make up the culture of a given nation. (p. 60)

As that last remark makes clear, the ties of blood are less important than those of culture.\u00a0 Indeed, multiple ethnicities can make up a nation.\u00a0 Referring to his native Poland, the pope notes that \u201cin ethnic terms, perhaps the most significant event for the foundation of the nation was the union of two great tribes,\u201d and yet other peoples too eventually went on together to comprise \u201cthe Polish nation\u201d (p. 77).\u00a0 It is shared culture, and especially a shared religion, that formed these diverse ethnicities into a nation:

When we speak of Poland\u2019s baptism, we are not simply referring to the sacrament of Christian initiation received by the first historical sovereign of Poland, but also to the event which was decisive for the birth of the nation and the formation of its Christian identity.\u00a0 In this sense, the date of Poland\u2019s baptism marks a turning point.\u00a0 Poland as a nation emerges from its prehistory at that moment and begins to exist in history.\u00a0 (p. 77)

That a shared culture is the key to understanding the nation is a theme John Paul emphasizes repeatedly throughout the book.\u00a0 He says that \u201cevery nation draws life from the works of its own culture\u201d (p. 83), and that:

The nation is, in fact, the great community of men who are united by various ties, but above all, precisely by culture.\u00a0 The nation exists\u00a0\u2018through\u2019 culture and \u2018for\u2019 culture\u00a0and it is therefore the great educator of men in order that they may \u2018be more\u2019 in the community\u2026

I am the son of a nation which\u2026 has kept its identity, and it has kept, in spite of partitions and foreign occupations, its national sovereignty, not by relying on the resources of physical power but solely\u00a0by relying on its culture. \u00a0This culture turned out, under the circumstances, to be more powerful than all other forces.\u00a0 What I say here concerning the right of the nation to the foundation of its culture and its future is not, therefore, the echo of any \u2018nationalism\u2019, but it is always a question of a stable element of human experience and of the\u00a0humanistic perspective of man's development.\u00a0 There exists a fundamental sovereignty of society, which is manifested in the culture of the nation. (p. 85)

In addition to shared values and religion, John Paul identifies shared history as another crucial aspect of a nation\u2019s identifying culture:

Like individuals, then, nations are endowed with historical memory\u2026 And the histories of nations, objectified and recorded in writing, are among the essential elements of culture \u2013 the element which determines the nation\u2019s identity in the temporal dimension.\u00a0 (pp. 73-74)

The pope notes that citizens of modern Western European countries often have \u201creservations\u201d about the notion of \u201cnational identity as expressed through culture,\u201d and have even \u201carrived at a stage which could be defined as \u2018post-identity\u2019\u201d (p. 86).\u00a0 There is \u201ca widespread tendency to move toward supranational structures, even internationalism\u201d with \u201csmall nations\u2026 allow[ing] themselves to be absorbed into larger political structures\u201d (p. 66).\u00a0 However, the disappearance of the nation would be contrary to the natural order of things:

Yet it still seems that nation and native land, like the family, are permanent realities.\u00a0 In this regard, Catholic social doctrine speaks of \u201cnatural\u201d societies, indicating that both the family and the nation have a particular bond with human nature, which has a social dimension.\u00a0 Every society\u2019s formation takes place in and through the family: of this there can be no doubt.\u00a0 Yet something similar could also be said about the nation. (p. 67)

And again:

The term \u201cnation\u201d designates a community based in a given territory and distinguished from other nations by its culture.\u00a0 Catholic social doctrine holds that the family and the nation are both natural societies, not the product of mere convention.\u00a0 Therefore, in human history they cannot be replaced by anything else.\u00a0 For example, the nation cannot be replaced by the State, even though the nation tends naturally to establish itself as a State\u2026 Still less is it possible to identify the nation with so-called democratic society, since here it is a case of two distinct, albeit interconnected orders.\u00a0 Democratic society is closer to the State than is the nation.\u00a0 Yet the nation is the ground on which the State is born. (pp. 69-70)

As this last point about the state and democracy indicates, a nation cannot be defined in terms of, or replaced by, either governmental institutions and their laws and policies on the one hand, or the aggregate of the attitudes of individual citizens on the other.\u00a0 It is something deeper than, and presupposed by, both of these things.\u00a0 It is only insofar as a nation, defined by its culture, is already in place that a polity can come into being.\u00a0 Hence it is a mistake to think that, if the common cultural bonds that define a nation disappear, the nation can still be held together by virtue of governmental policy either imposed from above or arrived at my majority vote.\u00a0 For a people have to be united by common bonds of culture before they can all see either governmental policy or the will of the majority as legitimate.\u00a0 (Readers familiar with the work of Roger Scruton will note the parallels, and how deeply conservative John Paul II\u2019s understanding of the nation is.)\u00a0

Now, as a natural institution, the nation, like the family, is necessary for our well-being.\u00a0 And as with the family, this entails a moral duty to be loyal to and to defend one\u2019s nation \u2013 and for precisely the same sorts of reasons one has a duty of loyalty to and defense of one\u2019s family:

If we ask where patriotism appears in the Decalogue, the reply comes without hesitation: it is covered by the fourth commandment, which obliges us to honor our father and mother.\u00a0 It is included under the umbrella of the Latin word pietas, which underlines the religious dimension of the respect and veneration due to parents\u2026

Patriotism is a love for everything to do with our native land: its history, its traditions, its language, its natural features.\u00a0 It is a love which extends also to the works of our compatriots and the fruits of their genius.\u00a0 Every danger that threatens the overall good of our native land becomes an occasion to demonstrate this love. (pp. 65-66)

Among the dangers to the nation are the opposite extreme economic errors of egalitarian statism and liberal individualism, which threaten to destroy the common culture that defines the nation \u2013 in the one case from the top down and in the other from the bottom up.\u00a0 The pope writes:

[W]e must ask how best to respect the proper relationship between economics and culture without destroying this greater human good for the sake of profit, in deference to the overwhelming power of one-sided market forces.\u00a0 It matters little, in fact, whether this kind of tyranny is imposed by Marxist totalitarianism or by Western liberalism. (pp. 83-84)

If liberal individualism is an error that pays insufficient respect to the nation, there is of course an opposite extreme error which involves giving excessive esteem to the nation \u2013 namely, nationalism.\u00a0 Patriotism, rightly understood, is the middle ground between these extremes:

Whereas nationalism involves recognizing and pursuing the good of one\u2019s own nation alone, without regard for the rights of others, patriotism, on the other hand, is a love for one\u2019s native land that accords rights to all other nations equal to those claimed for one\u2019s own. (p. 67)

John Paul II was clear that the remedy for nationalism was not to go to the opposite extreme (whether in the name of individualism, internationalism, or whatever), but rather precisely to insist on the sober middle ground:

How can we be delivered from such a danger?\u00a0 I think the right way is through patriotism\u2026 Patriotism, in other words, leads to a properly ordered social love. (p. 67)

Now, let\u2019s note a number of things about these remarks and their implications.\u00a0 First, as I have said, what the late pope was giving expression to here is not merely his personal opinion, but traditional natural law political philosophy and Catholic moral teaching \u2013 the kind of thing that would have been well known to someone formed in Thomistic philosophy and theology in the early twentieth century, as John Paul II was.

Second, John Paul\u2019s teaching implies that those who seek to preserve their nation\u2019s common culture, and for that reason are concerned about trends that might radically alter its religious makeup or undermine its common language and reverence for its history, are simply following a natural and healthy human impulse and indeed following out the implications of the fourth commandment.\u00a0 There is no necessary connection between this attitude and racism, hatred for immigrants, religious bigotry, or the like.\u00a0

Of course, a person who seeks to preserve his nation\u2019s culture might also be a racist or xenophobe or bigot.\u00a0 The point, however, is that he need not be, and indeed that it is wrong even to presume that he is, because a special love for one\u2019s own nation and desire to preserve its culture is a natural human tendency, and thus likely to be found even in people who have no racist or xenophobic or bigoted attitudes at all.\u00a0 Indeed, it is, again, even morally virtuous.\u00a0

Needless to say, there is also a moral need to balance this patriotism with a welcoming attitude toward immigrants, with respect for the rights of religious minorities, and so forth.\u00a0 The point, however, is that all of these things need to be balanced. \u00a0Too many contemporary Catholics, including some churchmen, have a tendency to emphasize only the latter while ignoring the former.\u00a0 They have a tendency to buy into the leftist narrative according to which the current wave of populist and patriotic sentiment in the United States and Western Europe is merely an expression of racism and xenophobia.\u00a0 This is deeply unjust, contrary to Catholic teaching, and politically dangerous.\u00a0 It is unjust and contrary to Catholic teaching because, again, both natural law and traditional moral theology affirm that a desire to preserve one\u2019s nation and its culture are natural human sentiments and morally praiseworthy.\u00a0 It is dangerous because, when governing authorities fail to respect and take account of these natural and decent human sentiments, they are inviting rather than preventing a nationalist overreaction.

(President Trump has famously called himself a \u201cnationalist,\u201d which is unfortunate given the connotations of that term.\u00a0 However, from his 2019 address to the United Nations it seems clear that what he means by this is just the defense of the institution of the nation against those who would dissolve it in the name of globalism, open borders, etc.\u00a0 Moreover, he explicitly affirmed the right of every nation to preserve itself and its sovereignty, and the right of everyhuman being to have a special patriotic love and preference for his own country.\u00a0 He also has repeatedly called for the United States to refrain from intervening in the affairs of other nations.\u00a0 So it is evident that it is really just patriotism in the sense described above, rather than some sort of American nationalism, that he intends to promote.)

The current controversy over illegal immigration must be understood in light of these principles.\u00a0 In a 1996 message on World Migration Day, John Paul II emphasized the need to welcome migrants, to take account of the dangerous circumstances they are sometimes fleeing, to avoid all racist and xenophobic attitudes, and so on.\u00a0 At the same time, he acknowledged that \u201cmigration is assuming the features of a social emergency, above all because of the increase in\u00a0illegal migrants\u201d (emphasis in the original), and that the problem is \u201cdelicate and complex.\u201d\u00a0 He affirmed that \u201cillegal immigration should be prevented\u201d and that one reason it is problematic is that \u201cthe supply of foreign labour is becoming excessive in comparison to the needs of the economy, which already has difficulty in absorbing its domestic workers.\u201d\u00a0 And he stated that in some cases, it may be necessary to advise migrants \u201cto seek acceptance in other countries, or to return to their own country.\u201d

The Catechism promulgated by Pope John Paul II teaches that:

The more prosperous nations are obliged, to the extent they are able,to welcome the\u00a0foreigner\u00a0in search of the security and the means of livelihood which he cannot find in his country of origin. Public authorities should see to it that the natural right is respected that places a guest under the protection of those who receive him.

Political authorities, for the sake of the common good for which they are responsible, may make the exercise of the right to immigrate subject to various juridical conditions, especially with regard to the immigrants' duties toward their country of adoption. Immigrants are obliged to respect with gratitude the material and spiritual heritage of the country that receives them, to obey its laws and to assist in carrying civic burdens.\u00a0 (Emphasis added)

End quote.\u00a0 Note that the Catechism teaches that immigrants have a duty to respect the laws and \u201cspiritual heritage\u201d of the nation they seek to enter, and that political authorities may restrict immigration so as to uphold the \u201ccommon good\u201d of the nation they govern.\u00a0

Hence, there is no foundation in Catholic teaching for an open borders position, or for the position that those who seek to uphold the common culture and economic interests of their nation ought to be dismissed as racists and xenophobes.\u00a0 On the contrary, Catholic teaching explicitly rules out those positions.\u00a0

There is a further implication of John Paul II\u2019s teaching.\u00a0 It isn\u2019t merely that having a special love for one\u2019s nation and its culture is natural and virtuous.\u00a0 It is that a failure to have it is vicious \u2013 a violation of the fourth commandment.

Of course, every nation has its faults, and aspects of its history of which one ought to be ashamed.\u00a0 For example, Germans are right to repudiate the Nazi period of their history, and Americans are right to repudiate slavery and segregation.\u00a0 But there is a mentality prevalent in the modern West that goes well beyond that \u2013 that insists on seeing nothing but evil in one\u2019s own nation and its culture and history.\u00a0 This is the mentality sometimes called oikophobia \u2013 the hatred of one\u2019s own \u201chousehold\u201d (oikos), in the sense of one\u2019s own nation.\u00a0 One sees this mentality in Westerners who shrilly and constantly denounce their civilization as irredeemably racist, colonialist, etc., downplaying or denying its virtues, and comparing it unfavorably to other cultures \u2013 as if Western culture is somehow more prone to such failings than other cultures are, and as if it hasn\u2019t contributed enormously to the good of the world (both of which are absurd suppositions).

Oikophobia is evil.\u00a0 It is a spiritual poison that damages both those prone to it (insofar as it makes them bitter, ungrateful, etc.) and the social order of which they are parts (insofar as it undermines the love and loyalty citizens need to have for their nation if it is to survive).\u00a0 It is analogous to the evil of hating and undermining one\u2019s own family.\u00a0 It is a violation of the fourth commandment.

The oikophobe sees his position as a remedy for nationalism, but in fact he is simply guilty of falling into an error that is the opposite extreme from that of the nationalist.\u00a0 Moreover, he is inadvertently promoting nationalism, because human beings have a tendency to overreact to one extreme by going too far in the other direction.\u00a0 Nationalism is bound to arise precisely as an overreaction against oikophobia.\u00a0 Those who are currently reacting to what they perceive as a resurgent nationalism by doubling down on oikophobia \u2013 pushing for open borders, indiscriminately denouncing their opponents as racists and xenophobes, etc. \u2013 are making a true nationalist backlash more likely, not less likely.\u00a0 The only true remedy for the evils of nationalism and oikophobia is, as John Paul II taught, the sober middle ground of patriotism.

It is no accident that those prone to oikophobia tend to be precisely the same people as those who want to push further the sexual revolution, feminism, and the destruction of the traditional family and traditional sex roles that these entail.\u00a0 The same liberal individualist poison is at the core of all of these attitudes.\u00a0 As St. John Paul II said, \u201cpatria is associated with the idea and the reality of \u2018father\u2019 (pater).\u201d\u00a0 Hatred of masculinity and of the paternal authority and responsibilities that are its fulfilment, hatred of the traditional family and of the sexual morality that safeguards it, and hatred of one\u2019s fatherland, are ultimately of a piece.\u00a0 And lurking beneath them all is a deeper hatred for another, heavenly Father.

Further reading:

Liberty, equality, fraternity?

Continetti on post-liberal conservatism

Hayek\u2019s Tragic Capitalism
" }, "visual": { "url": "none" }, "unread": true, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/7badfd54-6d65-421b-9a23-93dec726a308", "label": "Test for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/fbdcd69b-7e27-4b6a-bfed-6584b944155d", "label": "\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb\ud83e\udd1e\ud83c\udffb" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572499824479 }, { "originId": "https://www.raywenderlich.com/5436806-modern-collection-views-with-compositional-layouts", "fingerprint": "16268498", "id": "RFlzskW4NhJjlZfijOSI8IXqM9+zz6V9qnDVl1gxaJs=_16e1cddfaa1:1c015:d4506071", "updated": 1572440368000, "summary": { "direction": "ltr", "content": "In this tutorial, you\u2019ll learn how to build beautiful, modern UICollectionView layouts using iOS 13\u2019s new declarative UICollectionViewCompositionalLayout API." }, "alternate": [ { "href": "https://www.raywenderlich.com/5436806-modern-collection-views-with-compositional-layouts", "type": "text/html" } ], "crawled": 1572442340001, "title": "Modern Collection Views with Compositional Layouts [FREE]", "published": 1572440368000, "origin": { "streamId": "feed/http://www.raywenderlich.com/feed", "htmlUrl": "http://www.raywenderlich.com/feed", "title": "Ray Wenderlich | High quality programming tutorials: iOS, Android, Swift, Kotlin, Unity, and more" }, "unread": false, "readTime": 3593, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/885f2e01-d314-4e63-abac-17dcb063f5b5", "label": "Programming" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572499811331 }, { "originId": "https://inessential.com/2019/10/30/etas_follow_up", "fingerprint": "d48dc2d2", "id": "+jHfsXnBCVfCstSIW1WDumAyigT4rnsUPnI5WFxgnAU=_16e1e5e8e9e:1ca95:d4506071", "summary": { "direction": "ltr", "content": "

Some people took my post No ETAs as if I were arguing against doing software estimates of any kind, ever.

\n

I didn\u2019t actually mean that. If your boss, project manager, or person you\u2019re contracting with asks for an estimate, do your best to come up with something accurate. If you\u2019re writing enterprise software, you may even be contractually bound to provide estimates for when features will ship.

\n

There are ways to get pretty good at this. Pay attention to history and avoid wishful thinking. Don\u2019t assume perfect productivity. Allow for the unexpected, because there\u2019s always something.

\n

What I\u2019m talking about is the case where you\u2019re writing a consumer-facing app \u2014\u00a0something that would get published on an app store, for instance \u2014\u00a0and customers or potential customers ask about an ETA for a given feature. Don\u2019t do it! (For the reasons stated in the article.)

" }, "alternate": [ { "href": "https://inessential.com/2019/10/30/etas_follow_up", "type": "text/html" } ], "crawled": 1572467543710, "title": "ETAs: Follow-Up", "published": 1572466202000, "origin": { "streamId": "feed/http://ranchero.com/xml/rss.xml", "htmlUrl": "https://inessential.com/", "title": "inessential.com" }, "unread": false, "readTime": 6552, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/b35dbac9-ed46-4c6f-ab82-6798caa6b43d", "label": "Another for NetNewsWire" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/66132046-6f14-488d-b590-8e93422723c8", "label": "THree" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572499788300 }, { "keywords": [ "Apple" ], "originId": "https://9to5mac.com/?p=617593", "fingerprint": "a1dafaae", "id": "BmoAzSEWHFzR01wyxBZAhNEo11Vy8oDR1qKDe+tKVEQ=_16e1de23321:1c6e3:d4506071", "author": "Guilherme Rambo", "summary": { "direction": "ltr", "content": "
\n

Rumors about a new 16-inch MacBook Pro are not exactly new, with recent icon evidence found in macOS Catalina betas suggesting the redesign mentioned in some reports is not going to happen as we thought.

\n

more\u2026

\n

The post Exclusive: 16-inch MacBook Pro Touch Bar and Touch ID layout confirmed appeared first on 9to5Mac.

" }, "alternate": [ { "href": "https://9to5mac.com/2019/10/30/exclusive-16-inch-macbook-pro-touch-bar-and-touch-id-layout-confirmed/", "type": "text/html" } ], "crawled": 1572459393825, "title": "Exclusive: 16-inch MacBook Pro Touch Bar and Touch ID layout confirmed", "published": 1572456327000, "origin": { "streamId": "feed/http://9to5mac.com/feed/", "htmlUrl": "https://9to5mac.com", "title": "9to5Mac" }, "unread": false, "readTime": 3947, "categories": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/5ca4d61d-e55d-4999-a8d1-c3b9d8789815", "label": "Macintosh" } ], "tags": [ { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.read", "label": "" }, { "id": "user/f2f031bd-f3e3-4893-a447-467a291c6d1e/tag/global.saved", "label": "Saved For Later" } ], "actionTimestamp": 1572499186128 } ] }