{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","updated":1569830765949,"continuation":"16d74074eb8:2058:90d684ff","items":[{"originId":"https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/","fingerprint":"3edfc038","id":"AVw5dsyytPMMU/iCsYRiYJstfLF5CXoDiC5tFHJ2Gfk=_16d8134857d:4da39:18991ffa","author":"keith@useyourloaf.com (Keith Harrison)","summary":{"direction":"ltr","content":"

Laying out a scroll view is a confusing task. I found it easier when, in iOS 11, Apple introduced frame and content layout guides. Too bad they neglected to add them to Interface Builder. That changed in Xcode 11. Here’s a quick guide on how to use them.

\n

Why Are Scroll View Layouts So Hard?

\n

For a recap on why scroll views are confusing and how the frame and content layout guides help see this earlier post on easier scrolling with layout guides. Here’s the layout I built in code using layout guides:

\n

\"Scrolling

\n

You need two groups of constraints to layout a scroll view:

\n\n

Building my layout with Interface Builder and Xcode 10 I might end up with constraints like this:

\n

\"Constraining

\n
    \n
  1. Four constraints pin the scroll view to the edges of the root view, fixing its frame.
  2. \n
  3. Four constraints between the stack view and the scroll view pin the content to the scroll view content area.
  4. \n
  5. The width of the stack view is fixed to the width of the scroll view frame.
  6. \n
\n

I never found this to be very intuitive:

\n\n

The introduction of the frame and content layout guides in iOS 11 promised to make things clearer. Unfortunately, Apple neglected to add support for them in Interface Builder.

\n

What Changed In Xcode 11

\n

From the Xcode 11 release notes:

\n
\n

Content and Frame Layout guides are supported for UIScrollView and can be enabled in the Size inspector for more control over your scrollable content. (29711618)

\n
\n

The content and frame layout guides are enabled by default in Xcode 11 when you drag a new scroll view into the canvas:

\n

\"Scroll

\n

You can enable them for an older layout using the size inspector:

\n

\"Enable

\n

The best way to explain how to use them is with an example.

\n

Using The New Layout Guides In Interface Builder

\n

Let’s build the previous layout in Interface Builder using the content layout guides:

\n
    \n
  1. To get started I have arranged the content for my layout in a vertical stack view that I have embedded in a scroll view in Interface Builder:

    \n

    \"Embedded

  2. \n
  3. Let’s fix the size and position of the scroll view by pinning it to the edges of the root view. I find that easier to do if you first hide the safe area layout guide for the root view (using the size inspector):

    \n

    \"Hide

    \n

    Select the scroll view and then use the “Add New Constraints” tool to add the four constraints between the scroll view and the edges of the root view:

    \n

    \"Pin

    \n

    Check the constraints in the navigator to make sure you’re not using the safe area or accidentally adding padding to any of the constraints:

    \n

    \"Scroll

  4. \n
  5. We want to pin the stack view to the edges of the content area. Control-drag from the stack view to the Content Layout Guide:

    \n

    \"Using

    \n

    Then add the four constraints to pin each edge of the stack view to the guide:

    \n

    \"Constraints

    \n

    Check the constraints in the navigator:

    \n

    \"Content

  6. \n
  7. I don’t want the layout to scroll horizontally so I also need to fix the width of the content area to match the width of the scroll view frame. It’s not possible to create an equal width constraint between the content and frame layout guides in Interface Builder. Instead, control-drag from the stack view to the frame layout guide:

    \n

    \"Using

    \n

    Then add an equal widths constraint:

    \n

    \"Equal

    \n

    The final set of nine constraints using both the content and frame layout guides:

    \n

    \"Completed

  8. \n
\n

What’s Still Missing?

\n

I don’t want to complain. It’s good to see the content layout guides show up in Interface Builder. It’s been two years since they were introduced with iOS 11 but better late than never. To complete the picture I’d like to see Apple also expose the layout margin guide for the scroll view.

\n

Sometimes you want a view that remains fixed in the scroll view frame so that it floats over the scrollable content. For example, the info button in my previous example remains fixed in the top-left corner when the content scrolls:

\n

\"Info

\n

The frame layout guide doesn’t help in this case as it extends into the safe area behind the navigation bar. I created constraints in code to fix the button to the layout margins guide of the scroll view:

\n
infoButton.leadingAnchor.constraint(equalTo:\n           scrollView.layoutMarginsGuide.leadingAnchor),\ninfoButton.topAnchor.constraint(equalTo:\n           scrollView.layoutMarginsGuide.topAnchor)\n
\n

If you try to do that in Interface Builder the constraints are assumed to be with the content area so the button scrolls with the content. The closest you can get is to use the safe area layout guide of the scroll view (enable it in the size inspector) with some extra padding:

\n

\"Scroll

\n

See The Code

\n

You can find the code for this post in my Code Examples GitHub repository. You can compare it to the original ScrollGuide project which builds the layout in code.

\n

Read More

\n
\n

\nScroll View Layouts With Interface Builder was originally posted 16 Sep 2019 on useyourloaf.com.\n

\n

Want this direct to your inbox? Sign up and get my free iOS Size Classes guide.\n

\n
"},"alternate":[{"href":"https://useyourloaf.com/blog/scroll-view-layouts-with-interface-builder/","type":"text/html"}],"crawled":1569830765949,"title":"Scroll View Layouts With Interface Builder","published":1568624542000,"origin":{"streamId":"feed/http://useyourloaf.com/blog/rss.xml","htmlUrl":"https://useyourloaf.com/blog/","title":"Use Your Loaf - iOS Development News & Tips"},"visual":{"url":"http://b.vimeocdn.com/ts/442/609/442609877_1280.jpg","width":1280,"height":720,"contentType":"image/jpeg"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"https://useyourloaf.com/blog/editing-a-swift-package/","fingerprint":"1299da46","id":"AVw5dsyytPMMU/iCsYRiYJstfLF5CXoDiC5tFHJ2Gfk=_16d8134857d:4da38:18991ffa","author":"keith@useyourloaf.com (Keith Harrison)","summary":{"direction":"ltr","content":"

When I want to make changes to a Swift package, I find it useful to do it in the context of a project that depends on that package. Unfortunately, you can’t directly edit a Swift package you add as a dependency to an Xcode project. It’s read-only and managed by Xcode. What you can do is add a local copy of the package that overrides the package dependency.

\n

Swift Package Dependencies

\n

I previously covered creating Swift packages in Xcode 11 and then adding them as a dependency to a project. Xcode downloads the package files from the remote repository:

\n

\"Xcode

\n

You can browse the source files in the package, but you cannot edit them in Xcode (which is probably for the best).

\n

Editing A Standalone Package

\n

You always have the option to clone the package repository to a new folder:

\n
$ git clone <URL of Git repository>\n
\n

\"Finder

\n

You can then open the Package.swift file in Xcode and work on the package directly:

\n

\"Package

\n

After you’ve made your changes, commit the package back to the remote repository.

\n

This is cumbersome if you want to try your updated package with an existing Xcode project. To get Xcode to download the updates from the remote repository you either need to tag the commit with a new version or change the project dependencies to refer to the specific commit:

\n

\"Package

\n

Luckily, there’s a better way.

\n

Editing A Local Copy

\n
    \n
  1. Clone the package repository to a local directory as before.

  2. \n
  3. Drag the whole folder into the Xcode project that has a dependency on the package:

  4. \n
  5. Xcode overrides the package dependency with the same name as the local package. Notice in the screenshot how the Swift Package dependency disappears from the file navigator.

    \n

    \"File

  6. \n
  7. Make your changes to the local package and test them with the project before pushing the changes to the remote repository.

  8. \n
  9. Release the changes by tagging the commit and then pushing the tag:

    \n

    \"Push

  10. \n
\n

To switch back to using the remote package:

\n
    \n
  1. Delete the local copy of the package from the project.

  2. \n
  3. Make Xcode update the package dependencies File > Swift Packages > Update To Latest Package Versions.

  4. \n
  5. You should now see the latest version of the remote package in the file navigator:

    \n

    \"Updated

  6. \n

\n

\nEditing A Swift Package was originally posted 19 Aug 2019 on useyourloaf.com.\n

\n

Want this direct to your inbox? Sign up and get my free iOS Size Classes guide.\n

\n
"},"alternate":[{"href":"https://useyourloaf.com/blog/editing-a-swift-package/","type":"text/html"}],"crawled":1569830765949,"title":"Editing A Swift Package","published":1566205065000,"origin":{"streamId":"feed/http://useyourloaf.com/blog/rss.xml","htmlUrl":"https://useyourloaf.com/blog/","title":"Use Your Loaf - iOS Development News & Tips"},"visual":{"url":"http://b.vimeocdn.com/ts/442/609/442609877_1280.jpg","width":1280,"height":720,"contentType":"image/jpeg"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"keywords":["Tech Life"],"originId":"https://randsinrepose.com/?p=4326","fingerprint":"84f0fac2","id":"xoPmejgsoSEqDaFR4LV9EjzHAN8HPWA8MceMFxcQR3k=_16d812a78cb:4da16:18991ffa","author":"rands","summary":{"direction":"ltr","content":"(Ok, first hit play on the above video. This article has a soundtrack.) In World of Warcraft, Darkshore is the first major city outside of the Night Elf starting area and stands in dark contrast to the mystical and deeply saturated pink realm of Teldrassil. It’s where you discover that the game is full of… More"},"alternate":[{"href":"https://randsinrepose.com/archives/ok-im-in-darkshore-and-it-just-started-raining/","type":"text/html"}],"crawled":1569830107339,"title":"Ok, I’m in Darkshore, and It Just Started Raining","published":1569074623000,"origin":{"streamId":"feed/http://www.randsinrepose.com/index.xml","htmlUrl":"https://randsinrepose.com","title":"Rands in Repose"},"content":{"direction":"ltr","content":"

\n

(Ok, first hit play on the above video. This article has a soundtrack.)

\n

In World of Warcraft, Darkshore is the first major city outside of the Night Elf starting area and stands in dark contrast to the mystical and deeply saturated pink realm of Teldrassil. It’s where you discover that the game is full of many people of many races. I’ve spent just over twenty hours in the game over a week, I’m crossing level 17, and it just started raining.

\n

As part of their fifteenth anniversary, Blizzard released the original “vanilla” version of World of Warcraft (“WoW”). This release represents the initial version of the wildly popularly MMO that consumed years of my life. There is a service on the internet that will tell me precisely the number of hours, days, weeks, and years I’ve already spent on WoW, but there is no way I’m going to look because if the total time played isn’t years, it’s undoubtedly months and months.

\n

For me, the act of purchasing and installing Vanilla was a multi-week agonizing process. I’d log into Battle.net, move my mouse cursor over the Subscribe Now button and sit there. Am I ready for this? Do you remember how much time you spent raiding Molten Core? How about Zul’Gurab? Years. Do you need more missing months?

\n

But I had to know. Having played most of the subsequent releases of WoW and watched how the game evolved, I wanted to see if the original spark, the unique hook, was still there. Sure, I was nostalgic, but was the grind going to be worth it?

\n

It is.

\n

A Punishing Grind

\n

Everything and I mean everything is a grind in Vanilla WoW whether it’s increasing your base level, your professions, and/or your secondary skills. Nothing comes from free. You must devote significant time to any attribute you want to grow, and that means finding resources and converting them into useful goods that you either use or sell.

\n

I choose leather-working as one of my professions which pairs nicely with my other profession: skinning. Efficient, right? Skin the animals that I kill and turn those skins into useful materials. Sure, except this is Vanilla where drop rates for many items are anemic. Need five bear skins? Ok, go kill 50 or so bears. Where are these bears? Well, there’s a bunch in the north part of Darkshore which is a five-minute walk or I can head south where there are more bear clusters, but that’s more like a ten-minute walk. No fast travel, no mounts, I need to point my Night Elf south and walk down a forest path for ten minutes… in the rain.

\n

Yes, there are other quests to do on my long walk to the bear massacre, but these quests contain the same DNA as the rest of Vanilla. Nothing for free plus an enormous grind. Lengthy collection quests with frustratingly low drop rates. Oh yeah, did I mention that if I leave a level-appropriate area, I’m going to die? The moment I run into an over-leveled baddie, I’m dead. When this happens (and it will), I appear as a ghost at a usually not nearby cemetery where I am required to run back to my corpse where I will likely to die again at the hands (claws, paws, whatever…) of the same vastly overpowered baddie.

\n

How is any of this fun?

\n

Conspicuously Helpful and Painfully Kind

\n

WoW is a profoundly complex puzzle, and puzzles are meant to be solved. My first week of grind in Vanilla was vastly more satisfying than my first week over a decade ago because I intimately know how this puzzle is constructed. I rolled a hunter because I am clear how a hunter works. I’m ranged damage, I need a pet as quickly as possible because my melee attack sucks, and I need to become adept at managing that pet so that I don’t die so I can avoid long ghost walks.

\n

I am space constrained. Bags are worth their weight in gold, but I have no gold. I have bronze coins which with a ton of work will become silver coins which eventually will become gold coins. I’m going to need 100 of these hard to earn gold coins when I hit level 40, so I can purchase a mount and travel efficiently. I’m level 18 now. I have 22 silver and 81 bronze. I am forever away from 100 gold coins.

\n

And then, standing there in the rain in Darkshore, a random Dwarf walks up next to me, opens the trade window, and gives me a bag. For free. No commentary, no requests, just a free bag in the middle of the forest. I bow. He walks off.

\n

Oh right…

\n

Now, I’m standing outside of this cave, and it’s a cave full of quest-necessary mushrooms protected by fish-like creatures named Naga. I remember this cave from years ago because I spent hours of my life ghost walking back to this cave after being swamped by Naga. I did not know what I know now that just about everything is easier with others in WoW. Social connections are encouraged, so the moment I see a friendly player I request to join forces, and they accept. We competently charge into the cave and quickly overpower the Naga.

\n

Oh, right… people are helpful in this game.

\n

When it became clear to me the I was going to play Vanilla, I searched the internet from remnants of my old guild, Liquid Courage because those humans were why I devoted time to this game. A bunch of gaming strangers building a helpful community. The reason the ten-year-old game was so familiar to me was because of those helpful mostly anonymous humans who took the time to explain how it worked, how to optimize my play, and how to work together to solve this punishing grind.

\n

Oh, right… people are helpful in this game. The community is what made this game great. Conspicuously helpful and painfully kind.

\n

Darkshore is a Place… To Me

\n

Liquid Courage is still a guild on Cenarius, one of the many realms on the latest World of Warcraft. I recently logged in quietly to see familiar names there. I found the guild on Facebook, too. Familiar names were now playing with children who were yet born the last time we charged into Zul’Gurab seeking the heart of Hakkar.

\n

When I started playing WoW, there was no rain. It was an effect that was added in a later patch. I do remember the moment I first saw and heard the rain. I wasn’t in Darkshore; I was in the Arathi Highlands – a different continent. I don’t remember if I was level 60, yet, but I remember when it started raining. I was questing with a guild-members. Did we need spiders? Maybe?

\n

It just started raining, and we celebrated the digital rain.

"},"visual":{"url":"none"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"keywords":["Advice","Development","Opinion"],"originId":"https://furbo.org/?p=2411","fingerprint":"1953a570","id":"6IpDVPJg6aqZjbDgAeUFNoin2kWUje5qGrfJkJShV7Q=_16d81299bad:4da11:18991ffa","author":"Craig Hockenberry","summary":{"direction":"ltr","content":"Luckily, I don’t have to use this kind of title often. But when I do, there’s a good reason: this year’s beta release cycle for all of Apple’s operating systems has been a mess. The months since WWDC in June have been a terrible experience for both customers and developers alike and the literal center […]"},"alternate":[{"href":"https://furbo.org/2019/09/04/icloud-clusterfuck/","type":"text/html"}],"crawled":1569830050733,"title":"iCloud Clusterfuck","published":1567623053000,"origin":{"streamId":"feed/http://furbo.org/feed/","htmlUrl":"https://furbo.org","title":"furbo.org"},"content":{"direction":"ltr","content":"

Luckily, I don’t have to use this kind of title often. But when I do, there’s a good reason: this year’s beta release cycle for all of Apple’s operating systems has been a mess. The months since WWDC in June have been a terrible experience for both customers and developers alike and the literal center of the chaos was Apple’s iCloud syncing service.

\n

For us, it all started with customers reporting lost Linea sketches in their iCloud Drive. Initial investigations led to a common factor: all of the people affected had installed the iOS 13 beta release.

\n

And when I say lost, I mean really lost. Entire folders were either gone or corrupted. Apple’s mechanism to recover deleted files was of no help. The customers with weird folder duplicates were the “lucky” ones.

\n

We couldn’t find any problems in our code and there was no information from Apple about problems with iCloud, so we did the only thing possible: we blocked people from using Linea on iOS 13. If a customer absolutely needed the app, we got them onto TestFlight after a stern warning about the real possibility of losing data.

\n

A few weeks later, Apple finally indicated that there were some issues with iCloud and the beta release. In the same week, they released a public beta and sent out an email to customers encouraging them to try out iOS 13.

\n

We did our best to understand the situation and provide information to Apple, but it felt like we were tossing bug reports into a black hole. The most discouraging part was when we tried to open an incident with Apple Developer Technical Support (DTS). After writing up a detailed report, we were informed that they don’t support beta releases!

\n

By the time beta 6 rolled around, things were improving, but there were still isolated reports that the service might not be completely back in working order. Confirming the fixes on our end was impossible: the folks who’d encountered the previous data loss had no desire to mess with iCloud again.

\n

Now it appears that the entire stack is getting rolled back and there won’t be new iCloud features in iOS 13 (at least initially.) I honestly think that’s the wisest course of action at this point. My only wish is that Apple would make an official statement.

\n

Now that we’re past the worst of it, it’s time to think about why this whole episode happened and how it can be prevented in the future.

\n

Folks don’t understand beta

\n

Apple’s biggest fuck up was a bad assumption about who is testing a beta release. In WWDC presentations and developer documentation, there’s always warnings about using the release on non-production devices and only with test accounts.

\n

But there are many folks that are just looking to get the new and shiny features. In past iOS beta releases, Apple hasn’t suffered too much from this because the early software was relatively stable. Maybe you got some dropped calls or bad battery life, but it was nothing too serious.

\n

These early adopters installed iOS 13 and expected a similar experience. They also weren’t using an iCloud test account, so any instability in the beta release propagated bad data to their other devices.

\n

Developers have long known to unhook external drives when testing a new OS release. Shit happens, and that’s OK because it’s a beta and we expect a bumpy road. In fact, I currently have an external Photos Library that I can’t use in Mojave because it got upgraded when I booted into Catalina: it’s my dumb mistake and I have no complaints.

\n

Anyone who’s not a developer, and hasn’t been burned by a bad OS, does not know the kind of trouble that lies ahead. It’s irresponsible for Apple to release a public beta with known issues in iCloud. It’s doubly egregious to then promote that release with an email campaign to customers. For a company that prides itself in presenting a unified front, it sure looks like the left hand doesn’t know what the right hand is doing.

\n

Disconnect iCloud by default

\n

The solution to this situation is relatively simple, but with painful consequences. Apple needs to help unwitting customers by automatically disconnecting that external hard drive called iCloud.

\n

If a device is using an Apple ID that’s also being used on a non-beta device, then iCloud shouldn’t be allowed. If you install an iOS beta on your iPad, it doesn’t get to use any cloud services because it puts the data on your iPhone or Mac at risk.

\n

Of course, once this restriction is put into place, Apple will quickly realize that no one is testing iCloud or anything that touches it. If a beta tester can’t have their contacts, synced notes, reminders, and appointments over the course of three months, they’re not going to be testing much. I’d also expect to see lots of guides on “How to Get Back on Normal iOS” around the web.

\n

But there’s a better, and even more unlikely solution…

\n

iCloud can’t be a beta

\n

Because it’s a service, iCloud doesn’t get to go into beta. It needs to be reliable all the time, regardless of whether iOS or any other platform is in beta test.

\n

As it is now, Apple is effectively telling you that your storage device will be unreliable for a few months. It’s like having a hard drive where the manufacturer tells you it won’t work well for ¼ of the year. Would you purchase storage with a caveat that “the drive mechanism may not work properly during the hot summer months”?

\n

You don’t see these kinds of issues with Google Drive or Dropbox because they don’t get a pass while an OS is being tested. Dropbox moved your folders from AWS to their own servers without you noticing even the slightest hiccup. Compare this to the last three months of iCloud in beta.

\n

And yes this is a hard task: akin to swapping out the engines of an airplane in mid-flight. But data services, like hard drives, must work all the time.

\n

We’re well past that point with iCloud and it’s just going to get worse as Apple moves more of our data there. This time next year, will I suddenly not know which episodes I’ve watched on Apple TV? Or will I suddenly lose all my scores and achievements in Apple Arcade? Will I shoot myself in the foot with some cool new feature in iOS 14?

\n

Unfortunately for Apple, breaking iCloud away from the OS isn’t a simple problem to solve. It’s not a technical challenge as much as it is an organizational one: a move from a functional form to a divisional one.

\n

So while we all dream of an OS release roadmap to ease the transition to new features, Apple needs to give some very close to attention to the underlying services that would enable that new way of working.

\n

The lack of substantive communication about iCloud’s problems this summer shows how far the company has to go in that regard. You can’t use a roadmap without letting people know about your successes and failures. There will be wrong turns, and you can’t continue on in silence when people depend on the service’s reliability.

\n

iCloud gives data a bad name

\n

As a developer whose job requires frequent beta installations, this year’s problems with Apple’s service has brought something clearly into focus: as much as I love the functionality that iCloud provides, I cannot put my valuable data at risk.

\n

And you can bet your ass that I have a new backup strategy for anything that’s in iCloud Drive. (Hint: rsync and ~/Library/Mobile Documents.)

\n

As an Apple shareholder, I also worry about how these failures will damage the iCloud brand. Apple’s growth hinges on services and when they get a bad name, the stock price can only go one way. There is only one brand that people think of when you mention “click of death”.

\n

I sincerely hope that Apple can address these issues, because I love the idea of services that focus on simplicity and privacy. I know my last clusterfuck memo got some notice within the company, and I hope this one does as well.

"},"visual":{"url":"none"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"keywords":["Development"],"originId":"https://furbo.org/?p=2384","fingerprint":"6abb6e16","id":"6IpDVPJg6aqZjbDgAeUFNoin2kWUje5qGrfJkJShV7Q=_16d81299bad:4da10:18991ffa","author":"Craig Hockenberry","summary":{"direction":"ltr","content":"We recently started updating our macOS apps for Catalina: so far there have been very few issues with APIs and frameworks. The biggest hurdle has been the new notarization process that’s required for apps signed with a Developer ID: customers will be unable to download and launch your product easily until this step is completed. […]"},"alternate":[{"href":"https://furbo.org/2019/08/16/catalina-app-notarization-and-sparkle/","type":"text/html"}],"crawled":1569830050733,"title":"Catalina, App Notarization, and Sparkle","published":1565997404000,"origin":{"streamId":"feed/http://furbo.org/feed/","htmlUrl":"https://furbo.org","title":"furbo.org"},"content":{"direction":"ltr","content":"

We recently started updating our macOS apps for Catalina: so far there have been very few issues with APIs and frameworks. The biggest hurdle has been the new notarization process that’s required for apps signed with a Developer ID: customers will be unable to download and launch your product easily until this step is completed.

\n

Notarization involves an extra step in your build process: you upload an archived binary to Apple’s server with Xcode’s Organizer window and a short time later, you can export the binary. If you’ve automated your build process, you’ll need to make changes to your scripts to accommodate this new manual step. Apple’s documentation explains the process well.

\n

Before you can notarize the app, you’ll need to enable the hardened runtime in the target’s Capabilities panel. After flipping the switch you’ll see a array of exceptions and access permissions. You’ll want to survey this list carefully: for one product we needed Apple Events, for another Location was required.

\n

Things start to get tricky when you go to upload the binary: if you’re using Sparkle, it’s probably been codesigned without the hardened runtime, so you’ll immediately see an error.

\n

Sparkle Without a Sandbox

\n

How you deal with this error depends on which of the Sparkle versions you’re using. If your app isn’t sandboxed, your life will be a bit simpler because there are fewer things you’ll need to sign manually.

\n

After the target’s Copy Files build phase where the Sparkle.framework is moved into the application package, you’ll need to create a new Run Script step: I called ours “Sign Frameworks”. The script looks like this:

\n
\nLOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"\nIDENTITY=${EXPANDED_CODE_SIGN_IDENTITY_NAME}\n\ncodesign --verbose --force --deep -o runtime --sign "$IDENTITY" "$LOCATION/Sparkle.framework/Versions/A/Resources/AutoUpdate.app"\ncodesign --verbose --force -o runtime --sign "$IDENTITY" "$LOCATION/Sparkle.framework/Versions/A"\n
\n

The key part in this step is the -o runtime. The codesign manual page describes this flag as:

\n

\nOn macOS versions >= 10.14.0, opts signed processes into a hardened runtime environment which includes runtime code signing enforcement, library validation, hard, kill, and debugging restrictions. These restrictions can be selectively relaxed via entitlements. Note: macOS versions older than 10.14.0 ignore the presence of this flag in the code signature.\n

\n

The good news here is that the build changes we’re making won’t affect your app when it runs on an older version of macOS.

\n

Sparkle in a Sandbox

\n

If your macOS app is in a sandbox, you’ll be using the version that relies on XPC services to perform the update. Like everything else in your application package, these will need to be signed correctly before you can submit your app for notarization.

\n

The “Sign Frameworks” build phase should look like this:

\n
\nLOCATION="${BUILT_PRODUCTS_DIR}"/"${FRAMEWORKS_FOLDER_PATH}"\nIDENTITY="${EXPANDED_CODE_SIGN_IDENTITY}"\n\ncodesign --verbose --force -o runtime --sign "$IDENTITY" "$LOCATION/Sparkle.framework/Versions/A/Resources/AutoUpdate"\ncodesign --verbose --force --deep -o runtime --sign "$IDENTITY" "$LOCATION/Sparkle.framework/Versions/A/Resources/Updater.app"\ncodesign --verbose --force -o runtime --sign "$IDENTITY" "$LOCATION/Sparkle.framework/Versions/A"\n
\n

You’ll also add a new Run Script build phase just before the XPC Services are embedded in your application package. Since you’ll only need to do this for release builds, the script looks like this:

\n
\nif [ "${CONFIGURATION}" = "Release" ]; then\n    $PROJECT_DIR/Sparkle/bin/codesign_xpc "Developer ID Application" $BUILT_PRODUCTS_DIR/*.xpc\nfi\n
\n

But wait, we’re not done yet! You’ll also need to update the codesign_xpc Python script with the -o runtime flag. It looks like this when you’re done:

\n
\ndef _codesign_service(identity, path, entitlements_path=None):\n    command = ["codesign", "-f", "-o", "runtime", "-s", identity, path] + ([] if entitlements_path is None else ["--entitlements", entitlements_path])\n    log_message(" ".join(map(sanitize, command)))\n    ...\n
\n

You’re Not Done Yet

\n

At this point, you should be able to do a build where everything in your app is using the hardened runtime. It’s more likely that you’ve had some kind of issue along the way: this Apple document helped get me over the rough patches. (Thankfully, I didn’t have to write it this time around.)

\n

After the notarization upload completes, you’ll see “Uploaded to Apple” in the organizer, then after a few minutes you’ll get an email and Xcode notification that your app is “Ready to distribute”. In the righthand panel underneath “Distribute App”, you’ll see that the “Export Notarized App” button is enabled and can be used to place the signed package anywhere on your Mac for further processing.

\n

In our case, we had to split up the build scripts into two parts: previously we had a single script that did the build, signed it with the Developer ID, and then created an appcast. Sparkle’s XML file is now created with a separate script that also prepares the release to be checked into our repositories.

\n

One final note: these instructions are based on Xcode 10, which is currently the only development tool that can be used to submit an app for notarization or the Mac App Store. Before we figured that out, we found that Xcode 11 does a better job passing along the -o runtime flag during a framework’s Code Sign On Copy. It’s likely that all this work you just did will only be needed for a few months. Sigh.

"},"visual":{"url":"none"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"http://david-smith.org/blog/2019/09/26/moon-plus-plus","fingerprint":"d717143d","id":"37MS5KwinfzXRHFFH8onqsLrpe3pbr+gQeC/KCTSLiw=_16d81299335:4da0f:18991ffa","updated":1569510120000,"alternate":[{"href":"http://david-smith.org/blog/2019/09/26/moon-plus-plus/","type":"text/html"}],"crawled":1569830048565,"title":"Moon++, a better lunar complication","published":1569510120000,"origin":{"streamId":"feed/http://david-smith.org/atom.xml","htmlUrl":"http://david-smith.org/","title":"David Smith, Independent iOS Developer"},"content":{"direction":"ltr","content":"

This app started life as so many of my apps do…from a frustration that just got under my skin.

\n

I just received my new Series 5 Apple Watch. While reading reviews for it, many reviewers were using the moon complication in their product shots. I think this is because it is the default complication for the new California watch face. Anyway, I liked the overall aesthetic of it and so tried it out myself.

\n

I went outside and looked up at the moon in the sky. This is what I saw:

\n

\n

Then I looked down at my wrist and saw this:

\n

\n

This bothered me more than it should. The two don’t really look the same at all. On my wrist is a powerful computer, capable of precisely locating itself on the surface of the earth (and indeed the solar system!)…but it isn’t showing me the correct moon.

\n

So I had to fix it…

\n

\n

The result is Moon++.

\n

Moon++ seeks to provide a highly accurate, visually pleasing indication of what the moon looks like right now, right where you are. My goal was to make it so that if you look down at your wrist and then up into the sky the images you see should match.

\n

Building it has been a fun little adventure into astronomy. The moon image I generate is adjusting itself for all manner of astronomical factors. I got to learn about such fun terms as: parallactic angle, libration, and lunar terminator.

\n

\n

It includes a robust set of complications for every watch face type. You can choose between either a visually rich ‘actual’ appearance or a more simplified version, to fit your own personal style.

\n

\n

Within the actual app itself it displays the current location of the moon in the sky (azimuth and elevation) along the horizon. If you rotate the Digital Crown you can shift forward and backwards through time.

\n

Additionally, on the new Series 5 Apple Watch, which is equipped with a compass, you can have Moon++ orient itself towards the actual moon to make it easier to locate the moon in the sky.

\n

I hope you enjoy this little utility, I really enjoyed making it.

\n

It is $0.99 in the App Store.

\n
\n

A Press Kit for the app is here.

\n
\n

Technical Note:

\n

This is my first app built using SwiftUI. It is really cool to see how interactive and lively you can now make an Apple Watch app. The compass mode feature especially wouldn’t really have been practical or performant to build using WatchKit.

\n

Also, it is an Apple Watch only app, which means I didn’t have to build a hosting iPhone app.

\n

»"},"visual":{"url":"http://www.blogcdn.com/www.engadget.com/media/2013/10/galaxygear-lead.jpg","width":619,"height":411,"contentType":"image/jpeg"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"http://david-smith.org/blog/2019/09/13/seamless-light-complications","fingerprint":"cd8567d7","id":"37MS5KwinfzXRHFFH8onqsLrpe3pbr+gQeC/KCTSLiw=_16d81299335:4da0e:18991ffa","updated":1568388600000,"alternate":[{"href":"http://david-smith.org/blog/2019/09/13/seamless-light-complications/","type":"text/html"}],"crawled":1569830048565,"title":"Seamless Light Complications","published":1568388600000,"origin":{"streamId":"feed/http://david-smith.org/atom.xml","htmlUrl":"http://david-smith.org/","title":"David Smith, Independent iOS Developer"},"content":{"direction":"ltr","content":"

I really like the new Meridian face that arrived in the watchOS 6 GM. It is clean, simple but still provides ample opportunity for customization. Over the summer I’ve been rocking the California face (with Arabic numerals because its default mixed Roman numerals hurt both my head and heart). But the California face only has extensive complication options in the corners which isn’t my preferences. I like the face itself going to the edge of the display, it is one of the things I like most about the Series 4/5 display, that it really fills the face.

\n

There is, however, one thing I’m now really wishing for with the Meridian face…the ability to make seamless complications for its light face options.

\n

For the dark face variants, we already have this. You have white text on a black background that blends seamlessly into the background of the watch.

\n

\n

Increasingly Apple is providing options for us to have non-black watch faces, which I think creates a delightful bit of character and delight for the Apple Watch. These started with the Infograph faces and now continue with both California and Meridian. However, sadly we don’t yet have a way to make complications that can blend seamlessly into the these light colored backgrounds. The best I can currently do is something that looks kinda like this:

\n

\n

Which isn’t awful, but really interrupts the full effect that would be possible if the complication blended seamlessly into the background. Apple already allows this for the “Digital Time” complication so I know it isn’t completely out of the question. Here is an altered version of the above screenshot removing the ring around my complications.

\n

\n

Doesn’t that look great!

\n

So this is my little feature request for apple (filed as FB7264371), I’d love to see a way to provide seamless complications for these colored backgrounds. Fingers crossed!

\n

Note: The font used in my custom date and weather complications is Redbird, which is my current favorite for display on an Apple Watch face. It just looks at home on this device.

\n

»"},"visual":{"url":"http://www.blogcdn.com/www.engadget.com/media/2013/10/galaxygear-lead.jpg","width":619,"height":411,"contentType":"image/jpeg"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"http://www.caseyliss.com/2019/9/19/stalman-podcast","fingerprint":"a907e8ac","id":"fkFLg490GSKODJZCYxuxuSDw5utmxlHxrMJQGyyxmh0=_16d8129898d:4da0d:18991ffa","author":"Casey Liss","summary":{"direction":"ltr","content":"

Last night I recorded a podcast with my pal Tyler Stalman on his\nshow, The Stalman Podcast. Tyler received review units of the\niPhone 11, iPhone 11 Pro, and Apple Watch Series 5. After a whirlwind\nday of him testing the phones, Tyler made some time to sit down with\nme to discuss them.

\n

In this episode, I turned the tables on Tyler and interviewed\nhim. As a professional photographer, Tyler naturally had a lot of\nthoughts about the new two-camera system on the 11 and the three-camera\nsystem on the 11 Pro.

\n

I had a ton of fun recording this with Tyler, and for those of you\nwaiting in line tomorrow, or debating buying a new iPhone, this episode\nis for you.

\n

Read on Liss is More

"},"alternate":[{"href":"https://www.stalmanpodcast.com/64","type":"text/html"}],"crawled":1569830046093,"title":"Appearance: Stalman Podcast 64","published":1568942100000,"origin":{"streamId":"feed/http://www.caseyliss.com/rss","htmlUrl":"https://www.caseyliss.com","title":"Liss is More"},"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":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"http://www.caseyliss.com/2019/8/27/family-feud","fingerprint":"8d3ef9eb","id":"fkFLg490GSKODJZCYxuxuSDw5utmxlHxrMJQGyyxmh0=_16d8129898d:4da0c:18991ffa","author":"Casey Liss","summary":{"direction":"ltr","content":"

Just over five years ago, Myke and I announced Analog(ue). It doesn’t\nfeel like it was that long ago, but here we are. Analog(ue) is older than both\nof my children; Myke and I have released 163 episodes of the show. Not bad for\nsomething we thought would peter out after ten or twenty episodes.

\n

To celebrate Analog(ue)'s Relay’s fifth anniversary, over twenty hosts\njoined Myke and Stephen in San Francisco to record a live game of\nFamily Feud. It was a blast, and probably the zaniest podcast I’ve\never been a part of.

\n

The whole episode is up on the Connected feed, if you’d like to have a\nlisten. There may be video in the future, but no guarantees. If there is, I’ll\nlink it here.

\n

Read on Liss is More

"},"alternate":[{"href":"https://www.relay.fm/connected/257","type":"text/html"}],"crawled":1569830046093,"title":"Appearance: Connected 257","published":1566916200000,"origin":{"streamId":"feed/http://www.caseyliss.com/rss","htmlUrl":"https://www.caseyliss.com","title":"Liss is More"},"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":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"originId":"https://allenpike.com/2019/multiply-your-time","fingerprint":"99105153","id":"r0GuC4sgAzEOyudB9cuXyJaa1HYa9lXs9s0Sf3Zd858=_16d8128aefe:4da03:18991ffa","updated":1567278610000,"author":"Allen Pike","alternate":[{"href":"https://www.allenpike.com/2019/multiply-your-time","type":"text/html"}],"crawled":1569829990142,"title":"Multiply Your Time","published":1567278610000,"origin":{"streamId":"feed/http://www.allenpike.com/feed/","htmlUrl":"https://www.allenpike.com/","title":"Allen Pike"},"content":{"direction":"ltr","content":"

One of my most hated things is when someone over-fills a garbage bag.

\n

You see, an almost-full garbage bag is a small task to deal with – you just close it up and pull it out. But an over-full garbage bag is a problem. Suddenly, you can’t just pull it closed anymore – dealing with the bin now involves biohazardous juggling, something nobody is inclined to do anytime soon. The resulting additional procrastination leads to, in most cases, an unstoppable garbage snowball that eventually destroys humanity itself.

\n

Everybody has their irrational pet peeves. As long as I can remember, this has been one of mine. For years I always tried to prioritize the task of emptying the bin before it got over-filled. Sometimes I succeeded, but other times I failed, and a stupid garbage can would put me on tilt.

\n

One day, when I attempted the task of emptying the bin, I found it over-full. And instead of emptying it, I left. I left for Home Depot, on a different task that would change how I thought about prioritization forever: I bought a smaller garbage bin.

\n

\n

It may be obvious to you, but for years I ignored the root cause of my age-long grief. I did nothing about the thing that actually enabled people to pile in more garbage than the bag could hold: the bin was bigger than its bag. By buying a smaller bin, the same bags simply couldn’t be over-filled. Even the most precariously over-filled bin could be wrapped up swiftly and neatly, using the specially reserved portion of bag draped on the outside of the bin, ready and waiting for duty.

\n

It was glorious.

\n

The quietly worthwhile

\n

There is a lot of stuff you should get done.

\n

Or, more accurately, there is a lot of stuff you feel like you should get done. My OmniFocus tracks 860 actions that, at one time, I felt like I should do. Many of them won’t get done. But there are some things in there that I truly should do, and if I do them, I’ll be very glad.

\n

The question is: which ones?

\n

Some actually-important things are urgent. If you don’t renew your passport, you can’t go on your upcoming trip. If you don’t empty the garbage before garbage day, you’ll be stuck with old garbage for two weeks. The task needs to get done, you need to do it, so you just gotta do it. It’s kind of obvious, because it’s both urgent and important.

\n

More interesting, though, is the non-urgent stuff that is nevertheless very worthwhile. The tasks that are easy to defer, tempting to procrastinate, but actually more important than the supposedly urgent tasks: the smaller garbage bins, waiting to be bought.

\n

So, when I’m looking at things I should do, I keep an eye out for certain kinds of tasks: work that isn’t urgent, but can multiply time. Things that could pay off for months or years to come.

\n

In particular, I try to consider if I can:

\n
    \n
  1. Automate. Can you spend 1 hour simplifying or automating something that would then save yourself 5 minutes a week? If so, then I have an incredible investment opportunity for you: you can invest time – the most precious resource we have – at a 430% annual interest rate. The busier I get, the harder it is to get around to tackling these automation and simplification tasks, but the more worthwhile it is.
  2. \n
  3. Teach. If there’s somebody who’d be willing to do this task in the future, but they don’t know how yet, then you have a big opportunity. The long-term payoff for teaching someone how to do a task can be massive. Even in the case of successfully handing something off only for it to “boomerang” back later, having taught still improves your understanding of the work and makes you a better teacher for the next attempt. If you’re in a leadership position of any kind, you don’t have the time not to be teaching people.
  4. \n
  5. Calm. Like many people, I have a certain amount of tolerance for frustration and stress in a given day. At a certain point further annoyances, even small ones, cause disproportionate reactions and sap energy from me and those around me. That’s why I find it useful to prioritize fixing anything that is a persistent aggravation or stressor. In OmniFocus, I keep an ongoing project “Make Life Calmer”. Doing work today that will make tomorrow calmer and more focused is a great investment, and will let you use your future “stress budget” on something more meaningful than the fact the damn kitchen drawer is stuck closed again because the saran wrap and aluminium foil boxes got pushed on top of each other again and god DAMN it why do I have three different sets of measuring cups in here augghhhh.
  6. \n
  7. Improve. It is extremely easy to procrastinate making yourself better. It takes motivation to build new habits, learn how do to something “right”, or to address a longstanding problem. But this work is profoundly worthwhile, since small investments here can have huge payoffs. After 35 years of using a computer like a dumb animal, I’m finally learning how to sit, type, and work in a way that doesn’t permanently injure my wrists and shoulders. Reading books about RSI or learning better posture aren’t necessarily my idea of fun, but I’m going to benefit from the investment for decades to come.
  8. \n
\n

Diamonds in the rough

\n

Next time you’re cleaning up your todos, considering a new goal or theme, or just feeling over-busy, consider how you can be multiplying your time. What things, once done, will have an impact that pays off for years?

\n

What is your smaller garbage bin?

"},"visual":{"url":"http://cdn0.sbnation.com/entry_photo_images/9193021/3462607995_150a6b2624_z_large.jpg","width":630,"height":420,"contentType":"image/jpg"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"K2yEyJkJAlTYIjP5i2D9ccp/wbMYzpHnabsacInQgcs=_16d7e95f988:1fc4:90d684ff","keywords":["digital-publishing","newspapers","france","search-engine-optimizati","media"],"originId":"https://medium.com/p/948b24fd555c","fingerprint":"ea8aeae3","content":{"content":"

#MN_Briefing 09.29.19

by Frederic Filloux

\"\"
Google responding to the French law on snippets

In today’s briefing: Google on the warpath with French publishers | Le Monde facing crucial choices for its future | The New York Media/Vox deal | Some news about Deepnews | Great long forms.

1. Google fires a warning shot at EU publishers

TThe Facts. Google chose the hard way when faced with the decision on how to comply with France’s new copyright law, set to come into force in late October. The law states that publishers are entitled to be paid by online services that display snippets of articles. It is the result of intense pressure on behalf of French publishers.

Last Wednesday, Google announced that, in order to be fully compliant with the new French law, it will simply stop showing snippets below headlines, as well as thumbnails.

Here is an abstract of Google’s statement (full text in FR and ENG here), emphasis mine:

At the moment, when we display news results, we show a headline, which links directly to the relevant news site. For some results, we also show you a short preview of the article, such as a few lines of text (also known as a “snippet”) or a small “thumbnail” image. Together, these headlines and previews can help you decide whether a result is relevant to your search, and whether you want to click on it.
When the French law comes into force, we will not show preview content in France for a European news publication unless the publisher has taken steps to tell us that’s what they want. This applies to search results across Google services.

Why it matters.
1) French publishers have a lot to lose in the process.
To understand the visible impact of Google’s decision, here is the same set of news, collected yesterday morning with a simple query “Jacques Chirac” (the former French President who died last week), in Google search. Assuming none of the publishers mentioned below will take the steps to opt-in back to the former system of snippets (or snippets + thumbnail), the impact will be significant:

\"\"

Maintaining the volume of traffic sent back to publishers from search results will require a united front in which no one publisher accepts going back to the headline + snippet system, and/or the adoption of clear and straightforward headlines. Otherwise, the loss in traffic could be significant.

2) Google’s reaction equals to a shot across the bow of EU publishers: It says: “Do not push your governments to pass such kinds of law, or you will face the consequences”. Google’s position has the merit of consistency. Over the last five years, the search giant stood by its tune: “We won’t pay for snippets. Ever”. The news should not, therefore, come as a surprise for the French publishers. But, as an industry addicted to subsidies, supposedly protected by the EU as the Daddy and the French government as the Mummy, they hoped for a miracle which didn’t happen.

The lingering questions that I will cover in a future Monday Note:

1 . How French publishers will react to this, besides besieging the Ministry of Culture, who already slammed Google’s decision as unacceptable (press release in FR here)?

2 . It varies from one publisher to another, but Google News and Google Search might count for as much as 30 percent of the traffic a news site is getting. French publishers will still be present in SERPs (Search Engine Return Pages), but, as a default setting, their presence will be reduced. What will be the impact on their traffic? How many will opt-in to go back to the original system? Will they remain united? (Of course not).

3 . Is there some room for negotiations between Google on one side and the French government and the publishers on the other?

4 . Why does the issue of paid-for-snippets seem to be so specific to the EU and more specifically French publishers?

5 . If we take into account, on one hand, the value of the clicks sent to the publishers + the amount of funding direct and indirect injected by Google into the news sector (hundreds of millions of dollars), and on the other hand, the benefits for Google of inserting news elements in the SERPs, is the news industry really at a disadvantage?

Background: Past Monday Notes that cover the issues:

2. Follow-up on Le Monde’s saga: tough choices, hard consequences

LThe apparent good news: all shareholders of Le Monde agreed last week to sign a pact that will give to the staff’s representatives the right to veto an unwanted investor. At the same stroke, they decided to “consider the possibility” of a foundation. So far, only Xavier Niel, the telecom mogul who calls the shots here, is pushing in this direction. Despite an acceptable write-off, he will appear as the savior of Le Monde. Other stakeholders are not on board: Matthieu Pigasse, who narrowly escaped a personal bankruptcy, is about to make a good deal; Madison Cox, who manages Pierre Bergé estate, wants to sell his shares for a profit, and the newcomer, Daniel Kretinsky, who teamed up with Pigasse, is a patient man with large ambition.

Why it matters. Le Monde is facing a crucial moment in its existence. Nine years ago, the paper was on the verge of bankruptcy. Today, it harbors good journalism, even occasional strokes of extraordinary reporting. Financially speaking, Groupe Le Monde is well-managed but faces an uncertain/negative outlook for the future, as all insufficiently diversified media companies do.

Now the choice is this:

a) Scenario A: Le Monde engages in a decisive development strategy with a comprehensive investment in technology to improve the performances of its core assets (the newspaper and magazines) and opts for diversification with acquisitions in services and e-commerce. The goal would be to double its current €300 million revenue in a few years, expand its footprint in France and maybe in Europe. That’s a realistic option, which can’t be done with an ownership structure that is leaning toward a non-profit.

b) Scenario B: Le Monde folds itself in a foundation-like system, fencing its ownership for good. The short-term will be nice: predatory investors will be kept at bay, management will be groomed inside the company — no one from the outside world will dare to compete for a CEO or an executive editor position knowing that they can be vetoed by the kolkhoz. It will be like a global airline deciding that it will never seek talent from abroad. If the fundamentals are fine, the company will remain within its cozy perimeter with a decaying genetic talent pool and a business that barely survives.

But most likely, fundamentals will degrade, with a continual depletion on the advertising side, a subscription fatigue and a market penetration that will plateau (unlike any English-speaking media which enjoys a growing global pool of educated readers). In less than ten years, Le Monde will be back to begging, with a déjà vu “bail-me-out-or-I-die” plea.

Background: Past Monday Notes on the subject:

3. New York Magazine + Vox: a good deal, by the numbers

NA great, iconic magazine combined with a powerhouse in digital news: that’s the New York Magazine and Vox Media deal. Altogether, they will operate 14 digital properties with a combined reach of 125 million unique visitors:

\"\"

The all-stock deal values New York Media LLC at $105 million, a nice markup compared to the $55 million paid by the late famous investor Bruce Wasserstein in 2004 when he bought the company from Rupert Murdoch. According to the WSJ, NY Media’s revenue grew by 40% in the last 12 months but it lost $15 million in 2018. The magazine has been particularly good at segmenting its digital audience over several, remarkably efficient, entities. New York Media is getting 12 percent of the new venture that will retain the name of Vox.

\"\"

As for Vox Media, it is valued at $750 million in the operation, a severe discount compared to a valuation of $1 billion in 2015. It makes a small profit on a $185 million revenue. It too has a segmented a valuable audience (78 million UVs). It is a super agile company, which built is own CMS (Chorus) and its own advertising production studio.

Why it matters. Despite its 44 magazine awards, the 51-year-old NY Mag would not have been attractive for a young digital native company if it hadn’t been for its profound modernization and sizable investment in digital operations. The Vox/NY Mag merger is the perfect proof that the magazine industry is not doomed.

4. My long forms of the week

Two great pieces from the New Yorker I read during a trip to Germany:

Can a Burger Help Solve Climate Change?
Eating meat creates huge environmental costs. Impossible Foods thinks it has a solution.
This piece is just incredible in its thoroughness, density, precision as well as its narrative structure. I take it as an example in my journalism classes.

Paging Dr. Robot.
A pathbreaking surgeon prefers to do his cutting by remote control.
I have been following Intuitive Surgical for a long time. The firm makes the extraordinarily complex DaVinci robot — which is, for a large part, the future of medicine. This piece is the best on the topic.

5. News about Deepnews

XTwenty issues of the Deepnews Digest have given us pretty good insight about the potential of lightweight, automated newsletters. Deepnews Digest is built on a different news-related topic every week. It gathers a large number of articles across 400 carefully vetted sources, with a final selection made by our proprietary algorithm, the Deepnews Scoring Model. The whole process is 95 percent automated, except for the writing of the introductory text and the removal of a few parasite links. Our excellent editor, Christopher Brennan, spends less than an hour each week to do the job.

Now, we want to develop a commercial version of the Deepnews Digest to cover specific sectors with a series of vertical, paid-for publications. The idea is to identify markets worth serving and to quickly build products, easy to test, launch and evaluate. Although we have an idea of where to go, we are quite interested in hearing from you about the sectors we should cover:
Please, take five minutes to complete this questionnaire.
Your opinion matters a lot to us.

See you next week.

frederic.filloux@mondaynote.com

\"\"

#MN_Briefing 09.30.19 was originally published in Monday Note on Medium, where people are continuing the conversation by highlighting and responding to this story.

","direction":"ltr"},"title":"#MN_Briefing 09.30.19","updated":1569786960272,"author":"Frederic Filloux","alternate":[{"href":"https://mondaynote.com/mn-briefing-09-30-19-948b24fd555c?source=rss----c537d80ed0a---4","type":"text/html"}],"crawled":1569786821000,"published":1569786821000,"origin":{"streamId":"feed/http://www.mondaynote.com/feed/","title":"Monday Note - Medium","htmlUrl":"https://mondaynote.com?source=rss----c537d80ed0a---4"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"qxI9mPUQaH2N8pL2LRpLlzIW5hw1iiQKLdJmLkGau/I=_16d7e4a6db0:1f34:90d684ff","keywords":["User Interface","VR/AR"],"originId":"http://jnack.com/blog/?p=9310","fingerprint":"15a6ef0f","content":{"content":"

Looks lit.

\n

\n

(Tangential reminder: You can build hand tracking into your mobile app right now using tech from my team.)

\n

\"NewImage\"

\n

[YouTube]

","direction":"ltr"},"title":"Oculus Quest adds hand tracking","author":"jnack","summary":{"content":"Looks lit. (Tangential reminder: You can build hand tracking into your mobile app right now using tech from my team.) [YouTube]","direction":"ltr"},"alternate":[{"href":"http://jnack.com/blog/2019/09/29/oculus-quest-adds-hand-tracking/","type":"text/html"}],"crawled":1569781870000,"published":1569781870000,"origin":{"streamId":"feed/http://jnack.com/blog/?feed=rss2","title":"Nackblog","htmlUrl":"http://jnack.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"K2yEyJkJAlTYIjP5i2D9ccp/wbMYzpHnabsacInQgcs=_16d7d29c728:1fc3:90d684ff","keywords":["tesla"],"originId":"https://medium.com/p/29fd3b55c5b4","fingerprint":"e29fa3bb","content":{"content":"

by Jean-Louis Gassée

With its just-announced Taycan 4-door sedan, Porsche got tongues wagging. Ultra-fast at the Nürburgring, ultra-refined — and ultra-expensive — it’s a clever entry in the EV race, one that some see as a threat to Tesla.

\"\"
Courtesy Wikipedia

Ending months of speculation, Porsche picked Germany’s Frankfurt Auto Show (officially, the International Motor Show) to unveil the Taycan, the automaker’s entry in the Electric Vehicle race. To make the Taycan’s unveiling even more print- and click-worthy, weeks before the Frankfurt intro, Porsche headed to the famed Nürburgring track where the Taycan broke the 4-door EV record (video inside) with a 7 minute, 42 second lap.

For Monday Notes readers who aren’t into carnography, the legendary 20.8 km (12.9 mi) Nürburgring track has become a reference venue where automakers and tourist drivers attempt to break speed records in various categories.

(A brief historic digression: the first vehicle to break the 100km/h (62 mph) barrier was an electric car, yes, in 1899, La Jamais Contente (The Never Satisfied) managed to exceed 105km/h (65.8mph). This was the last time an EV drove faster than a gasoline-powered car.)

Before the Taycan, the Volkswagen ID R, a cousin EV in the Volkswagen Group, managed a 6:05 lap, an impressive feat but one that, unlike the Taycan’s, doesn’t belong in the Production Vehicles category. Earlier in the year, a modified ID R broke the Pikes Peak Hill Climb record.

The Volkswagen group, or VW AG, is a colossus that includes Porsche, Audi, Bugatti, and many others. It surpassed Toyota as the world’s largest auto maker by sales in 2016 and seems to have held the title since. By shattering EV speed records at historic venues, VW AG wants everyone to know that they’re not only big, they’re dead serious about their EVs, and about owning the performance crown in the category.

Furthermore, the giant German auto group has clearly decided to take the very high end of the production EV category. The Taycan starts at a theoretical $150K but, in Porsche tradition, it will easily exceed $200K in more desirable configurations.

For years, automakers have complained about the impossibility of generating any kind of profit by making EVs. Most of the models we’ve seen so far have either been “halo cars” meant to burnish a maker’s EV bona fides, or, as in the case of Fiat Chrysler electric Fiat 500, a way to gain CO2 emission credits. As an example, at the Frankfurt Auto Show mentioned above, Jaguar let it be known that its iPace had done its job and wouldn’t be iterated in the near term. BMW said very much the same about its carbon-fiber i3.

For “real” EVs, meaning models produced in hundreds of thousands or more per year, we must proceed with caution: Look at Tesla hemorrhaging $24B in free cashflow since 2011

With this in mind, one can look at Porsche’s Taycan as a doubly cautious move: a very expensive vehicle, produced in modest quantities. In 2018, Porsche sold about 250K cars, with the Macan and Cayenne leading the way with 86K and 71K units, respectively. With the evergreen 911 selling about 35K units, one could expect Taycan 2020 sales to be in a low 10K multiple. A fine addition to the very profitable Porsche business — but not an invasion.

Unsurprisingly, the kommentariat was prompt to position the Taycan as a Tesla rival, a killer, even. Elon Musk helped by announcing an attempt to outdo the Taycan’s Nürburgring’s time “any day now”, perhaps with a new three engine configuration. Rumors aside, nothing so far. No one should second guess Musk’s ability to promote the Tesla brand (and himself), nor should we underestimate the value of the Nürburgring crown, but a Tesla-killer the Taycan isn’t.

To start with, there’s scale. Give or take a few thousand in the end-of-quarter rushes, Tesla will approach 400K deliveries this year and get close or exceed 500K units in 2020 when the company’s Gigafactory 3 comes on line in China (assuming, of course, that the economy is willing and investors continue to feed cash into Tesla).

Second, Tesla and Porsche operate in different price ranges. The Model 3, Tesla’s best selling car, now costs less than $50K; the Model S is less than $100K and the Model X is a bit more. There’s a big jump up to the Taycan’s $150k+ minimum price tag, certainly far too large for a faithful Model 3 adherent, and probably too big for even a Model X owner.

That said, many Porschephile connoisseurs think the real Tesla killer will be an EV Macan. The gasoline powered Macan is a best-seller today, and could be a best-seller tomorrow as a new, designed-from-the-ground-up EV sporty SUV that will compete more directly with the still-gestating Model Y Tesla SUV.

But a more immediate threat to Tesla is likely to come from elsewhere in the VW AG product portfolio. At the Frankfurt show, Volkswagen announced the ID.3, a car that many see as the EV equivalent of the iconic Golf, a vehicle that managed to span 45 years in seven generations without losing its soul. Production of the ID.3 is slated to start this coming November with deliveries for existing reservations in the Summer of 2020, albeit limited to 30K units for the “1ST” edition (or so we think…it isn’t entirely clear). The price is likely to exceed 40K€ (close to $50K).

Stepping back a bit, while the ID.3 should offer some competition in the Model 3 price range, it isn’t yet a full-bore assault on Telsa. Today, the Model 3 is a top seller in several European countries and neither VW nor Porsche threaten this position for the near-to-medium term, meaning 2020. After next year, things could get interesting as EV models from other makers (Mercedes, BMW, Renault…) garner praise when compared to Tesla’s sometimes lackadaisical finish and inattention to creature comforts.

Unless, of course, Musk’s “million robotaxis” prediction comes true — but no one took him seriously, right?

— JLG@mondaynote.com


Porsche vs Tesla: False Equivalence was originally published in Monday Note on Medium, where people are continuing the conversation by highlighting and responding to this story.

","direction":"ltr"},"title":"Porsche vs Tesla: False Equivalence","updated":1569762953218,"author":"Jean-Louis Gassée","alternate":[{"href":"https://mondaynote.com/porsche-vs-tesla-false-equivalence-29fd3b55c5b4?source=rss----c537d80ed0a---4","type":"text/html"}],"crawled":1569762953000,"published":1569762953000,"origin":{"streamId":"feed/http://www.mondaynote.com/feed/","title":"Monday Note - Medium","htmlUrl":"https://mondaynote.com?source=rss----c537d80ed0a---4"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"qxI9mPUQaH2N8pL2LRpLlzIW5hw1iiQKLdJmLkGau/I=_16d7588ab10:1f33:90d684ff","keywords":["Miscellaneous"],"originId":"http://jnack.com/blog/?p=9304","fingerprint":"b1284979","content":{"content":"

Racks on racks on racks o’ cloud GPUs mean we’re setting up to deliver some awesome experiences. Check out these PM gigs:

\n\n

If you apply, please tell ‘em who sent ya. \"\uD83D\uDE0C\"

\n

\"NewImage\"

","direction":"ltr"},"title":"PMs: Come build cloud-based gaming at Google","author":"jnack","summary":{"content":"Racks on racks on racks o’ cloud GPUs mean we’re setting up to deliver some awesome experiences. Check out these PM gigs: Product Manager, Infrastructure, Stadia – Mountain View Product Manager, Graphics, Stadia – Waterloo or Munich If you apply, please tell ‘em who sent ya. \uD83D\uDE0C","direction":"ltr"},"alternate":[{"href":"http://jnack.com/blog/2019/09/27/pms-come-build-cloud-based-gaming-at-google/","type":"text/html"}],"crawled":1569634954000,"published":1569634954000,"origin":{"streamId":"feed/http://jnack.com/blog/?feed=rss2","title":"Nackblog","htmlUrl":"http://jnack.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d74088b20:205d:90d684ff","keywords":["Technology","iOS","iOS 13","Swift Programming Language"],"originId":"https://mjtsai.com/blog/?p=26732","fingerprint":"62a7d953","content":{"content":"

Alexandre Colucci (Hacker News):

\n
\n

The new iOS 13 features have with no surprise been built with some Swift code in their corresponding application. This is the case of the FindMy, Reminders and Sidecar apps. Also worth noting is the use of Swift in the Health, Book and Shortcuts apps.

\n

[…]

\n

If we exclude the Swift libraries, iOS 13.1 contains 141 binaries using Swift, more than doubling the number from iOS 12[…]

\n
\n

Previously:

\n","direction":"ltr"},"title":"Apple’s Use of Swift in iOS 13","author":"Michael Tsai","summary":{"content":"Alexandre Colucci (Hacker News): The new iOS 13 features have with no surprise been built with some Swift code in their corresponding application. This is the case of the FindMy, Reminders and Sidecar apps. Also worth noting is the use of Swift in the Health, Book and Shortcuts apps. […] If we exclude the Swift […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/apples-use-of-swift-in-ios-13/","type":"text/html"}],"crawled":1569609780000,"published":1569609780000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d74087798:205c:90d684ff","keywords":["Technology","Artificial Intelligence","Auto-Correction","iOS","iOS 13"],"originId":"https://mjtsai.com/blog/?p=26730","fingerprint":"7a0498ce","content":{"content":"

John Gruber:

\n
\n

One thing I and others have noticed is that when you type a dictionary word correctly — meaning you hit the exact right keys on the on-screen keyboard — iOS 13 autocorrect will replace it with a different dictionary word that makes no contextual sense. Even beyond dictionary words, I’m seeing really strange corrections.

\n
\n

I think this has been going on since before iOS 13.

\n

Previously:

\n","direction":"ltr"},"title":"iOS 13 Autocorrect Is Drunk","author":"Michael Tsai","summary":{"content":"John Gruber: One thing I and others have noticed is that when you type a dictionary word correctly — meaning you hit the exact right keys on the on-screen keyboard — iOS 13 autocorrect will replace it with a different dictionary word that makes no contextual sense. Even beyond dictionary words, I’m seeing really strange corrections. I think this […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/ios-13-autocorrect-is-drunk/","type":"text/html"}],"crawled":1569609775000,"published":1569609775000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d74084ca0:205b:90d684ff","keywords":["Technology","BlockBlock","Mac","Mac App","macOS 10.14 Mojave","Malware","Security"],"originId":"https://mjtsai.com/blog/?p=26728","fingerprint":"8d8dcbfc","content":{"content":"

Patrick Wardle (via Leo M):

\n
\n

Malware installs itself persistently, to ensure it’s automatically re-executed at reboot. BlockBlock continually monitors common persistence locations and displays an alert whenever a persistent component is added to the OS.

\n

[…]

\n

This alert contains the name and path of the process that installed the persistent component, as well as details about the actual persistent component. Moreover, it shows if the process (that created the persisted item) is signed by Apple, signed by a 3rd-party, or is unsigned[…]

\n
\n

It’s the equivalent of LittleSnitch for auto-launching background processes.

\n

Previously:

\n","direction":"ltr"},"title":"BlockBlock 0.9.9.4","author":"Michael Tsai","summary":{"content":"Patrick Wardle (via Leo M): Malware installs itself persistently, to ensure it’s automatically re-executed at reboot. BlockBlock continually monitors common persistence locations and displays an alert whenever a persistent component is added to the OS. […] This alert contains the name and path of the process that installed the persistent component, as well as details […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/blockblock-0-9-9-4/","type":"text/html"}],"crawled":1569609764000,"published":1569609764000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d7407eee0:205a:90d684ff","keywords":["Technology","Apple T2","Mac","macOS 10.15 Catalina","Secure Boot","Terminal"],"originId":"https://mjtsai.com/blog/?p=26726","fingerprint":"df4fbe8f","content":{"content":"

Howard Oakley:

\n

Even with Recovery Mode available, there have still been some reasons for wanting to enter SUM. One of them has been to run command tools to check memory for faults, as in SUM the system takes as little memory as possible, allowing you to run checks on all the rest. Sometimes fsck run from SUM could fix problems which Disk Utility in Recovery Mode couldn’t.

[…]

The biggest problem comes with Macs equipped with a T2 chip, and its Secure Boot. If it were available, a traditional SUM would bypass Secure Boot, so it isn’t allowed if your Mac has a T2 chip: Command-R will take you to Recovery, and that’s as close as your Mac can get, unless you disable Secure Boot by setting the Startup Security Utility to No Security. And you have to do that in Recovery anyway.

","direction":"ltr"},"title":"Is Single-user Mode Dead?","author":"Michael Tsai","summary":{"content":"Howard Oakley: Even with Recovery Mode available, there have still been some reasons for wanting to enter SUM. One of them has been to run command tools to check memory for faults, as in SUM the system takes as little memory as possible, allowing you to run checks on all the rest. Sometimes fsck run […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/is-single-user-mode-dead/","type":"text/html"}],"crawled":1569609740000,"published":1569609740000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d7407ac78:2059:90d684ff","keywords":["Technology","App Review","App Store Rejection","App Subscriptions","Business","iOS","iOS 13","iOS App"],"originId":"https://mjtsai.com/blog/?p=26724","fingerprint":"3e02b0d2","content":{"content":"

David Barnard (tweet):

\n

Paying once for an app really only makes sense if the app provides minimal functionality of limited value and won’t benefit from continued improvement.

\n

[…]

\n

With paid apps, people often end up buying several apps just to figure out which one best fits their needs. Let’s say they spent $3 each on 4 apps, that’s $12 they were willing to pay for a great app, but that great app they settled on only gets $3. Since most subscription apps have free trials, and many even have ad supported free tiers, people can try multiple apps and then only pay for the one they actually use.

\n

[…]

\n

Sure, some potential customers (or existing customers if you transition from another business model to subscriptions) are going to complain about the subscription model. It’s hard to hear someone tell you that they don’t value what you’ve built, but the smart thing to do is focus on the people who are subscribing, your true fans. Figure out who they are and look for ways to reach more people like them instead of focusing on the vocal minority that complain.

\n

Julian Schiavo:

\n
\n

My apps been rejected with a short message basically saying ‘your app can’t use auto renewing subscriptions’, any tips/experience on this? All the other apps of this type use auto renewing subscriptions \uD83E\uDD37‍♂️

\n
\n

Reginald Braithwaite:

\n
\n

The simple model I keep in my head, is that your revenue model should parallel your expense model.

\n

If they don’t, you’re both running a business AND engaging in arbitrage. That’s two things you have to get right, instead of one.

\n
\n

David Barnard:

\n
\n

This tweet reminds me of a chart by @macguru17. When you’re building an app, even one that doesn’t have ongoing costs like weather data or servers, the cost of continued development keeps putting you underwater before each update.

\n

I don’t think most people realize how much most indie developers sacrifice to keep the lights on. In 11 years, I’ve probably only been cash flow positive 48 months. With paid apps, I’d build up a war chest with a big launch/update/sale, then spend it down working on the next.

\n

I’ve even gone into debt to squeak by until the next big update. People seem to think all developers are rich & greedy. But it’s like any other small business. Most struggle, some do well, a few really well. But businesses don’t drop prices because they are doing well. \uD83D\uDE43

\n
\n

Previously:

\n","direction":"ltr"},"title":"Subscribers Are Your True Fans","author":"Michael Tsai","summary":{"content":"David Barnard (tweet): Paying once for an app really only makes sense if the app provides minimal functionality of limited value and won’t benefit from continued improvement. […] With paid apps, people often end up buying several apps just to figure out which one best fits their needs. Let’s say they spent $3 each on […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/subscribers-are-your-true-fans/","type":"text/html"}],"crawled":1569609723000,"published":1569609723000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]},{"id":"ov+64/RrrpHw8vHNs9Rbgmq2LwWdAk5I0cvaa8ohxPI=_16d74074eb8:2058:90d684ff","keywords":["Technology","iOS","iOS 12","iOS App","Twitter","Web"],"originId":"https://mjtsai.com/blog/?p=26722","fingerprint":"79c4af3b","content":{"content":"

Tim Hardwick:

\n

Twitter today rolled out its new “Hide Replies” feature in the U.S. and Japan, providing Twitter users with more control over the replies that are visible following a tweet.

The idea behind the feature is to give people more control over the conversations they start on the social media platform, so they can hide replies that are offensive and the hidden reply won’t show up to others as a response to the original tweet.

\n

Khedron:

\n
\n

So people can post false information and hide/censor anyone who calls them out on their lies or conduct.

\n
\n

Ben Sandofsky:

\n
\n

Decided to try the “Hide Reply” feature, and I noticed the hidden tweets got way more attention than if I’d just ignored them.

\n

It turns out this pop up appears when you visit my tweet.

\n
\n

Juli Clover:

\n
\n

Twitter today implemented a feature that’s designed to allow lists of Twitter users to be pinned to the Home screen and swiped between, allowing for easy access to multiple customizable timelines.

\n
","direction":"ltr"},"title":"Twitter “Hide Replies” and Timeline Swiping","author":"Michael Tsai","summary":{"content":"Tim Hardwick: Twitter today rolled out its new “Hide Replies” feature in the U.S. and Japan, providing Twitter users with more control over the replies that are visible following a tweet.The idea behind the feature is to give people more control over the conversations they start on the social media platform, so they can hide […]","direction":"ltr"},"alternate":[{"href":"https://mjtsai.com/blog/2019/09/27/twitter-hide-replies-and-timeline-swiping/","type":"text/html"}],"crawled":1569609699000,"published":1569609699000,"origin":{"streamId":"feed/http://mjtsai.com/blog/feed/","title":"Michael Tsai","htmlUrl":"https://mjtsai.com/blog"},"unread":true,"categories":[{"id":"user/f2f031bd-f3e3-4893-a447-467a291c6d1e/category/e31b3fcb-27f6-4f3e-b96c-53902586e366","label":"Weblogs"}]}]}