diff --git a/Evergreen.xcodeproj/project.pbxproj b/Evergreen.xcodeproj/project.pbxproj index 7a680a7bf..bb66c1263 100644 --- a/Evergreen.xcodeproj/project.pbxproj +++ b/Evergreen.xcodeproj/project.pbxproj @@ -150,6 +150,12 @@ 84F2D5371FC22FCC00998D64 /* PseudoFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */; }; 84F2D5381FC22FCC00998D64 /* TodayFeedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */; }; 84F2D53A1FC2308B00998D64 /* UnreadFeed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */; }; + 84F3EE1620DEC97E003FADEB /* FeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */; }; + 84F3EE1720DEC97E003FADEB /* FeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */; }; + 84F3EE1820DEC97E003FADEB /* FeedSpecifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */; }; + 84F3EE1920DEC97E003FADEB /* FeedSpecifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */; }; + 84F3EE1A20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */; }; + 84F3EE1B20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */; }; 84FB9A2F1EDCD6C4003D53B9 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */; }; 84FB9A301EDCD6C4003D53B9 /* Sparkle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 84FF69B11FC3793300DC198E /* FaviconURLFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */; }; @@ -634,6 +640,9 @@ 84F2D5351FC22FCB00998D64 /* PseudoFeed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PseudoFeed.swift; sourceTree = ""; }; 84F2D5361FC22FCB00998D64 /* TodayFeedDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodayFeedDelegate.swift; sourceTree = ""; }; 84F2D5391FC2308B00998D64 /* UnreadFeed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnreadFeed.swift; sourceTree = ""; }; + 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedFinder.swift; sourceTree = ""; }; + 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FeedSpecifier.swift; sourceTree = ""; }; + 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLFeedFinder.swift; sourceTree = ""; }; 84FB9A2D1EDCD6B8003D53B9 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = Frameworks/Vendor/Sparkle.framework; sourceTree = SOURCE_ROOT; }; 84FF69B01FC3793300DC198E /* FaviconURLFinder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FaviconURLFinder.swift; sourceTree = ""; }; D553737C20186C1F006D8857 /* Article+Scriptability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Article+Scriptability.swift"; sourceTree = ""; }; @@ -1075,6 +1084,7 @@ 8444C9011FED81880051386C /* Exporters */, 84F2D5341FC22FCB00998D64 /* SmartFeeds */, 849A97561ED9EB0D007D329B /* Data */, + 84F3EE0420DEC97E003FADEB /* FeedFinder */, 8426119C1FCB6ED40086A189 /* HTMLMetadata */, 848F6AE31FC29CFA002D422E /* Favicons */, 845213211FCA5B10003B6E93 /* Images */, @@ -1266,6 +1276,17 @@ path = Evergreen/SmartFeeds; sourceTree = ""; }; + 84F3EE0420DEC97E003FADEB /* FeedFinder */ = { + isa = PBXGroup; + children = ( + 84F3EE0620DEC97E003FADEB /* FeedFinder.swift */, + 84F3EE0720DEC97E003FADEB /* FeedSpecifier.swift */, + 84F3EE0820DEC97E003FADEB /* HTMLFeedFinder.swift */, + ); + name = FeedFinder; + path = Evergreen/FeedFinder; + sourceTree = ""; + }; 84FB9A2C1EDCD6A4003D53B9 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -1786,6 +1807,9 @@ 840D61832029031C009BC708 /* DetailViewController.swift in Sources */, 840D61812029031C009BC708 /* MasterViewController.swift in Sources */, 840D617F2029031C009BC708 /* AppDelegate.swift in Sources */, + 84F3EE1720DEC97E003FADEB /* FeedFinder.swift in Sources */, + 84F3EE1B20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */, + 84F3EE1920DEC97E003FADEB /* FeedSpecifier.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1866,8 +1890,10 @@ 84F204CE1FAACB660076E152 /* FeedListViewController.swift in Sources */, 84AD1EBC2032AF5C00BC20B7 /* SidebarOutlineDataSource.swift in Sources */, 845A29241FC9255E007B49E3 /* SidebarCellAppearance.swift in Sources */, + 84F3EE1620DEC97E003FADEB /* FeedFinder.swift in Sources */, 845EE7B11FC2366500854A1F /* StarredFeedDelegate.swift in Sources */, 848F6AE51FC29CFB002D422E /* FaviconDownloader.swift in Sources */, + 84F3EE1820DEC97E003FADEB /* FeedSpecifier.swift in Sources */, 849EE72120391F560082A1EA /* MainWindowSharingServicePickerDelegate.swift in Sources */, 849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */, 849EE70F203919360082A1EA /* AppImages.swift in Sources */, @@ -1889,6 +1915,7 @@ 841ABA6020145EC100980E11 /* BuiltinSmartFeedInspectorViewController.swift in Sources */, D5E4CC54202C1361009B4FFC /* AppDelegate+Scriptability.swift in Sources */, D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */, + 84F3EE1A20DEC97E003FADEB /* HTMLFeedFinder.swift in Sources */, D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */, 842611A01FCB72600086A189 /* FeaturedImageDownloader.swift in Sources */, 849A97781ED9EC04007D329B /* TimelineCellLayout.swift in Sources */, diff --git a/Frameworks/FeedFinder/FeedFinder/FeedFinder.swift b/Evergreen/FeedFinder/FeedFinder.swift similarity index 100% rename from Frameworks/FeedFinder/FeedFinder/FeedFinder.swift rename to Evergreen/FeedFinder/FeedFinder.swift diff --git a/Frameworks/FeedFinder/FeedFinder/FeedSpecifier.swift b/Evergreen/FeedFinder/FeedSpecifier.swift similarity index 100% rename from Frameworks/FeedFinder/FeedFinder/FeedSpecifier.swift rename to Evergreen/FeedFinder/FeedSpecifier.swift diff --git a/Frameworks/FeedFinder/FeedFinder/HTMLFeedFinder.swift b/Evergreen/FeedFinder/HTMLFeedFinder.swift similarity index 100% rename from Frameworks/FeedFinder/FeedFinder/HTMLFeedFinder.swift rename to Evergreen/FeedFinder/HTMLFeedFinder.swift diff --git a/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.pbxproj b/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.pbxproj deleted file mode 100644 index 30812b880..000000000 --- a/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.pbxproj +++ /dev/null @@ -1,384 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 84B06FEF1ED3808F00F0B54B /* RSWeb.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FEE1ED3808F00F0B54B /* RSWeb.framework */; }; - 84B06FF31ED3812600F0B54B /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B06FF21ED3812600F0B54B /* RSCore.framework */; }; - 84BAAE2A1C8E6B3B009F5239 /* FeedFinder.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BAAE1F1C8E6B3B009F5239 /* FeedFinder.framework */; }; - 84F466571F03523100225386 /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84F466561F03523100225386 /* RSParser.framework */; }; - 84FE13C220DC3D960029AB7B /* FeedFinder.h in Headers */ = {isa = PBXBuildFile; fileRef = 84FE13C120DC3D960029AB7B /* FeedFinder.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 84FE13C420DC3DA70029AB7B /* FeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FE13C320DC3DA70029AB7B /* FeedFinder.swift */; }; - 84FE13C620DC3DAE0029AB7B /* FeedSpecifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FE13C520DC3DAE0029AB7B /* FeedSpecifier.swift */; }; - 84FE13C820DC3DB50029AB7B /* HTMLFeedFinder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FE13C720DC3DB50029AB7B /* HTMLFeedFinder.swift */; }; - 84FE13D420DC3DDF0029AB7B /* FeedFinderTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 84FE13CB20DC3DDF0029AB7B /* FeedFinderTests.m */; }; - 84FE13D520DC3DDF0029AB7B /* indiestack.html in Resources */ = {isa = PBXBuildFile; fileRef = 84FE13CD20DC3DDF0029AB7B /* indiestack.html */; }; - 84FE13D620DC3DDF0029AB7B /* sixcolors.html in Resources */ = {isa = PBXBuildFile; fileRef = 84FE13CE20DC3DDF0029AB7B /* sixcolors.html */; }; - 84FE13D720DC3DDF0029AB7B /* DaringFireball.html in Resources */ = {isa = PBXBuildFile; fileRef = 84FE13CF20DC3DDF0029AB7B /* DaringFireball.html */; }; - 84FE13D820DC3DDF0029AB7B /* inessential.html in Resources */ = {isa = PBXBuildFile; fileRef = 84FE13D020DC3DDF0029AB7B /* inessential.html */; }; - 84FE13D920DC3DDF0029AB7B /* furbo.html in Resources */ = {isa = PBXBuildFile; fileRef = 84FE13D120DC3DDF0029AB7B /* furbo.html */; }; - 84FE13DA20DC3DDF0029AB7B /* HTMLFeedFinderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84FE13D220DC3DDF0029AB7B /* HTMLFeedFinderTests.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 84BAAE2B1C8E6B3B009F5239 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 84BAAE161C8E6B3B009F5239 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 84BAAE1E1C8E6B3B009F5239; - remoteInfo = RSFeedFinder; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 84B06FEE1ED3808F00F0B54B /* RSWeb.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSWeb.framework; path = "../../../../Library/Developer/Xcode/DerivedData/Evergreen-edcdqyvewhytnmcfaiesnqiqeynn/Build/Products/Debug/RSWeb.framework"; sourceTree = ""; }; - 84B06FF01ED380A700F0B54B /* RSXML.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSXML.framework; path = ../RSXML/build/Debug/RSXML.framework; sourceTree = ""; }; - 84B06FF21ED3812600F0B54B /* RSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSCore.framework; path = ../RSCore/build/Debug/RSCore.framework; sourceTree = ""; }; - 84BAAE1F1C8E6B3B009F5239 /* FeedFinder.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FeedFinder.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 84BAAE291C8E6B3B009F5239 /* FeedFinderTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FeedFinderTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 84E697E51C8E6C10009C585A /* RSCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSCore.framework; path = ../RSCore/build/Debug/RSCore.framework; sourceTree = ""; }; - 84E697E71C8E6C16009C585A /* RSXML.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSXML.framework; path = ../RSXML/build/Debug/RSXML.framework; sourceTree = ""; }; - 84E697E91C8E6C20009C585A /* RSWeb.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSWeb.framework; path = ../RSWeb/build/Debug/RSWeb.framework; sourceTree = ""; }; - 84F466561F03523100225386 /* RSParser.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RSParser.framework; path = ../RSParser/build/Debug/RSParser.framework; sourceTree = ""; }; - 84FE13C120DC3D960029AB7B /* FeedFinder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FeedFinder.h; path = FeedFinder/FeedFinder.h; sourceTree = ""; }; - 84FE13C320DC3DA70029AB7B /* FeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedFinder.swift; path = FeedFinder/FeedFinder.swift; sourceTree = ""; }; - 84FE13C520DC3DAE0029AB7B /* FeedSpecifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedSpecifier.swift; path = FeedFinder/FeedSpecifier.swift; sourceTree = ""; }; - 84FE13C720DC3DB50029AB7B /* HTMLFeedFinder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HTMLFeedFinder.swift; path = FeedFinder/HTMLFeedFinder.swift; sourceTree = ""; }; - 84FE13C920DC3DCA0029AB7B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = FeedFinder/Info.plist; sourceTree = ""; }; - 84FE13CB20DC3DDF0029AB7B /* FeedFinderTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FeedFinderTests.m; sourceTree = ""; }; - 84FE13CD20DC3DDF0029AB7B /* indiestack.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = indiestack.html; sourceTree = ""; }; - 84FE13CE20DC3DDF0029AB7B /* sixcolors.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = sixcolors.html; sourceTree = ""; }; - 84FE13CF20DC3DDF0029AB7B /* DaringFireball.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = DaringFireball.html; sourceTree = ""; }; - 84FE13D020DC3DDF0029AB7B /* inessential.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = inessential.html; sourceTree = ""; }; - 84FE13D120DC3DDF0029AB7B /* furbo.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = furbo.html; sourceTree = ""; }; - 84FE13D220DC3DDF0029AB7B /* HTMLFeedFinderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLFeedFinderTests.swift; sourceTree = ""; }; - 84FE13D320DC3DDF0029AB7B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 84FE13DC20DC3E4E0029AB7B /* FeedFinder_project_debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeedFinder_project_debug.xcconfig; sourceTree = ""; }; - D511EF0920242E7A00712EC3 /* FeedFinder_project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FeedFinder_project.xcconfig; sourceTree = ""; }; - D511EF0A20242E7A00712EC3 /* FeedFinder_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FeedFinder_target.xcconfig; sourceTree = ""; }; - D511EF0B20242E7A00712EC3 /* FeedFinder_project_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FeedFinder_project_release.xcconfig; sourceTree = ""; }; - D511EF0C20242E7A00712EC3 /* FeedFinderTests_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FeedFinderTests_target.xcconfig; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 84BAAE1B1C8E6B3B009F5239 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 84F466571F03523100225386 /* RSParser.framework in Frameworks */, - 84B06FF31ED3812600F0B54B /* RSCore.framework in Frameworks */, - 84B06FEF1ED3808F00F0B54B /* RSWeb.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84BAAE261C8E6B3B009F5239 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 84BAAE2A1C8E6B3B009F5239 /* FeedFinder.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 84B06FED1ED3808E00F0B54B /* Frameworks */ = { - isa = PBXGroup; - children = ( - 84F466561F03523100225386 /* RSParser.framework */, - 84B06FF21ED3812600F0B54B /* RSCore.framework */, - 84B06FF01ED380A700F0B54B /* RSXML.framework */, - 84B06FEE1ED3808F00F0B54B /* RSWeb.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; - 84BAAE151C8E6B3B009F5239 = { - isa = PBXGroup; - children = ( - 84FE13C120DC3D960029AB7B /* FeedFinder.h */, - 84FE13C320DC3DA70029AB7B /* FeedFinder.swift */, - 84FE13C520DC3DAE0029AB7B /* FeedSpecifier.swift */, - 84FE13C720DC3DB50029AB7B /* HTMLFeedFinder.swift */, - 84FE13C920DC3DCA0029AB7B /* Info.plist */, - 84E697E91C8E6C20009C585A /* RSWeb.framework */, - 84E697E71C8E6C16009C585A /* RSXML.framework */, - 84E697E51C8E6C10009C585A /* RSCore.framework */, - 84FE13CA20DC3DDF0029AB7B /* FeedFinderTests */, - 84BAAE201C8E6B3B009F5239 /* Products */, - 84B06FED1ED3808E00F0B54B /* Frameworks */, - D511EF0820242E7A00712EC3 /* xcconfig */, - ); - sourceTree = ""; - }; - 84BAAE201C8E6B3B009F5239 /* Products */ = { - isa = PBXGroup; - children = ( - 84BAAE1F1C8E6B3B009F5239 /* FeedFinder.framework */, - 84BAAE291C8E6B3B009F5239 /* FeedFinderTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 84FE13CA20DC3DDF0029AB7B /* FeedFinderTests */ = { - isa = PBXGroup; - children = ( - 84FE13CB20DC3DDF0029AB7B /* FeedFinderTests.m */, - 84FE13CC20DC3DDF0029AB7B /* Resources */, - 84FE13D220DC3DDF0029AB7B /* HTMLFeedFinderTests.swift */, - 84FE13D320DC3DDF0029AB7B /* Info.plist */, - ); - path = FeedFinderTests; - sourceTree = ""; - }; - 84FE13CC20DC3DDF0029AB7B /* Resources */ = { - isa = PBXGroup; - children = ( - 84FE13CD20DC3DDF0029AB7B /* indiestack.html */, - 84FE13CE20DC3DDF0029AB7B /* sixcolors.html */, - 84FE13CF20DC3DDF0029AB7B /* DaringFireball.html */, - 84FE13D020DC3DDF0029AB7B /* inessential.html */, - 84FE13D120DC3DDF0029AB7B /* furbo.html */, - ); - path = Resources; - sourceTree = ""; - }; - D511EF0820242E7A00712EC3 /* xcconfig */ = { - isa = PBXGroup; - children = ( - D511EF0920242E7A00712EC3 /* FeedFinder_project.xcconfig */, - 84FE13DC20DC3E4E0029AB7B /* FeedFinder_project_debug.xcconfig */, - D511EF0B20242E7A00712EC3 /* FeedFinder_project_release.xcconfig */, - D511EF0A20242E7A00712EC3 /* FeedFinder_target.xcconfig */, - D511EF0C20242E7A00712EC3 /* FeedFinderTests_target.xcconfig */, - ); - path = xcconfig; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 84BAAE1C1C8E6B3B009F5239 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 84FE13C220DC3D960029AB7B /* FeedFinder.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 84BAAE1E1C8E6B3B009F5239 /* FeedFinder */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84BAAE331C8E6B3B009F5239 /* Build configuration list for PBXNativeTarget "FeedFinder" */; - buildPhases = ( - 84BAAE1A1C8E6B3B009F5239 /* Sources */, - 84BAAE1B1C8E6B3B009F5239 /* Frameworks */, - 84BAAE1C1C8E6B3B009F5239 /* Headers */, - 84BAAE1D1C8E6B3B009F5239 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FeedFinder; - productName = RSFeedFinder; - productReference = 84BAAE1F1C8E6B3B009F5239 /* FeedFinder.framework */; - productType = "com.apple.product-type.framework"; - }; - 84BAAE281C8E6B3B009F5239 /* FeedFinderTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 84BAAE361C8E6B3B009F5239 /* Build configuration list for PBXNativeTarget "FeedFinderTests" */; - buildPhases = ( - 84BAAE251C8E6B3B009F5239 /* Sources */, - 84BAAE261C8E6B3B009F5239 /* Frameworks */, - 84BAAE271C8E6B3B009F5239 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 84BAAE2C1C8E6B3B009F5239 /* PBXTargetDependency */, - ); - name = FeedFinderTests; - productName = RSFeedFinderTests; - productReference = 84BAAE291C8E6B3B009F5239 /* FeedFinderTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 84BAAE161C8E6B3B009F5239 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0930; - ORGANIZATIONNAME = "Ranchero Software"; - TargetAttributes = { - 84BAAE1E1C8E6B3B009F5239 = { - CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; - }; - 84BAAE281C8E6B3B009F5239 = { - CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; - }; - }; - }; - buildConfigurationList = 84BAAE191C8E6B3B009F5239 /* Build configuration list for PBXProject "FeedFinder" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 84BAAE151C8E6B3B009F5239; - productRefGroup = 84BAAE201C8E6B3B009F5239 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 84BAAE1E1C8E6B3B009F5239 /* FeedFinder */, - 84BAAE281C8E6B3B009F5239 /* FeedFinderTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 84BAAE1D1C8E6B3B009F5239 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84BAAE271C8E6B3B009F5239 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84FE13D820DC3DDF0029AB7B /* inessential.html in Resources */, - 84FE13D920DC3DDF0029AB7B /* furbo.html in Resources */, - 84FE13D720DC3DDF0029AB7B /* DaringFireball.html in Resources */, - 84FE13D520DC3DDF0029AB7B /* indiestack.html in Resources */, - 84FE13D620DC3DDF0029AB7B /* sixcolors.html in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 84BAAE1A1C8E6B3B009F5239 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84FE13C420DC3DA70029AB7B /* FeedFinder.swift in Sources */, - 84FE13C820DC3DB50029AB7B /* HTMLFeedFinder.swift in Sources */, - 84FE13C620DC3DAE0029AB7B /* FeedSpecifier.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 84BAAE251C8E6B3B009F5239 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 84FE13DA20DC3DDF0029AB7B /* HTMLFeedFinderTests.swift in Sources */, - 84FE13D420DC3DDF0029AB7B /* FeedFinderTests.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 84BAAE2C1C8E6B3B009F5239 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 84BAAE1E1C8E6B3B009F5239 /* FeedFinder */; - targetProxy = 84BAAE2B1C8E6B3B009F5239 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 84BAAE311C8E6B3B009F5239 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - SWIFT_VERSION = 4.0; - }; - name = Debug; - }; - 84BAAE321C8E6B3B009F5239 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D511EF0B20242E7A00712EC3 /* FeedFinder_project_release.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 84BAAE341C8E6B3B009F5239 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D511EF0A20242E7A00712EC3 /* FeedFinder_target.xcconfig */; - buildSettings = { - INFOPLIST_FILE = FeedFinder/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.FeedFinder; - SWIFT_VERSION = 4.0; - }; - name = Debug; - }; - 84BAAE351C8E6B3B009F5239 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D511EF0A20242E7A00712EC3 /* FeedFinder_target.xcconfig */; - buildSettings = { - INFOPLIST_FILE = FeedFinder/Info.plist; - PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.FeedFinder; - }; - name = Release; - }; - 84BAAE371C8E6B3B009F5239 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D511EF0C20242E7A00712EC3 /* FeedFinderTests_target.xcconfig */; - buildSettings = { - INFOPLIST_FILE = FeedFinderTests/Info.plist; - }; - name = Debug; - }; - 84BAAE381C8E6B3B009F5239 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = D511EF0C20242E7A00712EC3 /* FeedFinderTests_target.xcconfig */; - buildSettings = { - INFOPLIST_FILE = FeedFinderTests/Info.plist; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 84BAAE191C8E6B3B009F5239 /* Build configuration list for PBXProject "FeedFinder" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84BAAE311C8E6B3B009F5239 /* Debug */, - 84BAAE321C8E6B3B009F5239 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84BAAE331C8E6B3B009F5239 /* Build configuration list for PBXNativeTarget "FeedFinder" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84BAAE341C8E6B3B009F5239 /* Debug */, - 84BAAE351C8E6B3B009F5239 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 84BAAE361C8E6B3B009F5239 /* Build configuration list for PBXNativeTarget "FeedFinderTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 84BAAE371C8E6B3B009F5239 /* Debug */, - 84BAAE381C8E6B3B009F5239 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 84BAAE161C8E6B3B009F5239 /* Project object */; -} diff --git a/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 869932f23..000000000 --- a/Frameworks/FeedFinder/FeedFinder.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Frameworks/FeedFinder/FeedFinder/FeedFinder.h b/Frameworks/FeedFinder/FeedFinder/FeedFinder.h deleted file mode 100644 index 0e51c8f2d..000000000 --- a/Frameworks/FeedFinder/FeedFinder/FeedFinder.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// FeedFinder.h -// FeedFinder -// -// Created by Brent Simmons on 3/7/16. -// Copyright © 2016 Ranchero Software, LLC. All rights reserved. -// - -#import - -//! Project version number for FeedFinder. -FOUNDATION_EXPORT double FeedFinderVersionNumber; - -//! Project version string for FeedFinder. -FOUNDATION_EXPORT const unsigned char FeedFinderVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - -/* Given a URL, find one or more feeds. - -Download URL - If is feed, return URL - If is web page, find possible feeds in web page - Download each possible URL - If URL is feed, add to URLs list - return URLs list -*/ - diff --git a/Frameworks/FeedFinder/FeedFinder/Info.plist b/Frameworks/FeedFinder/FeedFinder/Info.plist deleted file mode 100644 index 3343335ab..000000000 --- a/Frameworks/FeedFinder/FeedFinder/Info.plist +++ /dev/null @@ -1,28 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - $(CURRENT_PROJECT_VERSION) - NSHumanReadableCopyright - Copyright © 2016 Ranchero Software, LLC. All rights reserved. - NSPrincipalClass - - - diff --git a/Frameworks/FeedFinder/FeedFinderTests/FeedFinderTests.m b/Frameworks/FeedFinder/FeedFinderTests/FeedFinderTests.m deleted file mode 100644 index 7b4edc8b6..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/FeedFinderTests.m +++ /dev/null @@ -1,39 +0,0 @@ -// -// FeedFinderTests.m -// FeedFinderTests -// -// Created by Brent Simmons on 3/7/16. -// Copyright © 2016 Ranchero Software, LLC. All rights reserved. -// - -#import - -@interface FeedFinderTests : XCTestCase - -@end - -@implementation FeedFinderTests - -- (void)setUp { - [super setUp]; - // Put setup code here. This method is called before the invocation of each test method in the class. -} - -- (void)tearDown { - // Put teardown code here. This method is called after the invocation of each test method in the class. - [super tearDown]; -} - -- (void)testExample { - // This is an example of a functional test case. - // Use XCTAssert and related functions to verify your tests produce the correct results. -} - -- (void)testPerformanceExample { - // This is an example of a performance test case. - [self measureBlock:^{ - // Put the code you want to measure the time of here. - }]; -} - -@end diff --git a/Frameworks/FeedFinder/FeedFinderTests/HTMLFeedFinderTests.swift b/Frameworks/FeedFinder/FeedFinderTests/HTMLFeedFinderTests.swift deleted file mode 100644 index ed5c78013..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/HTMLFeedFinderTests.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// HTMLFeedFinderTests.swift -// FeedFinder -// -// Created by Brent Simmons on 8/7/16. -// Copyright © 2016 Ranchero Software, LLC. All rights reserved. -// - -import XCTest -@testable import FeedFinder -import RSParser - -class HTMLFeedFinderTests: XCTestCase { - - func parserData(_ filename: String, _ fileExtension: String, _ url: String) -> ParserData { - - let bundle = Bundle(for: HTMLFeedFinderTests.self) - let path = bundle.path(forResource: filename, ofType: fileExtension)! - let data = try! Data(contentsOf: URL(fileURLWithPath: path)) - return ParserData(url: url, data: data) - } - - func feedFinder(_ fileName: String, _ fileExtension: String, _ url: String) -> HTMLFeedFinder { - - let d = parserData(fileName, fileExtension, url) - return HTMLFeedFinder(parserData: d) - } - - func testPerformanceWithDaringFireball() { - - let d = parserData("DaringFireball", "html", "https://daringfireball.net/") - self.measure { - - let finder = HTMLFeedFinder(parserData: d) - let _ = finder.feedSpecifiers - } - } - - func testFindingBestFeedWithDaringFireBall() { - - let finder = feedFinder("DaringFireball", "html", "https://daringfireball.net/") - let feedSpecifiers = finder.feedSpecifiers - let bestFeedSpecifier = FeedSpecifier.bestFeed(in: feedSpecifiers)! - XCTAssert(bestFeedSpecifier.urlString == "https://daringfireball.net/feeds/json") - } - - func testFindingBestFeedWithFurbo() { - - let finder = feedFinder("furbo", "html", "http://furbo.org") - let feedSpecifiers = finder.feedSpecifiers - let bestFeedSpecifier = FeedSpecifier.bestFeed(in: feedSpecifiers)! - XCTAssert(bestFeedSpecifier.urlString == "http://furbo.org/feed/") - } - - func testFindingBestFeedWithIndieStack() { - - let finder = feedFinder("indiestack", "html", "http://indiestack.com/") - let feedSpecifiers = finder.feedSpecifiers - let bestFeedSpecifier = FeedSpecifier.bestFeed(in: feedSpecifiers)! - XCTAssert(bestFeedSpecifier.urlString == "http://indiestack.com/feed/json/") - } - -} - - - diff --git a/Frameworks/FeedFinder/FeedFinderTests/Info.plist b/Frameworks/FeedFinder/FeedFinderTests/Info.plist deleted file mode 100644 index ba72822e8..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - - diff --git a/Frameworks/FeedFinder/FeedFinderTests/Resources/DaringFireball.html b/Frameworks/FeedFinder/FeedFinderTests/Resources/DaringFireball.html deleted file mode 100644 index 4bcdf3000..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Resources/DaringFireball.html +++ /dev/null @@ -1,1463 +0,0 @@ - - - - - Daring Fireball - - - - - - - - - - - - - - -
- - - -
- - -
-
-How Much Faster is the iPhone X’s ‘Telephoto’ Lens Than the iPhone 7 Plus’s?  -
-
-

