Archive for November 2016
Sunday, November 27, 2016 [Tweets] [Favorites]
mulle-objc (Hacker News):
mulle-objc is a new way to run Objective-C code on various platforms, based on a new compiler and a new runtime.
- Run everywhere C runs
- Everything faster than everyone else
- No assembler code necessary
- The runtime should be completely unloadable
- Separate runtimes should be able to coexist (instances should not cross)
- Should work in real time applications
- No magic
- No locking
- Keep the Spirit of C
Nat! (tweet) has a series of blog posts describing the implementation and some interesting choices and optimizations. For example, there’s a unified struct-based calling convention, less reliance on the linker, optimized message sending in loops, “Always Autoreleased Mode,” and deliberately no support for dot syntax, blocks, or non-fragile ivars.
Kirk McElhearn (blog):
But iOS offers no such option. If you tap a URL, it opens in Safari. If you tap a link to send an email, it opens in Mail. The default calendar is Apple’s Calendar app. And so on. You may not want to work that way and because Apple doesn’t give you any choice, you’re stuck with workarounds: using share sheets to open a web page in a different browser; copying an email link or address to create an email; and so on.
We’re at iOS 10, and Apple still hasn’t allowed users to make these choices. It seems ridiculous that, with a mature operating system, we’re still locked into Apple’s default apps. It’s not rocket science to make these changes; after all, there are protocols that funnel requests to specific handlers, the same way they do on the Mac.
Given that it’s relatively easy to implement, and that it’s been about 8.5 years since the introduction of third-party apps, limiting this must be a design decision. I think it’s a mistake.
Update (2016-12-01): Nick Heer:
This clearly isn’t a technical limitation, but a conscious design decision. However, it is far more noticeable in iOS 10 than in previous versions of iOS because of the ability to hide default apps, which can leave gaps in typical interactions. Tapping on a
mailto: link when Mail is hidden will display an inelegant modal dialog telling the user to reinstall Mail, even if they have a third-party Mail app installed.
A new event alarm was created in my primary iCloud calendar without my consent.
No matter what I do – Accept, Maybe, Decline – the sender of the spam appointment receives the notification of my action. There’s no way to just simply delete the damn invitation from your calendar without sending the reply!
These calendar invites aren’t coming from some magic hacked portal in your phone. The invites are coming as e-mails into your iCloud.com e-mail account and then being automatically converted into in-app push notifications to both iOS and macOS. Once that’s done the original e-mail is deleted.
One solution is to go to the settings on the iCloud Web site and change from In-app to Email notifications.
Fantastical does support ignoring and deleting a calendar invitation without notifying the sender.
Update (2016-11-28): See also: Stuart Breckenridge.
Update (2016-12-01): John Gruber:
The most interesting thing about this is that it’s a way to send completely unauthenticated spam, and it has been just sitting around unexploited until now. This feature has been around for years, but the spammers seemingly didn’t find it until very recently.
There are many blog articles and forum posts out there about how to delete these messages without notifying the sender that you have done so. The prevalent wisdom says that adding the events to a temporary calendar, then deleting that calendar, will delete the events without sending a notification. This seems to be backed up by the fact that macOS will give you the option to delete without notifying[…]
Unfortunately, I’ve been testing this for a couple days, between my calendar and my wife’s calendar, and it doesn’t work for me. Even if I click Delete and Don’t Notify, or if I do this from iOS as some sites suggest, the sender will always get a notification that the invitation was declined.
There is also the question of how to prevent this from happening in the future. Unfortunately, again, the conventional wisdom appears to be failing.
Of course, this does nothing to stop the problem once it has started. However, you may be able to change your Apple ID e-mail address, which would help to cut off the flow. If your address ends in @icloud.com, @me.com, or @mac.com, you may not be able to change it at this point, but for anyone else it would be worth a try.
Update (2016-12-12): Joe Rossignol:
Apple has added a “Report Junk” option to iCloud.com to help combat a recent increase in calendar spam, as noticed by a Reddit user over the weekend.
Amelia Tait (via Nick Heer):
Reddit CEO Steve Huffman has publicly admitted to editing comments on the pro-Donald Trump subreddit r/the_donald in a move he has described as “trolling the trolls“. Huffman – who goes by “spez” on Reddit – deleted comments from the pro-Trump community on the site, and also altered comments that insulted him.
Normally when a comment is edited on Reddit – by a user or a moderator – a small asterisk will appear after the time stamp to indicate that it has been changed. In this instance, no such asterisk appeared, meaning Huffman ostensibly has the ability to edit comments without a trace. This is crucial because two months ago, a Redditor was taken to court for comments he left on the site. Huffman’s editing powers could clearly be abused to cause trouble for individuals.
The Reddit admins have had a strained relationship with the moderators and users of The_Donald, for multiple reasons. For a lot of users there, this validates some beliefs about the admin’s treatment towards them, specifically that they make an active effort to censor their content. Other users on the site feel like this sets a dangerous precedent, as it demonstrates the admins can and have edited comments without disclosure. Further users feel like, while Spez made a mistake, he was unfairly treated and harassed by TheDonald and his response was an understandable outburst.
Now, people around the site are wondering what the repercussions of this will be. Some question if Spez will be removed from his position over this. Some wonder if the admins will come forward and admit they’ve edited comments in the past.
Makes me wonder if other reddit staff have done the same thing in the past, unnoticed only because most people aren't paranoid enough to chk
Huon sued ATL & Gawker for defamation. ATL settled. At the District Court level, where the lawsuit was originally filed, it was dismissed as to Gawker on the basis of a reporting privilege and under 47 U.S.C. § 230, a Provision of the Communication Decency Act.
Because Gawker’s editors were (anonymously) authoring comments themselves, they were exerting active authorial control over the information on their forum. This led the court to labeling them an “information content provider” and prevents them from claiming Section 230 protection. The lawsuit gets to proceed.
Starting to see how relates to Huffman’s actions at Reddit?
See also: Hacker News and Slashdot.
Tuesday, November 22, 2016 [Tweets] [Favorites]
Adam C. Engst:
If you’ve been feeling as though Apple’s heart isn’t in moving the Mac forward these days, you’re not alone. The new MacBook Pro models have taken widespread criticism, Apple has provided no roadmap for the future of its desktop Macs, and most recently, the company eliminated the position of Product Manager of Automation Technologies, presumably seeing it as unnecessary. High-end creatives have despaired about Apple’s lack of attention to their needs, and the mood among many of the consultants and support professionals at last week’s MacTech Conference was downbeat.
In spite the fact that it now employs 115,000 people and is the most valuable company in the world, Apple still thinks like a one-platform company. Now it’s all about iOS, and everything Apple does is designed to serve the single goal of selling more iPhones and iPads.
Now that Apple’s primary task is to sell more iPhones, the company has little incentive to improve the Mac past the point that iOS developers need to run Xcode and macOS Server’s caching server effectively. Sure, the Mac business was worth $22.8 billion in revenues in 2016, which is far from chump change, but it’s nothing compared to the $192.8 billion of revenues generated by iOS and associated services.
Two points that I would add:
- In Apple’s current functional organization, there is no vice president whose job it is to advocate for the Mac and its customers. This approach can potentially enable product integrations and reduce strategy tax problems, but I think it also led to the idea that, as Engst says, the Mac is but an accessory to the iOS platform.
- Like others, I am continuing to see problems with software quality, more particularly on the Mac. (One example from today: Mail’s smart mailboxes and searches keep breaking, fixed only by regular database and Spotlight rebuilds. I’ve actually excluded nearly everything except for Mail from Spotlight in an effort to make these rebuilds faster.) There are many possible reasons for these symptoms, but I think one is that the primacy of iOS has caused Apple to ship major macOS updates when the iOS hardware is ready rather than when the Mac software is ready.
Lastly, I think a lot of the frustration from Mac users is that Apple deprioritized their needs yet saw fit to dedicate huge teams and resources to making $17,000 gold watches, automobiles, and original TV shows. So the decisions about the Mac are clearly not driven by a need to focus.
After how many years does secrecy become patronizing? A simple acknowledgment of the Mac Pro/Mini would go a long way.
Apple could either update or kill the Pro/Mini and both seem like equal possibilities. That’s your marketing message?
I don’t think Mac users should switch, but I can’t recommend any newbies join MacShip.
Previously: Apple Abandons Development of Wireless Routers, Thank You, Sal, New MacBook Pros and the State of the Mac.
Update (2016-11-27): Matthew Yglesias (via Marco Arment):
But this all raises a more fundamental question. If GE can build jet engines, tidal energy farms, freight rail data systems, mining equipment, and medical devices, how is it that the world’s most valuable company can’t find the time to make a full line of personal computers and PC peripherals alongside its market-leading smartphones and tablets? The answer goes back to Apple’s corporate structure, which, though fairly common for a startup, is extremely unusual for an enormous company.
Of course, it might be hard to bring radical redesigns and breakthrough innovations to the Mac. But what existing Mac customers really want is something more basic: confidence that Apple will regularly update the Mac to incorporate new chips as they become standard in the rest of the computer industry.
The upshot is that even though regularly updating desktop Macs should not be that difficult, objectively speaking, it tends not to happen in part because it’s not anyone’s job to make it happen. The functional organization values collaboration on top corporate priorities above all else, and that means basically everything comes ahead of desktop Macs.
So if Apple cannot maintain a functional structure at scale, and cannot be divisional without losing ability to innovate, what’s plan C?
Sadly, can’t see any significant progress coming in this respect. If anything, it’s gonna get worse.
Update (2016-12-01): Jean-Louis Gassée:
On the surface the Mac appears to be thriving. If ‘Macintosh Inc.’ were an independent company, its $22.8B in revenue for Apple’s 2016 accounting year (which ended in September) would rank 123rd on the Fortune 500 list, not far below the likes of Time Warner, Halliburton, Northrop Grumman, and Raytheon[…]
Instead of racing to the bottom as the market plummets, Apple appears to be taking the “high road”, in a sense: They’re taking refuge at the high end of the market by introducing new, more expensive MacBook Pros, with a visible differentiating feature, the Touch Bar. This is known, inelegantly, as milking a declining business, although you shouldn’t expect Apple to put it that way.
I think it’s almost certainly true that if there were, say, a “Macintosh” division within Apple, that we’d see more frequent updates to all Mac hardware. That doesn’t mean Apple should change its structure, though — and in the long run, I don’t even think that would be good for the Macintosh. Apple’s functional structure is absolutely central to their success over the past 20 years.
There are certainly growing pains with regard to Apple’s enormous size today. The iPhone’s extraordinary success creates a sort of gravity that has warped the company. But Apple ran into “can’t walk and chew gum” problems even when they were a much smaller company.
Update (2016-12-09): Ken Segall:
When the new Mac Pro was introduced in 2012, it felt like the type of radical departure Steve was known for. Combined with Phil Schiller’s famous “Can’t innovate, my ass” comment, it gave hope for the future.
Unfortunately, the future never came for any of the Macs. When it finally arrived for MacBook Pro, it was at least a couple of years late.
When updates between revolutions disappear, the result is bad press and restless customers — both of which are well earned.
Monday, November 21, 2016 [Tweets] [Favorites]
Mark Gurman (Hacker News, MacRumors):
Apple Inc. has disbanded its division that develops wireless routers, another move to try to sharpen the company’s focus on consumer products that generate the bulk of its revenue, according to people familiar with the matter.
Apple hasn’t refreshed its routers since 2013 following years of frequent updates to match new standards from the wireless industry.
Exiting the router business could make Apple’s product ecosystem less sticky. Some features of the AirPort routers, including wireless music playback, require an Apple device like an iPhone or Mac computer. If the company no longer sells wireless routers, some may have a reason to use other phones and PCs.
The question is, are they really out of the router game (and will start selling Belkin or Eero routers in their stores), or are they working on something new, a HomeKit hub, that will include the functionality of a router?
Just seems like Apple is abandoning a lot of stuff without having replacements ready these days.
Back when Apple did the iPhone, it was partially because all cellphones sucked; now, all cellphones work similarly to iPhones. I’d like to think that they kept supporting their AirPort models for as long as they did because routers still suck. Look at the routers recommended by the Wirecutter: their picks have antennas sticking out and pointing everywhere, and really crappy web-based control panels. I’m not looking forward to the day that I need to replace my AirPort Extreme.
Apple working hard to convert its synergistic eco system into something more akin to PC/Android market of hodgepodge components.
And when we start looking elsewhere, we customers who have been in the habit of just buying the Apple thing get in the habit of looking outside Apple for things.
I can’t help but think that it’s a kind of an anti-halo effect. I can’t help but think that once we start looking elsewhere, we’ll look elsewhere more and more. We’ll get used to it. We’ll find out that other companies make things that work and are, in some cases, delightful.
Wireless routers are not like external displays. Every major Apple device needs to connect to a wireless router. It’s essential.
Apple seems to be running the company “by the numbers” lately. If they can’t sell X many millions of units at 40% profit they just kill it.
Or perhaps it’s a matter of attention and deploying their employees where they think they can make the most difference. In any case, it seems like this change will reduce the quality of the Mac and iOS experience. One issue is the ecosystem with technologies such as AirPlay, Back to My Mac, and Time Machine and the easy-to-use apps for configuration. Another is simply that AirPort was an easy choice. You pay a little extra, but you don’t have to do any research to be sure that it will work well. And you know that help is available from Apple.
On the plus side, lots of people seem to have great things to say about the Wi-Fi products from Eero and Ubiquiti.
Update (2016-11-21): Kirk McElhearn:
Frankly, it’s about time. They’ve been limping along, unable to keep up with new technology. I used to really like Apple’s AirPort hardware, but somewhere in the past few years, it started to suck. They never updated the AirPort Express for 802.11ac, making their hardware useless in any but the smallest setups.
This said, the AirPort Express is still a useful tool for people who want to stream music using AirPlay. I’d recommend buying one or two if you use it for that. I’m not aware of any other device – other than the Apple TV – that works like this.
Update (2016-11-22): Benjamin Mayo:
I hope that Apple evaluated the AirPort roadmap, decided there was little scope for improvement over the status quo, and then shuttered the division. Whether I believe that Apple could add value to the router space is irrelevant; I have to trust Apple is in the omniscient position here about its own lineup.
On the other hand, if AirPort development was cancelled simply because it ‘only’ made a few million dollars, I would be deeply disappointed. Accessories support the core products — it is unreasonable to expect them to make money. Apple has the privilege to make choices that aren’t constrained by financials. Abandoning products that don’t make money is what companies on the brink of bankruptcy do.
I have yet to find a device that I like more than the current AirPort Express, just in terms of what it does: Home Router, Home Wi-Fi, AirPlay speaker, remotely managed. There isn’t anything I’ve found that is as easily-managed as the AirPort line is. But there are some good options[…]
None of the solutions above carry with it the user-friendly function-focus of the AirPort, and that makes me sad. But, new companies like eero and Luma are making wireless do things that Apple has decided not to do, and so the future lives with them, or with the professional access point manufacturers who work down market like UniFi and Xclaim (Ruckus). I think we’re in good hands, even if they’re not Apple’s.
Update (2016-11-27): See also: Core Intuition.
I’ve tested three currently-available mesh offerings: eero, Netgear’s Orbi and Ubiquiti’s AmpliFi. While they all solve the same problem in basically the same way, they each have strengths and weaknesses. If you’re finished reading and just want to buy, my TL;DR advice is that, at this very moment, I feel like eero is the best product to recommend to most users. That said, it’s worth watching what Netgear does with Orbi over the next six months. If they keep adding features to it, Orbi could easily take the lead due to its tri-band Wi-Fi hardware. Still, even today Orbi or AmpliFi might be right for you, and I’ve listed more than a few points of comparison to help you make your choice.
Update (2016-12-01): Joe Rossignol:
Apple ranks highest in customer satisfaction among wireless router manufacturers, according to a new study released by J.D. Power today.
The accolade comes just nine days after a report said Apple has ceased development of its AirPort routers and reassigned engineers working on the products to other teams. Apple continues to sell the AirPort Express, AirPort Extreme, and AirPort Time Capsule, last released in 2013, but future updates appear unlikely.
Apple has been on a cutting spree recently, sending display production outside of Apple, cutting the Airport base station line, and neglecting Mac desktops. It’s tempting to cut everything that isn’t a massive line of profit, but if Apple isn’t careful with their removal of supports, they’ll bring the whole house down on top of them.
See also: Accidental Tech Podcast.
Keiichi Watanabe (via Hacker News):
Constant expressions in C++ are expressions that can be evaluated at compile-time. In C++14, by relaxing constrains, constant expressions became so powerful that a C compiler can be implemented in!
In constexpr-8cc, the main routine for compilations of C programs is implemented in a C++14
constexpr function. Therefore, if you compile 8cc.cpp to a binary file by g++, compilation of a C program will be performed as a compile-time computation and the result of this C compilation will be embedded into the generated binary.
When you see
8cc.hpp, you will know this program was not written by hand.
Actually, I used ELVM Compiler Infrastructure to generate it.
I just implemented a translator from ELVM IR to C++14 constexpr here.
A lot of people have asked me why I did my first mobile client in iOS rather than Android. The answer is monetization. iOS is straight-up easier to monetize. Android has cultivated a frugal audience, through both marketing and hardware choices, and that cultivation has been a success. Android users tend to be frugal. That doesn’t mean they don’t spend money, but it does mean they are more cautious about it. I have friends who’ve done simultaneous iOS/Android releases for their apps, and invariably the iOS users outspend the Android users by anywhere from 4:1 to 10:1 -- anecdotally, to be sure, but a little Googling is enough to support just about any confirmation bias you like. So I picked iOS.
And as a result, the Android APIs and frameworks are far, far, FAR from what you would expect if you’ve come from literally any other UI framework on the planet. They feel alien. This reddit thread pretty well sums up my early experiences with Android development.
The story of my app’s rejection is epic enough for an opera, but in a nutshell, Apple requires that all apps support ipv6-only networks. But none of the major Cloud providers supported ipv6 at the time of my submission, in late September. […] Fortunately, after a mere six weeks, and me finally sending them an angry-ish (but still cravenly and begging) note asking WTH, they granted me the exception for 1 year, backdated so it was really only 11 months, but whatevs. I was approved!
I’m really worried about In-App Purchases. I offer them in my game (though it’s definitely not pay-to-play), but Apple’s testing for IAP leaves a lot to be desired. You have to sandbox it, and this requires setting up separate accounts. It’s not possible to enable production IAP (with real money) before the actual launch. But their sandbox environment makes it really easy to screw up a transaction, after which your device will prompt you for a store login every 5 minutes for the rest of your miserable life, and likely into the hereafter. It’s a mess.
Apple’s new coffee table book “Designed by Apple in California” features many products the company has produced over the last 20 years. Turns out, most of what it is in the book is a part of my collection. Here are the actual products alongside the book:
Friday, November 18, 2016 [Tweets] [Favorites]
We’ve been wanting to do this recently, due to problems where Messages says that an iMessage was delivered, when in fact it never arrived. I’ve been having problems like this on and off since iMessage was introduced, yet as far as I know SMS has never let me down. You used to be able to tap and hold on a message bubble and choose “Send as Text Message,” but that feature seems to have been removed.
The Send as SMS setting lets the phone automatically fall back to SMS when iMessage is not available. However, that doesn’t help in my situation where iMessage is available but simply doesn’t work.
I found several forum posts, but the only solution seems to be to temporarily turn off iMessage, which seems like a terrible solution because it means that you won’t be able to receive iMessages from anyone else in the interim. Worse, the iMessages will look to the sender like they got delivered because they’ll still go to your Mac or iPad.
Ideally, there would be a way to simply start a new conversation using SMS even though there is an iMessage account associated with that phone number.
Kim Zetter (via Hacker News):
Russian digital forensics firm Elcomsoft has found that Apple’s mobile devices automatically send a user’s call history to the company’s servers if iCloud is enabled — but the data gets uploaded in many instances without user choice or notification.
The logs surreptitiously uploaded to Apple contain a list of all calls made and received on an iOS device, complete with phone numbers, dates and times, and duration. They also include missed and bypassed calls. Elcomsoft said Apple retains the data in a user’s iCloud account for up to four months, providing a boon to law enforcement who may not be able to obtain the data either from the user’s phone, if it’s encrypted with an unbreakable passcode, or from the carrier.
It’s not just regular call logs that get sent to Apple’s servers. FaceTime, which is used to make audio and video calls on iOS devices, also syncs call history to iCloud automatically, according to Elcomsoft. The company believes syncing of both regular calls and FaceTime call logs goes back to at least iOS 8.2, which Apple released in March 2015.
Apple is syncing your calls between devices logged in with your Apple ID. In theory, this is no big deal: Apple says that the idea is if you’re logged in to your iPad and your iPhone, you can see the same call record in FaceTime on both of them. Miss a call on your iPhone? You can return it from your iPad. Makes perfect sense as a feature from Apple’s perspective.
The Information called it “secretly” and “surreptitiously”, but it’s not only wicked obvious why Apple is syncing call history, it’s fully disclosed in Apple’s security white paper.
I’m not really bothered by this, but I would not say that it’s obvious that an item in the “Here’s what iCloud backs up” section is backed up even when iCloud Backup is off.
If call history sync concerns you, you can disable iCloud Drive in preferences and it’ll stop.
There are no separate iCloud Drive settings for Phone or FaceTime, so if this concerns you I guess your only option would be to disable iCloud Drive entirely, which is probably not feasible because it would break other apps.
There is no option to turn it on or off. This makes it completely opaque to the user that this is being done. Also, the way the devices interact with this data can lead a user to believe this is not the case.
If I clear my call log on my iMac, it doesn’t not clear it on my iPhone, and vice versa.
In a Sync’d system, one would expect the data on all connected devices to mirror the Sync’d source, so changes are propagated across devices.
This isn’t the case for Apple devices (in a number of situations), therefore it makes complete sense that it would seem obvious to someone that Apple is not doing this, especially with their heavy “focus” on letting users know that everything stays on their device and is done locally.
Update (2016-11-18): McCloud:
You know what else syncs with catastrophic results? RESETTING NETWORK SETTINGS. Reset my iPhone, my Mac went off the radar. Couldn’t SSH.
I didn’t think 15" would make a huge difference, but I’ve almost doubled my canvas area when I’m on the go. I can actually see an entire view controller at a time without collapsing panels. Of course, this doesn’t hold a candle to what I work in when I’m at my desk on my 27" external monitor.
I still miss the 17-inch MacBook Pro.
The isRestorable property in macOS conveniently saves window position between launches without much effort for developers. Unfortunately, isRestorable doesn’t have any knowledge of whether the app is in full-screen mode. It would be nice if Apple provided a simple checkbox for remembering full-screen status in IB somewhere.
Meanwhile, on behalf of Mac laptop users everywhere, allow me to plead with my Mac developer friends: When I put your app in full screen and keep it that way, I’m showing intent. And good developers always pay attention to a customer’s intent, and use it to anticipate their preferences. Consider taking a few minutes on your next version to implement saving a preference for running the app full screen. It’ll go a long way to making your customers happy.
The Apple apps that I just tried this with (Mail, Safari, Xcode) all remembered full screen status, as did OmniFocus. But I see an
NSIsFullScreen key in the Saved Application State’s windows.plist file. So I wonder if there isn’t some framework support for this after all.
Chris Schidle (via Hacker News):
At the time the link led to a WordPress.com page where you could sign up for updates (the full get.blog website was not up yet). Thinking that chris.blog had a nice to ring to it, I signed up immediately.
Alright, I guess that’s fair. If multiple Chrises (or Chris’s? whatever) apply then it goes to auction. I’d still have a chance to secure it, and Automattic maximizes their revenue by auctioning it off. Win-win.
Perhaps it’s not fair to call this bait & switch. Really it was bait & refund, and certainly the situation would be far worse had they chosen to not make the application fee refundable.
But still, I thought I had chance at securing the domain. That was the logical conclusion given the terms they outlined (via successful application or winning an auction).
Knock Knock Whois There LLC, the subsidiary of Automattic behind the .blog TLD, has responded with this post regarding reserved domains.
Thursday, November 17, 2016 [Tweets] [Favorites]
Let’s say you have a type with a failable initializer. Now you want to extend that type to support deserializing from JSON. You throw nice detailed errors if JSON parsing fails and you’d like to throw if anything goes wrong[…] There are two problems here. One is that we can’t delegate to a failable initializer. […] The second is there is no syntax to checking the result of calling the failable initializer even if we could;
self is only optional in the context of a failable initializer.
Back in 2013, Facebook announced that they had become the leading source of traffic to media companies, to the tune of about 40% of their total referrals. That’s a huge number and, right or wrong, publications became somewhat reliant upon the traffic Facebook was sending their way.
Every major media company should be seriously reconsidering their commitments to Facebook right now. Between their seemingly uncaring attitude towards bogus news sites, their algorithmic fluctuations for legitimate publications, and their ongoing inflation of their statistics, Facebook shows that they simply don’t care about the state of the media.
So, to summarize, Zuckerberg is arguing that Facebook users absolutely cannot have their voting decisions swayed by posts on the social network, and that’s why advertisers should pay to promote political parties and candidates on Facebook.
Update (2016-11-21): Issie Lapowsky:
Throughout the last year-and-a-half, stories about the imbalance between Clinton’s ad spending compared to Trump’s proliferated. They noted how Clinton spent more than $200 million on television ads in the final months of the election while Trump spent less than half that. Because Trump wasn’t spending as much on television all along, it seemed like his team wasn’t investing in changing anyone’s minds. But they were: they were just doing it online.
Coby’s team took full advantage of the ability to perform massive tests with its ads. On any given day, Coby says, the campaign was running 40,000 to 50,000 variants of its ads, testing how they performed in different formats, with subtitles and without, and static versus video, among other small differences. On the day of the third presidential debate in October, the team ran 175,000 variations. Coby calls this approach “A/B testing on steroids.” The more variations the team was able to produce, Coby says, the higher the likelihood that its ads would actually be served to Facebook users.
We all have those old albums and boxes of photos, but we don’t take the time to digitize them because it’s just too hard to get it right. We don’t want to mail away our original copy, buying a scanner is costly and time consuming, and if you try to take a photo of a photo, you end up with crooked edges and glare.
We knew there had to be a better way, so we’re introducing PhotoScan, a brand new, standalone app from Google Photos that easily scans just about any photo, free, from anywhere. Get it today for Android and iOS.
Plus, lots of old photos are not easily removed from their albums for scanning. So even though I have a ScanSnap, which is the easiest way I’ve found to scan photos, I can’t always use it.
The results I got were… only okay. Some photos were distorted, and none of them looked particularly great. In other words, you get what you pay for—this is free and easy and better than never getting old photos in digital form, but it’s also not going to give you the quality of scanning items yourself or sending prints, slides, and film to a photo-scanning service.
I think being easy is the key feature, the difference between having photos of questionable quality vs. not scanning at all. Hopefully the quality will improve.
See also: Shawn King, Michael Rockwell, Juli Clover.
Update (2016-12-09): David Sparks:
I tested it with some old family photos and it works great, particularly old photos with not-so-great resolution to begin with.
Update (2016-12-18): I am getting pretty good results, although it really reduces the resolution of the photo. It’s still better to use the ScanSnap where possible.
Apple normally takes a 30 percent cut of all App Store app purchases and subscriptions, but for subscription-based streaming video apps like Netflix and Hulu, Apple plans to cut its fee to 15 percent. Apple has already reduced the fees for some of its video partners, and will soon extend the 15 percent rate to all subscription video services that are integrated with the company’s upcoming TV app.
Wednesday, November 16, 2016 [Tweets] [Favorites]
Terrible news from Sal Saghoian’s talk at #mt2016 - His position at Apple as Czar of User Scripting & Automation is terminated. This sucks.
Sal Saghoian (Hacker News):
I joined Apple in January of 1997, almost twenty years ago, because of my profound belief that “the power of the computer should reside in the hands of the one using it.” That credo remains my truth to this day. Recently, I was informed that my position as Product Manager of Automation Technologies was eliminated for business reasons. Consequently, I am no longer employed by Apple Inc.
The need for user automation is a constant. I’ve seen the benefits and power of individuals being able to automate critical and repetitive tasks. Solution apps are great, emojis are fun, but there’s nothing like really great automation tools.
This is very sad news. Saghoian was an unsung hero of the Mac community and by all accounts an inspiring and excellent guy. That Apple is making changes in the automation department is unsurprising, since AppleScript and Automator have long seemed like they were adrift. However, my impression is that if it weren’t for Saghoian things would be a lot worse. The question now is: what are Apple’s plans for automation? Is this another sign of Apple neglecting pros? At best, the company has lost a key advocate for users and link to the Mac community.
This is disappointing news. From the outside at least, it seems like Sal is the only thing keeping macOS automation moving at this point.
Does Apple care about giving users the ability to automate, simplify, and create their own solutions on Macs? Now I wonder and worry.
Sal has been so awesome for so long, and he deserves a giant round of applause.
And Apple deserves us asking “What the hell, dude?”
Whether Soghoian’s duties will be handed over to another team member is unknown, though the decision only serves to reinforce sentiment that automation technologies are no longer a priority at Apple.
Historically, when Apple devotes fewer resources to automation, users (especially professionals) suffer.
See also: Rob Griffiths, Mark Munz, Ken Case, CM Harrington, Andreas Netzmann, Federico Viticci, Matt Drance, Shawn King, David Sparks, Mark Damon Hughes, Jason Snell, Doug Adams.
Update (2016-11-16): John Gruber (tweet):
This sounds ominous. Just this week in my review of the new MacBook Pros, a huge part of my argument for why I feel so much more productive on a Mac than an iPad revolves around the automation [technologies] that Soghoian’s group developed. I have the impression that Soghoian was a bit of a rebel within Apple, fighting the good fight to keep advancing the Mac’s automation tools. If they had simply fired him, that’d be one thing, but the fact that they’ve eliminated his position is another. This is shitty news. I find this to be a profoundly worrisome turn of events for the future of the Mac.
Update (2016-11-17): This has been a depressing year for the Mac. The software quality continues to erode, the hardware has languished to the point where people wonder whether entire lines will be eliminated, newer apps are less capable than older ones, not to mention the state of the Mac App Store and sandboxing. I’m starting to expect things not to work. It seems worse than the 90s because today’s problems seem so unnecessary. The company is very profitable. The underlying technology is solid. There are smart people all through the ranks at Apple. The OS updates bring a steady stream of improvements. You would think that after years of iteration we’d be in a really good place now. Yet it feels like Apple is making one unforced error after another and has forgotten what it has in the Mac.
John Gruber in 2010:
Apple can only begin phasing out the Mac if and when iOS expands to allow us to do everything we can do on the Mac. It’s the heaviness of the Mac that allows iOS to remain light.
Long term—say, ten years out—well, all good things must come to an end.
Since then, iOS has inched towards the Mac, but Apple seems to have decided that it doesn’t want the Mac to be heavy—it’s just ceding that territory. At least, that’s how I read what’s been happening. I suppose it’s possible that there is a lot of internal progress that we just don’t see. A totally new Mac Pro in the works? A new pro scripting system? I don’t think I would bet on either at this point. It’s true that we eventually got Swift and APFS. The difference is that both of those projects have direct benefits for iOS.
See also: Marco Scheurer, Hamish Sanderson, Peter Maurer, Dr. Drang, Ars Technica forums, Jim Dalrymple, AppleScript Users mailing list, Riccardo Mori, Peter Cohen, Husain Sumra, Nick Heer, Rene Ritchie, Ben Lovejoy, Shane Stanley, Todd Ditchendorf.
Sal has been a champion for power users and other professionals who use the Mac for years. AppleScript was one of the few reasons major publishing companies stayed on the Mac during its darker days.
But lately it’s hard not to see that Apple’s interest in automation technologies appears lukewarm. iOS has no systemwide automation features; apps like Workflow and enterprising users and developers have provided ways for users to connect apps together, but it seems like they succeed despite—not because of—Apple.
I can honestly say that Sal’s videos about automation are part of what made me the Mac-lover I am. His work made the Mac seem like a computer from the distant future.
From this year’s Mac announcements it looks like the Mac road map is going down a dead-end for me. […] 2016 has been a year of disappointment and acceptance.
Update (2016-11-18): Hamish Sanderson:
If all of you file Radar tickets asking for SwiftAutomation in 10.13, and then reblog and retweet and whatever the hell it is FBers do to all your Mac-using mates to file tickets too, that will provide Apple with the first real, quantifiable evidence they’ve seen in years that their tired, saggy old unprofitable Automation platform actually has a potentially vast new source of users just begging to be tapped, and at next-to-no cost to themselves too.
Way back when Steve Jobs returned to Apple and was axing technologies left and right, Cal Simone went to visit him and -- to hear Cal tell the story -- single handidly convinced Steve to retain AppleScript. I believe Cal’s pitch was mainly that the publishing industry was an established Mac customer enclave, large enough to matter, and that it was one industry that was utterly dependent on AppleScript.
Is there an analogous pitch today? What is it? Who can make it with the right tone of rationality, realism and business sense?
You may not directly use AppleScript, but many applications use AppleScript or AppleEvents in lots of little ways. iTunes, for example, lets you pause, play, go forward and backward a track, change playlists, add properties to songs, and a zillion other things. Those little iTunes controller apps that live in your menubar or dock? They use AppleScript to talk to iTunes. The ones that add lyrics to the currently playing song at the push of a button? Yup, AppleScript. Applications that grab the current page from your browser? AppleScript. The “contact us” button in an app that automatically creates an email in Mail with a subject and the To: address filled in? AppleScript. There’s probably something on your Mac that uses AppleScript or AppleEvents, even though you’re not aware of it.
My fear is that with Sal’s departure, Apple’s waning interest in scripting, and application interoperability in general, will be gone for good.
AppleScript has been brittle for years (with new versions of apps often losing features in that regard) and the various scripting bridges have always been largely undocumented, but they were what allowed a lot of people (including me) to have moderately decent automated workflows.
If that’s going away, then macOS will lose another distinguishing feature and I might as well go Linux all the way.
A 9to5Mac reader (who asked to remain anonymous) emailed Apple software exec Craig Federighi about the future of automation on the Mac. Federighi responded with a definitive reply that Apple “has every intent” to continue supporting automation on macOS.
9to5Mac has verified the message headers for their authenticity. This should allay the community concern in part that Sal Soghoian’s ousting is a sign of bad news for the automation features in macOS.
What Craig Federighi actually just said is that they couldn’t care less about the current stack, and are putting it right out to pasture.
Update (2016-11-21): Dr. Drang:
Most people, you might argue, can’t do what I do. They can’t sit down and write a script to automate a repetitive task, and Apple needs to appeal to the multitudes of them, not the few of me. I would reply first that scripting isn’t all that hard and can be done at many levels. I learn from people who are much more capable, and in turn, I hope that others learn from me. The internet has democratized scripting.
Update (2016-11-27): See also: Core Intuition.
Tuesday, November 15, 2016 [Tweets] [Favorites]
When you enable Touch ID, 1Password stores in the macOS Keychain an obfuscated version of a secret that can be used to decrypt your 1Password data. The secret is used to unlock 1Password when your fingerprint is recognized. It is stored using these attributes:
kSecAttrSynchronizable — This means that the secret is synced with iCloud Keychain. However, Apple can’t access it. Additionally, it’s combined with a unique code that’s only stored locally by 1Password, so it’s not usable on any other device.
kSecAttrAccessibleWhenUnlocked — This means that nothing can access the secret when your Mac is locked.
keychainGroupIdentifier = "2BUA8C4S2C.com.agilebits.onepassword" — This means that only 1Password can access the secret unless you enter the password you use to log in to your Mac.
1Password removes the secret from the macOS Keychain when the amount of time in Preferences > Security > Require Master Password has elapsed.
This is new in 1Password 6.5. It sounds pretty much like the situation on iOS, but due to the differences between the operating systems it does not seem as useful to me. On iOS, Touch ID is a killer feature. You trade a bit of security for a lot of convenience. The secret is stored in the device keychain, which is hard to access because iOS is so locked down, and in return you can avoid having to type your long master password using a tiny glass keyboard. On the Mac, it’s easier to access the keychain, and it’s probably backed up to other hard drives or cloud services. As to convenience: you’re typing on a full-size keyboard, and 1Password already had a way to remember your password in RAM. (Unlike on iOS, the 1Password helper app can keep running in the background for as long as you want.) So how much is this really gaining you? None of this is to say that Touch ID is a bad feature—but, rather, that the context in which it appears can make a big difference.
Previously: 1Password 5: Touch ID and Safari/App Extensions.
I’ll show a way to test events scheduled over time, threads and other execution contexts with a
DebugContextCoordinator that functions as a basic task scheduler but operates over a simulated version of time so that testing of invocation times and task interaction can be precise and free from changes due to host activity.
Now that libdispatch is replaced by the more flexible
Exec, we can use the flexibility to schedule events with something other than libdispatch.
The advantage with using a
DebugContextCoordinator to handle timing is that you’re no longer dependent on the actual timing information from the host machine, leading to greater precision and greater reliablility in testing.
We said, “Instead of living with just Objective-C or Swift, let’s be a two-language code base. Let’s commit to that.” And this was actually a smart decision, I think, because realistically if we were porting our app one piece at a time, it would take us years to get completely to Swift anyways.
Xcode forgets what language you are looking at and gives you the header for the wrong one. More importantly, developers need to know two languages, which is also a disadvantage in terms of education. And finally we have to deal with all of those messy interoperability features i.e. bridging headers and auto-generated Objective-C.
The solution we landed on was to annotate files while you import them. Your Swift bridging header is the firewall between your Swift code and your Objective-C, as long as you annotate things there, you will be safe.
All we decided is that if you are going to use, for example, a generic or struct, make sure it is flagged as private. You can write your very Swifty code, but it will be interfaced for it. You are forced to write something that you can still use from Objective-C.
Monday, November 14, 2016 [Tweets] [Favorites]
Swift’s copy-on-write system usually helps efficiency by delaying the copying of structs until it’s actually needed. However, as shown here, you can run into some pitfalls if you aren’t vigilant of what’s going on under the hood.
The “gotcha” here is that at the time of
append, the array is referenced twice – once by the dictionary, and once by the variable
items. This triggers copy-on-write, meaning that the entire array is copied to a new location in memory, even though your intention is to mutate a single array.
This is a doubly weird example in Swift because you can’t actually mutate dictionary entries where the value is a struct such as an array. You have to set the array again after appending or wrap the array in a reference type.
Update (2016-11-15): See also: Optimizing a copy-on-write double-ended queue in Swift.
Over the past couple of years, I’ve increasingly switched to web services that offer iOS clients and APIs for automation and cross-service integrations.
In the latest version, Workflow can now interact with any API through POST and PUT requests with custom headers, which have been rolled into the ‘Get Contents of URL’ action in addition to existing support for GET requests.
The impressive aspect of Workflow’s deeper web API support isn’t only the sheer amount of possibilities that it opens up for iOS automation, but how it packages everything in a user-friendly interface integrated with the rest of iOS and the app’s features.
I worked with web APIs in Pythonista for iOS before, and it was neither pretty nor accessible. Not only does Workflow allow you to build API requests without typing their syntax manually – it also lets you chain them with variables, data types, and files constructed or fetched with other actions that take advantage of Workflow’s access to iOS frameworks.
Shaps (via iOS Dev Weekly):
ProTip: Why debug with
print when you can
dump uses Mirror for introspection.
Microsoft is hoping to persuade more developers to create Windows apps by bringing its main coding environment – Visual Studio – to the Mac for the first time. Previously, developers had to use a Windows machine or run a virtual machine on a Mac to write Windows software.
The company said that the Mac version uses the same under-the-hood tools of the Roslyn Compiler Platform and MSBuild, and it seemingly leans heavily on app development platform Xamarin Studio. It supports both C# and F# languages.
Visual Studio for Mac is to Visual Studio as Access is to SQL Server…
Previously: Microsoft Visual Studio Code.
Update (2016-11-17): Here’s Microsoft’s preview page (via Hacker News).
The simulator is cool, but I immediately noticed a few shortcomings:
- You have to download Xcode to use it.
- It’s cumbersome to activate and deactivate.
- Taking screenshots of the Touch Bar is awkward.
Touché is my answer to those shortcomings. If you’re an everyday user who just wants to play around with the Touch Bar concept, a developer who wants a an easy way to toggle the virtual Touch Bar off and on, or a designer who needs to share screenshots from the Touch Bar frequently, then I think you’re going to love Touché.
Previously: Touch Bar.
Saturday, November 12, 2016 [Tweets] [Favorites]
One challenge that can crop up for Mac admins is the problem of running a script or other tool with root privileges and using it to launch and run another tool, script or application as if the logged-in user had launched it. An example of this would be installing Dropbox using an installer package, then launching the Dropbox application as the logged-in user as a post-installation task. One reason to do so would be to give the user the opportunity to sign into their Dropbox account.
To accomplish this task, Apple has provided functionality in the launchctl tool.
Starting in OS X Yosemite, Apple made a number of changes to the launchctl tool and added a new asuser function. The asuser function is designed to take the place of the bsexec function, in the context of starting processes in the context of a specific user account. This makes it easier, as you now just need to figure out the username and do not have to figure out the PID of the user’s loginwindow process.
Apple has worked very hard to reduce the iPhone’s attack surface, but they haven’t yet fully addressed the underlying motivations of an attacker (specifically, the device’s forensic value), and that’s left the iPhone a very high value target. This is the oldest, and hardest challenge in the book: making sure that deleted data actually gets deleted. Conversations are ephemeral, but the traces of these conversations are not; this directly impacts how and why search warrants are executed and why mobile devices are targeted by attackers. If the user of the device believes their conversation to be deleted, it’s breaking their trust by keeping forensic traces of those conversations, and ultimately the device’s design can lead to a betrayal of the user’s privacy if data is stolen or a forensic image is made. Ephemeral conversations (or other exchanges) should also mean ephemeral data.
The whole experience is described in loving detail in the article: How Uber Engineering Evaluated JSON Encoding and Compression Algorithms to Put the Squeeze on Trip Data. They came up with a matrix of 10 encoding protocols (Thrift, Protocol Buffers, Avro, MessagePack, etc) and 3 compression libaries (Snappy, zlib, Bzip2). The target environment was Python. Uber went to an IDL approach to define and verify their JSON protocol, so they ended up only considering IDL solutions.
The conclusion: MessagePack with zlib. Encoding time: 4231 ms. Decoding: 715 ms. There was a 78% reduction in size relative to the JSON zlib combination.
Something to consider: don’t use JSON for messaging. The compression/decompression times are still dog slow. If you are going to use an IDL, which every grown up project eventually moves to for reliability and security reasons, consider not using JSON for messaging. Go for a binary protocol from the start.
fG (via Hacker News):
While Apple makes available the source code for many components used in OS X, most of the time there is a significant delay so we need to use binary diffing to find out the differences between the vulnerable and updated binary. The usual tool for this purpose is BinDiff but there is also a free alternative called Diaphora made by Joxean Koret. Both tools require IDA and on this post we are going to use Diaphora.
The developer of this particular piece of code made a mistake, and the fix can be as simple as adding a set of parenthesis[…]
With this release we’re changing the way Reveal is versioned and licensed. We’re switching to a model where we release features as they are ready rather than holding them back for major paid upgrades. We’re also moving to a simpler version strategy. This release is version 2, the next will be version 3, and so on.
Licenses now include a year of updates, after which you can continue to use the last version of Reveal released within those 12 months. To continue to receive updates after the included 12 months, you will need to renew your license.
Instead of offering upgrade pricing for Reveal 2 we have lowered the price for all new and existing users.
Friday, November 11, 2016 [Tweets] [Favorites]
Over the past year or so I’ve been trying out Resilio Sync (formerly BitTorrent Sync) as a possible alternative to Dropbox. It’s gradually improved to where I think I can rely on it. With my Dropbox subscription up for renewal in a couple of weeks, now’s the time. In this post I’ll describe how to set up Resilio to get a Dropbox-like experience.
I looked at a variety of sync options and rejected most of them. Reasons varied, but I found that the quickest test of a sync system was checking how it handled symbolic links. My only real technical gripe with Dropbox is that it won’t copy symbolic links as symbolic links. Instead it follows the links, which can cause duplicate files.
This is actually one of my favorite Dropbox features. It’s very useful even though it’s technically sort of wrong.
Resilio also offers a couple of nice benefits. It’ll sync directly from one Mac to another over my local network without needing to upload everything to a server first. And I can set up as many shared folders as I want, in any location on my Macs.
I’ve been talking about adding Macs to Resilio, but it also runs on other platforms. Most interesting for this post, it runs on Linux and can be configured remotely. That means you can buy space at any VPS provider and add your virtual server(s) to the mix. That gives you an always-on computer to sync with for just a few bucks a month.
After seeing the new MacBook Pros, I’m considering switching from a single MacBook Pro setup to a (future) desktop Mac combined with my 2012 MacBook Pro. I have some big folders that I want to sync between the two Macs but which don’t need to be stored in the cloud. Resilio Sync seems like a good solution for this.
Unfortunately, Resilio Sync is not a Dropbox replacement if you need to sync with iOS apps such as Editorial, GoodReader, and Readdle Documents.
Previously: Replacing Dropbox With iCloud Drive.
Update (2016-11-11): Some people share their experiences via Twitter.
Thursday, November 10, 2016 [Tweets] [Favorites]
The bulk of the standard library’s code is in the
stdlib/public/core directory in the Swift repository on GitHub. You’ll find the interfaces and implementations for all public types, protocols, and free functions there. You can of course just read the code directly in your browser or clone the repository and go through it on your local machine, but there’s one complication: you’ll notice that about a third of the files have the file extension
.swift.gyb. If you open one of these files, e.g.
FixedPoint.swift.gyb (this is where the integer types are defined), you’ll see a mixture of Swift and a templating language called GYB.
Erik Dietrich (via Reddit):
When it comes to getting up to speed in short order, there’s really little besides practice that will give you the needed skill set. As such, going into a bunch of codebases in your spare time and poking around is really the best way to become skilled at going into foreign codebases and figuring them out.
It’s not just the weighty architectural decisions that you’ll pick up, either. You’d be amazed at how many quick, little wins you snag with this practice. One day you’ll see a unit test naming scheme that you fall in love with. The next day you’ll notice a new language feature that will save you twenty lines of code in a lot of your classes. Or, maybe you’ll observe someone using semantics that make mistakes a lot harder.
Whatever the case may be, looking at a lot of code means taking advantage of a lot of others’ experience. It’s not quite the same as having tons of people review your code, but you can realize some of the same benefits.
Update (2016-11-16): Erica Sadun has more information about gyb.
Kyle Barrow shows a button from backup app Carbon Copy Cloner:
OK, I will jiggle the mouse every 20 seconds or so to keep the system awake
There are actually hardware mouse jigglers that can do this for you, although it looks like the same goal can be accomplished via software power assertions.
You’re right. I hadn’t considered using a DeclareUserActivity sleep assertion because it isn’t be appropriate for backup tasks, but
yeah, that’s the right use here, and it’s a supported mechanism. I’ll take a look at that for the next update, thanks!
Update (2016-11-10): See also Energy Efficiency Guide and QA1340 (via McCloudStrife).
Sam Byford (via Nick Heer):
Clearly, this is by far the most competitive Google has ever been in mobile photography. But the Pixel phones, on paper, don’t have cutting-edge hardware, relying on an f/2.0 lens without optical image stabilization. Instead, and in typical Google fashion, Google has turned to complex software smarts in order to power the Pixel camera.
This no-compromise approach to HDR photography has partly been made possible by new hardware. The Hexagon digital signal processor in Qualcomm’s Snapdragon 821 chip gives Google the bandwidth to capture RAW imagery with zero shutter lag from a continuous stream that starts as soon as you open the app. “The moment you press the shutter it’s not actually taking a shot — it already took the shot,” says Levoy. “It took lots of shots! What happens when you press the shutter button is it just marks the time when you pressed it, uses the images it’s already captured, and combines them together.”
The traditional way to produce an HDR image is to bracket: you take the same image multiple times while exposing different parts of the scene, which lets you merge the shots together to create a final photograph where nothing is too blown-out or noisy. Google’s method is very different — HDR+ also takes multiple images at once, but they’re all underexposed. This preserves highlights, but what about the noise in the shadows? Just leave it to math.
Google also claims that, counterintuitively, underexposing each HDR shot actually frees the camera up to produce better low-light results. “Because we can denoise very well by taking multiple images and aligning them, we can afford to keep the colors saturated in low light,” says Levoy.
Whereas iOS won’t let me always take photos using HDR—which is the non-lossy choice since the phone also saves the non-HDR version—Google enables HDR by default and intends for you to leave it on.
For years, the Mac was merely a container for Mac software. It was the software that enabled the work we created, it was software that shifted our relationship with computers and ultimately each other.
Over the last five years, Apple has lost the thread and chosen to become a hardware company again. Despite their huge profits and large staff, we’re confronted with[…]
I agree about the importance of software, and Apple’s recent troubles with it, but I don’t see Apple as having made such a choice.
Via John Gruber (tweet):
Software, in general, is much better than it used to be. Unlike 1995, we don’t lose data due to bugs very often. (For me personally, I can’t even remember the last time I lost data.) But our hardware is so much better than our software, the contrast is jarring. An iPhone is a nearly perfect object. Sleek, attractive, simple. The hardware is completely knowable — there are only five buttons, each of them easily understood. iOS, however, is effectively infinite. The deeper our software gets, the less we know and understand it. It’s unsettling.
David Owens II:
As a hardware company, I would expect Apple to be able to iterate more quickly on fixing bugs and not worrying about huge features.
On the other hand, the iOS hardware sets the schedule for when the Mac software ships.
Wednesday, November 9, 2016 [Tweets] [Favorites]
Call this method when you want to retrieve the item provider’s data. If the item provider object is able to provide data in the requested type, it does so and asynchronously executes your
completionHandler block with the results. The block may be executed on a background thread.
The type information for the first parameter of your
completionHandler block should be set to the class of the expected type. For example, when requesting text data, you might set the type of the first parameter to
NSAttributedString. An item provider can perform simple type conversions of the data to the class you specify, such as from
FileWrapper, or from
UIImage (in iOS) or
NSImage (in macOS).
Douglas Hill (via Twitter):
This API makes use of reflection internally: it looks at the type of the block’s first parameter to decide what to return. This is dependent on Objective-C’s looser enforcement of the block signature compared to Swift — and therefore does not work in Swift. (Yes, still.) See this discussion on the developer forums.
It’s strange to me that Apple would write such a recent API in such a bizarre way - as far as I know, there is no documented way to reflect block signatures so its fragile anyway. Why not just take a class parameter and give the block an id parameter type?
It’s a strange API.
Adrian Colyer on a paper by Santiago Perez De Rosso and Daniel Jackson (Hacker News):
The authors chose to use Git to explore the role of concepts in design – it is widely known and used, and at the same time known to be confusing and difficult to learn. Are the usability problems of git just on the surface, in the expression of the commands, or do they run deeper?
The staged and working versions of a file are coupled in complex ways, and Git commands that one might expect to affect only one often affect the other too. One way to get into trouble is to add a file, then continue working on it before committing. If you then decide to undo the commit with a reset command then depending on the arguments not just the staged version but also the working version will be replaced (wiping out subsequent work since the commit).
It’s rather weird to see the model described as such, since the underlying git model, the one that makes everything make sense it’s not even mentioned. It stays only one the surface of the command line interface, on the “porcelain” never touching the plumbing which is quite straightforward. In essence git is a layered system.
While I understand that removing the concept of staging makes things simpler to understand, I consider the staging area/index to be one of the most useful features of Git. I often make extensive changes to multiple files, which I do not want to save in a single, monolithic commit. I use the staging area to assemble fine-grained commits by carefully picking files and even individual lines. I can imagine that this could be solved without the index, but it seems a very useful concept still (like a safety net in some sense).
I like staging—don’t understand people’s issues with it. To me, Git’s model is good, but its interface could be improved.
It’s long been known that the game’s protagonist was named “Mr. Video” and “Jumpman” by Miyamoto, but that it was Nintendo’s American branch that christened him “Mario” due to his resemblance to their landlord, Mario Segale. But did you know that Donkey Kong was supposed to have human voice samples? Or that Nintendo had a company bathtub?
Miyamoto had to create Donkey Kong under intense time pressure. Nintendo of America was sitting on many unsold cabinets of a failed arcade game called Radarscope, and it needed a replacement game immediately. Miyamoto knew he was going into intense crunch time, and telephoned several of his friends, saying, “You probably won’t hear from me for about two or three months.” This was about how long it took to create a full game in those days, he said—but in fact, Donkey Kong ended up taking about four or five months.
“For example, for the game’s title, I was trying to convey the idea of ‘stupid monkey,’” he said. “‘Donkey’ of course referred to the animal, but the dictionary I used said that it had a secondary meaning of ‘idiot.’ Nintendo of America said that this was not the case, and ‘donkey’ didn’t mean ‘idiot.’”
Apple’s strategy has been to present everything as though nothing will ever go wrong with any of their software or services, and so the user doesn’t need a lot of tools to help recover when something does. Because it won’t. Ever.
All of Apple’s services just feel opaque. iCloud drive isn’t great as far as letting me know the status of my documents. If it did break in some horrible way, I have no trust that I would have a good way to get my stuff back.
The strange feeling I have is that I’m not moving because iCloud Drive has gotten better than Dropbox, or even that it’s gotten as good. I’m moving because maybe it’s become sufficient for my needs. I’m purposefully not using what’s clearly the best thing on the market, because I think I’m willing to live without some of it’s features. Hopefully it’ll be good enough.
February 2015, I put 1000 small text files in an iCloud Drive folder. Today, there are 999 left.
I do not trust this system.
UPDATE: 14.txt has been located, in iCloud’s (very well-hidden) Restore Files UI. I have no idea how it was deleted.
Previously: Dropbox Modifies TCC.db to Give Itself Accessibility Access.
Update (2016-11-09): Arthur A. Sabintsev:
Did this last month - haven’t had problems.
Tuesday, November 8, 2016 [Tweets] [Favorites]
The type checker allows you to pass a
String value to an
UnsafePointer<UInt8> parameter. When you do that, the compiler will transparently create a buffer containing the UTF-8-encoded, null-terminated string, and pass a pointer to that buffer to the function.
However, some C functions take an array of strings (a
char ** or
char *), and there is no built-in support in Swift for passing a
[String] to a
char ** parameter.
The full type of the
strlen function as imported by Swift looks like this[…]
Add this key-value pair to your Info.plist: NSUserNotificationAlertStyle with a string value of either banner (recommended by Apple) or alert. Supposedly, there’s another value, none, but that hasn’t worked for me yet – the app won’t appear in the Notifications preference pane.
Having the key-value pair in your Info.plist has no downside if you don’t use NSUserNotifications. There’s only the upside of having the user be able to disable your app’s badges if they like.
The documentation for
NSUserNotification is sparse and implies that Notification Center handles everything automatically. The reality is that developers need to do almost everything themselves.
There is no API to determine whether the user has “Badge app icon” checked in System Preferences. I was stuck on that, but the trick here, which Rig discovered, is that when “Badge app icon” is unchecked, your app’s calls to
setBadgeLabel: will not actually set the badge label. This is analogous to
deliverNotification: in that you should call the method regardless, and Notification Center determines whether anything happens as a result, according to the user’s preferences.
However, you may still want your own preference for privacy.
You’ll also need to call
[[NSApp dockTile] setBadgeLabel:nil] in
applicationWillTerminate: otherwise the Dock badge will remain visible after the app quits. And you may want to call it in
applicationDidFinishLaunching: too, in case your app crashed before it could clear the previous badge.
I noted some time ago that
when you ask Windows to use file system compression,
you get worse compression than WinZip or some other dedicated
file compression program,
for various reasons,
one of which is that
file system compression is under soft real-time constraints.
The requirement that a file compressed on one system be readable by any other system allows a hard drive to be moved from one computer to another. Without that requirement, a hard drive might be usable only on the system that created it, which would create a major obstacle for data centers (not to mention data recovery).
And one of the limiting factors on how fancy the compression algorithm could be was the Alpha AXP.
Many developers have to make the difficult choice between degrading the functionality of their software or leaving the MAS to sell online. […] Things are so acute that entire categories of apps cannot be distributed in the store because they cannot be sandboxed without crippling their feature set (e.g. developer tools, system utilities, and pro apps).
In-app purchases are killing the user experience, but they are currently the only way Apple allows developers to achieve incremental revenue. As a result, one of the only options available is ‘liteware’ with piecemeal in-app purchases, annoying ads, and free apps that “trick” you into buying more later. Devs are stuck between a rock and a hard place: They can’t achieve incremental revenue without in-app purchases, but are punished by consumers for the terrible experience.
Apple has made a lot of progress in reducing the average time it takes for an app to be reviewed, pushing the average app store review time down to just one day from a previous average of eight. That said, Apple’s app review process is incredibly inconsistent.
When sandboxing was introduced, I thought that more entitlements would be forthcoming each year. The theory was that Apple would prefer more apps to be sandboxed, with their functionality controlled by entitlements, than to have them remain wholly unsandboxed. But that hasn’t really happened. If anything, we’ve seen more tightening.
My last four app reviews were 4 hours, 3 days, 6 hours, and 2 days. Oddly, sometimes it takes 1–2 days after “Ready for Sale” before the update actually shows up in the Mac App Store.
Update (2016-11-15): Nick Heer:
As far as I can see, the only apps that take well to the Mac App Store — aside from Apple’s apps — are single-purpose lightweight consumer utility apps. For instance, a while ago, I was trying to find an audio A/B testing app. After fruitlessly scouring the web for probably half an hour, I tried the App Store and found a couple of decent contenders.
Ben Thompson (Hacker News):
And yet it is Twitter that has reaffirmed itself as the most powerful antidote to Facebook’s algorithm: misinformation certainly spreads via a tweet, but truth follows unusually quickly; thanks to the power of retweets and quoted tweets, both are far more inescapable than they are on Facebook.
To be clear, Twitter has a real abuse problem that it has been derelict in addressing, a decision that is costly in both human and business terms; there is real harm that comes from the ability to address anyone anonymously, including the suppression of viewpoints by de facto vigilantism. But I increasingly despair about the opposite extreme: the construction of cocoons where speech that intrudes on one’s world view with facts is suppressed for fear of what it does to the bottom line, resulting in an inert people incapable of finding common ground with anyone else.
This is why Twitter must be saved: the combination of network and format is irreplaceable, especially now that everyone knows it might not be a great business.
Austin Gardner-Smith (via Hacker News):
I’ve always been a big fan of Twitter as a platform. But like most people I’ve met who share that sentiment, I’m a bit disappointed by the grown-up it’s become.
These things happen. I’m not here to point out all the mistakes the management team has or has not made - these are not easy decisions to make and no one likes a Monday morning quarterback. But around 2010, when I was working on Pinyadda, I believed that Twitter was going to become something very different from what it looks like today. I thought it had a chance to become a protocol, of sorts.
Twitter created and controlled perhaps the most important new protocol since HTTP. What if it had embraced third-party developers and found a different business model than advertising?
Monday, November 7, 2016 [Tweets] [Favorites]
In Swift 3, the
id type in Objective-C now maps to the
Any type in Swift, which describes a value of any type, whether a class, enum, struct, or any other Swift type. This change makes Objective-C APIs more flexible in Swift, because Swift-defined value types can be passed to Objective-C APIs and extracted as Swift types, eliminating the need for manual “box” types. These benefits also extend to collections: Objective-C collection types
NSSet, which previously only accepted elements of
AnyObject, now can hold elements of
Any type. For hashed containers, such as
Set, there’s a new type
AnyHashable that can hold a value of any type conforming to the Swift
Property lists, JSON, and user info dictionaries are common in Cocoa, and Cocoa natively represents these as untyped collections. In Swift 2, it was necessary to build
NSObject elements for this purpose, relying on implicit bridging conversions to handle value types[…] Swift now imports Cocoa APIs as accepting collections of
AnyHashable, so we can change the collection type to use
[AnyHashable: Any] instead of
[NSObject: AnyObject] or
NSDictionary, without changing any other code.
Any does not have the same magic method lookup behavior as
AnyObject. This may break some Swift 2 code that looked up a property or sent a message to an untyped Objective-C object.
It’s good practice for programmers to figure out how to recreate crashes that they’re trying to fix. This can involve temporarily rewriting parts of the code to behave in an artificial way that makes the crash more likely. If we can reliably see the crash happen, it goes some distance to confirming suspicions and it gives us something to test potential fixes against. The alternative is to try a fix blindly, release it, and wait to see if we get crash reports.
In this case, I am aware of no way to trigger the suspension of an app that is connected to the debugger. In fact the debugger prevents suspension, and the simulators don’t accurately simulate it. Without the debugger, the only option is to experiment and then review logs on the device.
Apps that access files in a shared container while the app is running in the background should create a background task and not assume that the 30 second completion block time covers them. To work around this, developers can create a background task using the
beginBackgroundTaskWithName:expirationHandler method on UIApplication and call
endBackgroundTask when the background work is finished.
Additionally, Kevin also suggested that apps should close the database when they go into the background as a way to ensure they’ve finished flushing data and to surface rare bugs more reliably[…]
Vindu Goel (via Hacker News):
The counterfeiters have masqueraded as retail chains like Dollar Tree and Foot Locker, big department stores like Dillard’s and Nordstrom, online product bazaars like Zappos.com and Polyvore, and luxury-goods makers like Jimmy Choo, Christian Dior and Salvatore Ferragamo.
Some of them appeared to be relatively harmless — essentially junk apps that served up annoying pop-up ads, he said.
But there are serious risks to using a fake app. Entering credit card information opens a customer to potential financial fraud. Some fake apps contain malware that can steal personal information or even lock the phone until the user pays a ransom. And some fakes encourage users to log in using their Facebook credentials, potentially exposing sensitive personal information.
Many of the fake retail apps have red flags signaling that they are not real, such as nonsensical menus written in butchered English, no reviews and no history of previous versions.
Detecting malicious activity is a hard problem at scale — the App Review process has to handle thousands of apps every day — but it does seem like Apple could be doing more to protect the store from counterfeit software … especially with big, well-known, brands like Nike or Puma.
Update (2016-11-08): Nick Heer:
Contrary to the article, these apps did not appear “just in time for the holidays” — rather, that’s when the Times and New York Post noticed them. Even though Apple has now removed the apps from the App Store, there’s evidence around the web that these apps have been in the store since mid-September.
The single most effective action you can take to improve your build scripts is to extract them into their own files.
Xcode will name every new run script phase as “Run Script”, but that can be quite confusing when you have more than one. Double click on the “Run Script” header to reveal a text field you can use to rename your phase.
The idea is to have a single script invocation in Xcode, calling a script that will then take care of executing the single scripts.
This technique will help you grow your script, change their order, etc. in a tidy and understandable way.
You can make your scripts output compilation errors or warnings the same way Xcode does. I learnt this a while ago from this post.
Sunday, November 6, 2016 [Tweets] [Favorites]
Dmitri Pavlutin (via Natasha Murashev):
You can use
_ to suppress the argument label every time its indication seems redundant.
let (_, sub, _, div) contains
_ at first and third positions. This indicates that addition and multiplication results are insignificant.
The flight speed case
.flight(let speed, _) omits the information about the altitude using an underscore
_. Extracting the altitude in this case is simply not necessary.
Otherwise you can discard the result using an underscore […] Such way you let know the compiler that you ignore the returned value. And no warning is triggered in this case.
If you need to skip naming some closure parameters, just mark those with underscores.
Another common usage of the underscore is to iterate a code block a particular number of times, and ignore the iteration value.
The common wisdom with Apple, especially when it comes to explaining the unusual and apparently limiting ways they introduce features, is that to better serve the user they introduce features that solve the user need in a specific way for each task, instead of providing a generic, unrestricted feature that may not provide an optimal user experience.
So I have to wonder why Apple is not applying this principle to in-app purchases. Currently, it is a generic feature that does not provide an optimal user experience for a variety of user needs[…]
This results in warped incentives for app developers, which you probably know about already since Apple has gotten in hot water in the press for those, especially the matter with children buying smurfberries amounting hundreds of dollars or more (which they’ve been able to do while under the timer, initiated by the initial purchase, where the Apple ID password is not prompted for).
Matt Rajca (tweet):
Scriptarian allows you to easily automate macOS using the Swift programming language, providing a modern alternative to AppleScript.
Scriptarian uses a multitude of heuristics and transformation passes to ensure AppleScript naming conventions map nicely to Swift. For example, the property name
uses ssl gets imported as
url string gets imported as
urlString, and the class name
PXCanvasDocument gets imported as
In addition to full support for the Swift Standard Library, Scriptarian includes ScriptingKit, a scripting framework we built from the ground up with Swift in mind. It lets you communicate with any AppleScript-enabled app and even provides various utility functions for speech synthesis, sound playback, file management, process management, and more.
There’s no trial version, but it’s only $10.
There’s a 100% chance Apple either Sherlocks this or buys it, strips it down, and ships it as Script Editor 3.0.
Hamish Sanderson sees potential:
I love the idea of Scriptarian: a clean, simple out-of-the-box alternative to Script Editor + AppleScript that “Just Works”. The minimal featureset is quite acceptable considering it’s only $10; by comparison, Script Debugger 6 is $100, down from $200, which is still not unreasonable for a “pro” tool.
But has some concerns:
And this one’s the deal-killer: For any software that claims to provide a modern alternative to AppleScript, everything hinges upon how well its application scripting support, a.k.a. Apple event bridge, works compared to AppleScript. And Swiftarian’s AE bridge is rubbish.
Whether an Apple event bridge has any chance of working right depends 100% on whether or not its authors realize that application scripting is far more closely related to relational databases and SQL than it ever will be to Cocoa and Swift.
If the first thing I notice about this app is that it’s more than twice the size than the developer claims that it is, I’m bound to get confused. I can’t see any reason for a developer to claim a thing like this if it’s not the truth.
Then I notice that it’s kinda slow, but hey, it’s a work in progress, so I really don’t mind that. And it’s probably faster if I compile it first… Oh, the second claim about the app “Scriptarian can compile your scripts into native executables” is also not true.
I seriously can’t understand why you would advertise features that isn’t working in the state you are selling it. And apparently it will work in the next update, then please write that it will work, not that it actually works.
I still think that this is a great idea, and worth my $10, but it really needs some tweaks on how the developer is trying to sell it.
Instapaper (via Hacker News):
Before, some of our greatest features were limited to Instapaper Premium subscribers. Now that we’re better resourced, we’re able to offer everyone the best version of Instapaper.
All users will continue to have an ad-free Instapaper app experience, and we’re eliminating ads on the web entirely.
I understand and appreciate the skepticism, however, the reason we’re making this change is because we want to provide the best experience for our users.
Pinterest receives value from the ongoing operation of Instapaper in the form of continued parsing improvements and aggregate information about links on the web, and that value is enough to justify our relatively small operating costs.
We are a data analytics company specializing in providing an online service for smarter shopping which analyzes product reviews and provides potential buyers with a grade based on the reviews authenticity.
With so many online shopping options, product reviews can be a valuable indication of which companies to trust with your money. User reviews should be an informative tool for providing honest feedback from other buyers - but what about when the reviews themselves cannot be trusted? Recent reports of companies tampering with reviews have led to consumer doubt about their validity, and for good reason. In the last year Amazon filed lawsuits against a number of companies that offered to pay for positive reviews, while stories continually come to light of schemes which offer free or discounted products in return for reviews.
Via Gabe Weatherhead:
Now Fakespot has an iOS app that adds a new sharing extension for URLs.
The extension does little more than open a web view with Fakespot results, but that’s enough. I use it directly from the Amazon app.
Update (2016-11-27): Sarah Perez (via Hacker News):
Amazon is making good on its promise to ban “incentivized” reviews from its website, according to a new analysis of over 32,000 products and around 65 million reviews. The ban was meant to address the growing problem of less trustworthy reviews that had been plaguing the retailer’s site, leading to products with higher ratings than they would otherwise deserve.
It found that Amazon had deleted over 500,000 reviews, 71 percent of which were incentivized. The average rating for these deleted reviews was 4.75 stars – clearly much higher than the typical average.
What’s also interesting, Noonan notes, is that Amazon’s product ratings were largely unaffected, despite the mass deletions. The product ratings – that is, when Amazon tells you that a product is “4.5 out of 5 stars” – appear to have already been adjusted to discount the incentivized reviews when calculating the overall rating.
Saturday, November 5, 2016 [Tweets] [Favorites]
PixelCut (via Erica Sadun, Marco Arment):
PaintCode 3 adds support for Swift 3.0 and Swift 2.3, fully compatible with Xcode 8, iOS 10, and macOS Sierra.
By carefully analyzing the Swift compiler and tailoring the generated code to it, we were able to improve the compilation speed by more than 150x in many common cases.
With PaintCode and Telekinesis, you can. Changes you make to your app’s design in PaintCode are propagated in real time into your running app. Works like magic.
If you use Fantastical on a small-screen Mac, you’re going to love this feature. You can now completely hide the sidebar in the main calendar window, allowing your main calendar view to take up the entire window. Just drag to resize, select View > Hide Sidebar from the Menu, or press option-command-S.
Calendar sets are even better in 2.3, as you can set a default calendar and reminder list for each calendar set.
You can now press control-shift and hover over overlapping events in the Day or Week view to quickly view more details. Or press control and an arrow key to reschedule a selected event or reminder instantly. We also added support for traditional mouse scroll wheels in the Day, Week, Month, and Year views (classic mouse enthusiasts rejoice!)
Great stuff, although unfortunately the Control-arrow rescheduling doesn’t work from the mini window.
BugReplay (via Hacker News):
Initially, the risks to ad blockers seemed theoretical; the examples of sites that were employing this technique were very obscure. Then in August 2016, an employee of the company that owns Pornhub.com (MindGeek) started arguing against adding the WebSocket blocking capabilities to the Chrome API. Pornhub is the 63rd most visited site on the Internet according to Alexa. I checked out a few of MindGeek’s sites and sure enough, I could see ads coming through even though I had Adblock Plus on. The ads on Pornhub are marked ‘By Traffic Junky,’ which is an ad network owned by MindGeek.
When the WebSocket loads, the browser sends a frame with a JSON encoded payload for each of the spots it has available for ads.
Since I started looking into this, AdBlock Plus and uBlock Origin have shipped workarounds to block this technique. AdBlock and others still do not.
Sid Bala (via Gus Mueller, Hacker News):
Because now, you can take that frequency domain image and then mask out the edges - discard information which will contain the information with high frequency components. Now if you convert back to your regular x-y coordinates, you'll find that the resulting image looks similar to the original but has lost some of the fine details. But now, the image only occupies a fraction of the space. By controlling how big your mask is, you can now tune precisely how detailed you want your output images to be.
The Y is the luminance (essentially black and white brightness) and the Cb and Cr are the chrominance (color) components. RGB and YCbCr are equivalent in terms of information entropy. […] But check out the trick: the Y component gets encoded at full resolution. The C components only at a quarter resolution. Since the eye/brain is terrible at detecting color variations, you can get away with this. By doing this, you reduce total bandwidth by one half, with very little visual difference.
H.264 splits up the image into macro-blocks - typically 16x16 pixel blocks that it will use for motion estimation. It encodes one static image - typically called an I-frame(Intra frame). This is a full frame - containing all the bits it required to construct that frame. And then subsequent frames are either P-frames(predicted) or B-frames(bi-directionally predicted). P-frames are frames that will encode a motion vector for each of the macro blocks from the previous frame.
I was hoping the author would write about H.264 specifically, for instance, how it was basically the “dumping ground” of all the little tweaks and improvements that were pulled out of MPEG-4 for one reason or another (usually because they were too computationally expensive), and why, as a result, it has thousands of different combinations of features that are extremely complicated to support, which is why it had to be grouped into “profiles” (e.g., Baseline, Main, High).
I was also hoping that he would at least touch on the features that make H.264 unique from previous MPEG standards, like in-loop deblocking, CABAC Entropy Coding, etc..