Archive for April 2015

Thursday, April 30, 2015

Microsoft’s New Middleware: Islandwood and Astoria

Alex Wilhelm and Frederic Lardinois (comments):

Today as expected, Microsoft announced that developers will be able to more easily bring their Android applications to Windows devices. The company said developers will be able to “reuse nearly all the Java and C++ code from an Android phone app to create apps for phones running Windows 10.” Developers will also be able to recycle their Objective-C apps for iOS using new tools in Visual Studio.

Tom Warren:

“If they’re using some Google API… we have created Microsoft replacements for those APIs.” Microsoft’s pitch to developers is to bring their code across without many changes, and then eventually leverage the capabilities of Windows like Cortana, Xbox Live, Holograms, Live Tiles, and more.

[…]

Microsoft is also looking toward existing Windows desktop app developers with Windows 10. Developers will be able to leverage their .NET and Win32 work and bring this to Windows universal apps. […] Microsoft is using some of its HyperV work to virtualize these existing desktop apps on Windows 10. Adobe is one particular test case where Microsoft has been working closely with the firm to package its apps ready for Windows 10. Adobe Photoshop Elements is coming to the Windows Store as a universal app, using this virtualization technology. Performance is key for many desktop apps, so it will be interesting to see if Microsoft has managed to maintain a fluid app experience with this virtualization.

Peter Bright:

With Project Islandwood, iOS developers will be able to take their iOS apps and build them for Windows. Microsoft has developed an Objective C toolchain and middleware layer that provide the operating system APIs that iOS apps expect. A select group of third parties have been using the Islandwood tools already, with King’s Candy Crush Saga for Windows Phone being one of the first apps built this way. King’s developers had to change only a "few percent" of the code in order to fully port it to Windows Phone.

For Android, there is Project Astoria. Rumors of Android apps on Windows have been floating around for some time, and in Windows 10 Microsoft is delivering on those rumors. Astoria will allow Android apps to run in Windows. Specifically, Windows Mobile (and yes, that’s now officially the name for Windows on phones and sub-8 inch tablets) will include an Android runtime layer that’ll let them run existing Android apps (both Java and C++) unmodified. Unlike Islandwood, which will require developers themselves to recompile their software to bring it to Windows, Astoria will in principle work with any old APK, without requiring the developer to do anything but publish the app in the store—as long as the APK sticks to the APIs that Astoria will provide.

John Gruber:

The solution sounds complicated. Games are one thing — cross-compilation and shared code bases work fine for many games. But for actual apps, running apps designed for platform A on platform B never looks or feels right, even if technically it “works”. Running apps from platforms A and B on platform C? Yikes.

Frank A. Krueger:

It seems you still have to rewrite the UI since Microsoft can’t ship Cocoa Touch.

Update (2015-05-02): Marcel Weiher:

They don’t claim or shoot for complete coverage or compatibility with a specific iOS version.

Swift is not there, dev said “coming”, suit said “we have no comment” (the interaction between the young and slightly insecure program manager and the old and very comfortable dev. was fun to watch).

Project conversion is one-way and apparently one-time, which could be an issue. Dev immediately said “why not two-way, hey, that’s a good idea, we’ll do that”.

copx:

It seems Microsoft actually wrote their own Objective-C runtime. I mean otherwise the guy would have said “we ported Apple’s runtime” or something like that. But he said “We are providing you with a great Objective-C runtime.”

Project Islandwood:

“Following the launch of Windows 10, we will release “Project Islandwood”, a Universal Windows Platform Bridge toolkit that enables you to develop Windows apps using Objective-C.

Ken Ferry:

Stoked and impressed that Microsoft implemented auto layout and nibs as part of Islandwood!

Rosyna Keller:

So it looks like Microsoft acquired Inception Mobile for ObjC on Windows.

It seems Microsoft is taking an identical path for Project Islandwood that Wine took for Win32. Expect similar issues.

Microsoft Visual Studio Code

Microsoft:

Build and debug modern web and cloud applications. Code is free and available on your favorite platform - Linux, Mac OSX, and Windows.

Frederic Lardinois (comments):

This marks the first time that Microsoft offers developers a true cross-platform code editor. The full Visual Studio is still Windows-only, but today’s announcement shows the company’s commitment to supporting other platforms.

[…]

Visual Studio Code offers developers built-in support for multiple languages and as Microsoft noted in today’s Build keynote, the editor will feature rich code assistance and navigation for all of these languages. JavaScript, TypeScript, Node.js and ASP.NET 5 developers will also get a set of additional tools.

EnderMB:

What I took from it is that Microsoft used to make all their money from Windows and Office, but now the company is looking to transition towards being a service company rather than a product company. As a service-oriented company, restricting developers towards a single platform doesn’t really help them, so ultimately it’s in Microsoft’s best interest to get .NET out there as much as possible so that people will want to choose their services.

shankun:

The Visual Studio Code shell is built on GitHub’s Electron Shell, but the editor is a new and improved version of our own Monaco editor, which we use on Azure Websites, Visual Studio Online, and a number of other web sites, and in the F12 Tools in Internet Explorer.

The Nucleus of Atom (via Rosyna Keller):

Another great thing about writing code for Atom is the guarantee that it’s running on the newest version of Chromium. That means we can ignore issues like browser compatibility and polyfills. We can use all the web’s shiny features of tomorrow, today.

For example, the layout of our workspace and panes is based on flexbox. It’s an emerging standard and has gone through a lot of change since we started using it, but none of that mattered as long as it worked.

With the entire industry pushing web technology forward, we’re confident that we’re building Atom on fertile ground. Native UI technologies come and go, but the web is a standard that becomes more capable and ubiquitous with every passing year.

Pradeep:

One key difference between Microsoft’s offering and Atom is that Monaco runs on all modern browsers while Atom can only run on specialized version of Chromium alone.

Siri 3

Derrick Harris (via John Gruber):

Siri’s Mesos backend represents its third generation, and a move away from “traditional” infrastructure. Apple’s work with Mesos and J.A.R.V.I.S. predates the open-sourcing of Marathon (by Mesosphere) and Apache Aurora (by Twitter) in 2013.

Not only has Mesos helped make Siri scalable and available on the infrastructure front, it has also improved latency on the app itself.

After having a great experience with Siri in January, I’ve noticed a drop-off. Over the last month, the “Hey Siri” feature has never worked for me in the car. It’s as if it’s not even listening. It used to work consistently in the car (and still does in my office). I’ve also seen a recurrence of it being slow or unavailable when I’m out and about. It will either do nothing or say that there’s no Internet connection, even though the phone has full bars and other apps can do things online.

Aside from reliability, I’d like to see a way to turn off Siri’s reminder parser. Usually what I’m doing is saying “Remember to …” to create a reminder in OmniFocus. I always want to create a plain reminder with some text: no due date, etc. Yet if I say anything that sounds like a time, a day of the week, the name of a holiday, etc. Siri will pull words out of my sentence and turn them into metadata, so that the actual text is unrecognizable. I think it used to only try to interpret the text if I said “Remind me to” instead of “Remember to.”

BBEdit 11.1

My favorite new feature in BBEdit 11.1 is the Git menu. I also like the new “Search in Document’s Folder” command and the way that the Differences window now uses underlines to show which parts of a line changed.

Wednesday, April 29, 2015

Why I Prefer CrashPlan for Online Backups

Joe Kissell:

CrashPlan developer Code 42 publicly stated a few years ago that a native Mac app was in the works, but for some reason it has so far failed to materialize. Instead—perhaps as an interim measure while the native app is being perfected—CrashPlan now bundles its own copy of Java. That means you can run CrashPlan on your Mac without having to download Oracle’s Java—it behaves just like a stand-alone app. More importantly, CrashPlan’s built-in version of Java is self-contained, inaccessible to other Java apps and to websites, which are where most Java security exploits originate. And it doesn’t include the adware.

[…]

First, [Backblaze] file restoration drives me nuts. You log in to your account on the Backblaze website and select the file(s) you want to restore, and what you get back is a Zip file containing those files—in a replica of their original folder structure. So, if you restore a single file that was stored 10 levels deep in a series of nested folders, your expanded Zip file will be a series of 10 nested folders with your file inside the last one. After digging down to it, you’ll have to drag it manually to the corresponding spot on your disk. That’s a minor inconvenience for one file, but a huge hassle if you’re restoring lots of files from different locations.

By contrast, the CrashPlan app gives you the option to restore any file to its original location—either overwriting or renaming any file of the same name. Which is exactly what I want, 90 percent of the time. Or, if you prefer, you can restore files to your Desktop or any other arbitrary folder.

[…]

Unfortunately, although Carbonite is pretty good on Windows, the Mac version lacks a number of features I consider essential, including versioning (storing old versions of backed-up files after the original changes).

Software, Psychedelics, and the Origins of OS X & iOS

Andrew C. Stone (via Bill Bumgarner):

Today I’m going to share with you stories of the people and events that helped create the World of Today and talk freely about the influences and the coming of age stories affecting the kids born in the mid-1950’s (Like Steve, Bill Gates, me & probably many of you).

[…]

NeXTStep had become OpenStep, then Mac OS X and now iOS - something almost unheard of in software engineering, something magical - a technology not only survives 25 years but thrives and evolves and the NeXT community gets to use it’s sharply honed ObjectiveC and XCode skills.