Dan Provost:

- -
-

I also used the manual camera app Halide to get an ISO and shutter speed reading at the various light levels, and came to the conclusion that the iPhone X requires roughly 2 fewer stops of light before switching to the telephoto lens, as compared to the iPhone 7 Plus. This is obviously great news, and speaks to how improved the second lens is after just one year. In my own use of the phone for the past couple weeks, it does indeed seem to be the case that I am very rarely presented with a 2X cropped image.

-
- -

Impressive.

- -
- - -
- - -
-
-FCC Unveils Plan to Repeal Net Neutrality Rules  -
-
-

Brian Fung, reporting for The Washington Post:

- -
-

The Federal Communications Commission took aim at a signature Obama-era regulation Tuesday, unveiling a plan that would give Internet providers broad powers to determine what websites and online services their customers see and use.

- -

Under the agency’s proposal, providers of high-speed Internet services, such as Comcast, Verizon and AT&T, would be able to block websites they do not like and charge Web companies for speedier delivery of their content.

-
- -

This is literally bad for everyone but these mega-ISPs. Horrendously bad — and unpopular — policy.

- -
- - -
- - -
-
-Google Collects Android Users’ Locations Even When Location Services Are Disabled  -
-
-

Keith Collins, reporting for Quartz:

- -
-

Many people realize that smartphones track their locations. But what if you actively turn off location services, haven’t used any apps, and haven’t even inserted a carrier SIM card?

- -

Even if you take all of those precautions, phones running Android software gather data about your location and send it back to Google when they’re connected to the internet, a Quartz investigation has revealed.

- -

Since the beginning of 2017, Android phones have been collecting the addresses of nearby cellular towers — even when location services are disabled — and sending that data back to Google. The result is that Google, the unit of Alphabet behind Android, has access to data about individuals’ locations and their movements that go far beyond a reasonable consumer expectation of privacy.

- -

Quartz observed the data collection occur and contacted Google, which confirmed the practice.

- -

The cell tower addresses have been included in information sent to the system Google uses to manage push notifications and messages on Android phones for the past 11 months, according to a Google spokesperson. They were never used or stored, the spokesperson said, and the company is now taking steps to end the practice after being contacted by Quartz. By the end of November, the company said, Android phones will no longer send cell-tower location data to Google, at least as part of this particular service, which consumers cannot disable.

-
- -

If they were “never used or stored”, why did they start collecting them in the first place? This is like a kid caught with their hand in the cookie jar saying they weren’t going to eat any cookies. Sure.

- -
- - -
-CNBC’s Google Pixel Buds Review  -
-
-

Todd Haselton, writing for CNBC:

- -
-

There’s nothing I recommend about the Pixel Buds. They’re cheap-feeling and uncomfortable, and you’re better off using the Google Translate app on a phone instead of trying to fumble with the headphones while trying to translate a conversation. The idea is neat, but it just doesn’t work well enough to recommend to anyone on any level.

-
- -

Hardware is hard.

- -
- - -
- - -
-
-iPhone 7 Plus and Portrait Mode Lighting Effects  -
-
-

Steven Troughton-Smith discovered that portrait mode lighting effects can be edited on an iPhone 7 Plus after using a hex editor on an exported photo to enable the feature:

- -
-

Just to add insult to injury, if you AirDrop that photo back to the iPhone 7 Plus now it shows the Portrait Lighting UI, and lets you change mode. So Portrait Lighting is 100% an artificial software limitation. 7 Plus photos can have it, 7 Plus can do it.

-
- -

My understanding is that these effects aren’t enabled on iPhone 7 Plus because performance was really slow at capture time. It really does require the A11 Bionic chip for adequate performance live in the camera. And Apple decided against shipping it as a feature for 7 Plus that could only be applied in post, because that felt like half a feature. So I’ve heard.

- -

What I don’t know is why the new lighting effects are not available when you use an iPhone X or 8 Plus to edit a portrait mode photo that was taken using an iPhone 7 Plus. This should be possible.

- -
- - -
-The Best iPhone Fast Chargers and Wireless Chargers  -
-
-

Joanna Stern, writing for The Wall Street Journal:

- -
-

Wireless charging means you can toss your phone on a pad (sold separately!) on your desk and it will charge throughout the day. With a fast charger (sold separately!), you can plug your phone in and go from zero to 50% in 30 minutes.

- -

Both can make a real difference in how you combat battery anxiety disorder. But figuring out which gear you need is complicated.

- -

I went in search of the best options for both speed and wireless convenience, charging and draining iPhones nearly 30 times. My finding: Getting the best chargers doesn’t mean running up your charge card.

-
- -

I second her recommendation of this 3-in-1 cable from Monoprice — Lightning, USB-C, and micro USB all on a single cable.

- -
- - -
-BuzzFeed: McMaster Mocked Trump’s Intelligence in a Private Dinner  -
-
-

Joseph Bernstein, reporting for BuzzFeed:

- -
-

Over a July dinner with Oracle CEO Safra Catz — who has been mentioned as a candidate for several potential administration jobs — McMaster bluntly trashed his boss, said the sources, four of whom told BuzzFeed News they heard about the exchange directly from Catz. The top national security official dismissed the president variously as an “idiot” and a “dope” with the intelligence of a “kindergartner,” the sources said.

- -

A sixth source who was not familiar with the details of the dinner told BuzzFeed News that McMaster had made similarly derogatory comments about Trump’s intelligence to him in private, including that the president lacked the necessary brainpower to understand the matters before the National Security Council.

-
- -
- - -
- - -
-
-The Talk Show: ‘Christmas Mitzvah’  -
-
-

Merlin Mann returns to the show for a Thanksgiving-week holiday spectacular. Topics include the history of Markdown, nerding out with Keyboard Maestro, kids today and the computers they want to use, caring about idiomatic native UI design, a look back at last year’s election, and more.

- -

Brought to you by these fine sponsors:

- -
    -
  • Away: Travel smarter with the suitcase that charges your phone. Get $20 off with code TALKSHOW.
  • -
  • Eero: Finally, Wi-Fi that works. Use code THETALKSHOW for free shipping in the U.S. and Canada.
  • -
  • Fracture: Your photos, printed directly on glass. Great gift idea. Save 15% off your first order with code TALK15.
  • -
- -
- - -
-Microsoft App Center  -
-
-

My thanks to Microsoft for sponsoring this week’s DF RSS feed to promote App Center, their recently-launched service for Apple developers that connects to your GitHub repo to automatically build, test, distribute, and monitor iOS and Mac apps. App Center is the next generation of HockeyApp, which was acquired by Microsoft a few years ago.

- -

The basic HockeyApp features like beta distribution and crash reporting got a revamped user interface, and Microsoft added new features for building, testing, analytics, and push notifications. Simply connect your repo, build the app on App Center’s Mac cloud, and run automated UI tests on thousands of real iOS devices in their hosted device lab. You can not only distribute your builds to testers, but also deploy directly to the App Store.

- -

You can use all of these features together, or just the pieces that complement your current workflow. Spend less time on drudgery, and more time on your app. Sign up now.

- -
- - -
- - -
-
-HomePod Delayed Until ‘Early 2018’  -
-
-

I just got this statement from an Apple spokesperson:

- -
-

“We can’t wait for people to experience HomePod, Apple’s -breakthrough wireless speaker for the home, but we need a little -more time before it’s ready for our customers. We’ll start -shipping in the US, UK and Australia in early 2018.”

-
- -

I had a feeling this would happen when the iPhone X press briefings came and went without a word about HomePod. It’s a tough miss for Apple — there are surely going to be a lot of Amazon Echo devices under Christmas trees this year.

- -
- - -
- - -
-
-Apple Machine Learning Journal: ‘An On-Device Deep Neural Network for Face Detection’  -
-
-

Apple Machine Learning Journal:

- -
-

We faced several challenges. The deep-learning models need to be -shipped as part of the operating system, taking up valuable NAND -storage space. They also need to be loaded into RAM and require -significant computational time on the GPU and/or CPU. Unlike -cloud-based services, whose resources can be dedicated solely to a -vision problem, on-device computation must take place while -sharing these system resources with other running applications. -Finally, the computation must be efficient enough to process a -large Photos library in a reasonably short amount of time, but -without significant power usage or thermal increase.

-
- -
- - -
- - -
-
-Face ID’s Innovation: Continuous Authentication  -
-
-

Rich Mogull, writing at TidBITS:

- -
-

Every year, as I travel around the security conference circuit, -the hallway conversations always turn to the interesting things -attendees have seen lately. To be honest, I can’t remember the -last time I was excited about a legitimately cool security -technology. I see plenty of security evolution, but not much -revolution.

- -

That is, until my iPhone X arrived on launch day, and I got to try -Face ID in real-world usage. Put simply, Face ID is the most -compelling advancement in security I have seen in a very long -time. It’s game-changing not merely due to the raw technology, but -also because of Apple’s design and implementation.

-
- -
- - -
-Vector  -
-
-

Rene Ritchie has re-launched Vector as a daily — yes, daily — podcast. I’m halfway through yesterday’s “Designing for iPhone X Roundtable” episode, with guests Sebastiaan de With, Linda Dong, Marc Edwards, and Brad Ellis, and it’s terrific.

- -
- - -
-The Ringer: ‘The 50 Best Superhero Movies of All Time’  -
-
-

I largely somewhat agree with these rankings — but far more so than I usually do with such lists. But the whole thing is worth it just for the sub-list of the best superhero villains of all time — they nailed that one.

- -
- - -
-Jimmy Iovine and Most Bomb Record in the Solar System  -
-
-

Jason Kottke on the golden record NASA sent into deep space with Voyager:

- -
-

Carl Sagan was project director, Ann Druyan the creative director, -and Ferris produced the Record. And the sound engineer for the -Golden Record? I was surprised to learn: none other than Jimmy -Iovine, who was recommended to Ferris by John Lennon.

-
- -

As Kottke asks, how was this not in The Defiant Ones?

