Monday, February 8, 2016 [Tweets]
It seems that the age of platforms keeping to themselves and shutting out rivals is on the verge of ending. Now platform makers are actually playing to the strengths of their rivals as well. Apple has surprisingly made available not one but two Android apps, though one of them has been critically panned by Android users. Just recently, Apple updated its Apple Music app to add a feature that is technically impossible on the iPhone: saving music to a micro SD card for offline listening.
That move hinted that Apple was serious about its Android app, and apparently that was indeed more than the case. Under Cook, Apple has been trying to portray an image of a services company more than just a hardware and OS maker. Those services include iCloud apps and storage, Apple Pay, and iMessage, just to name a few.
In addition to providing a web interface for users to access the same data as your app, you can now easily read and write to the CloudKit public database from a server-side process or script with a server-to-server key.
This is fascinating insight into the, I suppose unsurprising, mindset of many venture capital investors. They’re not looking for a profitable business; instead, they’re looking for growth that provides the opportunity for a 100x exit. And their expectation is that you, the founder, will work to achieve that at any cost. And since their investment also brings the expectation of participation and inclusion in the running of the business, any company owner considering taking on investment would be well advised to make sure at the outset that everyone’s on the same page in terms of objectives.
Finally, it’s also worth noting that not all investors in Gimlet shared the mindset of Chris Sacca. We also discover that Marco Arment—of Tumblr, Instapaper and Overcast fame—is also an investor in Gimlet at a participation of $150,000. In interviews with Marco, he encourages Alex to forget about the ambitions of the other investors, focus on what he’s good at, and above all, listen more to his wife!
Julie Bort and Matt Weinberger (via Slashdot, Hacker News):
We’ve been hearing about a lot of drama going on at $2 billion startup GitHub, the hugely important and popular site used by millions of computer programmers where 10 or more executives have departed in recent months.
Its once famous remote-employee culture has been rolled back. Senior managers are no longer allowed to live afar and must report to the office. This was one reason why some senior execs departed or were asked to leave, one person close to the company told us.
Underlying the drama is the fact that GitHub is trying to grow the company’s revenues by landing more big enterprise contracts. And it’s doing a good job of that, several sources — even the disgruntled ones — told us.
That means there’s an effort to hire more enterprise salespeople, with all the suit-and-tie salesforce culture that typically includes. (GitHub employs over 80 sales folks according to LinkedIn.)
Meanwhile, the company’s millions of developer users, many of whom use the site for free or for a small monthly fee, also want GitHub to pay more attention to them. A bunch of active and influential users sent a letter in January called “Dear GitHub” in which they asked for a bunch of product features, too. At least one person told us that this letter alarmed some of the leadership team.
Result is not built in the Swift standard library, and a lot of functions use
throw to report synchronous errors anyway. Like in practice, to build a
User from a
NSDictionary we might have a
init(dict: NSDictionary) throws constructor instead of a
NSDictionary -> Result<User> function.
So how to mix both those worlds? Easy: let’s extend
Result just for that!
Umberto Raimondi (via Natasha Murashev):
In case of multiple integers in the same expression, Swift can only infer the type of free integer literals when they are used with some typed variable of one single type, as before, no implicit conversion toward the bigger integer type is performed.
The only drawback of this safety-first/no-assumptions approach, is that when you need to perform a lot of type conversions, you code starts to become bloated with all those truncating conversions.
But luckily, in Swift we can extend base types with new methods and we can use this to add some utility methods that truncate to a specific size to all the integer types[…]
All the alternative approaches to manipulate bit sets presented in this post are part of Bitter, a library that try to offer a more “swifty” interface for bit sets manipulation.
Some time later, I came across Iavor’s “jokes” page, including a
funny bit called
“The Evolution of a Programmer“
in which the traditional imperative “Hello, world” program is
developed through several variations,
from simple beginnings to a ridiculously complex extreme.
A moment’s thought turned up the factorial function as the best
functional counterpart of “Hello, world”.
Suddenly the Muse struck and I knew I must write out these examples,
culminating (well, almost) in the heavily generalized categorical
version of factorial provided by Uustalu, Vene and Pardo.
On a more serious note, I think that the basic idea of the joke (successive variations on a theme, building in complexity) can serve a good pedagogical purpose as well as a humorous one.
Sunday, February 7, 2016 [Tweets]
Miles Brignall (via Hacker News):
Thousands of iPhone 6 users claim they have been left holding almost worthless phones because Apple’s latest operating system permanently disables the handset if it detects that a repair has been carried out by a non-Apple technician.
Relatively few people outside the tech world are aware of the so-called “error 53” problem, but if it happens to you you’ll know about it. And according to one specialist journalist, it “will kill your iPhone”.
In summary, Apple iOS uses a validation system to ensure Touch ID sensor is not maliciously replaced or modified. The Touch ID sensor has access to the iPhone Security Enclave, where fingerprint data is kept. A malicious sensor could, hypothetically, steal fingerprints from an iPhone user unknowingly. This could be used to unlock the phone and make purchases through Apple Pay without the owner’s permission. To prevent this, Apple uses a validation system whenever the Touch ID sensor is repaired. When iPhone is serviced by an authorised Apple service provider or Apple retail store for changes that affect the touch ID sensor, the validation paring is updated. Third-party repairs to the sensor will not update the pairing, and will fail validation when using Touch ID. This validation error is shown to users as the mysterious “Error 53”.
If the validation fails, the device will function mostly fine, although with Touch ID disabled. However, the device will be prevented from restoring or updating to a new version. Restoring from backup still works. I’m not too sure why restoring or updating is blocked, but my guess is that they want to prevent malicious software from being uploaded in this process.
No, the CPU reads encrypted data from the sensor and sends them to the SE for decryption and analysis. See the PDF linked here by somebody. What a malicious sensor could do is store user’s fingerprint for retrieval by unauthorized parties.
It seems very reasonable to me that iOS should check for a trusted Touch ID sensor. But, if the sensor can’t be trusted, clearly the whole phone should not be bricked — it should simply disable Touch ID and Apple Pay. And, obviously, it should inform the user why. Putting up an alert that just says “Error 53” is almost comically bad.
The Apple Watch is a confused product, designed like a tiny iPhone, which is as misguided as it would’ve been to design the iPhone with the Mac’s UI and app structure. The result is promising, but clunky and slow. It could be so great at its three most useful functions — notifications, activity tracking, and timekeeping with robust complications — if only they were more reliable and better executed. Someday, I hope they are.
To be great, the Apple Watch needs to be rethought to do less, better. I see no signs that Apple is heading in this direction, but never say never.
Apple has aggressively pushed the Apple Watch as high fashion, but it’s simply not. It’s a utility watch, much like quartz watches, that has many useful functions and can be made to look very nice but won’t ever be a prestigious fashion item. There’s no shame in that. The sooner Apple realizes this and lets the Watch be what it really is, the better.
Some time last week my iPhone started prompting me frequently to re-enter my iCloud password. And then my Watch started doing the same, about once a minute — with a little tap on the wrist each time.
Obviously I did re-enter my password — and have done so a dozen or so times now — but it doesn’t seem to matter.
Lots of interesting tidbits, including the fact that Apple Watch sold better in its first holiday quarter than the original iPhone did in 2007.
Every now and then — seemingly at random — I get a full screen advertisement imploring me to sign up for Apple Music. I’ve even disabled Apple Music in the Music preferences. For the love of all that is good, leave me alone. I know Apple knows I tried the Apple Music service and canceled it before the free trial was over due to bugs.
iCloud Music Library, which was a requirement of Apple Music, caused data loss where it would randomly delete my playlists that predated Apple Music. […] That was all supposed to be old news, but then I wanted to listen to a playlist yesterday. All of my playlists were gone, except for one playlist of Star Trek film scores, and the automated “Purchased” playlist. How could this happen? I haven’t had iCloud Music Library enabled, or Apple Music.
What was once a major strength of Apple — a simple-to-use music player and digital storefront — turned into the kind of garbage software that runs on cable company set-top-boxes. The experience has been turned into something more akin to a website for a print publication. You’re constantly jumping in and out of various things, which slide in from different directions, the stuff you want is buried several taps deep in hierarchical menus, and it’s centered around getting you to sign up for Apple Music.
If you try to share something purchased on iTunes, but not in Apple Music, it doesn’t generate an iTunes link, it generates nothing. It succeeds at generating nothing, which is the really wild part, since obviously, I wanted to send a completely empty tweet.
Rosensteel’s comparison to a publication’s website is absolutely apt, though, for at least one big reason: the gross interstitial ad that appears if you launch Music without having Apple Music enabled, and the tiny tap target on it to close the ad without purchasing a subscription.
Even after accounting for devices used in regions where Apple Music is not available, devices owned by subscribers, and devices — like Macs — where an interstitial full-screen ad doesn’t appear, that still leaves hundreds of millions of devices used by tens of millions of people who see that gross interstitial ad as frequently as every single day.
Previously: Apple Pushes iPhone 6s Pop-up Ads to App Store.
When I think about where I’m most productive with OS X, it’s always at my desk, where I have a huge monitor (on my iMac, at home) or even two Cinema Displays (at work). It’s so much more comfortable to be able to manipulate the operating system’s myriad windows when I have copious amounts of screen real estate, just as it’s so much more pleasant to have a full keyboard (with a number pad!) and the physical desk space for all of the many peripherals—printer, scanner, USB hub, etc.—that really complement the desktop OS experience.
To be clear, I don’t argue the fact that OS X is still the best platform for heavy duty work, and that it is likely to continue to be that for years if not decades. But it seems apparent to me that it’s at its most potent in its original form: on the desktop, where immensely powerful chips do best and battery life is not an issue. When I think about what I want to be using in the near term, I would much rather own a fast and fully stationary iMac and an iPad running a much more productivity-capable version of iOS, than just a MacBook.
In 2010 and 2011 we all got excited and thought the iPad would be an amazing and cool addition to our lives, but after a few years it turned out that we’re fine using our smartphones and our computers.
As a result, the iPad reached a huge percentage of its target audience in a very short period of time. And once that audience was exhausted, it rapidly shifted into an upgrade-and-replace product cycle. Imagine a world where the iPad didn’t sell 67 million units in the first couple of years, but found its audience more slowly. We might end up with an iPad market just as large as the one we have today, but with a sales chart that looks much healthier.
He particularly looks at four points that may have contributed to its fall in sales, but none of them answer the problem entirely. I think the iPad solved a problem that many people didn’t know they had, but that most people simply don’t need or want one.
I completely agree with Vinh about the usefulness of a desktop Mac, and yet I don’t have one. Instead, I use a MacBook Pro that nearly all of the time has a keyboard, mouse, external display, and lots of drives and peripherals attached.
The reason is that, although I’m rarely out of the office, when I am the iPad doesn’t let me get my work done. Having both a desktop Mac and a MacBook Pro would seem to make sense, since an iMac or Mac Pro would be much better when I’m at my desk. But I’ve tried that before, and it’s too much of a pain to administer two Macs and keep them in sync. Hence the compromise of a MacBook Pro that’s underpowered both at the office and on the go.
My ideal Mac would be less of a mobile device than a portable or luggable one. Even when traveling I’m more likely to use it on a desk or table than on my lap. And it will almost always be plugged in. So instead of thinness and battery life, give me a huge screen, a faster processor, and lots of internal storage. The 17-inch “aircraft carrier” PowerBook G4 was great but didn’t go far enough. I would love to have two spinning hard disks in addition to the SSD. Who wants to travel with bus-powered drives and cables, and run out of USB ports? And if my primary drives were all internal, I wouldn’t have to unmount and unplug them when packing up the Mac—just close the lid and they go to sleep. A larger screen would also make it a better second display in my office.
In other words, if there’s a MacBook that tries to be as close as possible to an iPad, there should be one that’s as close as possible to a desktop Mac. Although Apple no longer has any desktop Macs with lots of internal storage options, either…
Update (2016-02-08): Jean-Louis Gassée:
Despite these improvements, the iPad Pro is (still) not a laptop replacement. Actually, for my uses, it’s the other way around. The new, light Retina MacBook (935 grams, 2.06 pounds) I bought when it came out last March has taken screen and lap time from my iPad.
Whether it’s the operating systems or the core apps, a major aspect of what makes both users and reviewers value Apple products is software that melds power, reliability, and ease of use. “It just works!” was a favorite Steve Jobs phrase.
In the last couple of years, however, I’ve noticed a gradual degradation in the quality and reliability of Apple’s core apps, on both the mobile iOS operating system and its Mac OS X platform. It’s almost as if the tech giant has taken its eye off the ball when it comes to these core software products, while it pursues big new dreams, like smartwatches and cars.
In response to my inquiries about this, Apple said: “We have dedicated software teams across multiple platforms. The effort is as strong there as it has ever been.”
iTunes is once again bloated, complex, and sluggish. That has gotten even worse since the recent integration of the new Apple Music streaming service.
In my experience, on both platforms, Mail is slow at both receiving and sending Gmail messages, whether they are from personal or business accounts. Some messages don’t show up. Search misses things.
iCloud Photo Library, which stores all your images in the cloud, tarnishes the improved experience. It works quickly and accurately on my iPhone and iPads, but is slow and balky on the desktop. I am not one of those people with 50,000 or 100,000 pictures, but it still takes forever on the Mac to find older photos, and some show up as just blank thumbnails. That isn’t Apple quality.
My Safari bookmarks only sync intermittently across my Apple devices. Unlike Amazon’s Kindle app for Apple products, the company’s iBooks doesn’t remember where I left off unless I set a bookmark.
There are only three reasons I can think of that software issues like the ones we find in Apple Music would happen at a company like Apple that prides itself on software that “just works.”
They didn’t know how bad it was when they released it. (Highly unlikely)
They are so big now, they just don’t care. They are Apple, so people will use the software regardless of what they do. (Please don’t let it be this one)
They were given a timeline to release the software whether it was finished or not. (This one is probably, but very scary)
Maybe this is the natural result of the fact hardware standards must be high, because they can’t issue “hardware updates” over the air like they can with software. But the perception is now widespread that the balance between Apple’s hardware and software quality has shifted in recent years. I see a lot of people nodding their heads in agreement with Mossberg and Dalrymple’s pieces today.
That we’re still talking about it a year later — and that the consensus reaction is one of agreement — suggests that Apple probably does have a software problem, and they definitely have a perception problem.
My little iCloud Photo Library syncing hiccup was not a huge deal — I was even lucky insofar as the two videos that couldn’t be found were meaningless. And I managed to find a solution. But it feels emblematic of the sort of nagging software problems people are struggling with in Apple’s apps. Not even the bug itself that led to these five items being unable to upload, but rather the fact that Photos knew about the problem but wouldn’t tell me the details I needed to fix it without my resorting to the very much non-obvious trick of creating a Smart Group to identify them. For me at least, “silent failure” is a big part of the problem — almost everything related to the whole discoveryd/mDNSresponder fiasco last year was about things that just silently stopped working.
I clicked OK and the Free button was now inactive. I typed Command-R to see if that would reload the iTunes page—no normal user would do it, but it worked because the App Store and iTunes is more or less a disguised web page—and then was able to click Free and download the app.
At some point in this process, the song I was listening to finished and another song began to play. It was a randomly selected track from my entire music library. The act of viewing the App Store had destroyed my music shuffle.
This is what Walt Mossberg means by “I dread opening the thing.”
Ever since I upgraded (cranks are reminded to add their air quotes here) to El Capitan, dragging something towards the top of the screen is an exercise in frustration, and dragging something to the menu bar in order to cancel the drag is a gesture set in muscle memory that I’m struggling to unlearn. Whenever you get close, Mission Control springs to life. Mission Control is great, if you have five windows open. If you have between 10 or 20 apps open and several of them have state-restoration, let’s-restore-everything, Quit-doesn’t-mean-clean-slate endless amounts of windows, it is an exercise in chugging. It takes half a minute, then you get one frame. It takes ten seconds more for the next. This is a MacBook Pro Retina (Early 2015), so it’s not a 2011 Mac mini with low memory and a slight limp.
Add to this storing all these Numbers documents in iCloud because I might need them one day on my iPhone. Then I do need them, and I open Numbers on my iPhone, and 30 documents start syncing now for the first time, and none of them get anywhere, and there are several duplicates, and I can’t even tell it which to download first, not that it matters because like I said, none of them fucking progress in the slightest.
This is not Haxies. This is not jailbreak. This is not unsandboxed, unencrypted, uncryptographically signed. This is Apple’s own software running on Apple’s own OS, running on Apple’s own hardware, talking to Apple’s own fucking internet services the way Apple pretend it just works if you do.
I’ll add one more to the mix: since watchOS 2.0, I haven’t been able to launch native third-party apps on my Watch. Apps from TestFlight work fine, as do WatchKit apps, but native third party apps continue to experience an issue associated with the FairPlay DRM that prevents them from loading — they simply crash at launch.
As I wrote in one of the bug reports I filed on this, I cannot believe watchOS 2 launched in this state.
Paul Jones (via Hacker News):
On OS X this is especially true: OpenGL implementation has fallen behind the competition, the filesystem desperately needs updating, the SDK has needed modernizing for years, networking and cryptography have seen major gaffes. And that’s with regards to the under-the-hood details, the applications are easier targets: it’s tragic that Aperture and iPhoto were axed in favor of the horrifically bad Photos app (that looks like some Frankenstein “iOS X” app), the entire industry have left Final Cut Pro X, I dare not plug my iPhone in to my laptop for fear of what it might do, the Mac App Store is the antitheses of native application development (again being some Frankenstein of a web/native app), and iCloud nee MobileMe nee iTools has been an unreliable and slow mess since day one.
What worries me is that AAPL the stock ticker and Apple the company are in a (self-driving) crash course with one another: AAPL needs to launch new products to drive growth and Apple needs to improve the products that have already shipped. The most valuable asset that Apple own is their brand, and that’s the brand that’ll drive sales of any car that may or may not be in development. If that brand name is tarnished by regressions and performance problems, what consumer would buy a car from the brand?
I’m still encountering many of the original El Capitan bugs. And I’m continuing to run into new issues. This week it was AppleScript in Numbers, AirDrop no longer working between my Macs, and the Xcode 7.2.1 update that broke the Bots feature.
See also: Accidental Tech Podcast.
Previously: Apple’s Software Quality, Continued.
Update (2016-02-08): Katie Floyd:
Mossberg discusses his piece in more depth on his podcast this week, it’s worth a listen.
Saturday, February 6, 2016 [Tweets]
The idea of Massive View Controller all started from one simple tweet. It feels like the most obvious and pressing issue in terms of code quality in our industry.
These techniques won’t solve Massive View Controller on their own, but taken together, but they will take you a lot of way there.
Instead of rejecting view controllers, what if we embraced them? We could make lots and lots of small view controllers, instead of lots of lots of small plain objects. After all, Apple gives us good ways to compose view controllers. What if we “leaned in” to view controllers? What benefits could we gain from such a setup?
We have a general principle that we like to follow: prefer composition instead. Luckily, Apple gives us a great way to compose view controllers, and we’ll get access to the view lifecyle methods too, for free! Even if your view controller’s view is totally invisible, it’ll still get the appearance callbacks, like
The letter shapes of Highway Gothic weren’t ever tested, having never really been designed in the first place. “It’s very American in that way — just smash it together and get it up there,” says Tobias Frere-Jones, a typographer in New York City who came to the attention of the design world in the mid-1990s with his Interstate typeface inspired by the bemusing, awkward charm of Highway Gothic. “It’s brash and blunt, not so concerned with detail. It has a certain unvarnished honesty.”
The standard FHWA typefaces, developed in the 1940s, were designed to work with a system of highway signs in which almost all words are capitalized. The designers of Clearview sought to create a typeface adapted for mixed-case signage, initially expecting it would be based on an existing European sans-serif typeface. Instead, using a similar weight to the FHWA fonts, a new font was created from scratch. Two key differences are much larger counter spaces, the enclosed spaces in letters like the lower case “e” or “a”, and a higher x-height, the relative height of the lower case “x” to the upper case “X”.
Federal Highway Administration (via Thomas H. Ptacek):
Though research initially gave us hope that Clearview would make signs easier to read from greater distances and at night, years of additional research have not supported this conclusion.
Early successes we noted were credited to the new font, but the years since have shown those successes were likely due, at least in part, to the fact that older, worn signs had been replaced with new, cleaner ones using brighter materials. After more than a decade of analysis, we learned that retro-reflective sign sheeting materials that direct a vehicle’s headlamp beams back to the observer were the primary determining factor in improved nighttime visibility and legibility.
Among other things, we also learned that Clearview compromises the legibility of signs in negative-contrast color orientations, such as those with black letters on white or yellow backgrounds like Speed Limit and Warning signs.
The ideas behind Clearview sound good, but I do not find it very attractive, and I think the spacing looks weird.
David Sparks interviewed me about my iPhone home screen.
Om Malik interviews Erik Spiekermann (via John Gruber):
Because we were German, we were very much about implementation. Making sure you had rules that you could actually follow, because it was monolithic. There was no internet. The English were good at concepts, and then they lost it. That’s actually a good combination, the English with their creativity and their weird ideas and then you get a German to make it work. To tighten all the bolts. […] We’re not creative in Germany; we’re good at making things. Too good. We always make things 120 percent. You buy anything from us, it’s always over-engineered.
I did some work for Apple in ’86, ’87. I got the first LaserWriter as payment, which at the time was like 20,000 marks. It was more than a Golf, the car.
There are physical limitations as to certain size. It’s nice to read 10 words a line, 50 to 60 characters. This is science. This is not me. This is something that we like, the way our eyes move in little segments. There are physical limitations to our eyes: the curvature of our eyeballs, the space we have in front of us, the distance from the eyes. That’s human, and no machine can ever change that.
I open [the paper version] and I find things that I wasn’t looking for. On the screen, you have to have a hierarchy, because you can’t fit so much. You have to look for something. Whereas I open the [printed] page and I will find something I wasn’t looking for, I would have never looked for. I wouldn’t know what to look for. I find things that I wasn’t expecting, and that is enriching.
Mobile fonts are doable, but for some reason are behind there. […] It’s ignorance, because these are engineering companies. Essentially, so is Apple. Jony is a mate of mine, and he is a good designer, but he is more of an engineer. He is surrounded by these kids in their twenties, and they go for whatever is trendy. For some reason there is nobody in management to tell these guys to go to us for some advice.
Wednesday, February 3, 2016 [Tweets]
Apple (via @objctoswift):
If you need an array of reference types and the array does not need to be bridged to
ContiguousArray instead of
Sometimes COW can introduce additional unexpected copies if the user is not careful. An example of this is attempting to perform mutation via object-reassignment in functions. In Swift, all parameters are passed in at +1, i.e. the parameters are retained before a callsite, and then are released at the end of the callee. This means that if one writes a function like the following […]
a may be copied despite the version of
a without one appended to it
has no uses after
append_one due to the assignment. This can be avoided
through the usage of
inout parameters […]
The compiler can only specialize generic code if the call site and the callee function are located in the same compilation unit. One trick that we can use to allow compiler to optimize the callee function is to write code that performs a type check in the same compilation unit as the callee function. The code behind the type check then re-dispatches the call to the generic function - but this time it has the type information.
Swift classes are always reference counted. The swift compiler inserts code that increments the reference count every time the object is accessed. For example, consider the problem of scanning a linked list that’s implemented using classes. Scanning the list is done by moving a reference from one node to the next:
elem = elem.next. Every time we move the reference swift will increment the reference count of the
next object and decrement the reference count of the previous object. These reference count operations are expensive and unavoidable when using Swift classes. […] In performance-critical code you can use choose to use unmanaged
Unmanaged<T> structure allows developers to disable
automatic reference counting for a specific reference.
When compiling with ARC, method arguments often appear to be retained at the beginning of the method and released at the end. This retain/release pair seems superfluous, and contradicts the idea that ARC “produces the code you would have written anyway”. Nobody in those dark, pre-ARC days performed an extra retain/release on all method arguments just to be on the safe side, did they?
When the compiler doesn’t know anything about the memory management behavior of a function or method (and this happens a lot), then the compiler must assume:
- That the function or method might completely rearrange or replace the entire object graph of the application (it probably won’t, but it could).
- That the caller might be manual reference counted code, and therefore the lifetime of passed in parameters is not realistically knowable.
Given #1 and #2; and given that ARC must never allow an object to be prematurely deallocated, then these two assumptions force the compiler to retain passed in objects more often than not.
David Owens II:
This is a general concern of mine in Swift: how to actually know what has value vs. reference semantics.
var, which fixes one problem. But there is no way to see what is a
struct or a
class, which adds another. It’s even more complicated in the context of the proposal to remove the “NS” prefix from Foundation class names.
As an example, the seemingly similar
CountedSet types produce different results from nearly identical code. Swift’s Set type has value semantics, so changes to a copy don’t affect the original Set instance […]
NSCountedSet), on the other hand, uses reference semantics, so changes to a copy of an instance. This is true whether the copy is an explicit one made via assignment or the implicit copy made when calling a function with
CountedSet as a parameter. This example shows how nearly code nearly identical to the above produces very different results […]
I’m using the invaluable https://www.whynopadlock.com/ checker for this, and already managed to get an A rating from the equally invaluable https://www.ssllabs.com/ssltest/ page.
The problem of requiring HTTPs in less than 140 chars: 1.Few benefits for blog-like sites, and 2. The costs are prohibitive.
There’s actually a #3 (sorry) -- 3. For sites where the owner is gone the costs are more than prohibitive. There’s no one to do the work.
Here’s a ten-minute podcast summarizing where we’re at with Google and Mozilla and HTTPS.
Your Kindle will soon receive a free, over-the-air software update. Readers are always looking for their next favourite book, and this update provides new ways to help you easily find new books and new authors that you’re sure to love.
Our readers’ most-used settings—such as Aeroplane Mode and Device Sync—can now be found together with just one tap on your toolbar.
All this looks like Amazon is desperately seeking to shore up ebook sales. Instead of letting you see just your books on the home screen, you have to pass through a vestibule displaying items to buy. Instead of only going to Amazon to search for books when you want, you’ll be exposed to more books each time you visit the home screen. You can naturally then see just your books, but it’s another tap, after your eye has been caught by the books at the bottom of the display.
If you go to advanced options in the updated Kindle software, you can disable the new opening screen entirely. That way when you turn on the Kindle, you see the old list format as before (but in the new, lighter typeface).
Update (2016-02-03): Jason Snell:
Fortunately, you can turn off recommendations, which I did. The fancy graphics disappear when you do this, but the entire interface has still been overhauled. There’s a new typeface that’s absolutely gorgeous on the high-resolution screen of my Kindle Voyage.
Tuesday, February 2, 2016 [Tweets]
David Ungar (comments):
But with value types, there’s no
override keyword to help the compiler find my mistakes. This omission seems out of place in a language otherwise designed to include enough redundancy to help find one’s errors.
All that can be known at compile-time is that pie is a
Pizza, and the
Pizza protocol extension says Wheat, so the declaration of a cornmeal crust in the
CornmealPizza structure had no effect whatsoever when asking pie for something. Although the compiler could have warned about the potential for error from this use of static- instead of dynamic-dispatch, it did not. I believe that here lurks a trap for the unwary, and I would call this a major snare.
Presenting Swift with both a declaration and a definition in this fashion causes the compiler to take notice of the runtime value of the pie variable.
However, without editing the source code in the framework, we cannot fix this problem. Hence, it is impossible to safely extend a protocol declared in another framework (without gambling that it will never need dynamic-dispatch.)
As shown in a previous section, a declaration in a protocol was sufficient to induce dynamic dispatch for a defined of the corresponding attribute in the protocol extension. But a definition in a restricted extension is always statically-dispatched.
Avoid assigning the result of an expression with side-effects to left-hand-side with optional chaining.
In-out parameters do not work when passed into the outer scope of a closure
These are all things we hope to remove or provide diagnostics for in 3.0, at least.
Swift for all its newness is going down a path much like C++ did as far as complexity. That is worrisome.
Swift’s init rules are confusing. I’ve never once got anything non-trivial right first time
Marcel Weiher (tweet, first linked in 2014):
Apple’s new Swift language has taken a page from the C++ and Java
playbooks and made initialization a special case. Well, lots
of special cases actually. The Swift book has 30 pages on
initialization, and they aren’t just illustration and explanation,
they are dense with rules and special cases.
The initializer model does need reconsideration, though. Current model doesn’t fit our ABI resilience goals.
A little up-front complexity for initializers greatly simplifies the state space for everything else.
Let’s sum up everything to that point:
- AppCast process is using HTTP that could be intercepted and modified on the
it to the user
- We control the transmission after doing the MITM attack
The vulnerability is not in code signing itself. It exists due to the
the ability to modify unencrypted HTTP traffic (XML response).
This attack works on stock Mac OS X install, and GateKeeper enabled with both options “Mac App Store and identified developers” or “Mac App Store” (the strictest one).
Simone Margaritelli (via Greg Slepak):
I’m not going to explain the details of his attack, his post is quite self explanatory, but I’ll show you how easy it is to mass pwn OSX machines on your network using the new OSX Sparkle bettercap proxy module.
Moreover, I improved the attack ... Radek shown how to get RCE using an OSX terminal profile file, I will show you how to make the target execute any Mach-O executable you want!
Update (2016-02-02): Rosyna Keller:
That is, Sparkle was explicitly opening every file using LaunchServices by overriding the default WebView handler.
This is a fine idea, but when I upgraded, I was surprised to find that the new “All Vaults” view is the default view. Even when I selected a specific vault as my preferred view, the next time I launch 1Password from my browser it would revert to the “All Vaults” view. I found this very irritating. This change struck me as wrongheaded—it flies right in the face of how I use vaults, as I prefer to keep each group of passwords segregated from the others.
That was my reaction as well.
Christian Tietze (via Matt Gemmell):
Sell outside the Mac App Store to increase revenue per sale and get to know your customers. This book shows you how. Fully functional, super-clean coded sample apps, everything ready to be copied right into your project, backed by more than 200 unit tests in total!
Save days of research and start selling your app before an Apple review person would even notice your upload to the App Store.
Jean-Baptiste Kempf (comments):
Since then, only on VLC, we've had around,
- 700 contributors,
- 70000 commits,
- at least 2 billion downloads,
- hundreds of millions users!
And all that, mostly with volunteers and without turning into a business!
A little know fact about the VideoLAN project is that it was started so that the student organization could justify the need to replace the old networking infrastructure of the campus with a brand new high-bandwidth fiber optics network. They really wanted to deploy a fiber optic network but the school would have never approved it so they thought “OK, we need something that uses a ton of bandwidth, let’s make a video streaming app”.
They proceeded to start the VideoLAN project, with the VideoLAN Client (VLC) and VideoLAN server, and streamed movies and public television channels to the whole campus.
It remains frustrating to me that VLC can play (just about) everything but only in its own app, while QuickTime works in every app but doesn’t support many popular formats. For a while, QuickTime plug-ins seemed to be the solution, but Apple doesn’t want to support them anymore.
Previously: Perian to Cease Development.
Saturday, January 30, 2016 [Tweets]
Control Center is probably my single favorite system-level UI change to iOS ever. I kind of wish you could change the apps hard-coded at the bottom (I’d replace Calculator with PCalc, for example), but I use it all the time.
I think Notification Center and Today view could still use some improvement. But cramming Control Center into the same pull-down sheet would make things worse, not better.
Update (2016-02-02): Dr. Drang:
I like the limitation of having just a few available slots, but being able to replace the “dead” spots with buttons I’d actually use would be a big improvement.
And the design inconsistency I mentioned earlier? The buttons on the top do a single thing and they do it immediately—they do not launch apps. The buttons on the bottom do launch apps, which is why the have the rounded rectangle shape of app icons. The exception, the inconsistency, is the Flashlight button. It belongs on the top. I can only assume that Apple put it where it is because they wanted six “do it now” buttons but had room to fit only five comfortably. It’s a minor inconsistency, but it wouldn’t be necessary if we could customize our button layouts.
Ilya Sukhar in 2013:
Some of the world’s best brands trust us with their entire mobile presence, and a growing number of the world’s brightest independent developers trust us with their next big thing. We couldn’t be happier.
As stewards of a good thing, we’re always thinking about the next step in growing Parse to become a leading platform in this age of mobile apps.
Parse has agreed to be acquired by Facebook. We expect the transaction to close shortly. Rest assured, Parse is not going away. It’s going to get better.
Via Nick Heer:
According to their brag page, Parse’s customers included some of the biggest and most popular apps on both iOS and Android. Uniqlo, Eventbrite, Plenty of Fish, Lululemon, and more all used Parse. Stubhub? Parse. Vevo? Yep. Zoosk? HopStop? The fucking White House? Their apps used Parse. Heck, even that shelved new app Panic was working on used it.
Dan Rowinski in 2014 (via Tim Burks):
Parse also sold but in a very different fashion. What Parse did well (create developer community connections to brands) worked really well for Facebook’s aim of bringing developers to its platform. Parse’s product is still alive and well—and supported by Facebook—and that isn’t going to end any time soon.
Kevin Lacker (via Natasha Murashev, comments):
Beginning today we’re winding down the Parse service, and Parse will be fully retired after a year-long period ending on January 28, 2017.
First, we’re releasing a database migration tool that lets you migrate data from your Parse app to any MongoDB database. During this migration, the Parse API will continue to operate as usual based on your new database, so this can happen without downtime. Second, we’re releasing the open source Parse Server, which lets you run most of the Parse API from your own Node.js server. Once you have your data in your own database, Parse Server lets you keep your application running without major changes in the client-side code. For more details, check out our migration guide here.
For years I had always heard great things about Parse. I eventually used it for the first time a few months ago on a client project. It’s got a well-designed API, friendly monthly pricing (free for many apps), and it seemed well supported, with new features like tvOS support and a web dashboard redesign rolling out just a month ago.
Entirely predictable. Even the title is blasé: “Moving On.”
If it had been me shutting down Parse I would have changed the home page to not point out how many “Trust Us”.
Let’s face it: if you want it done properly, you have to do it yourself. Is this the death of SAAS?
I think the biggest problem now is just trust. If FB can’t provide guarantees for your app’s backend, who can?
“But seriously developers, trust us next time your needs temporarily overlap our strategic interests. And here’s a t-shirt.”
The subtext to the Parse shutdown is “never trust a Facebook platform ever again, for any reason”
Yes, but solutions will emerge. I haven’t looked at the SDK code but expect this can be fixed w/ a URL update.
Parse was a model for selling products to developers. But it also succeeded by burning enough VC money to suffocate its competitors.
Update (2016-01-30): Marco Arment (tweet, 2014):
For whatever it’s worth, running your own Linux servers today with boring old databases and stable languages is neither difficult nor expensive. This isn’t to say “I told you so” — rather, if you haven’t tried before, “You can do this.”
Update (2016-02-01): Allen Pike:
Hundreds of thousands of unsuccessful Parse apps will perish. Like links to long-dead Geocities pages, dead mobile apps that relied on Parse will linger in the App Stores for years, slowly accumulating one-star reviews.
As much as Parse will try to get the word out that they’re shutting down, many apps’ owners don’t even know that they’re reliant on Parse. Parse’s overly generous free plan made them popular with freelancers and consultants building quick app backends for their clients. Many of those clients don’t know what Parse is, let alone that the little app they commissioned a couple years ago is a ticking time bomb.
In particular, it’ll be problematic when possibly hundreds of thousands of iOS apps just stop working in a year because their developers have long since moved on, or their contracts expired, or they can’t afford to spend time on a significant update.
One of the most damaging side effects of unhealthy App Store economics is that developers have little motivation or resources to keep apps updated.
Update (2016-02-02): Microsoft:
If you have been using Parse hosting as the backend that supports your mobile apps, this may be the perfect time to try out Azure App Service. Due to recent occurrences, the folks at Parse have provided a way to migrate an existing backend hosted by Parse to another host. When searching for a new host, we hope that you try Azure.
Where should you go? What should you do? By now you’ve transitioned through all five stages of grief and ready for stage six: doing something about it. Fortunately there are a lot of options and I’ve gathered as many resources as I can here in one place.
Update (2016-02-03): Sascha Konietzke (via Hacker News):
When Facebook acquired Parse back in April 2013, many people thought this meant Facebook goes all in on becoming a developer platform. If you recall, Facebook was at a crossroads back then, with a share price below IPO level, desktop traffic plateauing, and mobile revenues a big question mark. Enter Parse, which brought immediate mobile app developer reach, helping Facebook to distribute its SDKs and ensure developers are using Facebook’s login system. That in turn helped secure mobile adoption and a foothold in user profiles and mobile advertising. Fast forward to 2016, and Facebook essentially owns the mobile ads space, and its SDK is #1 in terms of mobile reach. Meaning Parse has run its cause as an SDK distribution vehicle. In other words, they never wanted to host your app, they just wanted you to use Facebook login.
John Calhoun has open sourced the excellent Glider Pro and other games (via Brendan Shanks, comments). It’s a CodeWarrior C project.
iReview housed reviews and rankings of other websites. Initial reviews were written by Apple employees, and the site launched with 250 published reviews. That number grew slowly, as personal Mac users could append to existing reviews, but not create new ones.
Apple also introduced iCards, a section of the company’s website where users could go to create and send virtual greeting cards.
iDisk offered users 20MB (yes, MB!) of Internet storage, hosted on Apple’s servers. Instead of fiddling with FTP settings, iDisk was baked into Mac OS 9 — there was an icon for it right on the Desktop.
Christian Hammond (via Craig Hockenberry and Paul Haddad, comments):
Yesterday morning, the Hosted UI team, responsible for VMware’s Workstation and Fusion products, woke up to find themselves out of a job. These products, despite being award-winning and profitable, are probably not long for this world.
Sad about Fusion, it was always my fave. Much more “Mac like” than Parallels with great performance. Will keep using it until I can’t.
It hasn’t been canceled, but the entire local team is gone. I read something that said future dev is offshored to China.
When contacted to comment, a VMware spokesman said that the company was committed to continuing development and support for Fusion and Workstation and that the company was “transitioning the Fusion and Workstation teams to co-locate” with the rest of the company as part of its reorganization. “Our commitment to Fusion and Workstation products is unchanged,” he said.
VMware was acquired by EMC in 2004, which offered 15 percent of VMware’s stock in a 2007 initial public offering. EMC is in the process of being acquired by Dell, which would give Dell a majority stake in VMware (though the company will remain independent).
Fusion is a great app. I hope it lives on.
Previously: Turning Off Ads in Parallels, Parallels Desktop 9 and Parallels Access.
Update (2016-02-08): Christian Hammond (via Hacker News):
I’d like to share some thoughts and pictures from a few people in our team about what made our team great, and share some comments from some of our users. Keeping it positive here.
Friday, January 29, 2016 [Tweets]
iOS Revenue. I brought this up last year and we still haven’t licked it. We had a change of heart — well, an experimental change of heart — and reduced the price of our iOS apps in 2015 to normalize them at $9.99 or less, thinking that was the upper limit and/or sweet spot for iOS app pricing. But it didn’t have a meaningful impact on sales.
More and more I’m beginning to think we simply made the wrong type of apps for iOS — we made professional tools that aren’t really “in demand” on that platform — and that price isn’t our problem, but interest is.
One of our interesting app experiments — an app to share and discover music — was 95% done, had a beautiful interface and some interesting ideas, plus a complete server-side component… then got shelved. It wasn’t an easy decision. It was mostly worries about revenue — it doesn’t seem possible that you can charge money for a social app in 2016, since mass adoption is critical. And is advertising really a thing we want to do? This is maybe one of the only times I wished we were a startup — with a “release now, figure out how to make money later” culture — but we’re not.
Later in the year should see a brand-new, major update to Transmit, that will increase speed, add Panic Sync, seriously expand protocol support, and more. A Transmit overhaul is long overdue and we are extremely excited to get this out to the world in 2016. (One open question: will we distribute it in the Mac App Store? Hmm…)
Beyond this one change, however, Numbers 3.6.1 looks much like Numbers 3.0. There’s still no formatting bar below the customizable toolbar, so everything is still controlled by the context-sensitive right-hand panel. And while this cleans up the look a lot, it leads to lots of clicking between tabs in the panel for many common tasks.
Another annoyance that remains from version 3.0 is the lack of an editable formula bar. To edit a formula, you have to double-click the formula, which pops up a tiny editing box. This box can be both resized and moved, but for no reason I can discern, these changes aren’t permanent, so you have to resize and move the formula box every time you use it (assuming you don’t like its size/location).
AppleScript, which vanished in 3.0, has also returned from the dead, to the relief of scripters everywhere. (It’s even gained a couple new options for PDF and Excel export.) Macros, which didn’t exist before, still don’t exist. I expect them to continue to not exist in all future versions, so macro users should look elsewhere.
This version of Numbers also returns Help to the app, sort of: Numbers no longer opens a webpage when you open help, but the in-app help viewer still requires an Internet connection.
He reports some big performance improvements. My 2013 test of opening a CSV file now takes 44s in Numbers 3.6.1 (down from 3m25s) vs. 3s (up from 2s) for Excel 2016.
Update (2016-02-02): I’ve found that, although some AppleScript features were restored, at least one property was removed/renamed, which broke my scripts.
Update (2016-02-05): The AppleScript support doesn’t seem to actually work. There is a dictionary, but nothing shows up in Script Debugger’s explorer. And basic scripts such as:
tell application "Numbers"
get document 1
fail with error -1,728.
Fortunately, I have recently worked on a design that I have been quite pleased with. In this design I am happily using
NSOperation subclasses again and I am using the
Note that I am triggering a KVO notification on
isFinished as opposed to
finished which is what the property name is. This seems to be a Swift-ism as the
NSOperation get accessor is called
isFinished instead of
getFinished and I suspect that is part of why I need to tickle the accessor name instead of the property name.
NSOperation subclasses I can now prioritize my network calls (posting to twitter is a higher priority than receiving avatars from twitter for example), cancel operations that are no longer needed (avatars or images that are no longer on screen) and in general be a much better citizen by only keeping the radios on for as long as I need them and not any longer.
Further, I can now watch for application life-cycle events in my
NetworkController and terminate operations when my application goes into the background, further improving my citizenship status. I can also look for operations that need to finish when the application goes into the background and request additional background time.
Tom Hogarty (tweet):
The goal of this release is to provide additional camera raw support, lens profile support and address bugs that were introduced in previous releases of Lightroom. This release also includes a new Boundary Warp feature for Creative Cloud members.
The direct download link is here (via ProDesignTools).
This is a very simple step-by-step guide [to migrate from Aperture to Lightroom] as I could not find anything with a really detailed description of the process for someone reasonably competent but not expert and who has a highly organised Aperture library of Projects, Folders and Albums!
Lots of good stuff in this BBEdit update:
There is a new setting in the Text Colors preferences: “Differences”. This color setting determines how differences are highlighted in editing views when you select them in a Differences window. (The color for differences within a line is derived from this, by darkening or lightening as needed.) If a custom color scheme does not include a Differences color, BBEdit will use a dark gray or light gray (depending on the scheme's background color) instead.
Things that are highlighted in the text at various times (matches for selected text, Live Search results, spelling errors, and diffs) are now marked in the view’s vertical scroll bar. The tick marks indicating matches for selected text may be turned off in the Editing preferences, if desired.
The “Apply to Left” and “Apply to Right” commands (and buttons) no longer pay attention to the selected range(s) of text in the respective documents. Instead, they will apply the difference based on what is reported in the differences list (and highlighted using the Differences color).
Open File by Name will now search Xcode for system framework headers, rather than relying on previous installation of the Xcode command-line tools package (which places framework headers in /System/Library/Frameworks/).
Updated the Objective-C/Objective-C++ keyword lists to add
_Null_unspecified, and a few others.
Tuesday, January 26, 2016 [Tweets]
Peter Kafka (tweet):
For the past few months, the social media company has stopped displaying ads, or has dramatically reduced the number of ads it displays, to a small group of some of its most prominent and active users.
For those people, Twitter is an ad-free, or nearly ad-free, experience.
Sources say Twitter made the move in an attempt to get some of its VIP users to stay engaged with the service.
Selective treatment on Twitter gives me the creeps. First @verified, now no ads for the elite
It seems like the ads have become a lot more intrusive lately.
Monday, January 25, 2016 [Tweets]
Glenn Rifkin (via Dan Bricklin, Hacker News, Slashdot):
Well before the advent of the microprocessor and the supercomputer, Professor Minsky, a revered computer science educator at M.I.T., laid the foundation for the field of artificial intelligence by demonstrating the possibilities of imparting common-sense reasoning to computers.
“Marvin was one of the very few people in computing whose visions and perspectives liberated the computer from being a glorified adding machine to start to realize its destiny as one of the most powerful amplifiers for human endeavors in history,” said Alan Kay, a computer scientist and a friend and colleague of Professor Minsky’s.
Professor Minsky’s scientific accomplishments spanned a variety of disciplines. He designed and built some of the first visual scanners and mechanical hands with tactile sensors, advances that influenced modern robotics. In 1951 he built the first randomly wired neural network learning machine, which he called Snarc. And in 1956, while at Harvard, he invented and built the first confocal scanning microscope, an optical instrument with superior resolution and image quality still in wide use in the biological sciences.
Marvin questioned many of the assumptions around Academia. He would show up to deliver a formal talk with a stack of notes and pick from them more or less at random. I wish that I could say that the results were amazing due to his dazzling intellect, but unfortunately the lack of an organized outline made these talks less than satisfying. Marvin was at his best in small groups or working one-on-one with others at MIT. What I remember most about him was his genial skepticism. If two people were arguing, rather than take one side, Marvin could show that both were operating from an assumption about the world that perhaps wasn’t necessary or true. He was a bit of a modern-day Socrates.
Update (2016-01-28): Paul Whitmore Sas:
Another defining characteristic of his mind was its utterly stochastic trajectory. No one, and certainly not Marvin, could discipline his curiosity cum hubris. SoM class lectures rode roughshod over a thousand topics, and left many stacks unpopped. The book, which exemplifies a horde of daemons tackling random splinters of cognition, was rumored to have been assembled from shards collected together with Hillis’ help.
Update (2016-01-29): Adam C. Engst:
I’ll remember him as a TidBITS reader and for his openness and kindness. Although plans to meet up at Macworld Boston never came to fruition, I exchanged email with him back in 1992 about Apple’s Casper voice recognition technology (see “Casper Speaks,” 9 March
1992), which evolved into a system called PlainTalk (see “Bossing Your Mac with PlainTalk,” 28 August 2000).
Stephen Wolfram (via Hacker News):
Being no expert on such things (and without the web to look anything up!), I called Marvin to ask what to do. What ensued was a long discussion about the possibility of developing microrobots that could chase mealybugs away. Fascinating though it was, at the end of it I still had to ask, “But what should I actually do about Margaret’s plants?” Marvin replied, “Oh, I guess you’d better talk to my wife.”
Marvin immediately launched into talking about how programming languages are the only ones that people are expected to learn to write before they can read. He said he’d been trying to convince Seymour Papert that the best way to teach programming was to start by showing people good code.
Update (2016-01-30): Scott Aaronson:
For example, in his and Papert’s 1968 book Perceptrons—notorious for “killing neural net research for a decade,” because of its mis- or over-interpreted theorems about the representational limitations of single-layer neural nets—the way Minsky and Papert proved those theorems was by translating questions about computation into questions about the existence or nonexistence of low-degree polynomials with various properties, and then answering the latter questions using MATH. Their “polynomial method” is now a mainstay of quantum algorithms research (having been brought to the subject by Beals et al.), and in particular, has been a mainstay of my own career.
Robert Elder (via Peter Steinberger):
Bjarne Stroustrup even points out that the standard isn’t clear about what should happen in function macro recursion. With reference to a specific example he says “The question is whether the use of NIL in the last line of this sequence qualifies for non-replacement under the cited text. If it does, the result will be NIL(42). If it does not, the result will be simply 42.”. In 2004, a decision was made to leave the standard in its ambiguous state: “The committee’s decision was that no realistic programs “in the wild” would venture into this area, and trying to reduce the uncertainties is not worth the risk of changing conformance status of implementations or programs.”
Many languages are first tokenized, and then the list of tokens doesn’t change throughout further processing of the program. In the C preprocessor, new tokens can be created at run time! This makes it impossible to build a parse tree ahead of time because you don’t know what tokens would be included in the final tree.
In general, when evaluating a function macro body, you need to consider both the pre-expanded version of the arguments, and the untouched tokens that were passed for that argument. This behaviour is unlike how C arguments and functions are evaluated, because in C you can always replace an argument that’s described by an expression with the result of that expression and have the same meaning (ignoring any side effects).
He also mentions handling of whitespace, which is confusing and also buggy in Clang.
Eric Springer (Hacker News, Slashdot):
The attacker gave Amazon my fake details from a whois query, and got my real address and phone number in exchange. Now they had enough to bounce around a few services, even convincing my bank to issue them a new copy of my Credit Card.
I again contact Amazon to reiterate how important it is that they keep my account secure, and not give out my details to anyone with a name and address. They promise they’re putting a note on my account, and it’ll never happen again. And I will be contacted by a specialist (never happened, again)
Medium is on its way to becoming the consensus platform for writing on the web. if you’re not sure you’re going to be blogging regularly, the default place to put your writing is Medium, rather than starting a blog on Tumblr or WordPress.com, for example. I guess the thought is that it’s wasteful to start a blog if you’re not sure you’re going to post that often.
People also post to Medium to get more flow. But at what cost? Which pieces get flow? Ones that are critical of Medium? I doubt it. Or offend the politics of the founder? I don't know.
I also want to preserve the ability of developers to innovate in this area. If Medium sews up this media type, if they own it for all practical purposes, as Google owned RSS (until they dropped it), then you can’t move until they do. And companies with monopolies have no incentive to move forward, and therefore rarely do.
The comparison to Google Reader is perfect. Google Reader was both (a) the most popular thing that ever happened to RSS, and (b) the worst thing that ever happened to RSS.
Matthew Braga (via Hacker News):
“We really thought six months after that, that we were done. We had done this app that was pretty baked. And we didn’t really think it was that hard,” Michael recalled. “Now we have this joke that, everyone thinks this problem is easy until they spend a year or two on it, and then they think it’s the hardest problem they’ve ever worked on.”
Developing f.lux, it turned out, was more complex than either Lorna or Michael initially thought. And in the seven years since they started working on the app full time, Michael and Lorna have realized what they’re really on is a mission to change the way that we sleep.
Michael and Lorna are quick to point out that that brightness also plays a role, as does distance from the source of light. The pair even operate a companion site called f.luxometer that measures the light intensity of various popular devices, and how this factors into your phase shift—the amount of time, say, a MacBook Air might shift your circadian timing if used before bed.
I think I’ve determined that all my Lightroom hangs occur when Flux re-enables itself after being suspended for an hour.
Saturday, January 23, 2016 [Tweets]
There are multiple ways to store these (key, value) records one of which is open addressing with linear probing which is used by swift’s dictionary implementation.
Bitmap value of a bucket tells if the key and value in that bucket is valid and initialized or not. If not, then that bucket is called a hole.
Also note that the end of bucket array is connected to start of the bucket array forming a logical ring. This just means that if you’re at end of the bucket array and you call next method, you’ll end up at begining of the array.
squeezeHashValue does try to create a good hash by applying some transformation operations.
Also it looks like to keep hashValues different across executions, execution speed was supposed to mixed with hashValue provided by the Key type but its a constant placeholder value for now
[_NativeDictionaryStorageOwner] was created to keep track of correct reference count for Copy on Write feature, since the storage will be referenced by Dictionary and DictionaryIndex both, reference count will be 2 for the storage but if Dictionary refers this class and reference count of this class is tracked, everything should be fine.
If a Value has to be removed from the bucket array, we might end up creating a hole which might cause side effect of probing to stop earlier than expected. To take care of that the elements are rearranged at their ideal position.
Previously: Exploring Swift Array’s Implementation, Exposing NSDictionary.