There was a grand feeling of having chosen the underdog’s underdog and being part of a small group of people that led the stray puppy home, and then being part of the next 18 years when this underdog becomes the world’s most profitable corporation and replaced the mighty Ma Bell AT&T on the Dow Jones Industrial Average. Being an underdog sort of person, I can see after almost 30 years, 30 applications and apps, my job is done here.

Removing Unmaintained Apps from the App Store

Gavin Hope:

Here’s why I don’t want an unmaintained app in the App Store:

  • It goes again my values. I value good software and I try to make good software. Leaving apps around that I have no intention of improving feels wrong.
  • It’s not good for the customer. Allowing someone to invest time and/or money into software that’s been written off seems unfair; I like the software that I use to be kept up to date, bugs fixed and improvements made.
  • It looks bad. Out of date apps don’t reflect well on the other things I’m developing. They can suggest poor decisions, habits and practices. They make the overall portfolio look disjointed and messy.

I recently discovered that Gameloft’s The Oregon Trail (App Store) has been abandoned. I purchased it when it was released for $6. 65,652 ratings later, it’s still for sale at $5 with this too-subtle disclaimer in the description:

We are aware of an issue that might prevent the game from running properly on iOS 7 or iOS 8. We apologize for any current inconvenience this may cause.

It turns out that it doesn’t launch at all on iOS 8 or even iOS 7. So it’s been broken for a long time. It’s apparently abandoned because the last update was in 2011. When I reported the problem to Gameloft, they said:

Unfortunately, The Oregon Trail has not been optimized for new Apple devices, that is why you may experience problems of this kind.

We suggest the following solution:

  • delete The Oregon Trail
  • install The Oregon Trail: American Settler Free+

The “solution” is to install a completely different game (App Store). Or, I guess, you could play the free JavaScript version, although that doesn’t work on my iPhone.

Tuesday, April 28, 2015

How to Eliminate Drop Shadows in Screenshots

Josh Centers:

You probably know about the keyboard shortcut to take a screenshot of a portion of the screen: Command-Shift-4. […] Less well known is the fact that if, instead of dragging out a rectangle, you press the Space bar, your cursor becomes a camera, and placing it over a window, dialog, or dropped-down menu highlights that object. Click the highlighted object and you get a screenshot of just that object, complete with drop shadow, on your Desktop.

But what if you don’t want the drop shadow? Easy. Instead of clicking the highlighted object, Option-click. That produces the same screenshot with no drop shadow.

What if you never want a drop shadow on your screenshots (like us)? In that case, you need to fire up the Terminal app.

He also presents a Quartz Composition filter for adding borders to screenshots that don’t have drop shadows.

Adobe Photoshop Lightroom CC 2015 Review

Jeff Carlson:

Lightroom CC now takes advantage of your computer’s GPU (graphics processing unit) for image-intensive tasks, so the main processor isn’t shouldering as much of the load. Computers with discrete GPUs see the most improvement, but machines with integrated GPUs (soldered onto the motherboard, such as many Intel processors) also see improvements. […] Want to see the difference yourself? In Lightroom’s preferences, you can turn off the Use Graphics Processor option in the Performance screen, an option no doubt included in case compatibility issues arise with graphics cards.

[…]

Lightroom 5 offered a way to create HDR (high dynamic range) photos by selecting two or more shots of the same scene captured at different exposures and shuttling them over to Photoshop CC’s HDR Pro module. Instead of taking that round trip through Photoshop to merge the shots into one, Lightroom CC now includes its own HDR Merge feature.

I think I will eventually switch to Lightroom and adjust to it, but I’m not looking forward to that process.

Microsoft’s LLVM-Based Compiler for .NET

Russell Hadley (via Slashdot):

The LLILC project (we pronounce it “lilac”) is a new effort started at Microsoft to produce MSIL code generators based on LLVM and targeting the open source dotnet CoreCLR. We are envisioning using the LLVM infrastructure for a number of scenarios, but our first tool is a Just in Time(JIT) compiler for CoreCLR. This new project is being developed on GitHub and you can check it out at https://github.com/dotnet/llilc.

[…]

This new JIT will allow any C# program written for the .NET Core class libraries to run on any platform that CoreCLR can be ported to and that LLVM will target.

Unmanaged

Nate Cook:

An Unmanaged<T> instance wraps a CoreFoundation type T, preserving a reference to the underlying object as long as the Unmanaged instance itself is in scope. There are two ways to get a Swift-managed value out of an Unmanaged instance:

  • takeRetainedValue(): returns a Swift-managed reference to the wrapped instance, decrementing the reference count while doing so—use with the return value of a Create Rule function.

  • takeUnretainedValue(): returns a Swift-managed reference to the wrapped instance without decrementing the reference count—use with the return value of a Get Rule function.

In practice, you’re better off not even working with Unmanaged instances directly. Instead, take... the underlying instance immediately from the function’s return value and bind that.

Amazon Sues Fake Review Site

Joe Mullin (via Slashdot):

The giant of online retail has filed a lawsuit (PDF) in King County Superior Court against Jay Gentile, a California man who Amazon says created websites offering to sell verified Amazon reviews for between $19 and $22 per review. The websites sell varying packages of reviews, allowing users to buy as few as three reviews and as many as 100.

The offerings include “drip-feed delivery” and a “100 percent stick guarantee” for reviews, promising to replace any that Amazon deleted or filtered out.

Monday, April 27, 2015

Mythology

Soroush Khanlou:

In one of my favorite posts of all time, Mike Hoye looks up exactly why we use zero indexed arrays. To spoil it, he finds that it was to optimize for compilation speed (rather than execution speed) on hardware where you only had a limited time to run your job.

[…]

Why has MVC attained this state of reverence when it’s trivial to find cases where it doesn’t apply? And it’s not as though MVC is a mere suggestion: the Cocoa documentation actually states that every object has to be either a Model, a View, or a Controller, even though there are objects within Cocoa that don’t even fit in one of those three categories! “MVC” isn’t a rigorously-defined term anymore, but rather a necessary, low-information signal to other developers that our new framework fits into their worldview.

[…]

C-style syntax probably will never go away as long as we have text-based programming languages. Even Swift, which tries to fix tons of flaws in programming, doesn’t even begin to move away from C-style syntax. It’s too ingrained in the way we view code.

[…]

It’s too easy to continue doing what we’ve always done. I want to question all the constants in my programming career. The things that are already status quo are don’t need cheerleading: they’re already winning. But the weird ideas, the undersung ones, those are the ones we should be championing.

Previously: Why Array Indices Start at Zero. I find Hoye’s post interesting but not entirely convincing.

Hey Apple, Stop Messing With My Music

Kirk McElhearn:

Okay, Apple, this is getting out of hand. It’s bad enough that when I sync my music to my iPhone, you think you have the right to replace some of my album art. But now you’re changing my tags. And they’re wrong.

Greg Shadley:

What I have discovered is they way music is sorted has changed. If you go into the album info, go to the sorting tab. The “Sort As” lines have information that I never put there. Apple has changed the way I sort my music and I don’t like it. If you delete the information in those lines, it will return your library to the way you originally set it up. At least it has for me.

Joe Nash:

So it’s showing different metadata when playing back in iOS 8.3, but not changing any of your actual iTunes metadata on the Mac? I hope this is the case, because it means they are just changing it for display purposes. If iTunes messed with my real metadata, I think I’d cry.

HTTPS Bug in AFNetworking Affects 25,000 iOS Apps

Dan Goodin:

The new vulnerability is the result of a bug in AFNetworking that fails to ensure the domain name contained in the certificate matches the domain name of the HTTPS server it protects. As a result, anyone with a man-in-the-middle position—say, an attacker on an unsecured Wi-Fi hotspot, a rogue employee inside an Internet service or virtual private network provider, or a state-sponsored hacker sniffing the Internet backbone—can present their own CA-issued certificate, then read or tamper with the protected communications.

coolfactor:

It wasn’t a black-box bug, but rather the library has now been made more idiot-proof and “safer out of the box”. The validatesDomainName property was always configurable by developers using the library, and those that failed to be aware of it could’ve been bitten in the situation where the setting was defaulting to “NO” under non-pinning connections. It now defaults to “YES” in all cases, but a developer could’ve chosen to set that explicitly in their own code and been okay.

NateLawson:

There is no valid production scenario for turning off domain validation. It literally disables SSL to any attacker in the middle (e.g. shared WiFi). The fact that AFNetworking has now exposed user data two different ways via APIs that are only useful for testing shows that the defaults should be secure, and test mode should be something that is off by default and prints huge warnings if SSL is ever used in test mode.

Update (2015-04-28): Alamofire Software Foundation:

AFNetworking 2.5.1 and 2.5.2 include default behavior that are unsuitable for production applications—specifically, they do not provide necessary TLS evaluation without additional configuration.

AFNetworking 2.5.3 defaults to safer behavior, enabling domain name validation even when not using SSL pinning.

orrc:

You seem to be upset by articles discussing this already-publicly-disclosed vulnerability (though again, I’m not sure which parts you find objectionable), yet you continue to ask people to report security issues publicly via GitHub.

[…]

To enable responsible disclosure, this project needs a way of reporting security issues privately. On the master branch right now, the README only mentions Twitter as a way of getting in touch. Even with open source projects, having a security contact or private bug tracker for security issues isn’t unheard of.

EFF Busts Podcasting Patent

The Electronic Frontier Foundation (via John Gruber):

The U.S. Patent and Trademark Office (USPTO) invalidated key claims in the so-called “podcasting patent” today after a petition for review from the Electronic Frontier Foundation (EFF)—a decision that significantly curtails the ability of a patent troll to threaten podcasters big and small.