- -
- - -
- - -
-
-How Facebook Figures Out Everyone You’ve Ever Met  -
-
-

Excellent investigation by Kashmir Hill, writing for Gizmodo, on Facebook’s creepy “People You May Know” system:

- -
-

In the months I’ve been writing about PYMK, as Facebook calls it, -I’ve heard more than a hundred bewildering anecdotes:

- -
    -
  • A man who years ago donated sperm to a couple, secretly, so they -could have a child — only to have Facebook recommend the child -as a person he should know. He still knows the couple but is not -friends with them on Facebook.
  • -
  • A social worker whose client called her by her nickname on their -second visit, because she’d shown up in his People You May Know, -despite their not having exchanged contact information.
  • -
  • A woman whose father left her family when she was six years old -— and saw his then-mistress suggested to her as a Facebook -friend 40 years later.
  • -
  • An attorney who wrote: “I deleted Facebook after it recommended -as PYMK a man who was defense counsel on one of my cases. We had -only communicated through my work email, which is not connected -to my Facebook, which convinced me Facebook was scanning my work -email.”
  • -
-
- -

Even if, like me, you’ve never even signed up for Facebook, they almost certainly have a detailed profile of you.

- -
- - -
- - -
-
-Ming-Chi Kuo on 2018 iPhones  -
-
-

MacRumors on the latest from Ming-Chi Kuo:

- -
-

Kuo expects the 5.8-inch model to have 458 pixels per inch, -suggesting the second-generation iPhone X’s display will likely -continue to have a resolution of 1,125×2,436. He said the 6.5-inch -model will have roughly 480 to 500 PPI, while the 6.1-inch model -is estimated to have between 320 and 330 PPI.

- -

In his latest research note, obtained by MacRumors, Kuo said the -6.1-inch model will have a lower-resolution LCD display and target -the low-end and mid-range markets with an estimated $649 to $749 -starting price in the United States.

- -

If accurate, next year’s new iPhone lineup would consist of the -second-gen iPhone X with the same size screen, a larger 6.5-inch -version that we’re tentatively calling the iPhone X Plus, and a -mid-range 6.1-inch LCD model that adopts an iPhone X form factor -and features but with a cheaper price point.

-
- -

A “Plus” sized version of the iPhone X makes perfect sense. Even without these rumors from the supply chain, I’d have been surprised if Apple didn’t create such a phone next. The iPhone X may well draw some current Plus-sized iPhone users, but in use it feels like a “regular” sized iPhone with an edge-to-edge display. Given the popularity of Plus-sized phones, I can’t see why Apple wouldn’t do that with the X design.

- -

But this 6.1-inch model with an LCD display makes no sense to me. First, I’d be surprised to see the X design trickle down to the $750 price range after just one year. Second, the size makes no sense to me. There’s a clear difference between the 4.7-inch and 5.5-inch regular and Plus classic-style iPhones. There would be a clear difference between 5.8-inch and 6.5-inch X-style phones. An additional 6.1-inch lower-priced X-style phone would just confuse things terribly. I don’t think Kuo has the story right on this phone.

- -
- - -
-Ina Fried Reviews Google’s Pixel Buds  -
-
-

Ina Fried, writing for Axios:

- -
-

Apple’s AirPods are more elegant as well as smaller and more -comfortable. However, Pixel Buds have some other appeals, most -notably the ability to aid in real-time language translation.

-
- -

The real-time translation feature is cool, but how often would you need it? I’ve been using AirPods for about a year and I don’t think I would have used this feature even once. And it seems like it’s more of a feature of the Google Translate app, not the Pixel Buds themselves.

- -

Given that they both cost $159, Apple comes out way ahead here.

- -
- - -
-Long-Term Coffee Consumption and Risk of Cardiovascular Disease  -
-
-

New paper published in Circulation:

- -
-

Background — Considerable controversy exists regarding the -association between coffee consumption and cardiovascular disease -(CVD) risk. A meta-analysis was performed to assess the -dose-response relationship of long-term coffee consumption with -CVD risk. […]

- -

Conclusions — A non-linear association between coffee -consumption with CVD risk was observed in this meta-analysis. -Moderate coffee consumption was inversely significantly -associated with CVD risk, with the lowest CVD risk at 3 to 5 -cups/d, and heavy coffee consumption was not associated with -elevated CVD risk.

-
- -

I like that 5 cups of coffee per day qualified as “moderate”. That’s right around what I consume.

- -
- - -
- - -
-
-Squarespace Domains  -
-
-

My thanks to Squarespace for sponsoring this week’s DF RSS feed. Buying a domain name from Squarespace is quick, simple, and fun. Search for the domain you want, or type any word or phrase into the search field, and Squarespace will suggest some great options. Every domain comes with a beautiful, ad-free parking page, WHOIS Privacy, and a 2048-bit SSL certificate to secure your website — all at no additional cost. Once you lock down your domain, create a beautiful website with one of Squarespace’s award-winning templates.

- -

Try Squarespace for free. When you’re ready to subscribe, get 10 percent off at squarespace.com with offer code “DARING17”.

- -
- - -
-The Talk Show: ‘Bed Is Where My Problems Are’  -
-
-

Ben Thompson returns to the show to talk about the iPhone X.

- -

Brought to you by these fine sponsors:

- -
    -
  • Casper: You can be sure of your purchase with Casper’s 100 night risk-free, sleep-on-it trial.
  • -
  • Squarespace: Make your next move. Use code talkshow for 10% off your first order.
  • -
  • Fracture: Photos printed in vivid color directly on glass. Get 10% off your first order.
  • -
- -
- - -
- - -
-
-Logitech Makes It Right  -
-
-

Logitech, on their company blog:

- -
-

We heard you and we want to make it right.

- -

If you are a Harmony Link user, we will reach out to you between -now and March 2018 to make arrangements to replace your Link with -a free Harmony Hub, a product with similar app-based remote -control features to Link, with the added benefit of controlling -many popular connected home devices plus, it works with popular -voice assistants.

-
- -
- - -
-Equifax Faces Hundreds of Class-Action Lawsuits and an SEC Subpoena Over the Way It Handled Its Data Breach  -
-
-

Hayley Tsukayama, reporting for The Washington Post:

- -
-

Equifax also said in its filings that it had received subpoenas -from the Securities and Exchange Commission, as well as the U.S. -Attorney’s Office for the Northern District of Georgia “regarding -trading activities by certain of our employees in relation to the -cybersecurity incident.” Shortly after news of the breach broke, -reports circulated that top officials had sold Equifax stock after -the company found out about the breach, but before disclosing it -to the public. Equifax said this week that it had cleared its -executives of wrongdoing after an internal investigation found -that the executives did not personally know about the breach -before their stock sales.

-
- -

Yeah, I’m sure the SEC will just take their word for it.

- -
- - -
-Clips 2.0  -
-
-

Major new release of Apple’s app “for making and sharing fun videos with text, effects, graphics, and more.” Headline feature for iPhone X:

- -
-

Selfie Scenes on iPhone X make Clips even more fun by using the -TrueDepth camera to place you in beautifully animated -landscapes, abstract art, and even onboard the Millennium Falcon -from Star Wars: The Last Jedi. Each scene is a full 360‑degree -experience, so however you move iPhone X, the scene surrounds -you on all sides.

-
- -

Here’s a perfect example from Rian Johnson.

- -

For an app that only debuted six months ago, Clips 2.0 is an ambitious 2.0. The entire user interface has been redone, and I think it makes everything more clear and obvious. I think Clips is the single best example of a productivity app designed for iOS.

- -

Ryan Christoffel, writing for MacStories, has a really good rundown of what’s new and what’s changed in 2.0:

- -
-

When Clips first debuted earlier this year, it was unknown what -kind of support the app would receive from Apple going forward. -Would it be another Music Memos, released to the public then -largely left alone? While Clips 1.1 was an encouraging sign of -life, today’s 2.0 clearly demonstrates Apple’s commitment to this -app. And I’m glad for that.

-
- -

I think Clips has flown under the radar since its release, but Apple seems very serious about it. It’s a big hit, apparently, in schools, where kids are using it to create presentations for classwork using iPads.

- -

And one for the road: Rene Ritchie has a good look at it for iMore.

- -
- - -
-SuperDuper 3.0  -
-
-

Dave Nanian, Shirt Pocket Software:

- -
-

With that last bit of explanation, I’m happy to say that we’ve -reached the end of this particular voyage. SuperDuper! 3.0 -(release 100!) is done, and you’ll find the download in the normal -places, as well as in the built-in updater, for both Beta and -Regular users.

- -

SuperDuper! 3.0 has, literally, many hundreds of changes under the -hood to support APFS, High Sierra and all version of macOS from -10.9 to the the present.

- -

SuperDuper! 3.0 is the first bootable backup application to -support snapshot copying on APFS, which provides an incredible -extra level of safety, security and accuracy when backing up. -It’s super cool, entirely supported (after all, it’s what Time -Machine uses… and it was first overall), and totally transparent -to the user.

-
- -

Fantastic update to one of my very favorite Mac utilities. I bought SuperDuper 1.5 in 2005, and I believe every single update since then has been free. I wish they’d charge me, I love SuperDuper so much.

- -

If you’re not familiar with it, SuperDuper lets you clone any volume to another drive or disk image. It’s really configurable, but with a very easy to understand UI. It’s also really smart, and incredibly trustworthy. I recommend it wholeheartedly.

- -
- - -
-Wallpaper Interview With Jony Ive on Apple Park  -
-
-

Nick Compton, writing for Wallpaper:

- -
-

The building, though, is not a metaphor for open systems, or -creative flow made concrete. It is a made object. Apple’s success -has been built on higher-order industrialisation; not just -designing beautiful objects that do all manner of new things but -producing them in incredible numbers and at consistent quality. -Its new building is, in some ways, the ultimate Apple product, in -places using the same materials the company uses in its laptops -and phones.

- -

Ive, above all else, is a maker, thrilled to have his CNC milling -machines close at hand. This culture of making was at the heart of -what Behling calls the ‘hybrid studio’ forged by the Apple and -Foster + Partners teams. ‘One of the connections that we made very -quickly was that their approach to problem solving was uncannily -similar to ours,’ Ive says. ‘We both make lots and lots of models -and prototypes. We made full-size prototypes of parts of the -building, we made prototypes to examine and explore a material. -The prototyping took many forms.’

-
- -

Gorgeous architectural photography throughout this piece — save it to read on the biggest display you have.

- -
- - -
-USB-C Earbuds: Slim Pickings  -
-
-

Helen Havlak, writing for The Verge:

- -
-

Two weeks after starting my cheap Pixel 2 earbud search, I finally -have a working pair — but they cost almost twice the amount I -wanted to spend, and don’t feel very premium. If I lose or break -them, it’ll cost me almost $50 and another 10-day wait. The next -time I upgrade my phone, they may not be compatible. Even the -Apple Store sells $29 Lightning EarPods. Google needs to do a lot -better by its Pixel owners than a single $149 USB-C option. Even -better, just give us back the damn headphone jack.

-
- -

Apple does better than selling $29 Lightning earbuds — they include a pair in the box with every iPhone. It’s embarrassing that Google doesn’t include a pair of USB-C earbuds with the Pixels.

- -
- - -
-Nintendo at Its Best  -
-
-

Chris Compendio, reviewing Super Mario Odyssey for Paste:

- -
-

I found that this videogame was persistent in its mission to bring -me joy. Super Mario Odyssey is extra — in that same area in the -Wooded Kingdom, I stood next to a boom box, and Mario, without any -button prompt, automatically began dancing to the music. When I -left Mario alone for more than a few seconds, he would lay down -for a nap, and a bird would eventually land on his nose, with each -kingdom having a different kind of bird. There are many moments -like this that serve little to no purpose other than smiles, -laughs and entertainment. Nintendo has a classic charm in all of -their products. They do not simply go for the extra mile, but for -at least fifty miles beyond that.

-
- -

I bought it last week, but haven’t had time to play yet. Looking forward to it.

- -
- - -
- - -
-
-Forking the iPhone  -
-
-

Jean-Louis Gassée:

- -
-

What we see is Apple is doing what they do best: Taking chances. -They made a risky bet with the iPhone X and covered it with the -iPhone 8. The new and improved perception of Apple might come from -the realization that both bets are winning, and that the iPhone X -is a radically new, as opposed to a merely improved, breed of -smartphone — and probably is the start of a new succession of -carefully incremented future models.

-
- -

A fork is exactly right: the iterative, familiar iPhone 8 and 8 Plus on one side of the fork, and the novel, back-to-the-drawing board iPhone X on the other.

- -
- - -
-TripAdvisor Removed Warnings About Rapes and Injuries at Mexico Resorts  -
-
-

Raquel Rutledge and Andrew Mollica, reporting for The Milwaukee Journal Sentinel:

- -
-

Seven years ago, TripAdvisor repeatedly removed a post written by -Kristie Love, a 35-year-old mother of two from Dallas. Love told -how she had been raped by a security guard at a highly rated -all-inclusive Mexican resort owned by the global chain, Iberostar, -based in Spain.

- -

She wrote how, after an evening with friends, she had returned to -her room to find the electronic key card no longer opened her door -at the Iberostar Paraiso near Playa del Carmen. She headed to the -lobby of the sprawling resort to get her card reactivated and -stopped to ask a uniformed guard whether she was walking in the -right direction.

- -

He motioned her to follow him, then overpowered her, dragged her -into some bushes and raped her. When she reached the lobby in -tears, hotel staff refused to call police.

- -

A TripAdvisor moderator spotted the post soon after it had -published and deemed it in violation of the company’s “family -friendly” guidelines.

- -

The following year, another young woman, 19 and on vacation with -her family, reported to hotel officials in the same resort complex -that a security guard had raped her in the bathroom.

- -

And in 2015, still another woman, Jamie Valeri, 34, a mother of -six from Wisconsin, was sexually assaulted at the same resort -after she and her husband simultaneously blacked out in the middle -of the day, barely into their third drink.

-
- -

It’s positively sickening that as a matter of TripAdvisor policy, actual rapes, sexual assaults, and druggings are OK, but reports about these crimes on their forums are not. TripAdvisor should get sued out of existence.

- -
- - -
-Most-Used OS in the World?  -
-
-

Andrew Tanenbaum, creator of the MINIX operating system, in an open letter to Intel CEO Brian Krzanich:

- -
-

Thanks for putting a version of MINIX 3 inside the ME-11 -management engine chip used on almost all recent desktop and -laptop computers in the world. I guess that makes MINIX the most -widely used computer operating system in the world, even more than -Windows, Linux, or MacOS. And I didn’t even know until I read a -press report about it. Also here and here and -here and here and here (in Dutch), and a bunch of -other places.

-
- -

It’s an interesting development, having a full-blown operating system running inside a CPU. And it’s a nice feather in the cap for MINIX, which heretofore had best been known as a teaching OS for computer science students. But it can’t be the most-used OS in the world. Android is. (Or, if you only want to count the kernel-level operating system, Linux, which runs at the heart of Android.)

- -

MINIX is now almost certainly the most widely-used OS on Intel-based computers, but Intel-based computers are now far outnumbered by ARM-based ones.

- -
- - -
-Horace Dediu: Apple Watch Will Soon Generate More Revenue Than iPod at Peak  -
-
-

Bookmark this for the next time you see someone claim Apple Watch is a flop.

- -
- - -
-Notcho  -
-
-

Notcho, from Cromulent Labs:

- -
-

Not a fan of the notch? Want to hide the horns? Now you can -quickly and easily create wallpapers that hide the notch on your -new iPhone X.

-
- -

It’s a clever little hack: you give Notcho an image, and Notcho lets you export a version with black bars and rounded corners at the top to hide the iPhone X’s sensor array notch. I don’t actually think this is a good idea — if there’s anywhere where I think embracing the notch is just fine, it’s on the lock and home screens. Where the notch should have been hidden is when you’re using apps. This utility doesn’t (and can’t) do anything about it. This was Apple’s decision to make, and even if you disagree with how they decided to handle it, I don’t think you should fight it. I still don’t like it, but I have to say that after nearly two weeks with iPhone X, I really don’t notice it.

- -

But damn if the name “Notcho” isn’t clever — it might be the best possible name for a utility that does this. Also clever is the monetization strategy: Notcho is free to download and use, but any wallpapers you create with it are watermarked with “Notcho” in the bottom right corner. For $2 you can remove the watermark. And if anyone is going to be bothered by that watermark, it’s the same sort of person who’s bothered by the notch.

- -

(I really hope that floppy disk icon for the Save button is a joke.)

- -
- - -
- -
- - -
-

Twitter’s 280-Character Own Goal

- - -

J.K. Rowling, on Twitter raising the per-tweet character limit to 280:

- -
-

Twitter’s destroyed its USP. The whole point, for me, was how -inventive people could be within that concise framework.

-
- -

USP is “unique selling proposition”. By doubling the character limit, Twitter has eliminated what made them unique. Yes, there were many trade-offs with the 140-character limit, both pros and cons. But one of the pros is it made Twitter unique. Twitter timelines now look more like Facebook — but Facebook is already there for Facebook-like timelines. Twitter trying to be more like Facebook is like basketball trying to be more like football — a bad idea that won’t work.

- -

Stephen King was more succinct:

- -
-

280 characters? Fuck that.

-
- -

Andy Ihnatko:

- -
-

I like the word-Tetris of making a complete thought fit in a -140-character box.

-
- -

John Dingell, 91-year-old retired Congressman from Michigan (who is truly excellent at Twitter):

- -
-

99% of you people don’t even deserve 140 characters.

-
- -

It’s no surprise that writers, in particular, object to this change. I agree with Ihnatko — the 140-character limit made it a challenge. Fitting certain complex thoughts into a mere 140 characters sometimes felt like solving a small challenge, like one of The New York Times’s tiny little 5 × 5 crossword puzzles.

- -

But perhaps the best commentary comes from William Shakespeare:

- -
-

Brevity is the soul of wit.

-
- -

Given 280 characters, people are going to use them, even to express thoughts that could have fit in 140. Given unlimited characters, such as in email, people ramble aimlessly.

- -

That’s why email feels like a dreary chore, and Twitter feels like fun. The fewer tweets that fit in a single screen at a time, the less fun Twitter feels. I’m sure Twitter considered this change carefully, but I’m convinced they’ve made a terrible mistake. 

- -
- -
- - - -
-
-Understanding Apple’s Multinational Tax Payments  -
-
-

Great piece by Shawn Tully for Fortune:

- -
-

I figured that if this reporter found corporate taxes baffling, so -did lots of sophisticated Fortune readers. So I dug into the -financials of Apple to grasp how the world’s most valuable -publicly traded company accounts for taxes. Albert Meyer, a -forensic accountant and former academic who runs investment firm -Bastiat Capital, helped explain how and why Apple books or defers -taxes on different categories of income, and which rates it -applies to each category. With his help, I present a primer on -taxation of multinationals, using Apple as a case study.