[…]

In petitions filed with Patent Office, EFF showed that Personal Audio did not invent anything new before it filed its patent application, and, in fact, other people were podcasting for years previously. Earlier examples of podcasting include Internet pioneer Carl Malamud's "Geek of the Week" online radio show and online broadcasts by CNN and the Canadian Broadcasting Corporation (CBC).

Previously: Personal Audio vs. Adam Carolla.

Sunday, April 26, 2015

iCloud Photo Library: the Missing FAQ

Joe Kissell:

Q: So, um… is there anything I can do about that whole bandwidth issue?

A: Yes. First, you can pause transfers. To do this, go to Photos > Preferences > iCloud and click Pause for One Day, which does exactly what it says. (You can manually resume transfers before the day is up by clicking Resume.) But if you need transfers to pause for a longer period of time, you’ll have to click that button every day. Your second option is to temporarily disable iCloud Photo Library altogether by going to System Preferences > iCloud, clicking the Options button next to Photos, and deselecting iCloud Photo Library. There’s no penalty for doing so; this merely disables syncing, and does not affect any photos on your Mac (except that if iCloud Photo Library has downloaded low-resolution versions of any photos but not the full-resolution copies at the moment you disable syncing, Photos may delete the low-resolution versions, and will warn you that it’s about to do so). If and when you later reselect it, syncing will resume.

But what if you quit Photos? Won’t that also stop syncing? Maybe. My initial experiments showed that transfers did indeed stop when I quit Photos. After Jason Snell pointed out that he had different results, I ran more tests. My revised results suggest that downloads from iCloud Photo Library pause when you quit Photos, but uploads continue even when the app isn’t running. Furthermore, My Photo Stream (if enabled) may transfer photos when Photos isn’t running. All that to say: quitting Photos might help in certain situations, but you can’t count on it.

Bandwidth is an issue, especially when traveling. On my last trip, I had to disable My Photo Stream and import via USB because, even overnight, the photos wouldn’t all finish transferring to my Mac over Wi-Fi. I also found that I needed to set a slow fixed transfer rate for Arq to prevent it from blocking all my other network connections. With the new photos removed from my phone daily, because it was full, and not enough bandwidth to upload them all to a cloud backup, I ended up setting up Time Machine to back up the new Aperture masters to an SD Card.

Update (2015-04-28): Photos doesn’t have a bandwidth limiter, just an off switch. John Siracusa discusses the poor family workflow and how iCloud Photo Library makes the iOS photo picker really slow.

Update (2015-05-04): Matt Henderson:

According to this Apple support document Faces data does not sync. Terribly disappointing.

Fraser Speirs:

The only reliable way I found to determine whether my Mac was completely finished migrating all the data to the cloud was to observe the Networking tab in Activity Monitor. When Photos was migrating, there was a very obvious pattern to the upstream bandwidth usage.

Matt Henderson:

My iPhone saw the Library data quite quickly, but my iPad didn’t, even after a toggling of iCloud Photo Library. Ben Brooks recommended toggling it on all my devices. I would have never considered doing that, but somehow it worked.

[…]

But we discovered that the iCloud Photos app on our second generation AppleTV doesn’t provide access to the library, just the “Photo Stream” and shared albums.

[…]

Watching videos in Photos on my Mac is very slow (over my Spanish ADSL connection), since the entire video has to download before viewing can begin. I wish there was an option to just stream them.

[…]

When cropping photos, I wish there were an option in the Setting to preserve the original aspect ratio. I almost never want a free-form aspect ratio when cropping (which is the default).

The One Line You Should Add to Every Makefile

John Graham-Cumming, who’s just written the GNU Make Book (Amazon):

It’s:

print-%: ; @echo $*=$($*)

It allows you to quickly get the value of any makefile variable. For example, suppose you want to know the value of a variable called SOURCE_FILES. You’d just type:

make print-SOURCE_FILES

This works with the 2006 version of GNU Make that comes with Xcode.

Reviving an Apple Wireless Keyboard

After about five years of service, my Apple Keyboard started giving me lots of trouble: missing keys that I’d typed, repeating keys that I’d only typed once, showing the character accent pop-over when I hadn’t held down a key, and spontaneously connecting and disconnecting from Bluetooth.

In the past, these types of problems always signaled that the two AA batteries needed changing, even though they were usually shown at 20% or higher capacity. This time, however, changing batteries only helped for a few hours, and then the problems recurred. I tried several sets of batteries, all above 85% capacity. Restarting the Mac sometimes seemed to help, but only for a short time. Other Bluetooth devices worked fine with the Mac.

I was pretty sure that I needed a new keyboard when I came across this post by Kevin C. Tofel about using tin foil to fix a Bluetooth Apple Keyboard that wouldn’t power on. He put a little ball of aluminum foil between the battery and the keyboard’s positive contact to make sure that they were connected. My keyboard always turned on, but perhaps the problems were caused by it intermittently losing power. Sure enough, I dropped a much smaller ball of foil into my keyboard two days ago, and it’s been working perfectly ever since.

This is a great keyboard. The only other problem I’ve had is that the labels are wearing off some of the keys—the E and S are gone, along with half of the D and C, and much of the Down Arrow—though I only use it with clean fingers. The E has even developed a little depression. This never happened with other keyboards that I used, for more years.

Deprecating the Sync and Datastore APIs

Dropbox:

We added the Datastore API in the summer of 2013 to support syncing structured (non-file) data with Dropbox. The Sync API and Datastore API are both part of the same mobile SDKs.

Since its launch almost two years ago, the Datastore API hasn’t seen the adoption we had hoped for. While some developers have adopted this API and loved it, the raw numbers show that it wasn’t used by very many apps.

The Datastore API is somewhat unique in that it, unlike the Core API, deals with non-file data, so we’re working directly with individual developers to help them migrate to an alternative. Existing apps built using the Datastore API will continue to work in the meantime.

I’m not aware of a good replacement for the Datastore API.

Saturday, April 25, 2015

That Finder Thing

John Gruber in 2002 (via Talus Baddley):

Once the NeXT regime stepped in and assumed top positions in Apple’s software division, they started putting their stamp on Apple’s UI design, despite the fact their input on such matters was neither wanted nor needed. The hallmarks of NeXT’s UI design are extravagant attention to cosmetic appeal, and nearly no attention whatsoever to actual usability. This is enough to fool many people, especially converts switching from other platforms, where the interfaces are both ugly and dysfunctional. If it looks better, it must be better, right?

[…]

Look no further than Mac OS X’s System Preferences. The icons looks nice, and the window smoothly slides around and redraws itself as you change from one panel to another. But because the list of preference panels occupies the same space as the panels themselves, you can’t switch directly from one panel to another, except for the handful of panels you put in the favorites list atop the window.

The favorites list is now gone. There’s now a Customize… command to hide certain icons, but this is not a replacement for favorites, more a way to hide panes that you never use. The Show All Preferences feature does not, actually, show all of the preferences; it just takes you back to the icon view that has some icons hidden. Switching panes still takes two clicks. Lists are still needlessly constrained in size because the main window isn’t resizable.

And so Apple was inundated with feedback complaining about the Desktop file manager. The complaints could be summed up as “Bring back the Finder.” But instead of bringing back the Finder, they simply brought back the name, along with a few superficial features.

[…]

The most common question I’ve heard about the new OS X Finder is “Why doesn’t it remember the size and location of open windows?”

13 years and a Cocoa rewrite later, the Finder still doesn’t remember how many windows I had open, or their sizes or locations. It doesn’t remember that I always like to have the status bar shown. (I wrote a script to put the windows back where I want, and even then the Finder doesn’t always obey the command to show the status bar.) It sometimes forgets my preferred sidebar and column widths.

Icon view doesn’t use the same pixel-perfect icons as the other views, and it is still so unreliable that it’s not worth using except to quickly view a bunch of image thumbnails. And I’m not even talking about remembering manually positioned icons, which I’ve long since given up on; the Arrange By feature doesn’t work reliably, either.

The classic Finder is like using your own hands. The OS X Finder is like using a joystick to control a set of robot hands — clumsy and inherently less intuitive.

[…]

Keep the new column view, but not as an alternative to icon and list views for normal (spatial) Finder windows. Instead, create a distinct new “Column Browser” window class, which acts like the column view in the current OS X Finder. When you double-click a folder in a Column Browser, however, it should open in a regular (spatial) Finder window.

Gruber said he wasn’t holding his breath, and that was wise. I’m not surprised that Apple never brought back the spatial Finder. What does surprise me is the state of the browsing Finder. It’s gained some browsing features such as the path bar, tags, and tabs. But the basic browsing functionality is still no match for Apple’s Web browser, Safari, which has better window state retention, bookmarks/favorites, tabs, history, and search.

Friday, April 24, 2015

Risky Business

David Sparks:

At the end of this process I found myself repeatedly coming back to my hypothetical death bed. If I was laying somewhere right now facing down the reaper, what would I regret more? It then became crystal clear to me.

If I let MacSparky and the Field Guides linger and wither, I would never forgive myself.

With that realization, a long tortuous decision process found clarity and purpose. I realized that if I ever had my ladder leaning against the wall of being a hot-shot partner in a big law firm, it had long since moved. I love being a small, crafty country doctor lawyer. The small business David that uses his Mac to sling rocks at big firm Goliaths.

[…]