-
- -

I still don’t quite understand the whole thing, but I have a much better grasp than I did before. And I’m more convinced than ever that Apple is doing something complicated, not something devious.

- -
-

It’s important to emphasize that Apple actually pays a lot of tax -compared to other U.S.-based corporations with immense foreign -earnings, and takes a highly conservative approach to tax -accounting. […]

- -

For FY 2016, Apple booked total pre-tax earnings of $61.4 billion. -On its income statement, Apple showed a “provision for taxes” of -$15.685 billion. That number is an expense that’s deducted -straight from pre-tax income of $61.4 billion to yield net income -of $45.7 billion. Hence, its reported “effective tax rate” was -25.6% ($15.685 billion divided by $61.4 billion), well below the -official 35%, but on the high side for multinationals, many of -which are in the teens.

-
- -

The news coverage on Apple’s tax avoidance would lead you to believe (and in fact has led many to believe) that Apple pays a lower effective tax rate than most companies, when the truth is they pay a higher rate than most of their peers.

- -

And later:

- -
-

It’s important to note that Apple is extremely responsible in the -use of this exemption for reinvested earnings. Many multinationals -report that they intend to plough all of their foreign profits -into operations, and hence, don’t make any accruals for U.S. taxes -on their offshore earnings. Apple is the rare tech titan that books -large annual accruals that lower net income.

-
- -

The problem isn’t Apple’s tax structure, it’s U.S. law. You can argue that Apple should voluntarily pay more in taxes than they’re legally obligated to, but no one who holds such views would ever get hired as a finance executive at a large publicly held company.

- -
- - -
-Barry Ritholtz: ‘Why Apple Should Buy Netflix’  -
-
-

Barry Ritholtz, writing for Bloomberg:

- -
-

I try not to give billionaires or corporate managers unsolicited -advice on what they should do with their money. Warren Buffett and -Apple Inc. both have done rather well for themselves and their -investors without my help. Today, I violate my own rule: Apple -should buy Netflix Inc. in an all-stock deal for about $100 -billion. […]

- -

The upsides for Apple are fairly obvious; the biggest downside is -the cost. If anything, it might spare us the boring quarterly -routine of analysts expecting soft iPhone sales and then being -shocked when the company beats to the upside.

- -

If Apple passes on Netflix, don’t be surprised if Amazon does not. -That alone is reason to make the purchase.

-
- -

Usually when someone proposes Apple make a huge acquisition, I hurt my eyes by rolling them so far back in my head. I remain unconvinced that Apple should buy Netflix, but I don’t roll my eyes at the notion.

- -

I think the main problem is that there’s nothing magical about Netflix. Surely Apple could buy HBO for less money than Netflix would cost, and I would put HBO’s original content up against Netflix’s any day. I also think it’s a mistake to underestimate Apple’s ability to build its own first-class original content streaming service based on the crappy shows it’s released to date. A couple of more deals like the Amazing Stories one with Steven Spielberg and they’ll already have a foot in the game — for way less than the $100 billion it would take to buy Netflix.

- -

And, just as I was about to publish this post, this just in: Apple has announced a deal for a two-season scripted TV series starring Jennifer Aniston and Reese Witherspoon as competing morning TV show hosts, with House of Cards producer Jay Carson writing the pilot and serving as showrunner.

- -

Ritholtz (and others, like Om Malik and Ben Thompson) argue that Apple’s incredible cash hoard would allow them to make an expensive acquisition like Netflix. My argument is that Apple’s cash hoard would allow them to outbid the competition for the best new shows. Make Apple Studios the place where top notch talent takes new pitches first, knowing they’ll get paid top dollar and treated well. The trick isn’t the money — the trick is hiring the right executives to identify the best new shows.

- -
- - -
-Logitech Will Brick Its Harmony Link Hub for All Owners in March  -
-
-

Chris Welch, reporting for The Verge:

- -
-

Logitech has announced that it’s shutting down all services for -the Harmony Link hub, a plastic puck the company released in 2011 -that gave smartphones and tablets the ability to act as universal -remotes for thousands of devices.

- -

Owners of the product have received an email from the company -warning that the Link will completely stop working in March. “On -March 16th, 2018, Logitech will discontinue service and support -for Harmony Link. Your Harmony Link will no longer function after -this date,” the email says. There’s no explanation or reason given -as to why service is ending in the email, but a Logitech employee -provided more details on the company’s forums. “There is a -technology certificate license that will expire next March. The -certificate will not be renewed as we are focusing resources on -our current app-based remote, the Harmony Hub.”

-
- -

This sucks, but it seems like the way of the future with cloud-backed products. In the old days, products stopped working when they broke. Now, they stop working when the company that sold them loses interest in continuing to support them. It feels spiteful. More than ever, it matters how much you trust the company from which you buy stuff.

- -
- - -
-Apple at Its Best  -
-
-

Ben Thompson, writing at Stratechery:

- -
-

In these instances the iPhone X is reaching the very pinnacle of -computing: doing a necessary job, in this case security, better -than humans can. The fact that this case is security is -particularly noteworthy: it has long been taken as a matter of -fact that there is an inescapable trade-off between security and -ease-of-use; TouchID made it far easier to have effective security -for the vast majority of situations, and FaceID makes it -invisible.

- -

The trick Apple pulled, though, was going beyond that: the first -time I saw notifications be hidden and then revealed (as in the -GIF above) through simply a glance produced the sort of -surprise-and-delight that has traditionally characterized Apple’s -best products. And, to be sure, surprise-and-delight is -particularly important to the iPhone X: so much is new, -particularly in terms of the interaction model, that frustrations -are inevitable; in that Apple’s attempt to analogize the iPhone X -to the original iPhone is more about contrasts than comparisons.

-
- -

“Surprise and delight” are intangibles. You can’t measure them with a benchmark or instrument. There are contingents of hardcore power user and open source nerd types who disdain surprise and delight as product attributes — and no surprise, those are the folks who seem to be dismissing iPhone X as a cynical cash grab.

- -
- - -
-Steven Soderbergh’s ‘Mosaic’  -
-
-

Angela Watercutter, writing for Wired:

- -
-

Where they ended up was a smartphone-enabled story, developed and -released by Silver’s company PodOp, that lets viewers decide which -way they want to be told Mosaic’s tale of a children’s book -author, played by Sharon Stone, who turns up dead in the idyllic -ski haven of Park City, Utah. After watching each segment — some -only a few minutes, some as long as a standard television episode -— viewers are given options for whose point of view they want to -follow and where they want to go next. Those who want to be -completest and watch both options before moving on can do so, -those who want to race to find out whodunit can do that too. -Because each node, filmed by Soderbergh himself, feels like a TV -show, launching Mosaic can be akin to sneaking a quick show on -Netflix while commuting to work or waiting on a friend; but -because it’s a long story that’s easily flipped through, it can -also be enjoyed like the pulpy crime novel on your nightstand, -something you chip away at a little bit at a time before bed.

-
- -

This sounds fantastic, especially in the hands of someone as innovative and talented as Soderbergh. iOS-only (for now?), but that includes Apple TV.

- -
- - -
- - -
-
-iPhone X 4K Video vs. the Panasonic GH5 Professional Video Camera  -
-
-

Impressive side-by-side comparison. The Panasonic GH5 sells for $2000 for the body only, and costs around $2800 with a lens. The iPhone X camera largely held its own in outdoor lighting.

- -
- - -
-Apple to Release Software Update to Solve iOS 11 Issue When Typing the Letter ‘i’  -
-
-

Benjamin Mayo, writing for 9to5Mac:

- -
-

Some iPhone and iPad users are facing a weird bug after updating -to iOS 11.1. When trying to type the lowercase letter ‘i’, -autocorrect replaces the word with the letter ‘A’ and a question -mark symbol.

- -

Apple has documented steps for a workaround fix until a real -bug-fix software update is released …

-
- -

Such a weird bug — and embarrassing for Apple because it makes the device look so dumb. What I’ve heard is that this is a machine learning problem — that, more or less, for some reason the machine learning algorithm for autocorrect was learning something it never should have learned.

- -
- - -
- -
- - -
-

iPhone X Review Roundup

- - -

Because I’ve only had about 24 hours with the iPhone X, I’m in no position to write a review yet. But my quick take:

- -
    -
  • Face ID works great. In practice it’s like not even having a passcode on the phone. You just swipe and you’re in. It’s also very quick to set up — way quicker than setting up even a single fingerprint in Touch ID.
  • -
  • I don’t really notice the notch while using it.
  • -
  • I do notice the lack of a home button. I think I’ll get used to the new no-home-button UI soon, but 10 years of habits die hard.
  • -
  • The device feels great.
  • -
- -

I was far from alone in not getting an extended period of time to test the phone before the review embargo lifted.

- -

Here’s what others are saying in their reviews.

- -

Matthew Panzarino used iPhone X for a week, and stress-tested it with a family trip to Disneyland. (He did the same thing with the iPhone 6 and 6 Plus three years ago — it’s a great conceit for a review.) He also got on-the-record interviews with Phil Schiller, Dan Riccio, Craig Federighi, and Alan Dye. Riccio flatly denied reports that Apple was scrambling to get Touch ID working with iPhone X:

- -
-

“I heard some rumor [that] we couldn’t get Touch ID to work -through the glass so we had to remove that,” Riccio says, -answering a question about whether there were late design -changes. “When we hit early line of sight on getting Face ID to -be [as] good as it was, we knew that if we could be successful we -could enable the product that we wanted to go off and do and if -that’s true it could be something that we could burn the bridges -and be all in with. This is assuming it was a better solution. -And that’s what we did. So we spent no time looking at -fingerprints on the back or through the glass or on the side -because if we did those things, which would be a last-minute -change, they would be a distraction relative to enabling the more -important thing that we were trying to achieve, which was Face ID -done in a high-quality way.”

-
- -

Panzarino, on the iPhone X’s OLED display:

- -
-

I hate to say it, but it makes the iPhone 8 Plus LCD look kind -of like butt. I love it, even though it is flawed in one -noticeable way.

- -

The one area where this display falls prey to standard OLED gripes -is in off-axis viewing. Apple tells me that it has done work to -counter the drop in saturation and shift to blue that affects OLED -screens traditionally. I can tell you that, compared to other OLED -screens, you have to get further “off of center” to see a real -shift in color, holding the phone 30 degrees or more off of dead -on. But it is still there. For people who share their phone’s -screen or use it at odd angles a lot, it will be noticeable. On -some phones, OLEDs go super blue. On the iPhone X it’s more of a -slight blue shift with a reduction in saturation and dynamic -range. It’s not terrible, but it definitely exists.

-
- -

I see the same thing with mine.

- -

Nicole Nguyen also used iPhone X for a week and wrote a great review for BuzzFeed:

- -
-

Whatever. I don’t feel strongly about the notch either way, but -it’s really the other end of the screen that feels awkward. It’s -when the keyboard, in any app, is on screen (which, for me, is -most of the time): There’s all this dead space on the bottom, -where Apple could have put common punctuation, frequently used -emojis, or literally anything, but instead left it blank. Other -full-screen apps on other phones put navigation or other design -elements in that area, and it doesn’t look crowded or crammed. It -looks fine. It’s puzzling why Apple didn’t put something more -useful down at the bottom, or why it didn’t add a row of numbers -or emojis up top and push down the keyboard to make it more -thumb-accessible.

-
- -

It does look like a waste of space, but I wonder if testing showed that there needs to be some space under the keyboard to separate it from the virtual home button? If there weren’t a gap under the keyboard, you might hit the home button while trying to hit the space bar, and vice versa. Update: I’ve heard from a little birdie that my speculation is correct; also: it’s about typing comfort.

- -
-

For a normal human who isn’t aware of the 30,000 invisible dots -being projected on their face or the 3D map of their head -encrypted somewhere deep inside their phone, there’s nothing -“futuristic” about these interactions. Using Face ID is what life -without a passcode — life before we all became paranoid -technofreaks — felt like.

-
- -

That’s my take too. It’s like not having a passcode set.

- -

Lance Ulanoff, in his review for Mashable:

- -
-

During my first 24 hours of using the iPhone X, I helplessly -pressed the space where a button should be. It’s a kind of Phantom -Home Button Syndrome that I expect all iPhone X owners will -experience in the early days.

- -

It fades, though, and rather quickly, thanks to a smartly designed -gesture interface and something Apple calls Face ID. […]

- -

One important limitation of Face ID: It only lets you register one -face. That may strike many as unnecessarily limiting since Touch -ID lets users register up to 10 fingerprints, but Apple says it -found the number of people who register more than one person’s -fingerprints is miniscule. There’s also the simple and obvious -fact that humans have 10 fingers, but just one face.

-
- -

I’m surprised it’s only a minuscule number. I’ve got a fingerprint registered on my son’s iPhone — I’m sure other parents do the same thing. And last week my wife let me put a fingerprint on her iPhone so I could use Apple Pay while pre-ordering her iPhone X while she slept. 

- -
- -
- - -
-

Face ID FUD

- - -

Seemingly-sensational Apple story from Bloomberg today, reported by Alex Webb and Sam Kim, “Inside Apple’s Struggle to Get the iPhone X to Market on Time”:

- -
-

As of early fall, it was clearer than ever that production -problems meant Apple Inc. wouldn’t have enough iPhone Xs in time -for the holidays. The challenge was how to make the sophisticated -phone — with advanced features such as facial recognition — in -large enough numbers.

- -

As Wall Street analysts and fan blogs watched for signs that the -company would stumble, Apple came up with a solution: It quietly -told suppliers they could reduce the accuracy of the -face-recognition technology to make it easier to manufacture, -according to people familiar with the situation.

-
- -

That sounds terrible. But what exactly does it mean? Does it mean Face ID will create too many false positives? Does it mean it will be too slow? Does it mean there will be too many false negatives? Surprise surprise, Bloomberg doesn’t say.

- -
-

Apple is famously demanding, leaning on suppliers and contract -manufacturers to help it make technological leaps and retain a -competitive edge. While a less accurate Face ID will still be far -better than the existing Touch ID, the company’s decision to -downgrade the technology for this model shows how hard it’s -becoming to create cutting-edge features that consumers are -hungry to try.

-
- -

“Downgraded technology” sounds terrible. But which components, exactly, were “downgraded”?

- -
-

Apple spokeswoman Trudy Muller said “Bloomberg’s claim that it -reduced the accuracy spec for Face ID is completely false and we -expect Face ID to be the new gold standard for facial -authentication. The quality and accuracy of Face ID haven’t -changed; it continues to be one in a million probability of a -random person unlocking your iPhone with Face ID.”

-
- -

It is extraordinary for Apple to issue a blanket “this is completely false” statement on any news story. Apple, as policy, no-comments every news story, even when they know it’s bullshit. So either this story is particularly strong bullshit, or Apple is lying, on the record, under an employee’s real name (as opposed to the anonymous “an Apple spokesperson” attribution).

- -

And what exactly is the point of Bloomberg’s story if, as reported, “Face ID will still be far better than the existing Touch ID”?

- -
-

To make matters worse, Apple lost one of its laser suppliers early -on. Finisar Corp. failed to meet Apple’s specifications in time -for the start of production, and now the Sunnyvale, -California-based company is racing to meet the standards by the -end of October. That left Apple reliant on fewer laser suppliers: -Lumentum Holdings Inc. and II-VI Inc.

-
- -

Apple didn’t “lose” a supplier — Apple cut the supplier because they weren’t producing adequate yields.

- -
-

To boost the number of usable dot projectors and accelerate -production, Apple relaxed some of the specifications for Face ID, -according to a different person with knowledge of the process. As -a result, it took less time to test completed modules, one of the -major sticking points, the person said.

- -

It’s not clear how much the new specs will reduce the technology’s -efficacy.

-
- -

Now we get to the real heart of the story. Did Apple adjust the specifications for the components, or just the testing parameters? And if “it’s not clear how much the new specs will reduce the technology’s efficacy”, what is the point of this story? When did Apple “relax” these specifications? Before or after the September event?

- -

To be clear, I have no idea whether Face ID works as advertised or not. I haven’t used it even once yet. Maybe it stinks, maybe it’s great, maybe it’s somewhere in between. But Bloomberg clearly doesn’t know either, yet they published this story which has a headline and summary — “The company let suppliers reduce accuracy of the phone’s Face ID system to speed up production” — which suggests that Face ID is going to stink because Apple’s suppliers couldn’t get enough good components out the door. If this weren’t merely clickbait, they’d be able to say how well it actually works.

- -
- -

Frankly, I don’t trust anything Bloomberg reports about iPhones any more. On July 3, they published this piece by Mark Gurman, “Apple Tests 3-D Face Scanning to Unlock Next iPhone”:

- -
-

Apple Inc. is working on a feature that will let you unlock your -iPhone using your face instead of a fingerprint.

- -

For its redesigned iPhone, set to go on sale later this year, -Apple is testing an improved security system that allows users to -log in, authenticate payments, and launch secure apps by scanning -their face, according to people familiar with the product. This is -powered by a new 3-D sensor, added the people, who asked not to be -identified discussing technology that’s still in development. The -company is also testing eye scanning to augment the system, one of -the people said.

- -

The sensor’s speed and accuracy are focal points of the feature. -It can scan a user’s face and unlock the iPhone within a few -hundred milliseconds, the person said. It is designed to work even -if the device is laying flat on a table, rather than just close up -to the face. The feature is still being tested and may not appear -with the new device. However, the intent is for it to replace the -Touch ID fingerprint scanner, according to the person. An Apple -spokesman declined to comment.

-
- -

Apple did in fact replace Touch ID with Face ID in the iPhone X, but the timing on Gurman’s story is wrong. They weren’t “testing” the viability of any of this in July. According to several trusted sources within Apple, including multiple engineers who worked directly on the iPhone X project, the decision to go “all-in on Face ID” (in the words of one source) was made over a year ago. Further, the design of the iPhone X hardware was “locked” — again, a source’s word — prior to January 2017. If I had to wager, I’d say it was locked a few months before the end of 2016. This was a nine-month-old decision that Bloomberg reported in the present tense.

- -

Beyond Bloomberg, there are the slew of reports from various “analysts” that suggested Apple was still working to incorporate Touch ID into the iPhone X display as late as this summer.

- -

Ming-Chi Kuo in January:

- -
-

In a note sent out to investors on Friday, and subsequently -obtained by AppleInsider, well-connected KGI analyst Ming-Chi Kuo -says he believes Apple is developing a new class of -bio-recognition technologies that play nice with “full-face,” or -zero-bezel, displays. Specifically, Kuo foresees Apple replacing -existing Touch ID technology with optical fingerprint readers, a -change that could arrive as soon as this year, as Apple is widely -rumored to introduce a full-screen OLED iPhone model this fall.

-
- -

By January, there were no plans to embed an “optical fingerprint reader” in the display of any Apple device this year. Apple did, of course, investigate ways to embed Touch ID sensors in edge-to-edge displays, but, again, those efforts were abandoned in favor of Face ID over a year ago.