I’m doing it the way any self-respecting geek would. I’m pulling pieces of technology together to make me look like superman in both the MacSparky and legal world. I’m having a lot of fun developing new workflows and, yes, I’ll be writing and screencasting about that here.

iOS 8.3 Blocks File Managers and Transfer Utilities

Joe Rossignol (via Josh Centers):

Apple has changed security settings in iOS 8.3 that prevent file managers and transfer utilities such as iFunBox, iTools, iExplorer, iBackupBot and PhoneView from gaining access to app directories on an iPhone, iPad or iPod touch. The change breaks current versions of transfer utilities for OS X and Windows, forcing many developers to release new versions of their software with workarounds that restore at least partial sandbox access.

The new versions can only access files from apps that have iTunes file sharing enabled, and then only from the shared folders. This is a major loss because file access is important for backing up and salvaging files, and for selectively restoring them. (iCloud and iTunes backups are more opaque, incomplete, and all-or-nothing.) I’ve also found file access essential when communicating with app developers to troubleshoot misbehaving apps. I can just look in PhoneView to send a log file or folder listing.

Apple’s intent with the change seems to be to protect users from malicious Mac (and Windows) apps that were installing files onto people’s iPhones, or perhaps surreptitiously reading private app data. If that’s the case, it would make sense to offer an “unlock” feature for when the user wants to grant access.

Mentioning Pebble in the App Store

Steve (Hacker News):

We have just had the latest version of our SeaNav US iOS app rejected by Apple because we support the Pebble Smartwatch and say so in the app description and meta-data (we also state in the review notes that “This application was approved for use with the Pebble MFI Accessory in the Product Plan xxxxxx-yyyy (Pebble Smartwatch)”.  See copy of rejection reason below.

SeaNav US has previously been approved by Apple with no problem, we have had Pebble support in SeaNav for nearly 2 years and there are no changes to our support for the Pebble in this version.

mapgrep:

The problem appears to be that Apple has reclassified smart watches as a “mobile platform” whereas they did not before. So suddenly having an app so much as mention a smart watch brand is tantamount to mentioning, say, Android.

yellowapple:

According to other posts in the linked discussion, other apps are being rejected under the same rationale and for the same reasons, and attempts to appeal those rejections aren’t going through (Apple’s reviewers are continuing to reject new versions of these apps until they remove any/all mention of “Pebble” in their metadata).

So apparently this is now Apple policy, rather than a reviewer’s mistake. This is certainly bad for iPhone users, since almost any accessory could potentially be considered a “mobile platform.” What’s next? Rejecting Fitbit’s app? I can’t see how this policy helps anyone, even Apple. Pebble support doesn’t diminish Apple Watch; the two watches are not even in direct competition. Rather, it increases the value of the iPhone platform to have all these devices working with iOS. Past App Store rejections have made Apple look petty, or perhaps evil. This one just makes it look stupid.

Thursday, April 23, 2015

Lessons Learned in Software Development

Henrik Warne (via Drew Crawford):

When you develop, and some tests fail, or a feature stops working, it’s much easier to find the problem if you only changed one thing. In other words, use short iterations. Do one thing, make sure it works, repeat. This applies down to the level of commits. If you have to refactor the code before you add a new feature, commit the refactoring first, then (in a new commit) add the new feature.

[…]

When developing a new system, one of the first things I do is adding logging and error handling, because both are useful from the very beginning. For all systems that are bigger than a handful of lines of code, you need some way of knowing what happens in the program.

[…]

Every developer should spend a portion of their time handling trouble reports from customers and fixing bugs. It gives you a much better understanding of what the customers are trying to do, how the system is used, how easy or hard it is to troubleshoot and how well the system is designed.

[…]

Sometimes there are several problems present that you know about. The different bugs can interact with each other and cause strange things to happen. Instead of trying to work out what happens in those cases, fix all the know problems and then see what symptoms remain.

FogBugz Iteration Planner

Fog Creek (tweet):

Iteration Planner helps teams construct and plan iterations from existing cases. Create milestones for backlog, sprints, doing and done — or any other structure your team or project needs. Customize each project's structure with Iteration Planner to match your ideal Agile or Scrum work flow. Iteration Planner provides the flexibility and power to make project and sprint planning work with your team.

I don’t use any of that agile process jargon. To me, it’s a nifty new view that shows multiple milestones at once, each in a column, like Trello cards. You can drag and drop to move cases between milestones. You can also create new cases and search for old ones to drag in without reloading the page.

Thanks

Thanks to TidBITS (tweet). 25 years and still going strong in terms of content and editing, still with a clean page design that’s easy to read.

Although Take Control was keeping TidBITS afloat as we started the second decade of the twenty-first century, it wasn’t pretty. I was torn between working on Take Control projects that actually paid and TidBITS articles that didn’t, and sponsorship revenues had been dropping for years. With Glenn’s help on the back end, we turned TidBITS from being entirely ad-funded to being supported primarily by voluntary contributions from our readers through the TidBITS membership program (see “Support TidBITS by Becoming a TidBITS Member,” 12 December 2011). That money has allowed us to hire Josh Centers as managing editor and pay our contributing editors and freelance writers. As successful as the TidBITS membership program has been, with nearly 2,900 people stepping up to keep TidBITS coming out every week, that’s still not even 15 percent of our email subscribers, much less the many tens of thousands of people who read in RSS or on the Web. If you’ve found our work valuable over the years, or if one of us has helped you personally with a problem, could you kick in $20 to help TidBITS keep going?

Thanks to the Edge Cases podcast. They’re stopping after 128 episodes, but since it wasn’t very topical I think the back catalog will age well. The episodes are a rare combination: short, dense, technical, ad-free, and occasionally hilarious.

Update (2015-04-26): Thanks to John Siracusa for 15 years of Mac OS X reviews.

Monday, April 20, 2015

Researching ResearchKit

Peter Steinberger:

Apple’s first GitHub-released open source project is a big thing. There’s much to learn here - I’ve spent some time reading through the source, here are my observations.

Instant Hotspot: Tethering Always Enabled

Apple:

You can use Personal Hotspot on your iPhone to provide Internet access to your other devices without additional setup. You’ll need to sign in to iCloud using the same Apple ID as your iPhone. Also, your cellular provider needs to provision your Personal Hotspot.

After traveling for a week, using Personal Hotspot because it was faster than hotel Wi-Fi, I got home and was surprised to find that the Mac offered my iPhone as a Wi-Fi connection. I had been consistently turning off Personal Hotspot when not using it, and in fact it was off. But it turns out that showing the hotspot anyway is not a bug; it’s Instant Hotspot, part of the Continuity feature in Yosemite. If the Mac and iPhone are using the same Apple ID, Personal Hotspot is always available. You only have to turn on Personal Hotspot to share your phone’s connection with other people’s devices.

Presumably it’s worked this way for months, since iOS 8.1, but I didn’t see this because until my trip I was using an older AT&T plan that didn’t include tethering.

I didn’t notice this during the trip—the hotspot was not available when Personal Hotspot was off—because Instant Hotspot requires Bluetooth, which I turn off when traveling. Interestingly, Personal Hotspot can work over both Wi-Fi and USB, so when charging my iPhone from the Mac, the iPhone would show two Personal Hotspot connections from the same Mac. But this direct connection is not considered sufficient proximity for Instant Hotspot if Bluetooth is off.

Update (2015-05-27): I’m not sure what changed, but my Mac no longer shows my iPhone in the Wi-Fi menu unless Personal Hotspot is enabled.

Friday, April 10, 2015

Et Tu, Tim?

Joe Rosensteel:

A few days ago, U.S. District Judge Lucy Koh dismissed a class action lawsuit against several animation, and visual effects companies. This is directly tied to the emails uncovered in a 2010 suit by the Justice Department for the companies agreeing not to poach employees from one another. Ed Catmull — one of the most important people in computer graphics, and film — was sending very casual emails about coercing people to participate in the no-poaching scheme.

[…]

When Koh ruled against the former employees, I was gobsmacked that the employees couldn’t sue the companies because the statue of limitations had expired. The clock started ticking when the employees were affected, not when proof of a scheme came to light. So tough cookies.

During my twitter indignation over this, Glenn Fleishman and Jason Snell pointed me towards the new Becoming Steve Jobs book. They informed me that the book doesn’t shy away from it (unlike Catmull’s autobiography) and specifically includes a quote from Tim Cook defending Steve Jobs’ position in this.

Archive Your iOS Device Backups With iTunes

Apple (via Dan Moren):

Always back up your data and files to iTunes before you install a prerelease version of iOS. Then archive the backup. If you back up to iCloud or if you don’t archive your backup, you won’t be able to restore from it if you go back to current version of iOS.

[…]

4. When the backup is complete, go to iTunes > Preferences > Devices.

5. Find your device’s backup and Option-click the backup. Choose Archive.

This should read “Control-click the backup.”

Thursday, April 9, 2015

The 12-inch MacBook

The way Apple’s presentation focused on the new MacBook’s keyboard, you might think it was better for typing, the way all keyboards would be someday. Jason Snell finds otherwise:

Apple seems to have realize that the reduced travel has made this keyboard less appealing, and has attempted to offset the change with a bunch of other changes that improve the typing experience. There’s a new butterfly key mechanism atop stainless steel dome switches, which Apple says increases key stability, and the keys are all a bit wider than on a traditional keyboard, so there’s more area to hit on each key.

These changes help, but they don’t really offset the reduced travel. The MacBook keyboard’s better than I expected it to be—I was able to score 118 words per minute on TypeRacer using it—but it never felt particularly comfortable. If you’re not a keyboard snob, you may not even notice the difference, but if there’s any single feature that would make me reluctant to buy a MacBook, it would be the keyboard.

[…]

The Esc key has been elongated and the function keys narrowed, which didn’t really bother me. However, the redesign of the arrow keys really shook me–the up and down arrows are still half-height, but the left and right arrows are now full sized. It turns out that I used the gaps above the left and right arrow keys on prior keyboards to orient by feel, so I knew which arrow key was which. On the MacBook’s keyboard, there’s no longer a gap–and I kept having to look down to make sure I was tapping the up arrow key.

Jason Snell:

I’ve got to say that I’m not a fan of the new keyboard. Apple played the other enhancements that the keyboard offers, such as increased stability and wider keys, as attempts to offset some of the costs of the reduced key travel. That makes me hopeful that Apple sees this keyboard as what it is—a pretty serious compromise in order to get the computer thinner—rather than some breakthrough new keyboard that will be replicated on every other Apple keyboard in the next year or two.

If you don’t type a whole lot, or very fast, you may not care about the substantially reduced key travel. And you can get used to it. But it’s just a tiny step up from typing on flat touchscreen glass.

Jim Dalrymple:

The arrow keys took the most time to get used to. Surprising, I know. However, I use the up and down arrow keys a lot to navigate email messages and RSS feeds and those keys are quite close together—in fact, they are the only two keys on the keyboard that are so close together. It’s like the person that designed the keyboard doesn’t use those two keys and put them together like that because it looked better. At any rate, those keys are just taking a bit longer for me to use without error. I hope for a change in the future.

Keyboard aside, it sounds nice for what it is. It’s not for me, though. After the 12-inch MacBook was announced, I bought an 11-inch MacBook Air to use as an auxiliary Mac. It’s small enough to fit on the desk next to my main Mac, much faster than the 12-inch MacBook, and has a Thunderbolt port for connecting my drive dock.

Update (2015-04-24): Thomas Brand:

I made the same decision to purchase an 11-inch MacBook Air last year to use as my auxiliary Mac.

In addition to having Thunderbolt and twice as many USB ports as the new MacBook, my 11-inch MacBook Air comes with the security of MagSafe, the expandability of upgradable storage, the compatibility of Mavericks, the availability of an easy to install battery, and the comfort of a familiar keyboard. For those who care, the new MacBook does have a retina display, Force Touch, and a gold exterior, but as an auxiliary Mac such features come with a noticeable price tag. (Both machines have comparable performance.)

Note that Bare Feats compared the 11-inch MacBook Air from 2014, which runs at 1.4 GHz rather than the 1.6 GHz of the current model.

David Sparks:

I typed about 500 words of text on it and it didn’t repel me, but it most certainly is different. The key travel is shorter and would take some getting used to. The lower amount of travel might be a deal breaker after using it for a few days but after just a half hour, it felt more strange than terrible.

Yosemite-Only Security Fixes

Emil Kvarnhammar:

The Admin framework in Apple OS X contains a hidden backdoor API to root privileges. It’s been there for several years (at least since 2011), I found it in October 2014 and it can be exploited to escalate privileges to root from any user account in the system.

The intention was probably to serve the “System Preferences” app and systemsetup (command-line tool), but any user process can use the same functionality.

Apple has now released OS X 10.10.3 where the issue is resolved. OS X 10.9.x and older remain vulnerable, since Apple decided not to patch these versions. We recommend that all users upgrade to 10.10.3.

This sounds like a serious bug that Apple should fix for previous OS versions as well. Not everyone can update to Yosemite, and some don’t want to yet because of bugs. Mavericks was the current OS version less than six months ago. It’s too early to abandon it.

Quoted Domain Specific Languages

Shayan Najd, Sam Lindley, Josef Svenningsson, and Philip Wadler (PDF, via Lambda):

We describe a new approach to domain specific languages (DSLs), called Quoted DSLs (QDSLs), that resurrects two old ideas: quotation, from McCarthy’s Lisp of 1960, and the subformula property, from Gentzen’s natural deduction of 1935. Quoted terms allow the DSL to share the syntax and type system of the host language. Normalising quoted terms ensures the subformula property, which guarantees that one can use higher-order types in the source while guaranteeing first-order types in the target, and enables using types to guide fusion. We test our ideas by re-implementing Feldspar, which was originally implemented as an Embedded DSL (EDSL), as a QDSL; and we compare the QDSL and EDSL variants.

Mailman 3.0

Sumana Harihareswara (via Hacker News):

More than a decade after its last major rewrite, the GNU Mailman mailing list manager project aims to release its 3.0 suite in April, during the sprints following PyCon North America. Mailman 3 is a major rewrite that includes a new user membership system, a REST API, an archiver replacement for Pipermail, and a better web interface for subscriptions and settings — but it carries with it a few new dependencies as well.

[…]

The architecture and user interfaces of previous versions of Mailman reflect a different era of the web, and of application interoperability. Mailman 2 was a single codebase, written in Python 2, encompassing a rudimentary web application for subscription and list management (and incorporating the Pipermail web archiver) as well as the engine for receiving, moderating, and propagating messages. Lead developer Barry Warsaw explained in the overview he wrote for The Architecture of Open Source Applications that, beyond the browser-based interface, Mailman 2 also offered a dedicated command-line interface, and a Python internal API that system administrators could integrate with by writing Python code.

In contrast, Mailman 3 is a suite of five connected projects, each of which can run independently[…]

AnyBar and SuperDuper

Dr. Drang:

Today, One Thing Well posted an article on a utility called AnyBar, written by Nikita Prokopov, that lets you put a colored dot in your menubar by sending your computer a UDP message. As soon as I read the article, I knew I could make some use of it.

[…]

Instead of putting a bunch of words on my Desktop, I could just put a colored dot in my menubar—green for a successful backup, red for a failure.

Update (2015-04-24): Dr. Drang:

Unbeknownst to all of us, though, was TextBar a $3 app from Rich Somerfield that already does what T.J. wants. It doesn’t display graphics, but with Emoji and the rest of Unicode, I doubt that’s a significant limitation. TextBar seems to have a simpler user interface, especially when you want to display more than one signal in your menubar, but it’s meant to be used only for signals that are updated regularly. AnyBar is more flexible, but that flexibility comes with reduced simplicity.

PowerPhotos

Brian Webster:

PowerPhotos will be free for all existing iPhoto Library Manager customers. Due to the smaller feature set, I’ve decided to offer PowerPhotos at a lower price point of $19.95. iPhoto Library Manager 4 will continue to be sold at its current price of $29.95, and will also include a free copy of PowerPhotos; the serial number you receive with your purchase can be used with both programs. This also applies to existing iPLM customers, who can just use their existing serial number with PowerPhotos. iPhoto is not disappearing overnight, so iPhoto Library Manager will continue to be supported as well.

Git Tower’s Yosemite Design

Fabricio Rosa Marques:

We recently updated Tower to make it feel even more at home on Mac OS X Yosemite. We touched many areas of the app over the course of several updates. Now, we want to share our experience from bringing an app to Mac OS X 10.10.

[…]

In some cases it can become tricky to decide whether to treat certain aesthetics system-specifically or just go for a "yosemitized" look on all system. Targeting specific OS versions might bloat the app and will make managing your app's aesthetics harder, so you need to draw a line and compromise at some point.

Wednesday, April 8, 2015

iPhone Sizes

Jason Snell:

And since my normal iPhone 6 is locked to AT&T, I used an unlocked iPhone 6 Plus as my phone for the trip.

[…]

This all made Myke Hurley, my co-host on the Upgrade podcast, thrilled, as he’s a proud iPhone 6 Plus user and hoped to convert me to his side as he’s been doing with other friends. Thus he began anticipating my defection with the hashtag #mykewasright.

I really did appreciate the iPhone 6 Plus’s longer battery life. The longer life is noticeable, and was much appreciated as I was wandering around London. And I got used to the size of the device in my pocket in no time. But beyond that, I have to say I’m hard pressed to find anything I prefer about the iPhone 6 Plus over my iPhone 6. Yes, the screen is larger, but I didn’t ever feel that I was seeing more of the world by viewing an extra tweet in Twitterrific or a little bit more territory in Maps.

I also noticed—and Myke confirmed—that the iPhone 6 Plus’s camera appears to be buggy.

Marco Arment:

Camera: The 6 Plus’ image stabilizer is a minor difference outdoors, but a noticeable difference indoors when it can select a lower ISO, resulting in less noise.

Typing: For whatever reason, the keyboard size on the 6 Plus (in portrait orientation) fits me better than the 6, resulting in far fewer errors. I’m already typing more accurately on the 6 Plus than I ever could on the 6.

[…]

The 6 Plus is indeed worse than the 6 for one-handed use, but not by nearly as much as I expected — both are poorly suited to it.

[…]

In fact, the iPad-crossover enhancements mostly annoy me, and I’d disable them if I could. The iPad-style treatment of split-view apps and slide-up modal views in landscape orientation feels cramped and hacky at best — it just feels like a too-small iPad, rather than a too-large iPhone. I’m also constantly rotating the home screen unintentionally, requiring me to use portrait lock regularly for the first time.

[…]

The biggest problem I’ve hit is that it just feels uncomfortably huge and awkward in my pocket more often than the 6 (which did have this issue sometimes as well, but not as often), and it’s clumsier to insert and remove from pockets.

[…]

CGP Grey summarized the difference well in the aforelinked Hello Internet episode: “I am more and more convinced that the iPhone 6 is the phone for nobody; it’s the in-between phone that has all of the disadvantages of both [the 5S and 6 Plus]”.

Manton Reece:

The lesson from all these switches couldn’t be more clear: there’s no longer one perfect iPhone for everyone. What works great for one person might be terrible for someone else. I personally love the 5C design — the size of the screen, the way the plastic feels in my hand, flipping or spinning it on my fingers without worry that it’ll slip, using it without a case, adding a little color to my life — but many people never even tried it because it contains underpowered hardware compared to the latest models.

Update (2015-05-04): Federico Viticci:

Giving up on years of certainties such as absolutely-required one-handed usage has led me down the path of using my iPhone differently. After a surprisingly fast adjustment, I’ve come to the conclusion that a big screen in the device I carry with me every day is better for me because it’s more comfortable. Comfort follows multiple directions: more battery, bigger touch targets, more content on screen, the ability to look at videos from a distance, or better photos in low light.

The iPhone 6 Plus has some flaws. iOS could do a better job at keeping apps paused in memory, and I’ve occasionally experienced slow animations and random Springboard crashes when switching between apps. Landscape mode is hindered on two sides by hardware and software, with an industrial design that doesn’t lend itself well to a horizontal grip with two hands and apps that are inconsistently updated to take advantage of split views and other custom enhancements.

The Object Graph

Soroush Khanlou:

Now, what did Sandi mean about the “edges of your object graph”? Let’s not use the word “edge”, since it’s overloaded in the context of graphs. Let’s use the word “boundaries”. She’s talking about the tiniest leaves of our tree. Polymorphic objects are okay by Sandi as long as they are only referred to, instead of doing any referring. And this makes a lot of sense! Polymorphic classes are dangerous because small changes in them ripple to all of their subclasses and users. By making sure your inheritance hierarchies stay small and well managed, you can contain that complexity. When you refer to other objects, you’re more fragile. If you’re only referred to, a stable interface is the only thing you need to keep from breaking anything else.

In addition to your object graph, you also have a dependency graph. Here, your nodes are classes instead of instances, and your links are #imports instead of object ownership. […]

It makes me think that it would be great to have two types of objects, separated into layers.

Mac App Store Licensing and Copy Protection

Gus Mueller:

I’m seeing 40x more downloads than purchases. Hello massive pirating.

It’s been happening for years.

Cabel Sasser:

Yeah, easy as pie. One username/password shared. As if I needed another reason to hesitate from the MAS…

Ian Meyer:

My girlfriend’s workplace uses a single MAS account to make purchases for hundreds of users. She’s trying to change that.

Jason Snell (in 2011):

When you buy an app on the Mac App Store, you’re getting the rights to run that program on any Macs you own and operate, for your personal use. Basically, if your household has a half-dozen different Macs, including desktops and laptops, you can buy a copy of Gratuitous Space Battles and play it on every single one of them. Consider a purchase of consumer software via the Mac App Store to be a bit like buying a household site license for the app.

The situation is slightly different for apps that are considered commercial or professional in nature. For apps that fall into this category—Aperture’s a good example—the Mac App Store license says that you essentially can install that item on computers you use or on a single computer shared by multiple people. Basically think of it as a one-seat license for a pro app.

[…]

There’s no authorizing or deauthorizing of Macs, like you do with iTunes media. There’s no five-Mac limit, or device limit of any kind. […] Beyond entering in your Apple ID and password, this is all on the honor system.

It seems like Apple should be able to solve this problem rather easily. It already has a system to keep track of which devices are authorized to play media files. This could have been a reason to sell in the Mac App Store, because a FairPlay system would be both secure and easy to use. But Apple doesn’t really sell software anymore, so it probably doesn’t see this as much of a problem. And developers are not breathing down its neck the way the record labels were.

Enforcement aside, Apple isn’t even trying very hard to communicate how the honor system is intended to work. Alastair Houghton:

To be fair, it’s far from obvious how businesses are supposed to handle purchases from MAS.

There are no links from the App Store front pages, and no obvious indication what to do.

Normally businesses buy the same way as consumers and don’t need to use a special channel.

Apple should be more pro-active; right now, it’s costing developers quite a lot of lost revenue I expect.

Update (2015-04-09): There is further discussion on Twitter.

Facebook Legacy Contacts

Hayley Tsukayama:

Facebook has announced that it will grant users more control over what happens to their Facebook pages after they die. Starting Thursday, users should see a new option pop up in their security settings that will let them choose whether they want to pass their information and account management over to someone else when the time comes.

[…]

  • You can do nothing, in which case the current rules apply and your account can be memorialized by anyone after your death, providing that the company gets adequate proof of your death.
  • You can ask Facebook to delete your account after you die.
  • You can designate someone—called your legacy contact—to manage your account. Once Facebook is notified of your death, your timeline will also change to let people know you’ve died. Facebook does this by adding the word “Remembering” ahead of your name—i.e. “Remembering John Doe.”

Tuesday, April 7, 2015

Swift, Accelerate, and Generics

Chris Liscio:

After spending a while in a Playground, I managed to get a generic vDSP multiply routine written that could work on both Slice<Float> and [Float].

For no good reason at all, I decided that I should brain-dump this approach into my SMUGMath-Swift project before I lose the playground to the sands of time.

The “magic” is in the way that I was able to lean on the withUnsafeBufferPointer method that exists for both collection types, and then also specify some additional type clauses to ensure we’re working with Float vs Double floating point types.

1Password 5.3 for Mac

Chris De Jabet:

We recently introduced our TOTP feature — Time-Based One-Time Passwords — in iOS and Windows, and now we’re bringing it to the Mac. TOTPs are increasingly used as an extra layer of security by companies from Dropbox to Tumblr, so now you’re ready for them with 1Password for Mac.

[…]

We also implanted a plethora of custom field options, some great 1Password mini nips and tucks, and Secure Notes can now have custom fields and sections.

Infinite NSScrollView

Milen Dzhumerov:

When we refer to infinity, what we mean is that in practical terms the user will never hit an edge. One way to achieve that would be to make the scrollable area as large as possible (max values of CGFloat). Unfortunately, such very large values end up producing jerky scrolling movements.

Another approach is to never let the user hit the edge of the scroll view. We can observe the position of the scroll area and if it gets too close to a particular edge, we can move it back to the center while also making any changes to ensure the onscreen contents do not change. This will create the illusion of an infinite scroll view – in practice, the user can just never hit the edge.

Car UI

Dr. Drang:

When the wiper is in intermittent mode, it moves at the same speed as it does in low-speed mode. The difference is that it pauses between wipes. How long it pauses is what’s controlled by the collar position. To me, twisting the collar to move the marker down should make the pause between wipes shorter. This would be consistent with the way the stalk itself is moved: down to handle heavier rain. This is also consistent with the quasi-bar chart graphic, which I interpret as a graph of the pause, or interval, between wipes.

You will not be surprised to learn that the collar works exactly the opposite of how I think it should work. The interval between wipes increases as you turn the collar to move the marker down; the bottom position is for the lightest sprinkle. For the stalk, down equals heavier rain; but for the collar, down equals lighter rain.

The chart is apparently meant to represent the frequency of wiping, not the interval between wipes, despite the INT label on the marker. Yes, I know they mean INT to be interpreted as intermittent, not interval, but intermittent is not a quantity that can be graphed. Interval is. Which is why every time I look at that control, my mind says interval and I want to twist it the wrong way.

This has always bothered me with my Toyota.

Monday, April 6, 2015

Xcode Searching

Daniel Jalkut:

A search scope that includes system frameworks will not actually search or match against any of the frameworks that are linked to by the targets in a workspace. It appears that it will only search frameworks that are explicitly included as file references in the project navigator.

[…]

A related problem is that even if a framework is explicitly linked to, such as Cocoa.framework, only the header files of that specific framework will be searched, not the header files of subsidiary frameworks (e.g. Foundation and AppKit).

I find that searching in Xcode is only worthwhile for my own code. If I’m trying to find an API, Xcode’s documentation search is clunky and doesn’t seem to actually search all the documentation. Its header searching, as Jalkut explains, is very limited. Dash is great for searching the documentation, but there is a lot that is not documented. If Dash can’t find what I want, I have a BBEdit saved search set that looks in all the header files in the current SDK.

Google, Our Patron Saint of the Closed Web

Drew Crawford:

Of course ICANN cannot actually afford to manage the day-to-day operations of thousands of new TLDs. So they’ve opened the process up to anyone who wants to apply. So you fill out an application, you pay $185,000, there’s a convoluted evaluation process where they ask you questions like whether or not you’re a drug dealer and whether you’re technically qualified to run a TLD, and after a lengthy and bureaucratic review process you basically get your own TLD.

It came as no surprise that thousands of applicants came forward in some kind of crazed internet landrush. Many internet companies are placing bets. Amazon made some 76 applications, and Google made even more, with 101.

What people did not seem to expect (whether due to incompetence or malice is up for debate) is what they would be used for.

[…]

Google opens with a “how-is-this-not-a-parody” argument that owning a TLD and not allowing anyone else to use it “lead[s] to diversified consumer choice”[…]

Update (2019-02-18): Drew Crawford:

So google straight up LIED to icann. They said when applying that .dev was internal-use-only, now that they have it they’re selling access

.htaccess Snippets

Phan An (via Hacker News):

What we are doing here is mostly collecting useful snippets from all over the interwebs (for example, a good chunk is from Apache Server Configs) into one place.

The Birth of Microsoft’s New Web Rendering Engine

Charles Morris comments:

As we announced last month, Project Spartan will be the new browser across all Windows 10 devices, from phones to tablets, PCs and beyond.

[…]

First, the Web is built on the principle of multiple independent, yet interoperable implementations of Web standards and we felt it was important to counter movement towards a monoculture on the Web. Second, given the engineering effort required, we found that we could deliver an interoperability focused engine to customers significantly faster if we started from our own engine (especially if unshackled from legacy compatibility concerns), rather than building up a new browser around an open-source engine.

[…]

As detailed in Jacob Rossi’s article for Smashing Magazine, the new engine began as a fork of MSHTML.dll but has since diverged very quickly. By making this split, we were able to keep the major subsystem investments made over the last several years, while allowing us to remove document modes and other legacy IE behaviors from the new engine. On the other hand, our legacy engine (MSHTML.dll) can remain largely unchanged (outside of security and other high priority fixes) to help guarantee legacy compatibility for our enterprise customers. We also built up capabilities to switch between the legacy and new rendering engines seamlessly.

A clean break also necessitates a new user-agent string to ensure that no IE-specific code was being sent. This built upon a long browser history of using whatever tokens are necessary to get the desired content from servers. Although this meant a lower compatibility rate initially, it was also useful to reveal interoperability issues that needed to be fixed!

[…]

However, a new engine was not enough – we also needed to significantly revamp how we find, track and fix issues on the long tail of the Web. To do so, we do daily analysis on trillions of URLs crawled in conjunction with Bing to detect patterns that exist in the head of the Web and the tail of the Web. By fixing these patterns, sites just end up working. This data is augmented by thousands of daily feedback reports from users via the “smiley face” icon.

MustOverride

Nick Lockwood:

MustOverride provides a macro that you can use to ensure that a method of an abstract base class must be overriden by its subclasses.

Apple does not currently provide a way to flag this at compile time, and the standard approach of raising an exception in the base class’s implementation has two disadvantages: 1) it means that the method will only crash when it is called, which might only happen under difficult-to-reproduce conditions, and 2) you cannot provide a base implementation and require that the subclass calls super.