- -

Cowen and Company analyst Timoth Arcuri, on June 21 (of this year), under the AppleInsider headline “Apple Still Undecided on Fingerprint Tech for ‘iPhone 8’, No Shipments Until October”:

- -
-

The OLED-embedded fingerprint technology for Apple’s “iPhone 8” -is “still being worked out,” an analyst claimed on Wednesday, -with the company only deciding on one of three options by the end -of June.

- -

The one settled point appears to be that there won’t be a sensor -on the back of the phone, Cowen and Company’s Timothy Arcuri -indicated in a memo obtained by AppleInsider. The three options -include thinning the cover glass over a sensor area, creating a -pinhole through the glass for an optical or ultrasonic sensor, or -trying a “film” sensor integrated into the display, using either -capacitive or infrared technology.

-
- -

This, it turns out, was complete nonsense. Again, Apple was “all-in” on Face ID over a year ago. The idea that they were still “working this out” in June is a joke.

- -

And back to Ming-Chi Kuo, in August:

- -
-

Apple has decided against an embedded Touch ID solution for its -forthcoming “iPhone 8” handset, according to well-connected -analyst Ming-Chi Kuo, leaving the door open for competitor Samsung -to debut similar technology in next year’s Galaxy Note 9.

- -

In a note to investors obtained by AppleInsider, Kuo says Apple -has “cancelled” plans to embed a fingerprint recognition solution -in the next-generation flagship iPhone. The analyst left embedded -Touch ID off a list of standout “iPhone 8” features published in -July, but did not indicate that Apple had abandoned the initiative -altogether.

-
- -

As with Gurman’s report in June, the problem here is with the timing, not the facts. By August of this year, this was a nearly year-old decision.

- -

The Wall Street Journal, in a September 7 report attributed to reporters “Yoko Kubota in Tokyo, Tripp Mickle in San Francisco, and Takashi Mochizuki in Tokyo”:

- -
-

The production delays earlier this summer stemmed in part from -Apple’s decision to build new phones using organic light-emitting -diode, or OLED, screens similar to those used by rival Samsung -Electronics Co. At the same time, Apple decided to ditch the -physical home button that contains fingerprint sensors for -unlocking the device. Apple tried to embed the Touch ID function, -or fingerprint scanner, in the new display, which proved -difficult, the people familiar with the process said.

- -

As deadlines approached, Apple eventually abandoned the -fingerprint scanner, the people said, and users will unlock the -phone using either an old-fashioned password or what is expected -to be a new facial-recognition feature. Nonetheless, precious time -was lost and production was put back by about a month, according -to people familiar with the situation.

-
- -

I quote the two Tokyo datelines in the byline because I don’t think this information came from Apple. Again, my sources at Apple, directly familiar with the decision, have told me that they chose Face ID over a year ago because they were convinced it was better than Touch ID. Touch ID was not abandoned because it was difficult to embed in the display.

- -

For good measure while I’m pouring out the claim chowder, here’s Zach Epstein, writing for BGR on July 20, “I Might Know the Truth About Touch ID on Apple’s iPhone 8” (note that the device he refers to as “iPhone 8” is the iPhone X):

- -
-

I have now received information from three different well-placed -sources over the past few weeks, and they have all told me the -same thing: The iPhone 8’s Touch ID fingerprint sensor is in the -power button.

- -

The news first came to me about a month ago from a source I know -well. I’ve since been told the same thing by two additional -sources I haven’t known for quite as long. All three sources have -provided information to me in the past that has proven to be -accurate.

-
- -

That’s a lot of “well-placed sources” for a bullshit story.

- -
- -

All of this fits with what I’ve heard from rank-and-file engineering sources within Apple for years. To wit, producing hardware at the iPhone’s scale, while pushing the boundaries of the industry in technology, is so difficult, so complicated, that it requires hardware designs to be locked down far in advance of when iPhones are actually announced and released. Apple’s iPhone hardware engineering teams did not spend 2017 working on the iPhone X and iPhone 8 — they spent this year working on new iPhone hardware for 2018 and 2019 (and perhaps beyond). Hardware is nothing like software. If Apple had really been dithering over Touch ID-embedded-in-the-display vs. Face ID in June of this year, iPhone X wouldn’t be hitting the market until 2018. And the final decisions on the hardware for the iPhones that will be debuting next year are being made right now.

- -

So where do these rumors come from? I don’t know. My guess is that if there’s an intent behind them, it’s that competitors (cough, Samsung?) within the Asian supply chain are attempting to sow doubt about Face ID. The narrative presented by analysts and certain news reports this summer was that Apple was still scrambling to get Touch ID working embedded within the iPhone X display, suggesting that Face ID was their Plan B.

- -

People are naturally skeptical about biometric ID systems. They were skeptical about Touch ID when it was still only rumored, just like they’re skeptical now about Face ID. Today, though, Touch ID is both trusted and familiar. So rumors claiming that Apple really wanted to get Touch ID into iPhone X but had to settle for Face ID play into both the skepticism of the new and the comfort of the familiar. FUD is one of the oldest tricks in the book.

- -

The other, simpler explanation is that it simply takes 9 months or longer for engineering decisions made within Apple to percolate out to the rumor reporters and analysts — and their sources are so far removed from the halls of Cupertino that they mistake old news for new news. 

- -
- -
- - - - - - - - - - -
- -
- - - diff --git a/Frameworks/FeedFinder/FeedFinderTests/Resources/furbo.html b/Frameworks/FeedFinder/FeedFinderTests/Resources/furbo.html deleted file mode 100644 index 969d3f121..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Resources/furbo.html +++ /dev/null @@ -1,372 +0,0 @@ - - - - - - - - - - - - - - - - furbo.org by Craig Hockenberry - - - - - - - - - - - - - -
- - - - -
-
- - - -
- -
-
- - - - - - -
- -
-

The Forensic Shit Show

- -
-

It turns out someone at the FBI advised another law enforcement officer in San Bernardino to reset the iPhone that the government wants Apple to unlock.

-

This is just another episode in a complete forensic shit show.

-

Remember, this is the same case where the media was allowed to roam freely through a crime scene. One of the photos in that gallery shows a computer without an Ethernet connection on the wall (the age of the apartment also suggests that there would be no wired Internet.)

-

What are the chances that there was a wireless network in that apartment? What are the chances that there are IP logs on that router? Or maybe some kind of data backed up to a disk on the router? Here’s another wild guess: maybe that router was used to connect to an online backup service.

-

Yep, someone did the equivalent of a “restore factory defaults” on a device under active investigation.

-

What we’re seeing here is law enforcement’s complete lack of understanding of how digital devices store and transmit data. This new evidence is much more intricate than smoking guns or blood splatters. The important stuff is what you don’t see: it’s a hard problem where the people dealing with it are untrained. Shit, I work in this business and trying to decipher what’s going on makes my head spin.

-

Yet law enforcement is asking Apple to not only provide data, but also to create a forensic instrument that allows them to extract information from any device. And by its very nature, this tool would be made widely available throughout the forensic and law enforcement community.

-

Basically, the government is asking Apple to hand over a golden key that can defeat the security of any device to folks that can’t even secure a wireless network. Worse, this whole process is being overseen by politicians that think the problem is predators getting access to their grandkid’s Playstation.

-

This is why the entire tech community is saying “No fucking way.”

-

Updated February 21st, 2016: Several people have commented about my use of “restore factory defaults” in the post above. My intention was figurative, not literal.

-

The folks involved with the investigation were pressing buttons without understanding the consequences of their actions. To me, it feels like a “reboot to fix” approach. The password reset did not damage any data, it just made automatic backups stop working because iCloud information on the device needed to be updated, and that can’t be done without a passcode.

-

Others have reminded me that the FBI had cleared the crime scene. That’s true, but since the Wi-Fi equipment was not collected as evidence, it still shows that the investigators were out of their league. In an electronic investigation, a router is a key piece of the puzzle.

-

Both of these things are details in a bigger picture: the FBI wants to hold the private keys to a public key encryption system that affects the privacy of hundreds of millions people. If they can’t get the details of an online backup service right, how the hell do we expect them to guard a back door?

-

There’s also a possibility that the iCloud password reset was intentional. If this is the case, we have a government that is extorting Apple by essentially planting evidence. Imagine what they could do with a private key.

-
- - - -
- -
- -
-

Strapped In

- -
-

A lot has happened since I purchased my Apple Watch on April 10th, 2015. One unexpected aspect to owning this device is my fascination with watch bands:

-
-Apple Watch Bands

-
My current collection of watch bands. And no, the watch isn’t upside down.
-
-

From left to right, in order of date purchased:

-
    -
  • -Sport Model with Blue Band ($400) – I picked the aluminum watch with a blue band because I knew it would be spending a lot of time in the water. To date, I’ve used it 110 times for over 35 hours of swimming. -
  • -
  • -Milanese Loop ($150) – I was intrigued by this band as soon as I saw it during the video at the product announcement. I love how the metal feels a lot like fabric. It also dresses up the utilitarian Sport model so it doesn’t look out of place when I’m someplace nice. -
  • -
  • -Black & Silver Nylon ($30) – This NATO-style band from Clockwork Synergy popped up on my Twitter timeline thanks to my pal Rob Rhyne. I love that it dresses up the watch and is waterproof. -
  • -
  • -Red Sport ($50) – When Apple started selling additional colors for the sport bands, getting one in my favorite color was a no-brainer. I also like that a little of my purchase goes to a worthwhile charity. -
  • -
  • -Orange Silicone ($20) – This band by MoKo was another recommendation from Twitter by Neven Mrgan. To me, the most interesting thing about this band is that it shows why Apple went with fluoroelastomer for their bands: it’s stiffer and “breathes” better than silicone. -
  • -
  • -Black Goat Leather ($200) – The leather bands from Apple are nice, but I prefer the classic look of this one from Lucrin. The company also offers a huge range of colors: my wife loves the dark green one I gave at Christmas. -
  • -
-

In this survey of my growing collection, there’s an interesting datapoint: the value of these bands ($450) exceeds the cost of the watch itself ($400).

-

If Apple decides to change the interchange mechanism in some future version of the watch, I will have very little desire to upgrade. As I continue to “work in” my leather band, I hope I’ll be using them for a long time.

-
- - - -
- -
- -
-

The New iPod

- -
-

Something tells me that there were a lot of Apple Watches under the tree this year:

-

Clicker Downloads for December 2015

-

That graph shows the last month of downloads for my free Clicker app for watchOS. Since this app does nothing on an iPhone or iPad, the only reason to get it is if you have a new watch.

-

Many of us, myself included, originally thought of the Apple Watch as a device in and of itself. But the more I use the computer on my wrist, the more it feels like a satellite to the computer that’s sitting in my pocket.

-

Accessories have always made great gifts for folks who love their computers. Giving the watch as a gift is a perfect option for someone who’s always playing around with the apps on their iPhone. Just like the iPod was an ideal match for someone who loved playing music on their desktop computer.

-
- - - -
- - - -
- -
-

A Responsive Factory

- -
-

Back in May 2014, we introduced a new Iconfactory home page. One of the main design goals for that site was to make the layout a responsive web design: the same site looked great whether you were looking at it on a desktop PC or an iPhone. Reading Ethan Marcotte’s book was a revelation.

-

Of course, that site was just a beginning. We run a lot of web sites (including some you’ve probably never heard of before). Clearly we had to pick our responsive battles.

-

We started with an update to our blog in January 2015. In October, we updated our iOS and OS X app catalog. And yesterday we launched a responsive design portfolio.

-

A year and a half after our first responsive design, we’ve hit a milestone. All of the sites listed in the Iconfactory’s red navigation bar are responsive designs and will display correctly on any device. Woo hoo!

-

Along the way, we cleaned up some of our branding elements and worked toward a more consistent experience across all the sites. Check out the post at the Iconfactory about the new SVG icons in Safari to see what that’s all about.

-

It’s clear we’re at a point in time where the vast assortment of screens is daunting. If you haven’t thought about how your site works on this wide variety of devices, now is a great time to start.

-
- - - -
-
- -
- -
-
- - -
- -
-
-
- - -
-
-
- -
- - - - - - - - - - - \ No newline at end of file diff --git a/Frameworks/FeedFinder/FeedFinderTests/Resources/indiestack.html b/Frameworks/FeedFinder/FeedFinderTests/Resources/indiestack.html deleted file mode 100644 index 017a438d3..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Resources/indiestack.html +++ /dev/null @@ -1,715 +0,0 @@ - - - - - - - - - - Indie Stack | Hacking the Mac, iOS, and more with Daniel Jalkut - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
- -
-
- - -
-
- -

- Treat Warnings as Errors in Swift -

- - -
- -
-

For years I have maintained a zero-tolerance policy for warnings in shipping code. To help me enforce this, my “Release” build configurations define the build setting that induces Xcode to “treat warnings as errors”:

-
GCC_TREAT_WARNINGS_AS_ERRORS = YES
-
-

The comedy of this build setting is that it references “GCC,” a compiler that increasingly few of us even remember Apple ever using for macOS or iOS development. Apple’s fork of the popular open-source compiler was the standard for years, until Apple debuted clang, which is built on the LLVM framework.

-

It’s always been kind of annoying that, as time moved on, we were stuck specifying important build settings with names that included “GCC,” but I accepted it. After all, I configure the vast majority of these settings in “.xcconfig” files that I reuse in all my projects, so I almost never interact with them directly.

-

As I’ve started to shift some of my code from Objective-C to Swift, I assumed that my ancient GCC build setting would ensure that I don’t ship any builds with warnings. But today I realized that I had built a release build that didn’t treat a warning as an error. What’s the deal?

-

It looks like Apple has decided to break with tradition and establish a new build setting for Swift:

-
SWIFT_TREAT_WARNINGS_AS_ERRORS = YES
-
-

Adding this to my .xcconfig file breaks the build when a warning is generated, and prevents me from accidentally shipping code that is known to be vulnerable to unexpected behavior. I think it would have been a nice touch if Apple had inferred SWIFT_TREAT_WARNINGS_AS_ERRORS when GCC_TREAT_WARNINGS_AS_ERRORS is set, so I’ve filed a bug requesting that it does. Radar #35352318.

-
- -
- -
-
- -
-
- -

- Selective Selector Mapping -

- - -
- -
-

I ran into an interesting challenge while porting some Objective-C code to Swift. The class in question served both as an NSTableView delegate and data source, meaning that it implemented methods both for controlling the table view’s behavior and for supplying its content.

-

Historically in Cocoa, most delegate relationships were established as informal protocols. If you wanted a particular class to be a table view data source, you simply implemented the required methods. For example, to populate a cell based table view, a data source would implement various methods, including one to indicate how many rows the view should have:

-
-- (NSInteger) numberOfRowsInTableView:(NSTableView *)tableView;
-
-

In recent years, Apple has increasingly converted these informal protocols to formal Objective-C protocols. These give the compiler the opportunity to generate errors if a particular class declares compliance, but neglects to implement a required method. At runtime, however, the compliance-checking is still pretty loose. NSTableView consults its data source, checks to see that it implements a required subset of methods, and dynamically dispatches to them if it does.

-

The dynamic nature of NSTableView hasn’t changed with Swift. An @objc class in Swift that complies with NSTableViewDataSource must still implement the required methods such that Apple’s Objective-C based NSTableView can dynamically look up and dispatch to the required delegate methods. Swift’s method rewriting “magic” even ensures that a delegate method can be written in modern Swift style, yet still appear identically to older Objective-C code:

-
-class MyDataSource: NSObject {
-	@objc func numberOfRows(in tableView: NSTableView) -> Int {
-		return 0
-	}
-}
-
-

Given an instance of MyDataSource, I can use the Objective-C runtime to confirm that a the legacy “numberOfRowsInTableView:” selector is actually implemented by the class above:

-
-let thisSource = MyDataSource()
-thisSource.responds(to: Selector("numberOfRowsInTableView:")) // false
-
-

Or can I? False? That’s no good. I’m using the discouraged “Selector” initializer here to ensure I get Swift to look for a very specific Selector, even if it doesn’t appear to be correct to the Swift-adapted side of the runtime.

-

I was scratching my head, trying to figure out why Objective-C could not see my method. Did I forget an @objc marker? No. Did I forget to make MyDataSource a subclass of NSObject? No. I finally discovered that I could second-guess the default Swift selector mapping to obtain a result that “worked”:

-
-class MyDataSource: NSObject {
-	@objc func numberOfRowsInTableView(_ tableView: NSTableView) -> Int {
-		return 0
-	}
-}
-
-let thisSource = MyDataSource()
-thisSource.responds(to: Selector("numberOfRowsInTableView:")) // true
-
-

Instances of MyDataSource will get the job done for Objective-C calls to “numberOfRowsInTableView:”, but I’ve lost all the pretty formatting that I expected to be able to use in Swift.

-

There’s something else I’m missing out in my Swift implementation: type checking of MyDataSource’s compliance with the NSTableViewDataSource protocol. Old habits die hard, and I had initially ported my class over with an old-fashioned, informal approach to complying with NSTableViewDataSource: I declared a plain NSObject that happens to implement the informal protocol.

-

It turns that adding that protocol conformance onto my class declaration not only gains me Swift’s protocol type checking, but changes the way key functions are mapped from Swift to Objective-C:

-
-class MyDataSource: NSObject, NSTableViewDataSource {
-	func numberOfRows(in tableView: NSTableView) -> Int {
-		return 0
-	}
-}
-
-let thisSource = MyDataSource()
-thisSource.responds(to: Selector("numberOfRowsInTableView:")) // true
-
-

Armed with the knowledge that my class intends to comply with NSTableViewDataSource, Swift generates the expected mapping to Objective-C. Notice in this final case, I don’t even have to remember to mark the function as @objc. I guess when Swift is creating the selector mapping for a function, it does so in a few phases, prioritizing more explicit scenarios over more general:

-
    -
  1. First, it defers to any explicit annotation with the @objc attribute. If I tag my “numberOfRows…” func above with “@objc(numberOfDoodads:)” then the method will be made available to Objective-C code dynamically looking for “numberOfDoodads:”.
  2. -
  3. If there’s no @objc specialization, it tries to match function implementations with declarations in superclasses or protocols the class complies with. This is what gives us the automatic mapping of Swift’s “numberOfRows(in:)” to Objective-C’s “numberOfRowsInTableView:”.
  4. -
  5. Finally it resorts to a default mapping based on Swift API Design Guidelines. This is what yielded the default “numberOfRowsIn:” mapping that I first encountered.
  6. -
-

This is an example of a Swift growing pain that is particularly likely to affect folks who are adapting older source bases (and older programming mindsets!) to Swift. If you run across a completely vexing failure of Objective-C to acknowledge your Swift class’s protocol compliance, start by making sure that you’ve actually declared the compliance in your class declaration!