MustOverride uses some runtime magic to scan the class list at load time, and will crash immediately when the app is launched if the method is not implemented, even if it is never called.

Motion Sensing Using the Doppler Effect

Daniel Rapp (via Avi Bryant):

Recently I stumbled upon an interesting paper for implementing motion sensing requiring no special hardware, only a speaker and mic! Unfortunately the paper didn’t include code to test it, so I decided to reproduce it here on the web!

[…]

In order to measure the doppler effect for motion detection on a conventional computer, what you can do is send out a sinusoid at some known (inaudible) frequency, say, 20 kHz. If something is moving in the room, then, after the sinusoid has bounced around on the walls and into the microphone, the sound will shift in frequency. This can be measured by looking at the frequency spectrum in the nearby region of the 20 kHz tone.

Speedy Transfers With IP Over Thunderbolt

Dan Moren:

Right now Thunderbolt remains the fastest port on both my 2011-era iMac and my MacBook Air from 2014—even if it can’t reach its full speed of 10Gbps (or 20Gbps in the case of Thunderbolt 2), it can still transfer a multi-gigabyte file from one machine to the other in a matter of seconds. But using it to transfer files does take a few steps.

While you could use Thunderbolt Target Disk Mode, which essentially lets you boot one of your Macs as an external drive, I generally don’t feel like shutting down my computer just to transfer a file. Fortunately, there’s another option: Thunderbolt can converse via the same Internet Protocol (IP) used by Ethernet. It just takes a little quick configuration.

Friday, April 3, 2015

XCTest: Areas for Improvement

Brian Gesiak (via Ole Begemann):

There are a lot of things that XCTest does really well. Below are some suggestions for what it could do even better, in my order of my personal preference.

My number one would be a way to automatically show the full log entry for each failing test. Right now, even with a behavior set up to show the report navigator and navigate to the current log, I still have to click at the top to show Logs instead of Tests, then click the expansion triangle to see the full log entry for the first test. And neither of these operations has a keyboard shortcut.

Must Fix for Next Release

Craig Hockenberry:

This fix was submitted two weeks ago on February 2nd. A week later it went into review and was quickly rejected. The problem was that a buy button was accessible from our Help window.

[…]

My issue is the way that we must fix these problems. In this particular case, the issue was resolved by editing some HTML on our server, not by changing anything in the app itself. But we still must submit a “new” binary and go through the lengthy review process again. This is a huge waste of time for both developers and app reviewers (who are clearly lagging behind these days.)

I think there’s an easy way to fix these minor transgressions that would benefit both parties: add a new kind of approval with strings attached. A “Must Fix for Next Release” state where the app can go into “Ready for Sale” but the issue remains in the Resolution Center.

Truncated Text in Mobile UIs

Ole Begemann:

As an app developer or designer, you should treat most cases where you conveniently resort to truncating text as a failure in your design. There are certainly exceptions to this, and especially if you deal with user-generated content you have to set a limit—nobody wants item titles spanning a dozen lines or more. For “normal” content, however, the default should be to display the full text. If that means an item title requires four lines, then give me four lines.

[…]

If you really think you need truncated text, you should at least provide the user with a way to see the whole thing without having to leave the current screen. Apple used to do this in the Music app. A long tap on a truncated song title would display a popover with the full title. This feature is gone in iOS 8, however. Another option might be to let users expand text by tapping on the ellipsis, but I still think these workarounds are worse than just showing the full text from the start.

I feel like I spend my day clicking to tell Xcode to show the rest of truncated error messages and unit test failures.

Aperture, Capture One, and Lightroom Walk Into a Bar

Jochen H. Schmidt:

As a registered developer I’ve installed Photos for OS X and have started to build an opinion on it. I actually like it — it is incredibly fast and some of its tools (like the retouch brush) are the best working implementations I have seen so far. But it is also very clear that this cannot replace Aperture today. Regardless of that, the infrastructure around Photos is how photos will be managed on Apple devices from now on. So it is likely that it’ll be a part of our future workflow even if another program replaces Aperture. Unfortunately it is not yet known which third-party vendors will offer some kind of integration with this new system or what that will look like.

[…]

I will edit a photo in Aperture, Lightroom and Capture One. The example is chosen to teach an important lesson; it is often wrong to quickly assume that something is impossible within an application. The paths are different — and sometimes more tedious — but in almost all cases you can get very comparable results from any of those programs. If not, try harder! To get to this point, you need to learn a programs strengths and quirks. Don’t write-off something to early!

Jochen H. Schmidt:

The result is looking much better than the one in Aperture. This example clearly shows why so many users trying Lightroom are shocked about the results they can get.

[…]

With both Lightroom and Capture One I easily can get better results than I got using similar techniques in Aperture. But is this really the whole story? Actually no; this kind of pushing deep shadows out of a photo with high dynamic range doesn’t really work with Aperture’s shadow slider. The solution is to drop the black point to zero and use the levels or curves tool to raise the shadows.

[…]

One fact is undenyable though: It is much easier in Capture One or Lightroom. The reason for that is very simple; the tools in those programs are written with such situations in mind. These are not just simple linear shadow level adjustments; there is a set of non-linear curves behind them which are carefully crafted to give natural results, even in the extremes. This is not a limit of the engine; it is a feature of the user interface which hides such complexity behind a simple linear looking slider.

[…]

When comparing Lightroom to Aperture I mostly miss the ease of use. While Lightroom’s tools work exceptionally well, the user interface and the catalog organization is something you may really have force yourself to like.

[…]

Capture One doesn’t only look similar to Aperture, it has a lot in common. The UI is more like Aperture and more configurable than Lightroom. The quality of its output it often said to be better than Lightroom.

Bob Rockefeller:

This is similar to my experience. Both Lightroom and Capture One have somewhat better develop tools. Aperture is far and away better at photo management.

Optionaldelusion:

I use Lightroom at work, but it never felt as comfortable as Aperture, even 5 years later. I have been experimenting with Capture One and like it as the best Aperture replacement so far. The most annoying missing features for me are global before and after (WTF? This is such a basic feature. You can do before/after only on each adjustment brick).

The current situation is a mess. Aperture is in maintenance mode, and its photo development tools lag behind the competition. None of the alternatives seem to be able to easily migrate files out of Aperture while preserving the organization (projects, albums, stacks, keywords). Only Photos.app can preserve Aperture’s non-destructive edits and use Photo Stream, and it’s the most limited in terms of managing photos, the area where Aperture still has a big lead. Right now, the least bad option seems to be to keep using Aperture. There are still professionals using it who at some point will need better migration tools, aren’t there?

Update (2015-04-08): Jeff Carlson:

Unfortunately, there’s no way to assign geo information to photos that don’t already have it. For example, if I shoot several photos of a location with my iPhone, I can’t copy that data to photos shot at the same place with my DSLR.

[…]

If you’re a longtime Aperture user, Photos is definitely a step back. Or rather, it’s the clear signal that says it’s time to look for other professional photo pastures. I can’t recommend Photos as a full-time replacement, although I can envision situations where it would work alongside Aperture, such as creating small libraries for sharing with clients who don’t own Aperture (both iPhoto and Aperture can open a library after it’s been converted, but edits don’t sync).