-
- -
- -
-
- -
-
- -

- Swatch Your Step -

- - -
- -
-

Shortly after macOS 10.13 was released, I received an oddly specific bug report from a customer, who observed that the little square “swatches” in the standard Mac color panel no longer had any effect on MarsEdit’s rich text editor.

-

Screenshot of the macOS standard color panel.

-

I was able to reproduce the problem in the shipping 3.7.11 version of MarsEdit, which for various reasons is still built using an older version of Xcode, against the 10.6 SDK. The MarsEdit 4 Beta, which is built against the 10.12 SDK, does not exhibit the problem.

-

It’s not unusual for the behavior of Apple’s frameworks to vary based on the version of SDK an application was built against. The idea is usually to preserve the old behaviors of frameworks, so that any changes do not defy the expectations of a developer who has not been able to build and test their app against a later SDK. Sometimes, the variations in behavior lead to bugs like this one.

-

Using a totally straightforward demo app, consisting only of an NSTextView and a button to bring up the color panel, I was able to confirm that the bug affects an app that links against the macOS 10.9 SDK, but does not affect an app that links against the 10.10 SDK.

-

I filed Radar #34757710: “NSColorPanel swatches don’t work on apps linked against 10.9 or earlier.” I don’t know of a workaround yet, other than compiling against a later SDK.

-
- -
- -
-
- -
-
- -

- Xcode 9 Signing Workarounds -

- - -
- -
-

I wrote on Monday about issues with Xcode 9 relating to code signing. Although the gist of that post involved sandboxed Mac applications that launch sandboxed child processes, the fundamental issue is a bit broader: Xcode 9 adds a “com.apple.security.get-task-allow” entitlement to any binary it signs. For the majority of developers, this is probably not an issue, because the entitlement is removed when an Xcode archive is exported for distribution. Most developers, and particularly iOS developers, use Xcode archives.

-

For folks who don’t, side effects of this additional entitlement include, but may not be limited to:

-
    -
  1. Inability to launch sandboxed child processes.
  2. -
  3. Rejection from the Mac App Store.
  4. -
  5. Unknown consequences of shipping with an unintended entitlement.
  6. -
-

So, if you’re a developer who doesn’t use archives, what are your options? I’ve come up with four workarounds, and I present them here, roughly sorted by advisability and level of tedium:

-
    -
  1. -

    Use Xcode 8. The simplest solution is to not upgrade to Xcode 9 unless and until you need to. Xcode 8’s signing process does not impose the unintended entitlement, so there is no risk of shipping a product that has it, unless you add it yourself. The downside to sticking with Xcode 8 is you won’t enjoy any of the new features of Xcode 9, you’ll have to work to support either Swift 4, macOS 10.13, or iOS 11 SDK features in your app.

    -
  2. -
  3. -

    Manually re-sign the built-product. Code signing is code signing, and you’re free to sign anything you like to suit your needs, using the “codesign” command line tool. It frankly sounds like a pain in the neck to recursively re-sign every binary in the app bundle, ensuring that the suitable entitlements (minus the unwanted one) are preserved, but I’m sure it can be done.

    -
  4. -
  5. -

    Use Xcode archives. It strikes me as a little obnoxious to have to use Xcode archives when they don’t offer any added benefits for my dibstrution workflow. But as a long term solution, this is probably the safest bet. The new behavior in Xcode 9 strongly suggests that Apple expects most developers to use archives, and joining the crowd is usually a good idea when it comes to avoiding trouble with Apple’s developer tools.

    -

    If you are using Xcode archives for the first time, particularly with a complex project, you might discover that the resulting archives are not suitable for exporting a signed application. If you get a “Generic Xcode Archive” after running Build -> Archive, you know you’ve got a problem. By default the archive process builds all targets with an “install” option, rendering their built products into a file hierarchy that will be used to build the archive. If your project includes helper apps, for example, they will be “installed” alongside your main app, resulting in a generic archive of two apps, instead of the expected archive of a single app.

    -

    The solution for this problem is to ensure that the “SKIP_INSTALL” build setting is set to YES for any such helper app. Just archive your main app, export the “Built Products” from the resulting archive, and look at the file hierarchy to determine whether you have subtargets that need to have installation disabled.

    -
  6. -
  7. -

    Hack Xcode 9. In a hurry to ship an update to your app, and you’ve only got Xcode 9 handy? It turns out the imposition of this “com.apple.security.get-task-allow” entitlement is controlled by a single property list file inside Xcode’s application bundle. As a test, I edited the file:

    -
    -Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources/BaseEntitlements.plist
    -
    -

    It contains a single entitlement, the one that’s causing our grief. I deleted the entitlement from the list, saved the file, and relaunched Xcode. After doing so, everything is “back to normal.”

    -

    I can’t strongly encourage you to hack your copy of Xcode because I don’t know what the consequences might be. “It seems fine,” but you’re on your own if you decide to do this. -

  8. -
-

This small change in Xcode 9 causes a lot of unexpected grief for folks who don’t use Xcode archives. I am curious to know how widespread the problem is, and enthusiastic to get the word out about it so that affected folks can work around the problem, or at least be aware of it. Myself, I’ll probably end up adopting the workaround of using Xcode archives, but I’m hopeful that Apple will see the merit of providing an option in an update to Xcode 9 that supports disabling the addition of this entitlement without archiving and exporting a built product.

-
- -
- -
-
- -
-
- -

- Unordered Directory Contents -

- - -
- -
-

Since I updated to macOS 10.13 High Sierra, some of my unit tests broke. Examining the failures more carefully, I discovered that they were making assumptions about the order that Foundation’s FileManager.contentsOfDirectory(atPath:) would return items.

-

I wrote a quick playground to test the behavior on a 10.12 machine:

-
-import Foundation
-
-let array = try! FileManager.default.contentsOfDirectory(atPath: "/Applications/Utilities")
-print("\(array.debugDescription)")
-
-

The results come back alphabetically ordered by file name:

-
-[".DS_Store", ".localized", "Activity Monitor.app", "Adobe Flash Player Install Manager.app", "AirPort Utility.app", "Audio MIDI Setup.app", "Bluetooth File Exchange.app", "Boot Camp Assistant.app", "ColorSync Utility.app", "Console.app", "Digital Color Meter.app", "Disk Utility.app", "Grab.app", "Grapher.app", "Keychain Access.app", "Migration Assistant.app", "Script Editor.app", "System Information.app", "Terminal.app", "VoiceOver Utility.app"]
-
-

The same playground on 10.13 tells a different story:

-
-["AirPort Utility.app", "VoiceOver Utility.app", "Terminal.app", "Activity Monitor.app", ".DS_Store", "Grapher.app", "Audio MIDI Setup.app", ".localized", "System Information.app", "Keychain Access.app", "Grab.app", "Migration Assistant.app", "Script Editor.app", "ColorSync Utility.app", "Console.app", "Disk Utility.app", "Bluetooth File Exchange.app", "Boot Camp Assistant.app", "Digital Color Meter.app"]
-
-

I thought at first this might have been related to the APFS conversion that 10.13 applied to my boot volume, but the same ordering discrepancy occurs for items on my HFS+ volumes as well.

-

After checking the 10.13 release notes for clues, and finding none, I consulted the documentation. Well, what do you know?

-

The order of the files in the returned array is undefined.

-

So, mea culpa. The test code in question probably shouldn’t have ever made assumptions about the ordering of items returned from this method. While it has evidently always been undefined, it appears they are only making good on that promise in 10.13. You have been warned!

-

Update: It turns out I have some real bugs in my apps, not just in my tests, because of assuming the results of this call will be reasonably sorted. Luckily I use a bottleneck method for obtaining the list of files, and I can impose my own sorting right at the source. If you’re looking to make the same kinds of changes to your app, be sure to heed Peter Maurer’s advice and use “localizedStandardCompare” (available since macOS10.6/iOS4) to obtain Finder-like ordering of the results.

-
- -
- -
-
- -
-
- -

- Sandbox Inheritance Tax -

- - -
- -
-

I ran into a subtle bug with Xcode 9 that I think is worth sharing. Specifically, this bug affects Mac applications that:

-
    -
  1. Are sandboxed.
  2. -
  3. Launch a sandboxed subprocess with NSTask (or posix_spawn).
  4. -
  5. Configure the subprocess to inherit the parent’s sandbox.
  6. -
-

When such an app is compiled with Xcode 9, the subprocess will crash whenever the parent process launches it. A canonical example of something that might suffer from this problem is a bundled crash-monitor. I embed one with my apps to keep an eye on the running status of the parent process, and to present a crash-reporting interface to users if the host app terminates prematurely. When I build and run my app with Xcode 9, the bundled crash monitor dies instantly upon being launched.

-

It took me a while to realize that the subprocess is dying because it fails to satisfy the contract for inheriting a sandbox. From Apple’s “Enabling App Sandbox Inheritance“:

-

-To enable sandbox inheritance, a child target must use exactly two App Sandbox entitlement keys: com.apple.security.app-sandbox and com.apple.security.inherit. If you specify any other App Sandbox entitlement, the system aborts the child process. -

-

Well, that’s funny because my child process does specify only those two keys, but the system is aborting it anyway. It turns out that Xcode 9 is inserting a third entitlement without my permission. Clicking on the detail of the “Process Product Packaging” build phase in Xcode’s log navigator, I can see that there are three entitlements for my target:

-

Xcode build log detail showing the wrong entitlements.

-

When my subprocess is launched, the system sees that extra “com.apple.security.get-task-allow” entitlement in the context of “com.apple.security.inherit”, and unceremoniously crashes my the child process.

-

I’m not sure what Apple’s reasoning is for imposing this entitlement on sandboxed targets, but it appears to be doing so across the board, for literally every sandboxed target in my app. I confirmed that all of my apps, XPC processes, helper tools, etc., are all getting this bonus entitlement.

-

I searched Xcode’s files, and discovered the entitlement listed in this file inside the Xcode app bundle:

-
-Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/PrivatePlugIns/IDEOSXSupportCore.ideplugin/Contents/Resources/BaseEntitlements.plist
-
-

Putting aside the question of whether it’s appropriate for Xcode to surreptitiously add entitlements that are not specified by the developer’s own list of permissions, the addition of the entitlement for these particular targets, ones that inherit their parent’s sandbox, turns out to be a fatal move.

-

Ideally I would be able to work around this by adding a custom build phase to manually tweak the generated entitlements file, removing the unwanted key. But the “Process Product Packaging” build phase happens so late in the build process that it’s after the last user-specified custom build phase. There’s no room in Xcode’s current design for fixing up the problematic entitlements before they are incorporated into the signed product. As far as I can tell the only clean workaround would be to redundantly re-sign the child app with a custom script, and corrected entitlements, after Xcode’s build process is completed.

-

I filed Radar #34628449, “Sandboxed project build with Xcode 9 cannot launch child process.”

-

Update: Colin Barrett pointed out on Twitter that the entitlement in question here, “com.apple.security.get-task-allow”, may be required in order to attach to and debug a process. If true, then I think this is something that was handled in a different way in Xcode 8. I can confirm that my apps do not have the entitlement imposed on them by Xcode 8, yet I am able to attach to and debug them.

-

If Apple changed the debugger infrastructure in Xcode 9 so that the relationship between the debugger and target processes is more locked down, requiring a specific entitlement, then that’s probably a good thing. But if this change was made without thinking about the implications for the above-cited “strict two entitlement” rule for sandbox inheritance, then probably some flexibility needs to be applied to that rule.

-

Finally, as I noted above the entitlement is being applied to all my targets. What I didn’t clarify is that the entitlement is added even when Building and Archiving. A release build’s binaries are endowed with this additional entitlement, which may also bring additional security vulnerabilities to the app.

-

I would not ship a sandboxed Mac app that is built with Xcode 9, until we understand more about when Xcode applies this entitlement, and whether it can be prevented for Release builds at the very least.

-

Update 2: I’ve learned that Xcode’s “Export Archive” functionality causes the unwanted entitlement to be removed. Apparently the assumption is that everybody creates Xcode archives as part of their build and release process. I am sure this is true for most (all?) iOS deployments, but for Developer-ID signed apps on the Mac, there has traditionally been less of an incentive to do this. Got a properly signed Mac application? Zip it up, put it on a web server, and you’re done.

-

I’m not sure yet whether I’ll switch my build process to use archiving, or whether I’ll pull some other stunt to redo the code signing with corrected entitlements. In any case this has been quite an adventure today getting to the bottom of this. I updated my bug report with Apple to request that they provide some standard build flag that would prevent the problematic entitlement from being added from the start. In the mean time, I’ll explore one of the workarounds and get my builds back to fully functional!

-
- -
- -
-
- -
-
- -

- Better Swift Completion -

- - -
- -
-

Apple released Xcode 9 earlier this week, and in spite of a few glitches here and there, I have found the update to be an overall improvement over Xcode 8. It’s nice that Apple continues to invest in the core tools for Mac and iOS developers.

-

I’ve been dabbling in more and more Swift development lately, and it’s brought to light a shortcoming in Xcode’s code completion which has unfortunately not improved in Xcode 9: completion of Swift function calls when there is a large quantity of candidates.

-

Take for example NSAttributedString. If I want to initialize a new instance in Swift, I type “NSAttributedString(” to bring up the list of compatible init methods I can choose from:

-

SwiftCompletion

-

The problem at this point is that I have to navigate the menu by hand. I can’t narrow down the list of completions any further by typing, because the very next character I type will be interpreted as the manual filling out of parameters of the NSAttributedString initializer.

-

BadCompletion

-

This is a situation where Objective-C gets much nicer treatment in the editor. Because completion in Objective-C begins when I start typing “init”, and because the named first parameter is part of the init message name, I can winnow down the results quite a bit:

-

Pasted Image 9 22 17 11 24 AM

-

Better still, because Xcode performs a fuzzy match on the typing, I can proceed to type the names of additional parameters to zero in completely on the variation I want:

-

MEAppController AppDelegate m Edited

-

When I accept the completion, all of my typing is replaced with the expected, templated parameter placeholders for the chose initializer.

-

I filed Radar #34594940 requesting better completion for Swift.

-
- -
- -
-
- -
-
- -

- JavaScript OSA Handler Invocation -

- - -
- -
-

When Apple added support to macOS to support JavaScript for Automation, they did so in a way that more or less allows folks who invoke AppleScripts to invoke JavaScript for Automation scripts as if they were exactly the same. An abstraction in Apple’s Open Script Architecture (OSA) makes it easy for script-running tools to theoretically handle any number of scripting languages without concern for the implementation details of those languages.

-

This mostly works, but I recently received a bug report that shed light on a problem with Apple’s implementation of JavaScript with respect to invoking a specific named handler. The OSA provides a mechanism for loading and running a specific handler, or function, within a script. My app FastScripts takes advantage of this to query a script about whether it would prefer to be invoked in another process or not. Unfortunately, when it comes to JavaScript, Apple’s implementation runs the whole script in addition to running just the specific, named handler.

-

If you’ve got Xcode handy, you can use this simple playground content to observe the problem:

-
-import OSAKit
-
-if let javaScriptLanguage = OSALanguage(forName: "JavaScript") {
-   let scriptSource = "Application('Safari').activate();" +
-         "function boo() { ObjC.import('Cocoa'); $.NSBeep(); }"
-   let myScript = OSAScript(source: scriptSource, language: javaScriptLanguage)
-
-  // Only the behavior of boo should be observed
-  myScript.executeHandler(withName: "boo", arguments: [], error: nil)
-}
-
-// Give time for the beep to sound
-RunLoop.current.run(until: Date(timeIntervalSinceNow:5))
-
-

The named function “boo()” only invokes NSBeep, so when this playground is run, all that should happen is a beep should be emitted from the Mac. Instead, when it runs Safari becomes the active application. This is because in addition to running the “boo()” handler, it also runs the whole script at the top level.

-

A workaround to the bug is to wrap the top level functionality of a script in a “run()” handler, so where the scriptSource is declared above, instead use:

-
-   let scriptSource = "function run() { Application('Safari').activate(); }" +
-         "function boo() { ObjC.import('Cocoa'); $.NSBeep(); }"
-
-

I hope this helps the one other person on earth who cares about invoking JavaScript for Automation methods indvidually! (Radar #33962901, though I’m not holding my breath on this one!)

-
- -
- -
-
- -
-
- -

- Xcode GitHub Integration -

- - -
- -
-

Apple’s beta release of Xcode 9 features impressive improvements to its source control features, including streamlined integration with GitHub. There’s even a fancy “Open in Xcode” button when you go to clone a project:

-

Screen capture of the GitHub interface for cloning a project

-

This integration is amazing. You just click the button, specify a save folder in Xcode, and boom! You’re off and …

-

Screen capture of build failure indicating a missing signing certificate

-

Oh, right. Code signing. The otherwise stellar GitHub integration in Xcode underscores a longstanding deficiency in how it manages code signing identities for multi-team, collaborative projects. Precisely the kinds of projects you’re liable to find on GitHub.

-

The problem could be solved, or at least diminished greatly, by providing some mechanism for declaring that a project should be code signed “with the user’s own default developer team.” The default branch of any open source project targeting Apple platforms, would specify the DEVELOPMENT_TEAM as something like:

-
-DEVELOPMENT_TEAM = Automatic
-
-

Xcode would provide a user-level setting for “Default Development Team”, and in the absence of any overriding setting, that team would be used whenever a project was configured as above.

-

I wrote about this problem once before, but with all the work being put into streamlining the experience of cloning from and pushing to GitHub, now is an ideal time for Apple to embrace a fix. Radar #32614751.

-

Another issue that stops short the cloning, and immediate building and running, of open source projects, is the need to fulfill external dependencies. In some cases this might require manually downloading and installing libraries, or cloning projects, but in the vast majority of cases the dependencies will be specified using built-in Git submodule support, or a popular package manager. In each of these cases, it should be trivial for Xcode to detect that the project it has just cloned also has dependencies:

-
    -
  • Git submodules: there is a .gitmodules directory.
  • -
  • Carthage: there is a Cartfile file.
  • -
  • CocoaPods: there is a Podfile file.
  • -
  • Swift Package Manager: there is a Swift.package file.
  • -
-

If Xcode sees evidence of any of these techniques at play, it could do the favor of checking them out immediately after cloning the project. Radar #32615265.

-

The GitHub integration coming in Xcode 9 provides a nearly effortless capability for cloning, building, and running open source projects that target Apple platforms. Ideally it would also go the extra mile and provide for variable, dynamic development teams, as well as conduct a rudimentary check for dependencies that must be checked out before commencing work on the project.

-
- -
- -
-
- -
-
- -

- Evergreen Images -

- - -
- -
-

Brent Simmons, the original developer of MarsEdit and NetNewsWire, is building a new feed reader app called Evergreen:

-

Evergreen is an open source, productivity-style feed reader for Macs.

-

It’s at a very early stage — we use it, but we don’t expect other people to use it yet.

-

I’ve never been one to shy away from early-stage software, so of course I ran to the GitHub project page, cloned the repository, and built it immediately on my own Mac.

-

Screenshot of Evergreen about box without a custom icon.

-

Ahh, the tell-tale sign of a young app: the generic about box. Personally, I like to give apps-in-progress an icon, even if only a placeholder image, as soon as possible. It occurred to me that Apple has done the favor of providing a pretty-darned-suitable image for “Evergreen” in the form of its Emoji glyph of the same name:

-

🌲

-

Since I have the source code right here, why don’t I render that tree at a large size in a graphics app, resize it to a million different resolutions, bundle it up and check it in to the Evergreen source base?

-

Because that’s not nearly as fun as doing it in code. I dove into the Evergreen application delegate class, adding the following function:

-
-private func evergreenImage() -> NSImage? {
-	var image: NSImage? = nil
-	let imageWidth = 1024
-	let imageHeight = 1024
-	let imageSize = NSMakeSize(CGFloat(imageWidth), CGFloat(imageHeight))
-
-	if let drawingContext = CGContext(data: nil, width: imageWidth, height: imageHeight, bitsPerComponent: 8, bytesPerRow: 0, space: CGColorSpaceCreateDeviceRGB(), bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue) {
-
-		let graphicsContext = NSGraphicsContext(cgContext: drawingContext, flipped: false)
-		NSGraphicsContext.saveGraphicsState()
-		NSGraphicsContext.setCurrent(graphicsContext)
-
-		let targetRect = NSRect(origin: NSZeroPoint, size: imageSize)
-		NSString(string: "🌲").draw(in: targetRect, withAttributes: [NSFontAttributeName: NSFont.systemFont(ofSize: 1000)])
-
-		NSGraphicsContext.restoreGraphicsState()
-
-		if let coreImage = drawingContext.makeImage() {
-			image = NSImage(cgImage: coreImage, size: imageSize)
-		}
-	}
-
-	return image
-}
-
-

In summary this code: creates a CoreGraphics drawing context, renders a huge evergreen Emoji glyph into it, and creates an NSImage out of it.

-

Then from the “applicationDidFinishLaunching()” function:

-
-if let appIconImage = evergreenImage() {
-	appIconImage.setName("NSApplicationIcon")
-	NSApplication.shared().applicationIconImage = appIconImage
-}
-
-

Give the newly created image the canonical name, used by AppKit, for looking up the application icon, and immediately change the application’s icon image to reflect the new value. It worked a treat:

-

EvergreenEmoji

-

In programming there is usually a hard way, an easy way, and a fun way. Be sure to take the third option as often as possible.

-
- -
- -
-
- - - - -
-
- - -
- -
- - - - - - - - - \ No newline at end of file diff --git a/Frameworks/FeedFinder/FeedFinderTests/Resources/inessential.html b/Frameworks/FeedFinder/FeedFinderTests/Resources/inessential.html deleted file mode 100644 index 3bd46888f..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Resources/inessential.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - inessential: weblog - - - - - - - - - - -
- -
-

Lizcast

-

The Omni Group’s Liz Marley, who recently transitioned from testing to engineering, appears on the NSNorth 2016 podcast. She talks about…

- -

…challenges in engineering school, working with office cats, making the transition from software engineering to testing to developing and how knitting, like code, has the ultimate undo.

- -

Knitting is serious (though not somber) business here at Omni.

- -
-

OmniOutliner 4.5

-

OmniOutliner 4.5 is up on Omni’s site, and should be in the Mac App Store within days.

- -

With this release — see the release notes — I helped work on, of all things, printing bugs and features. This is the first time in my entire career where I worked on printing support that was more than just the most basic possible thing.

- -

And that sounds weird for the year 2016, I realize. But here’s the thing: working on printing support is far from glamorous. You wouldn’t call it fun. But the people who need these features really do need them, and it’s a matter of respect for OmniOutliner users that we do a great job even with printing.

- -

But I sure am glad to get it finished and shipping. And I’m proud of the work we did — more proud than I expected to be. It’s solid, and I think the people who print from OmniOutliner will be very pleased.

- -

Now we’re on to other new features, including editing Markdown documents with OmniOutliner.

- -
-

OmniDev

-

Omni is hiring a Mac/iOS developer!

- -

We’re also hiring a web developer, graphic designer, and phone support humans.

- -

I’ll let you try out my new beanbag chair.

- -
-

OmniJobs

-

We’re hiring a senior front-end web developer, a graphic designer, and support humans.

- -

You should apply.

- -
-

It Will Be Trump

-

The South Carolina primary is where the establishment fixes the errors of Iowa and New Hampshire. It’s Lee Atwater’s firewall.

- -

When Buchanan threatens Dole, South Carolina shuts it down. When McCain threatens Bush, South Carolina applies the kibosh.

- -

But is there any hope that it will function that way this time?

- -

I don’t think so. The establishment candidates are Bush, Rubio, and Kasich. They don’t have a shot. Nor does Cruz. Trump wins South Carolina.

- -

If that’s true, then it’s all over. If South Carolina fails — if the very primary that’s designed to toss the ball back to the establishment fails — then there’s no hope at all.

- -

Cruz will go on to win a few states, most notably Texas. But otherwise it’s going to be Trump. He’ll get the delegates he needs, and that will be that.

- -
-

Origin of Good (and Bad) Hair Day

-

When I was in middle school in the late ’70s I struggled to get my hair to feather properly. It just didn’t want to do it.

- -

Like many kids that age I was newly conscious of my appearance — and I naïvely thought that well-feathered hair was a necessary (though not sufficient) key to fitting in. (Which was probably true, by the way.)

- -

Every morning I would find that my hair behaved, at least somewhat, or it didn’t. So I categorized each day as a “good hair day” and a “bad hair day.”

- -

I told my friends about this categorization — including a neighborhood girl named Sarah. She ended up telling other kids at school.

- -

And pretty soon those kids, even kids I didn’t really know, would stop me in the halls or at lunch and say, “Hey Brent — good hair day or bad hair day?” Not meanly. Teasingly. It was funny.

- -

Years later I started hearing the phrase on TV, and I was surprised that my little middle-school thing had spread and become part of the culture.

- -

* * *

- - -

Of course, it’s also possible that I picked it up from Jane Pauley. But for all these years I’ve believed — no joke — that it was me, that it was my phrase. Maybe Jane Pauley got it (indirectly) from me.

- -

It’s highly unlikely — of course, I know this — that I’m the originator. But still, it had to be someone, right?

- -

(Not necessarily. It’s kind of obvious and could have had many originators.)

- -

* * *

- - -

I stopped categorizing good and bad hair days by the time I got to high school. And these days I’m just glad that I still have some hair.

- -
-

River5

-

River5 is Dave Winer’s river-of-news RSS aggregator.

- -

It’s a Node app. You can run it on a public machine and access it anywhere, or run it on your desktop and just read your news there.

- -
-

Stop Watch

-

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.

- -

So I stopped wearing my Watch and have switched to a mid-sixties Hamilton that my Dad gave me. (He had gotten it as a high school graduation present.)

- -

I’m no watch aficionado — but I do appreciate a good and attractive watch (which this is), and I appreciate even more an old watch that’s a family thing.

- -

Here’s the thing, though: the Apple Watch contains a hundred miracles of engineering and design, surely, but serious problems with software and services can turn even the most incredible hardware into something you just sit on your desk and ignore.

- -
-

On Sanders Governing

-

The Atlantic, Norm Ornstein:

- -

But is there any real evidence that there is a hidden “sleeper cell” of potential voters who are waiting for the signal to emerge and transform the electorate? No.

- -

Pure candidates on both sides of the spectrum often claim that their purity will bring in the checked-out voters, because they’re just waiting for a real conservative or a real liberal.

- -

It’s an enduring fairy tale with terrible consequences. To put faith in it is to lose to the other party.

- -
-

CocoaConf Podcast with Me

-

Cesare Rocchi interviewed me for the latest CocoaConf Podcast on life before the App Store.

- -

There was a life, by the way. It was fun! We could release software any time we wanted to.

- -
-

Archive

- -
- -
-
-Ads via The Deck - -
-
- - - - - - - - - diff --git a/Frameworks/FeedFinder/FeedFinderTests/Resources/sixcolors.html b/Frameworks/FeedFinder/FeedFinderTests/Resources/sixcolors.html deleted file mode 100644 index 48927c6fa..000000000 --- a/Frameworks/FeedFinder/FeedFinderTests/Resources/sixcolors.html +++ /dev/null @@ -1,1102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Six Colors: Apple, technology, and other stuff from Jason Snell and Friends - - - - - - - - - - - - - - - - -
- -
- six colors -
- -
- -
- -

- by Jason Snell & Dan Moren -

- -
- -
- - -
- -
- -
- - - - -
- - - - -
-

Become a subscriber!

- -

Six Colors Subscriptions - Support the site and receive exclusive monthly newsletters and weekly podcasts. -

- -
- - - - - - - - - - - -
- - - - - - -
-
-

Linked by Dan Moren

- -
- -
-

Transmission Bit Torrent client possibly infected with malware

- -

Some copies of Transmission, a popular OS X Bit Torrent client, have reportedly been infected with a ransomware program, according to security researchers Palo Alto Networks:

- -
-

The KeRanger application was signed with a valid Mac app development certificate; therefore, it was able to bypass Apple’s Gatekeeper protection. If a user installs the infected apps, an embedded executable file is run on the system. KeRanger then waits for for three days before connecting with command and control (C2) servers over the Tor anonymizer network. The malware then begins encrypting certain types of document and data files on the system. After completing the encryption process, KeRanger demands that victims pay one bitcoin (about $400) to a specific address to retrieve their files. Additionally, KeRanger appears to still be under active development and it seems the malware is also attempting to encrypt Time Machine backup files to prevent victims from recovering their back-up data.

-
- -

Oof. At least that 3-day waiting period gives a window for folks to remove the infected apps. I checked all three of my Macs, which all had the reportedly infected version, but none of them appeared to include the malware. It’s a good idea to do the same if you’re concerned. Instructions for checking are at the address above, and at Transmission’s website.

- - - -
-
-
- - - - -
- - - - - - - - - -
- - - - - - -
-
-
-

Podcast

- -
- -
- -

The Incomparable #290: Team Bucket -

- -

The Incomparable

-

The recently released game “Firewatch,” by Campo Santo and Panic, is the subject of discussion on this week’s episode of The Incomparable. This is a game that’s got a plot, but so much of the richness comes from characters and dialogue. Also, there are a lot of trees. Jason is joined by John Siracusa, Tiffany Arment, Serenity Caldwell, Tony Sindelar, and Brian Hamilton.

- - -
-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Jason Snell

- -
- -
-

A marvelous marble-based music machine

- -

Michael Rundle at Wired UK:

- -
-

The Wintergatan Marble Machine, built by Swedish musician Martin Molin and filmed by Hannes Knutsson, is a hand-made music box that powers a kick drum, bass, vibraphone and other instruments using a hand crank and 2,000 marbles.

-
- -

The video of it in operation is amazing.

- - - -
-
-
- - -
- - - - -
- -
- - -
- - - - -
- - - - - - -
-
-

Linked by Jason Snell

- -
- -
-

Simple automation

- -

I’m spending some time building some complex workflows in Keyboard Maestro—more on those in the future. But it’s worth reading Dr. Drang’s post on the benefits of even the simplest automation.

- - - -
-
-
- - -
- - - - -
- - - - - -
- -
-

By Jason Snell

- -
- -
-

Automate This: Connect to the Web with cURL

- -

One of the best utilities on the Mac is one you might not be familiar with, because it requires the use of Terminal. It’s cURL, and it’s a valuable part of my scripting, automation, and debugging toolbox.

- -

curl is a command-line utility that works kind of like a web browser. I use it mostly to download web content or ping web services. Using cURL for a lot of basic tasks is quite easy. Just type curl followed by a web address, and you’ll see that web page spewed across your Terminal window. type curl https://sixcolors.com/ > sixcolors.html and you’ll have dumped the contents of that URL to a file in your user folder.

- -

As a person who does a lot of podcast-related stuff, I am occasionally called upon to debug a podcast’s feed. Podcast feed files are XML files, and don’t display in a friendly way in a web browser. No problem — I use cURL to download the file and open it in my text editor of choice, BBEdit.

- -
curl http://feeds.theincomparable.com/tpk > tpk.rss ; bbedit tpk.rss
- -

This is the command I usually use — it’s actually two commands in one, separated by a semicolon. The first command downloads the RSS feed to a text file; the second uses the bbedit command-line utility1 to open the resulting file directly in BBEdit.

- -

You could also omit the BBEdit step and direct cURL to save the file to a more convenient location, like the Desktop:

- -
curl http://feeds.theincomparable.com/tpk > ~/Desktop/tpk.rss
- -

When I wanted to use IFTTT to automate some stuff in my house, I needed my computer to activate one of IFTTT’s “custom triggers” simply by loading a particular URL, in the format https://maker.ifttt.com/trigger/trigger-name-here/with/key/key-goes-here. In other words:

- -
curl https://maker.ifttt.com/trigger/mytrigger/with/key/this-is-my-key
- -

The app I’m using for this particular trigger can’t run Terminal commands itself, but it can launch apps. One great thing about terminal commands is that they’re easily integrated into AppleScript or Automator workflows. In this case, the “app” my app launches is this:

- -
do shell script "curl https://maker.ifttt.com/trigger/mytrigger/with/key/this-is-my-key"
- -

That’s it. With cURL and the AppleScript command “do shell script” (or the Automator equivalent, the Run Shell Script action), you can quickly and cleanly automate Web connections without using a web browser. And scripting aside, cURL is quite useful in downloading content from the Internet that you want to view in something other than a web browser2.

- -
-
-
    - -
  1. BBEdit ships with three different command-line tools! Pretty awesome. ↩

  2. - -
  3. As with most command-line software, there’s a lot more to cURL. Type man curl or visit the online documentation to see all the options.  ↩

  4. - -
-
- - - - - - - - - - - -
-
-
- - -
- - - - -
-
-
-

Dan Moren for Macworld

- -
- -
-

3 ways Apple could improve email ↦

- -

Despite all the many forms of communicating with people online—iMessage, Twitter, Facebook, Slack—email still reigns supreme for me. I conduct business via email, keep in touch with my family, send links to friends, and coordinate events. And yet, Apple’s approach to email has remained largely static for years.

- -

That’s not to say that the company hasn’t tried to integrate new features into the email experience. Hardly a release of iOS or OS X comes without some improvements to the Mail app. While some are more successful than others, overall our email has hardly been—I hesitate to even whisper the word—disrupted.

- -

Despite the surfeit of ways for us to communicate, I don’t think email is going away anytime soon. And while dealing with it may not be the most pleasant of tasks, a few changes might bring it up to date with the rest of our modern online experience.

- - -

Continue reading on Macworld ↦ - -

-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Jason Snell

- -
- -
-

San Bernardino DA: iPhone may hold “dormant cyber pathogen”

- -

David Kravets of Ars Technica, quoting Michael Ramos, the San Bernardino County District Attorney:

- -
-

“The seized iPhone may contain evidence that can only be found on the seized phone that it was used as a weapon to introduce a lying dormant cyber pathogen that endangers San Bernardino’s infrastructure,” according to a court filing

- -

Jonathan Zdziarski, a prominent iPhone forensics expert, said in a telephone interview that the district attorney is suggesting that a “magical unicorn might exist on this phone.”

-
- -

Michael Ramos may have watched too many episodes of “24”. I suspect he’s also a probationary member of the Golden Key Wizard Society. He can come to meetings on his magical unicorn.

- - - -
-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Jason Snell

- -
- -
-

Apple shareholders reject board diversity plan

- -

The Guardian:

- -
-

Apple shareholders have overwhelmingly rejected a proposal that would require the board of America’s largest company to adopt an “accelerated recruitment policy” for minorities among company leaders.

-
- -

This is the shareholder proposal that Apple opposed in January, formally failing. Apple opposed the proposal on the grounds that it was “unduly burdensome and not necessary because Apple has demonstrated to shareholders its commitment to inclusion and diversity.”

- - - -
-
-
- - -
- - - - -
- - - - - -
- -
-

By Jason Snell

- -
- -
-

Amazon Echo Dot and Sonos? Not… yet.

- -

-
Sonos Play:5 comes with a line-in jack.
-

- -

As Dan wrote about earlier today, Amazon has expanded the Echo family, and I’m intrigued by the $90 Echo Dot. It seems to be the original Amazon Echo, with most of its speaker technology sliced out, so it’s shorter and cheaper. Instead of having the better-quality speakers of the original, the Echo Dot is made to work in contexts where audio quality is less important (as a bedside clock radio, for example) or with external audio sources, such as Bluetooth speakers or any speaker that can use a standard headphone jack.

- -

amazon-echo-dot
Echo Dot can play out via a headphone jack. Buddies?

- -

As someone with a couple of Sonos speakers in my house, I immediately wondered if this might be the first step toward a joyous combination of Sonos’s whole-home audio system and Amazon Echo’s smart voice control. It might very well be, but Sonos and Amazon really need to work together if this is going to be a bountiful relationship.

- -

An esoteric, somewhat unsung Sonos feature could be helpful: If you’ve got a Sonos device with a line-in jack (such as a Play:5 speaker or a Connect), you can connect an external device like the Echo Dot and use it as an audio source. Most important is an esoteric feature called Line-In Autoplay, which will force a Sonos device to immediately switch to the line-in jack if it detects any audio being played by the device on the other end. Without this feature turned on, you have to manually switch a Sonos speaker to the line-in input before you can hear the audio.

- -

With a device like the Echo Dot (or an AirPort Express), you wouldn’t want to have to get out your phone and launch the Sonos app before you could even hear what was going on. You’d want to ask Alexa a question and hear the answer, even if that meant the music you listened to would be paused while the interaction went on. It looks like Sonos and the Dot can do that today.

- -

Still, it’s only a first step. Amazon’s Echo infrastructure currently has no support for Sonos speakers.1 If Sonos cut a deal with Amazon to allow you to control Sonos audio from the Echo, most of the problems here would vanish entirely. (You might not even need to attach the Echo Dot’s audio to your Sonos system at all, since Sonos already supports pretty much all the audio sources that the Echo supports.) I’d love to be able to voice control Sonos with an Echo or Echo Dot.

- -

If you’re someone who wants to use an Amazon Echo with a home stereo system or a really nice external speaker, the Echo Dot seems like it’s going to be a great addition. If you’ve already got a Sonos system, though, I don’t think the existence of the Echo Dot will help you much. But if Sonos and Amazon can agree to talk to each other, this could be the beginning of a beautiful friendship.

- -
-
-
    - -
  1. There’s a hack for this on GitHub if you want to play around with that. I don’t think I do. And there’s no official IFTTT support for Sonos, either. ↩

  2. - -
-
- - - - - - - - - - - -
-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Dan Moren

- -
- -
-

Apple Support now available via Twitter

- -

For those times when you just can’t make it to the Genius Bar, now you can tweet to get support, tips, and tricks from Apple.

- -

Cupertino has been incredibly strategic about its use of Twitter. Tim Cook, Phil Schiller, Eddy Cue, and other executives have certainly started using the platform more in the past few years, and there have long been accounts for the App Store and iTunes Trailers, and more recently Apple Music. But for all of that, there is still no official Apple Twitter account1.

- -

What’s most interesting about this to me is that it’s the first of Apple’s Twitter accounts that’s actually based on listening and responding to people. The rest, including Apple executives for the most part, are one-way experiences that focus on broadcasting information.

- -
-
-
    - -
  1. In fact, @apple is an account from 2011 that has never posted and yet has 37 thousand followers.  ↩

  2. - -
-
- - - -
-
-
- - -
- - - - -
-
-
-

Podcast

- -
- -
- -

The Rebound 75: Siriously? -

- -

The Rebound

-

It should have been a short show, really. It should have. But after Dan, John, and Lex discuss some developments in the Apple-FBI case—including the fact that yes, you can get C-SPAN online for free!—and then discuss the rumored upcoming Apple event, we launch into a discussion of the Apple Watch’s successes and failures as we approach its first anniversary. There may be some yelling. Happy 75th episode!

- - -
-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Dan Moren

- -
- -
-

Apple posts amicus briefs in FBI case

- -

As the Case of the Locked iPhone1 moves on to the next phase, Apple has posted a list of supporting amicus—or “friends of the court”—briefs to its website. Included in the list so far are the ACLU, a relative of the San Bernardino victims, an official of the Office of the United Nations High Commissioner of Human Rights, the App Association, and Access Now.

- -

Conspicuously absent at present are any other technology companies, though it’s still early. The next stage in the case is a hearing to be held before Magistrate Judge Sheri Pym on March 22 in Riverside, California, the day after Apple’s rumored to hold its next press event.

- -
-
-
    - -
  1. Worst Sherlock Holmes story ever.  ↩

  2. - -
-
- - - -
-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Dan Moren

- -
- -
-

Bustin’ makes me feel good

- -

Hey, it’s the first trailer for the Ghostbusters reboot with Kristen Wiig, Melissa McCarthy, Kate McKinnon, Leslie Jones, and Chris Hemsworth!

- -

- -

I kind of wish the titlecards didn’t lean on the old franchise, especially when it seems like this is a complete and utter reboot, but I guess that’s marketing for you.

- -

Also starring are Charles Dance (!!!), batter known as Tywin Lannister from Game of Thrones, and Michael K. Williams, aka Omar Little from The Wire. The whole thing is directed by Paul Feig (Bridesmaids) and comes out on July 15.

- - - -
-
-
- - -
- - - - -
- - - - - -
- -
-

By Dan Moren

- -
- -
-

The Amazon Echo family expands by two

- -

Meet Dot and Tap. No, they’re not lovable cartoon characters—they’re new additions to Amazon’s Echo family of smart, connected speakers.

- -

amazon-echo-dot
The Dot is essentially a small version of the existing Echo, just 1.5 inches tall, as opposed to the Echo’s 9.9 inches. From what I can tell, it has all of the features of the Echo, as well as two new tricks up its sleeve: it includes a standard 3.5mm audio output jack, letting you connect it to an existing set of speakers; and it can connect to Bluetooth speakers as well, so you can pipe music from online music sources—Prime Music, Spotify, Pandora—to better speakers. (The Dot includes its own internal speaker, but given the size difference, I’d guess it’s not as good as the Echo’s speaker, which itself wasn’t going to win any awards.) At $90, it’s half the price of the full blown Echo, but there is one catch: currently it’s only available to order via an Amazon Echo, thanks to apparently limited supplies.1 It ships at the end of March.

- -

amazon-tap

- -

The Tap is, as rumored, a smaller portable version of the Echo—6.2 inches tall and 2.6 inches in diameter—complete with a rechargeable battery and charging cradle (you can also charge it via micro-USB). Despite sharing most of its siblings’ capabilities, though, it lacks one significant feature: you can’t address it by saying “Alexa”; instead, like a pre-6s iPhone, you need to tap a button on the side to trigger the voice assistant. Amazon says the battery should be good for up to 9 hours of playback, and the Tap will even announce to you when its juice is running low. It also has a 3.5mm audio input port, if you don’t want to connect an audio source via Bluetooth. The Tap runs $130, plus another $20 if you want the Sling case that makes it look like a waterbottle. Like the Dot, it ships at the end of March.

- -

As my favorite gadget of 2015, I’ve been overwhelmingly positive about the Echo, and I’m intrigued to see what these new additions offer. Of the two, the Dot is probably the less exciting, although its lower price point is firmly within “impulse buy” territory, which could bring in new users who have been curious about the Echo. The portability of the Tap is interesting: at $130, it’s not cheap, but it doesn’t cost an arm and a leg more than comparable portable Bluetooth speakers (as Amazon’s product page is quick to note). I wonder if having to manually trigger Alexa will dull some of the appeal, but perhaps it’s better to consider this as a Bluetooth speaker with Alexa capability than an Echo you can tote around with you.

- -

I’m also pretty convinced that within the next year or two, there will be a portable Echo with the voice-activated Alexa prompt. Amazon has been extremely diligent about bringing new features to the Echo, and I’ve definitely gotten attached to the device. Seems like these new models provide a good opportunity for Amazon to spread the love.

- -
-
-
    - -
  1. To forestall questions: Yes, I ordered one. In the name of science, people!  ↩

  2. - -
-
- - - - - - - - - -

[Dan Moren is a freelance writer, podcaster, and former Macworld editor. You can email him at dan@sixcolors.com or find him on Twitter at @dmoren.]

- -
-
-
- - -
- - - - -
- - - - - -
- -
-

By Jason Snell

- -
- -
-

Quick Tip: Push notifications from Mac to Apple Watch

- -

Last month, reader Patrick M. wrote in with an interesting question:

- -
-

I was wondering if you knew of a way to easily push Mac notifications to an Apple Watch? I’ve been doing a lot of FCPX exports and typically leave my iMac while it completes. I’d love to be notified while I’m out when it’s done. The same goes for any number of time intensive apps or jobs I have my Mac do. Just thought you might have ran into something that might be a good solution.

-
- -

There was a time that I pushed notifications to my iPhone from my Mac, using Growl and the first iteration of the Boxcar app for iOS. After trying a few things, though, I don’t think the current implementation of Boxcar for iOS is reliable enough to use here.

- -

prowl -
A Mac notification, right on my Apple Watch.
-

- -

Instead, I found success with a combination of Growl ($4 from the Mac App Store and Prowl ($3 from the iOS App Store).

- -

Growl is a Mac utility that lets you send custom notifications from your Mac. In many ways it’s been subsumed by Notification Center, but it’s still got some skills—like the ability to trigger actions other than displaying an alert bubble—that OS X doesn’t offer by itself. The Prowl app comes with a Growl plug-in that allows you to set Growl to trigger a Prowl notification on your iPhone (and, yes, Apple Watch).

- -

Is this pretty? No. In fact, both apps are not particularly attractive, but they do the job. Once you sign up for a Prowl account, you can get an API key and paste that into the Prowl action within Growl, which connects your Mac to the Prowl app on your iPhone. Once that’s done, you can alert yourself on your watch whenever your Mac needs you.

- -

And since this is all done via the Internet, you don’t need to be near your Mac to be alerted about what it’s doing. I once got a Growl alert on my phone that a video encode had completed when I was at one of my daughter’s softball games. I like the idea that my Mac can reach out and find me if it needs me.

- -

Now, the app you want to notify you needs to support Growl for this to work. (I had to open HandBrake’s preferences and change its notification setting to Growl before it would work, for instance.) But once I did that, I was receiving notifications that my video encoding job had finished, right on my Apple Watch.1

- -

So, Patrick M.: Growl plus Prowl may be just what you’re looking for.

- -
-
-
    - -
  1. If you’re wanting to script other notifications, you could also consider Pushover, which—for the cost of a $5 in-app purchase—lets you send push notifications to your phone via web service. Thanks to TJ Luoma for the tip. ↩

  2. - -
-
- - - - - - - - - - - -
-
-
- - -
- - - - -
- - - - - -
- -
-

By Dan Moren

- -
- -
-

Automate This: Turn on your Xbox One from afar

- -

A few weeks ago, I wanted to download a really big file—the beta for the upcoming game The Division—to my Xbox One. Given how large it was—several gigabytes—I figured it would be best to do it while I was out of the house anyway.

- -

Using Xbox Live’s web-based marketplace, it’s pretty easy to queue up a download from anywhere, but the trick is that the Xbox has to be powered on in order to start the download. I spent a while trying to find a way to turn the Xbox One on remotely, including messing around with Microsoft’s Smart Glass app over my VPN and trying a Python script installed on my Mac mini, but ultimately had no luck.

- -

Do Button
IFTTT’s Do Button app
-Fool that I am, I didn’t realize until I got home that it was far, far easier than I’d thought. As I described in an earlier post, I’ve set up a Harmony Hub so that I can use my Amazon Echo to activate my various entertainment components, including the Xbox One. At first I was thinking through stupid ideas like triggering the Echo using speech synthesis via Terminal on one of my home apps, until I remembered that the Harmony Hub is hooked up via IFTT, so all I needed to do was trigger that particular recipe via the web or iOS app.

- -

I even took it a step further, thanks to IFTTT’s Do Button app which lets you create nice big buttons to easily initiate a recipe. (Do Button also has a Today widget for the phone and an Apple Watch app, which makes it even faster.)

- -

So now, when I want to start something downloading on the Xbox while I’m out of the house, all I need to do is reach for my phone or my Apple Watch, and I’m never more than a few taps away.

- - - - - - - - - -

[Dan Moren is a freelance writer, podcaster, and former Macworld editor. You can email him at dan@sixcolors.com or find him on Twitter at @dmoren.]

- -
-
-
- - -
- - - - -
-
-
-

Podcast

- -
- -
- -

Clockwise #126: Go into Space with Jerks -

- -

Clockwise

-

This week on our 30-minute run through four tech topics, Dan and Jason are joined by Andy Ihnatko and Brianna Wu to discuss choosing between convenience and privacy, our virtual-reality future, the viability of voice interfaces, and spending time in outer space.

- - -
-
-
- - -
- - - - -
-
-
-

Jason Snell for Macworld

- -
- -
-

Apple may be about to shake up its naming scheme ↦

- -

Apple’s general approach to naming its products is refreshing in an industry filled with products with complicated names and model numbers. Macs have model numbers, but nobody really uses them: I own an iPad Air 3 and a 2014 5K iMac and a 2012 11-inch MacBook Air, and between the model name, the release year, and maybe a screen size, that’s all any of us needs to know.

- -

Still, the ebb and flow of technology and fashion means that sometimes Apple needs to take a breath and adjust how it presents its products to the world. The PowerBook became the MacBook, the Power Mac became the Mac Pro, the MacBook Air appears to be diminished and headed for the west in favor of the new (adjectiveless) MacBook. So it goes.

- -

Which brings us to the report from 9to5Mac’s Mark Gurman that Apple is about to announce a new, updated iPad with the same 9.7-inch screen size as the iPad Air 2—but rather than calling it the iPad Air 3, Apple will consider it a smaller version of the iPad Pro.

- - -

Continue reading on Macworld ↦ - -

-
-
- - -
- - - - -
- - - - - - -
-
-

Linked by Jason Snell

- -
- -
-

‘Twitter Has Become a Park Filled With Bats and Perverts’

- -

Julieanne Smolkinski in New York Magazine:

- -
-

Let me try to explain how I see it. Twitter is like a beloved public park that used to be nice, but now has a rusty jungle gym, dozens of really persistent masturbators, and a nighttime bat problem. Eventually the Parks Department might rip up the jungle gym, and make some noise about fixing the other problems, because that’s what invisible administrators like Twitter staff and municipal recreation departments tend to do. But if the perverts and the bats got to be bad enough with no recourse, you’d probably just eventually stop going.

- -

(Additionally frustrating is that everybody is complaining about the safety issues at the park, and instead of addressing them, the city installs a crazy new slide. What? Nobody was calling for that. What about the perverts? What about the bats?)

-
- -

Every time Twitter launches a new feature, or discusses launching one, what I hear from people currently on Twitter is always a variation on, “What about the bats?”

- - - -
-
-
- - -
- - - - - - - - - - -
- -
- -
- -
- - - - - - - - - - - - - \ No newline at end of file diff --git a/Frameworks/FeedFinder/xcconfig/FeedFinderTests_target.xcconfig b/Frameworks/FeedFinder/xcconfig/FeedFinderTests_target.xcconfig deleted file mode 100644 index c759ef8c6..000000000 --- a/Frameworks/FeedFinder/xcconfig/FeedFinderTests_target.xcconfig +++ /dev/null @@ -1,18 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks -INFOPLIST_FILE = FeedFinderTests/Info.plist -PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.FeedFinderTests -PRODUCT_NAME = $(TARGET_NAME) - - - - - - - - - - - - - diff --git a/Frameworks/FeedFinder/xcconfig/FeedFinder_project.xcconfig b/Frameworks/FeedFinder/xcconfig/FeedFinder_project.xcconfig deleted file mode 100644 index 258ba13b6..000000000 --- a/Frameworks/FeedFinder/xcconfig/FeedFinder_project.xcconfig +++ /dev/null @@ -1,58 +0,0 @@ -CODE_SIGN_IDENTITY = -CODE_SIGN_STYLE = Automatic -DEVELOPMENT_TEAM = M8L2WTLA8W - -// See the notes in Evergreen_target.xcconfig on why the -// DeveloperSettings.xcconfig is #included here - -#include? "../../../SharedXcodeSettings/DeveloperSettings.xcconfig" - -SDKROOT = macosx -MACOSX_DEPLOYMENT_TARGET = 10.13 -CLANG_ENABLE_OBJC_WEAK = YES -SWIFT_VERSION = 4.0 -COMBINE_HIDPI_IMAGES = YES - -COPY_PHASE_STRIP = NO -MACOSX_DEPLOYMENT_TARGET = 10.13 -ALWAYS_SEARCH_USER_PATHS = NO -CURRENT_PROJECT_VERSION = 1 -VERSION_INFO_PREFIX = -VERSIONING_SYSTEM = apple-generic -GCC_NO_COMMON_BLOCKS = YES -GCC_C_LANGUAGE_STANDARD = gnu99 -CLANG_CXX_LANGUAGE_STANDARD = gnu++0x -CLANG_CXX_LIBRARY = libc++ -CLANG_ENABLE_MODULES = YES -CLANG_ENABLE_OBJC_ARC = YES -ENABLE_STRICT_OBJC_MSGSEND = YES -CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES -CLANG_WARN_DOCUMENTATION_COMMENTS = YES -CLANG_WARN_EMPTY_BODY = YES -CLANG_WARN_BOOL_CONVERSION = YES -CLANG_WARN_CONSTANT_CONVERSION = YES -GCC_WARN_64_TO_32_BIT_CONVERSION = YES -CLANG_WARN_ENUM_CONVERSION = YES -CLANG_WARN_INT_CONVERSION = YES -CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES -CLANG_WARN_INFINITE_RECURSION = YES -GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_COMMA = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE -CLANG_WARN_UNREACHABLE_CODE = YES -GCC_WARN_UNUSED_FUNCTION = YES -GCC_WARN_UNUSED_VARIABLE = YES -CLANG_WARN_RANGE_LOOP_ANALYSIS = YES -CLANG_WARN_SUSPICIOUS_MOVE = YES -CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CLANG_WARN_OBJC_LITERAL_CONVERSION = YES -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES -GCC_WARN_UNDECLARED_SELECTOR = YES -CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -CLANG_ANALYZER_NONNULL = YES -CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE -SWIFT_SWIFT3_OBJC_INFERENCE = Off diff --git a/Frameworks/FeedFinder/xcconfig/FeedFinder_project_debug.xcconfig b/Frameworks/FeedFinder/xcconfig/FeedFinder_project_debug.xcconfig deleted file mode 100644 index 4480287e9..000000000 --- a/Frameworks/FeedFinder/xcconfig/FeedFinder_project_debug.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -#include "./FeedFinder_project.xcconfig" - -DEBUG_INFORMATION_FORMAT = dwarf -ENABLE_TESTABILITY = YES -GCC_DYNAMIC_NO_PIC = NO -GCC_OPTIMIZATION_LEVEL = 0 -GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) - -MTL_ENABLE_DEBUG_INFO = YES -SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG -SWIFT_COMPILATION_MODE = singlefile -SWIFT_OPTIMIZATION_LEVEL = -Onone -ONLY_ACTIVE_ARCH = YES - - diff --git a/Frameworks/FeedFinder/xcconfig/FeedFinder_project_release.xcconfig b/Frameworks/FeedFinder/xcconfig/FeedFinder_project_release.xcconfig deleted file mode 100644 index 4f6878e2a..000000000 --- a/Frameworks/FeedFinder/xcconfig/FeedFinder_project_release.xcconfig +++ /dev/null @@ -1,9 +0,0 @@ -#include "./FeedFinder_project.xcconfig" - -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym -ENABLE_NS_ASSERTIONS = NO - -MTL_ENABLE_DEBUG_INFO = NO -SWIFT_OPTIMIZATION_LEVEL = -O - -SWIFT_COMPILATION_MODE = wholemodule diff --git a/Frameworks/FeedFinder/xcconfig/FeedFinder_target.xcconfig b/Frameworks/FeedFinder/xcconfig/FeedFinder_target.xcconfig deleted file mode 100644 index 2cbf5f4fc..000000000 --- a/Frameworks/FeedFinder/xcconfig/FeedFinder_target.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ - -INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks -SKIP_INSTALL = YES -DYLIB_COMPATIBILITY_VERSION = 1 -DYLIB_CURRENT_VERSION = 1 -DYLIB_INSTALL_NAME_BASE = @rpath -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/Frameworks -DEFINES_MODULE = YES -FRAMEWORK_VERSION = A -INFOPLIST_FILE = FeedFinder/Info.plist -PRODUCT_BUNDLE_IDENTIFIER = com.ranchero.FeedFinder -PRODUCT_NAME = $(TARGET_NAME) - - diff --git a/Technotes/SubmoduleCheatSheet.md b/Technotes/SubmoduleCheatSheet.md index fc18d4962..45a703509 100644 --- a/Technotes/SubmoduleCheatSheet.md +++ b/Technotes/SubmoduleCheatSheet.md @@ -10,4 +10,6 @@ To add a submodule: To update a submodule — to get the latest changes: - TBD I surely wish I knew how + git submodule update + +I think. Not sure about the above.