Serenity Caldwell:

No, it’s not Aperture. It’s got a long way to go before it’s ever going to be Aperture — and honestly, Apple may be ready to cede the true pro-editing market to Adobe and the like. But for the vast majority of users — beginner to prosumer alike — Photos for OS X is more than enough for your photo management needs.

[…]

There aren’t any brushes, to my great disappointment. The loupe is gone, replaced with Multitouch pinch-to-zooms, as are some of the more advanced management features. And you can’t edit your images in an external editor, or properly work with a reference library unless you disable iCloud Photo Library.

Writing a Great App Store Description

Stuart Hall:

Sure this is a chicken and egg problem, but if you have any stats to brag about don’t hold back!

[…]

Selling a story of the person your potential customers want to be is what you are trying to achieve.

Preprocessor Abuse and Optional Parentheses

Mike Ash:

While coming up with macros that would justify this [UNPAREN()] construct, I built a nice dispatch_once macro for making lazily-initialized constants. Here it is:

#define ONCE(type, name, ...) \
    UNPAREN(type) name() { \
        static UNPAREN(type) static_ ## name; \
        static dispatch_once_t predicate; \
        dispatch_once(&predicate, ^{ \
            static_ ## name = ({ __VA_ARGS__; }); \
        }); \
        return static_ ## name; \
    }

Here’s an example use:

ONCE(NSSet *, AllowedFileTypes, [NSSet setWithArray: @[ @"mp3", @"m4a", @"aiff" ]])

Then you can call AllowedFileTypes() to obtain the set, and it's efficiently created on demand. In the unlikely event that the type contains a comma, you can add parentheses and it will still work.

Model Widget Controller (MWC) a.k.a.: Apple “MVC” Is Not MVC

Marcel Weiher (tweet, comments):

As far as I can tell, this architectural style comes from having self-contained widgets that encapsulate very small pieces of information such as simple strings, booleans or numbers. The MVC architecture was not intended for these kinds of small widgets […]

With a widget, there is no complex model, not filtering being done by the view. The widget contains its own data, for example a string or a number. An advantage of widgets is that you can meaningfully assemble them in a tool like Interface Builder, with a more MVC-like large view, all you have in IB is a large blank space labeled ‘Custom View’. On the other hand, I’ve had very good experiences with “real” (large view) MVC in creating high performance, highly responsive user interfaces.

Update (2015-04-06): Martin Fowler (via Hacker News):

Probably the widest quoted pattern in UI development is Model View Controller (MVC) - it’s also the most misquoted. I’ve lost count of the times I’ve seen something described as MVC which turned out to be nothing like it. Frankly a lot of the reason for this is that parts of classic MVC don’t really make sense for rich clients these days.

Thursday, April 2, 2015

Unintended Consequences of Usability Improvements

Matt Henderson:

I’m never quite sure myself whether I actually turned the lights off or not. And so, inevitably, I end up delaying my departure from the vehicle for the 30 seconds or so it takes to confirm that the lights are actually off. (And you can imagine that bystanders find that—a guy staring at his car, with its lights on—equally odd.)

[…]

The Toyota has a key-less entry system such that if I’m simply in proximity of the car, and in possession of the key, the doors will automatically unlock if I attempt to open them. While nice, it makes confirming that the doors are locked a bit difficult.

WiFi Signal 3.3.1

WiFi Signal (App Store, via Bradley Chambers):

WiFi Signal is a system menu bar application that provides easy access to your Wi-Fi connection details, monitors the signal quality of your wireless network, and can find and recommend alternative channels for your network thus avoiding signal overlapping and channel conflicts that can result in connectivity issues and performance degradation.

It shows that my 5 GHz network has poor signal quality, with 3/5 bars vs. 5/5 in Apple’s menu bar icon. However, it has a better data rate than the regular network, which has good signal quality. It could not find a better channel to recommend.

Custom Swift Switch Matchers

Joshua Emmons:

Wouldn’t it be great if we could teach switch new matchers that knew how to deal with our custom objects? Believe it or not, there’s an operator for that.

It’s called the pattern match operator, sometimes known by its (less googleable) syntax: ~=. And switch statements use it behind the scenes to compare values to their cases’ matching patterns.

[…]

This is yet another example of Swift employing polymorphism in an unexpected way to make the type system do work for us. Work that results in very clean, concise, and — dare I say it — declarative code.

Semaphores are Surprisingly Versatile

Jeff Preshing (via Jean-Francois Roy):

I used to think semaphores were strange and old-fashioned. They were invented by Edsger Dijkstra back in the early 1960s, before anyone had done much multithreaded programming, or much programming at all, for that matter. I knew that a semaphore could keep track of available units of a resource, or function as a clunky kind of mutex, but that seemed to be about it.

My opinion changed once I realized that, using only semaphores and atomic operations, it’s possible to implement all of the following primitives[…]

Not only that, but these implementations share some desirable properties. They’re lightweight, in the sense that some operations happen entirely in userspace, and they can (optionally) spin for a short period before sleeping in the kernel.

[…]

With all of these applications, semaphores are more general-purpose than I originally thought – and this wasn’t even a complete list. So why are semaphores absent from the standard C++11 library? For the same reason they’re absent from Boost: a preference for mutexes and condition variables. From the library maintainers’ point of view, conventional semaphore techniques are just too error prone.

The Death of Optimizing Compilers

Daniel J. Bernstein (tweet):

Have compilers become so smart that they automatically turn clean high-level code for these hot spots into optimized code, removing the need for humans to be optimization experts? The reality, unfortunately, is very much the opposite: general-purpose “optimizing” compilers are falling farther and farther behind the actual capabilities of modern processors.

This tutorial is an introduction to (1) what current and near-future processors are capable of; (2) how modern high-speed software libraries actually work; and (3) the increasing dominance of domain-specific tools to engineer high-speed software.

Hopefully the full talk will be available after ETAPS 2015.

Wednesday, April 1, 2015

Exploiting the DRAM Rowhammer Bug to Gain Kernel Privileges

Mark Seaborn (via Collin Allen):

“Rowhammer” is a problem with some recent DRAM devices in which repeatedly accessing a row of memory can cause bit flips in adjacent rows. We tested a selection of laptops and found that a subset of them exhibited the problem. We built two working privilege escalation exploits that use this effect. One exploit uses rowhammer-induced bit flips to gain kernel privileges on x86-64 Linux when run as an unprivileged userland process. When run on a machine vulnerable to the rowhammer problem, the process was able to induce bit flips in page table entries (PTEs). It was able to use this to gain write access to its own page table, and hence gain read-write access to all of physical memory.

[…]

History has shown that issues that are thought to be “only” reliability issues often have significant security implications, and the rowhammer problem is a good example of this. Many layers of software security rest on the assumption the contents of memory locations don't change unless the locations are written to.

The public discussion of software flaws and their exploitation has greatly expanded our industry’s understanding of computer security in past decades, and responsible software vendors advise users when their software is vulnerable and provide updates. Though the industry is less accustomed to hardware bugs than to software bugs, we would like to encourage hardware vendors to take the same approach: thoroughly analyse the security impact of “reliability” issues, provide explanations of impact, offer mitigation strategies and — when possible — supply firmware or BIOS updates.

Printing Objective-C Invocations in LLDB

Ari Grant:

A while ago Facebook open-sourced Chisel, a collection of commands and functions to assist in debugging iOS apps in LLDB.

[…]

There is one command that I find particularly fun and interesting yet haven’t had the chance to write about, until this post.

The command is pinvocation (for print invocation) which is most useful for debugging Objective-C methods in Apple’s code (or anything where you don’t have access to the source and thus symbols). pinvocation finds the values for self and _cmd, packages them up into an NSInvocation and then prints it all out for you, including the arguments.

It sounds like a wonderful idea, but I tried it with several applications and was not able to get it to work. I kept getting errors like:

error: error: 0 errors parsing expression
error: The expression could not be prepared to run in the target

Currently, only 32-bit x86 (Mac and iOS simulator) is supported.

Store Within a Store

Ouriel Ohayon:

Messenger “App Store” is the 1st major exception to App store rule 2.25 (i.e. do not promote apps that are not yours)

Why Overload Operators?

Marcel Weiher:

There are two candidates for what the difference might be: the fact that the operation is now written in infix notation and that it’s using special characters.

[…]

To my eyes at least, the binary-message version is no improvement over the keyword message, in fact it seems somewhat worse to me. So the attractiveness of infix notation appears to be a strong candidate for why operator overloading is desirable. Of course, having to use operator overloading to get infix notation is problematic, because special characters generally do not convey the meaning of the operation nearly as well as names, conventional arithmetic aside.

[…]

I’d say that overloaded operators are particularly attractive (to hacker mentalities, but that’s probably most of us) in languages where this boundary between user-defined and built-in stuff exists, and therefore those overloaded operators let you cross that boundary and do things normally reserved for language implementors.

Amazon Cloud Drive

Kirby Turner:

Amazon Cloud Drive is the solution I’ve been looking for to archive my old data to the cloud. I’ll continue using external hard drives, Dropbox, Backblaze and such for backups, but my days with SmugMugs might be numbered. Still, I’m excited to finally have an affordable cloud storage solution for my old data.

Amazon:

Unlimited photo storage, plus 5 GB for videos and files for just $11.99 per year.

[…]

Securely store all of your photos, videos, files and documents for just $59.99 per year.