Congratulations!

[Valid RSS] This is a valid RSS feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://mjtsai.com/blog/feed/rss2/

  1. <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
  2. xmlns:content="http://purl.org/rss/1.0/modules/content/"
  3. xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  4. xmlns:dc="http://purl.org/dc/elements/1.1/"
  5. xmlns:atom="http://www.w3.org/2005/Atom"
  6. xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  7. xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  8. >
  9.  
  10. <channel>
  11. <title>Michael Tsai</title>
  12. <atom:link href="http://mjtsai.com/blog/feed/" rel="self" type="application/rss+xml" />
  13. <link>http://mjtsai.com/blog</link>
  14. <description></description>
  15. <lastBuildDate>Tue, 18 Oct 2016 20:35:15 +0000</lastBuildDate>
  16. <language>en-US</language>
  17. <sy:updatePeriod>hourly</sy:updatePeriod>
  18. <sy:updateFrequency>1</sy:updateFrequency>
  19. <generator>https://wordpress.org/?v=4.4.1</generator>
  20. <item>
  21. <title>Still With the Mac, Unfashionably</title>
  22. <link>http://mjtsai.com/blog/2016/10/18/still-with-the-mac-unfashionably/</link>
  23. <comments>http://mjtsai.com/blog/2016/10/18/still-with-the-mac-unfashionably/#respond</comments>
  24. <pubDate>Tue, 18 Oct 2016 20:35:15 +0000</pubDate>
  25. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  26. <category><![CDATA[Technology]]></category>
  27. <category><![CDATA[Apple Software Quality]]></category>
  28. <category><![CDATA[Mac]]></category>
  29. <category><![CDATA[macOS 10.12 Sierra]]></category>
  30.  
  31. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16094</guid>
  32. <description><![CDATA[Riccardo Mori: I still love the Mac. Judging by the tech sites and blogs I usually read, I seem to be in the minority as of late. [&#8230;] Having a mandatory new version of Mac OS X every year is not necessarily the best way to show you&#8217;re still caring, Apple. This self-imposed yearly update [&#8230;]]]></description>
  33. <content:encoded><![CDATA[<p><a href="http://morrick.me/archives/7739">Riccardo Mori</a>:</p>
  34. <blockquote cite="http://morrick.me/archives/7739">
  35. <p>I still love the Mac. Judging by the tech sites and blogs I usually read, I seem to be in the minority as of late.</p>
  36. <p>[&#8230;]</p>
  37. <p>Having a mandatory new version of Mac OS X every year is not necessarily the best way to show you&rsquo;re still caring, Apple. This self-imposed yearly update cycle makes less and less sense as time goes by. Mac OS X is a mature operating system and should be treated as such. The focus should be on making Mac OS X even more robust and reliable, so that Mac users can update to the next version with the same relative peace of mind as when a new iOS version comes out.</p>
  38. </blockquote>]]></content:encoded>
  39. <wfw:commentRss>http://mjtsai.com/blog/2016/10/18/still-with-the-mac-unfashionably/feed/</wfw:commentRss>
  40. <slash:comments>0</slash:comments>
  41. </item>
  42. <item>
  43. <title>Discontinuing Support for Check the Weather</title>
  44. <link>http://mjtsai.com/blog/2016/10/18/discontinuing-support-for-check-the-weather/</link>
  45. <comments>http://mjtsai.com/blog/2016/10/18/discontinuing-support-for-check-the-weather/#comments</comments>
  46. <pubDate>Tue, 18 Oct 2016 20:27:46 +0000</pubDate>
  47. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  48. <category><![CDATA[Technology]]></category>
  49. <category><![CDATA[Business]]></category>
  50. <category><![CDATA[Check the Weather]]></category>
  51. <category><![CDATA[iOS]]></category>
  52. <category><![CDATA[iOS App]]></category>
  53. <category><![CDATA[Weather]]></category>
  54.  
  55. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16092</guid>
  56. <description><![CDATA[David Smith: The cost of providing weather data to it has grown too large to sustain. It has been operating at a slight loss for the last 2 years, which I didn&#8217;t mind providing as I used the app myself. However, a recent change in the pricing for my radar data provider has made it [&#8230;]]]></description>
  57. <content:encoded><![CDATA[<p><a href="https://david-smith.org/blog/2016/10/17/discontinuing-support-for-check-the-weather/">David Smith</a>:</p>
  58. <blockquote cite="https://david-smith.org/blog/2016/10/17/discontinuing-support-for-check-the-weather/">
  59. <p>The cost of providing weather data to it has grown too large to sustain. It has been operating at a slight loss for the last 2 years, which I didn&rsquo;t mind providing as I used the app myself. However, a recent change in the pricing for my radar data provider has made it infeasible to continue providing weather data for the app.</p>
  60. </blockquote>]]></content:encoded>
  61. <wfw:commentRss>http://mjtsai.com/blog/2016/10/18/discontinuing-support-for-check-the-weather/feed/</wfw:commentRss>
  62. <slash:comments>1</slash:comments>
  63. </item>
  64. <item>
  65. <title>Working Without a Nib</title>
  66. <link>http://mjtsai.com/blog/2016/10/18/working-without-a-nib/</link>
  67. <comments>http://mjtsai.com/blog/2016/10/18/working-without-a-nib/#respond</comments>
  68. <pubDate>Tue, 18 Oct 2016 20:26:31 +0000</pubDate>
  69. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  70. <category><![CDATA[Programming]]></category>
  71. <category><![CDATA[Auto Layout]]></category>
  72. <category><![CDATA[Automatic Reference Counting (ARC)]]></category>
  73. <category><![CDATA[Cocoa]]></category>
  74. <category><![CDATA[Core Data]]></category>
  75. <category><![CDATA[Interface Builder]]></category>
  76. <category><![CDATA[Mac]]></category>
  77. <category><![CDATA[macOS 10.12 Sierra]]></category>
  78. <category><![CDATA[Memory Management]]></category>
  79. <category><![CDATA[Objective-C]]></category>
  80.  
  81. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16090</guid>
  82. <description><![CDATA[Jeff Johnson: Four score and minus seventy-two years ago, I brought forth on this internet a new blog post, conceived in levity, and dedicated to the proposition that no nibs are created. Since then, much has changed in the Mac world. [&#8230;] The problem is that you need to call [myWindow setReleasedWhenClosed:NO]. In pre-ARC code, [&#8230;]]]></description>
  83. <content:encoded><![CDATA[<p><a href="http://lapcatsoftware.com/articles/working-without-a-nib-part-8-the-nib-awakens.html">Jeff Johnson</a>:</p>
  84. <blockquote cite="http://lapcatsoftware.com/articles/working-without-a-nib-part-8-the-nib-awakens.html">
  85. <p>Four score and minus seventy-two years ago, I brought forth on this internet <a href="http://lapcatsoftware.com/blog/2008/10/20/working-without-a-nib-part-7-the-empire-strikes-back/">a new blog post</a>, conceived in levity, and dedicated to the proposition that no nibs are created. Since then, much has changed in the Mac world.</p>
  86. <p>[&#8230;]</p>
  87. <p>The problem is that you need to call <code>[myWindow setReleasedWhenClosed:NO]</code>. In pre-ARC code, this would not be surprising to old-school Cocoa coders. However, ARC does not even allow you to use the <code>-release</code> and <code>-autorelease</code> methods, so you might think that <code>-setReleasedWhenClosed:</code> would not be allowed either, or would at least be ignored. And you would be very wrong.</p>
  88. </blockquote>
  89. <p>My goal is to make all my projects nibless. Nib and xib files have caused me no end of problems. Even files that haven&rsquo;t been edited in years spontaneously stop working when Xcode is updated and its xib compiler changes. (Most of the problems manifested on previous OS versions, where it was harder to detect them and to test fixes.) And that&rsquo;s to say nothing of the advantages that doing interfaces with code offers. I&rsquo;m convinced that with current technology (e.g. Auto Layout, Swift), using Interface Builder is a poor time investment for non-temporary projects. As Johnson <a href="https://twitter.com/lapcatsoftware/status/788084725021872128">writes</a>:</p>
  90. <blockquote cite="https://twitter.com/lapcatsoftware/status/788084725021872128"><p>Initial nib UI implementation is faster, but it&rsquo;ll haunt you forever.</p></blockquote>
  91. <p>I&rsquo;m leaning the same way about Core Data models, except that there seem to be places where the frameworks really want to have a model file saved to disk.</p>]]></content:encoded>
  92. <wfw:commentRss>http://mjtsai.com/blog/2016/10/18/working-without-a-nib/feed/</wfw:commentRss>
  93. <slash:comments>0</slash:comments>
  94. </item>
  95. <item>
  96. <title>Amazon Family Vault</title>
  97. <link>http://mjtsai.com/blog/2016/10/18/amazon-family-vault/</link>
  98. <comments>http://mjtsai.com/blog/2016/10/18/amazon-family-vault/#respond</comments>
  99. <pubDate>Tue, 18 Oct 2016 20:06:23 +0000</pubDate>
  100. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  101. <category><![CDATA[Technology]]></category>
  102. <category><![CDATA[Amazon]]></category>
  103. <category><![CDATA[Amazon Family Vault]]></category>
  104. <category><![CDATA[Cloud]]></category>
  105. <category><![CDATA[Photography]]></category>
  106. <category><![CDATA[Privacy]]></category>
  107. <category><![CDATA[Web]]></category>
  108.  
  109. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16088</guid>
  110. <description><![CDATA[Gabe Weatherhead: Amazon introduced several new photo features for Prime members. The first big one is a new family sharing option. This looks to be a really convenient way for family members to share the unlimited Amazon Drive storage and also keep shared albums. The semantic search looks great. Similar to Apple and Google, Amazon [&#8230;]]]></description>
  111. <content:encoded><![CDATA[<p><a href="http://www.macdrifter.com/2016/10/amazon-introduces-family-photos.html">Gabe Weatherhead</a>:</p>
  112. <blockquote cite="http://www.macdrifter.com/2016/10/amazon-introduces-family-photos.html">
  113. <p>Amazon introduced several new photo features for Prime members. The first big one is a new family sharing option. This looks to be a really convenient way for family members to share the unlimited Amazon Drive storage and also keep shared albums.</p>
  114. <p>The semantic search looks great. Similar to Apple and Google, Amazon is attempting to recognize the context of photos and surface the perfect result from a text search. In my very brief testing, it works as described.</p>
  115. </blockquote>]]></content:encoded>
  116. <wfw:commentRss>http://mjtsai.com/blog/2016/10/18/amazon-family-vault/feed/</wfw:commentRss>
  117. <slash:comments>0</slash:comments>
  118. </item>
  119. <item>
  120. <title>ShareLaTeX</title>
  121. <link>http://mjtsai.com/blog/2016/10/17/sharelatex/</link>
  122. <comments>http://mjtsai.com/blog/2016/10/17/sharelatex/#comments</comments>
  123. <pubDate>Mon, 17 Oct 2016 18:47:46 +0000</pubDate>
  124. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  125. <category><![CDATA[Technology]]></category>
  126. <category><![CDATA[Cloud]]></category>
  127. <category><![CDATA[Google Docs]]></category>
  128. <category><![CDATA[LaTeX]]></category>
  129. <category><![CDATA[Web]]></category>
  130.  
  131. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16081</guid>
  132. <description><![CDATA[ShareLaTeX looks like a sort of Google Docs for LaTeX (via Harlan Haskins). I would have loved to have this in college.]]></description>
  133. <content:encoded><![CDATA[<p><a href="https://www.sharelatex.com">ShareLaTeX</a> looks like a sort of Google Docs for LaTeX (via <a href="https://twitter.com/harlanhaskins/status/787002489212112896">Harlan Haskins</a>). I would have loved to have this in college.</p>]]></content:encoded>
  134. <wfw:commentRss>http://mjtsai.com/blog/2016/10/17/sharelatex/feed/</wfw:commentRss>
  135. <slash:comments>2</slash:comments>
  136. </item>
  137. <item>
  138. <title>Undocumented Xcode Sanitizer Settings</title>
  139. <link>http://mjtsai.com/blog/2016/10/17/undocumented-xcode-sanitizer-settings/</link>
  140. <comments>http://mjtsai.com/blog/2016/10/17/undocumented-xcode-sanitizer-settings/#comments</comments>
  141. <pubDate>Mon, 17 Oct 2016 18:47:03 +0000</pubDate>
  142. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  143. <category><![CDATA[Programming]]></category>
  144. <category><![CDATA[Debugging]]></category>
  145. <category><![CDATA[Documentation]]></category>
  146. <category><![CDATA[Mac]]></category>
  147. <category><![CDATA[macOS 10.12 Sierra]]></category>
  148. <category><![CDATA[Xcode]]></category>
  149.  
  150. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16079</guid>
  151. <description><![CDATA[Peter Steinberger (tweet): Here&#8217;s what I gobbled together based on Google; mostly thanks to WebKit being open source. (I only tested CLANG_ADDRESS_SANITIZER so far, but based on Google the other flags should work as well). There are also CLANG_THREAD_SANITIZER and CLANG_MEMORY_SANITIZER. The address sanitizer seems most useful, though: Since this flag is undocumented it might [&#8230;]]]></description>
  152. <content:encoded><![CDATA[<p><a href="https://openradar.appspot.com/28250805">Peter Steinberger</a> (<a href="https://twitter.com/steipete/status/775067118735880192">tweet</a>):</p>
  153. <blockquote cite="https://openradar.appspot.com/28250805"><p>Here&rsquo;s what I gobbled together based on Google; mostly thanks to WebKit being open source. (I only tested CLANG_ADDRESS_SANITIZER so far, but based on Google the other flags should work as well).</p></blockquote>
  154. <p>There are also <code>CLANG_THREAD_SANITIZER</code> and <code>CLANG_MEMORY_SANITIZER</code>. The <a href="https://pspdfkit.com/blog/2016/test-with-asan/">address sanitizer</a> seems most useful, though:</p>
  155. <blockquote cite="https://pspdfkit.com/blog/2016/test-with-asan/">
  156. <p>Since this flag is undocumented it might change without warning, and there are some hints that this might be renamed to <code>ENABLE_ADDRESS_SANITIZER</code>.</p>
  157. <p>Using this flag makes it simpler to dynamically switch this on or off without having to create a separate Xcode configuration that would be much harder to maintain, and you can configure your CI to run tests both with and without ASan to both have a great assurance of memory correctness and testing the binary that you actually ship to customers.</p></blockquote>]]></content:encoded>
  158. <wfw:commentRss>http://mjtsai.com/blog/2016/10/17/undocumented-xcode-sanitizer-settings/feed/</wfw:commentRss>
  159. <slash:comments>2</slash:comments>
  160. </item>
  161. <item>
  162. <title>ScanSnap and Sierra Update</title>
  163. <link>http://mjtsai.com/blog/2016/10/17/scansnap-and-sierra-update/</link>
  164. <comments>http://mjtsai.com/blog/2016/10/17/scansnap-and-sierra-update/#respond</comments>
  165. <pubDate>Mon, 17 Oct 2016 18:43:55 +0000</pubDate>
  166. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  167. <category><![CDATA[Technology]]></category>
  168. <category><![CDATA[Fujitsu ScanSnap]]></category>
  169. <category><![CDATA[Mac]]></category>
  170. <category><![CDATA[macOS 10.12 Sierra]]></category>
  171. <category><![CDATA[PDF]]></category>
  172. <category><![CDATA[VMware]]></category>
  173.  
  174. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16077</guid>
  175. <description><![CDATA[Katie Floyd: Good news, earlier this month Fujitsu issued a fix and an online update for the current model scanners, the iX500, iX100, SV600, S1300i, S1100i. This week, the patch came for older models including the S1500, S1500M, S1300, S1100. You can find more details on Fujitsu&#8217;s website. According to Fujitsu, update should allow you [&#8230;]]]></description>
  176. <content:encoded><![CDATA[<p><a href="http://katiefloyd.com/blog/scansnap-and-sierra-update">Katie Floyd</a>:</p>
  177. <blockquote cite="http://katiefloyd.com/blog/scansnap-and-sierra-update">
  178. <p>Good news, earlier this month Fujitsu issued a fix and an online update for the current model scanners, the iX500, iX100, SV600, S1300i, S1100i. This week, the patch came for older models including the S1500, S1500M, S1300, S1100. <a href="http://scansnapcommunity.com/features/14506-updated-notice-on-scansnap-compatibility-status-with-macos-sierra/">You can find more details on Fujitsu&rsquo;s website</a>. According to Fujitsu, update should allow you to safely use the above scanner models with macOS Sierra.</p>
  179. <p>[&#8230;]</p>
  180. <p>Unfortunately this fix does not appear to address older PDF content that was modified by macOS Sierra resulting in data loss.</p>
  181. </blockquote>
  182. <p>Also, unfortunately, as <a href="https://twitter.com/handcoding/status/788070585729294336">Ashley Bischoff</a> notes, there is no information listed for the ScanSnap S500M (which I have) or the S510M. Fujitsu&rsquo;s <a href="http://www.fujitsu.com/global/support/products/computing/peripheral/scanners/scansnap/faq/s500m-sierra.html">FAQ</a> says:</p>
  183. <blockquote cite="http://www.fujitsu.com/global/support/products/computing/peripheral/scanners/scansnap/faq/s500m-sierra.html"><p>ScanSnap S500M does not support macOS Sierra. There are no plans for adding support in the future since the support for ScanSnap S500M has already ended.</p></blockquote>
  184. <p>It looks like the scanner has been officially unsupported <a href="http://www.fujitsu.com/global/support/products/computing/peripheral/scanners/scansnap/faq/s500-mlion.html">since Mac OS X 10.8</a>, although I&rsquo;ve been successfully using version 2.2.12 of the software for years. I also successfully installed version <a href="http://www.fujitsu.com/global/support/products/computing/peripheral/scanners/scansnap/software/s1500m-setup.html">3.2.80</a> in a Mac OS X 10.11 VMware to use while waiting for Sierra compatibility. This version is listed as supporting the newer S1500M, but it seemed to work fine with my S500M.</p>
  185. <p>ScanSnap Manager 3.2.90 does not seem to be available as a standalone download, but I was able to install 2.3.80 and then install the <a href="http://www.fujitsu.com/global/support/products/computing/peripheral/scanners/scansnap/software/mac-mg32l90.html">update</a>. Even though my scanner is not officially supported, it seems to be working with Sierra (albeit more slowly).</p>
  186. <p>Previously: <a href="http://mjtsai.com/blog/2016/09/21/macos-10-12-sierra-notes/">macOS 10.12 Sierra Notes</a>, <a href="http://mjtsai.com/blog/2016/10/03/automatic-download-of-macos-sierra/">Automatic Download of macOS Sierra</a>.</p>]]></content:encoded>
  187. <wfw:commentRss>http://mjtsai.com/blog/2016/10/17/scansnap-and-sierra-update/feed/</wfw:commentRss>
  188. <slash:comments>0</slash:comments>
  189. </item>
  190. <item>
  191. <title>Swifty Delegates</title>
  192. <link>http://mjtsai.com/blog/2016/10/14/swifty-delegates/</link>
  193. <comments>http://mjtsai.com/blog/2016/10/14/swifty-delegates/#comments</comments>
  194. <pubDate>Fri, 14 Oct 2016 19:44:21 +0000</pubDate>
  195. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  196. <category><![CDATA[Programming]]></category>
  197. <category><![CDATA[Cocoa]]></category>
  198. <category><![CDATA[Craft]]></category>
  199. <category><![CDATA[iOS]]></category>
  200. <category><![CDATA[Mac]]></category>
  201. <category><![CDATA[Swift Programming Language]]></category>
  202.  
  203. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16072</guid>
  204. <description><![CDATA[Soroush Khanlou: These are horrible. Why are both of these methods called messageForm? Also, starting a method with a noun here doesn&#8217;t make sense: it usually suggests that you&#8217;ll be returning an object of that type (think about data(using:) on NSString, which returns a Data). We&#8217;re not returning any message form objects here. That &#8220;message [&#8230;]]]></description>
  205. <content:encoded><![CDATA[<p><a href="http://khanlou.com/2016/09/swifty-delegates/">Soroush Khanlou</a>:</p>
  206. <blockquote cite="http://khanlou.com/2016/09/swifty-delegates/"><p>These are horrible. Why are both of these methods called <code>messageForm</code>? Also, starting a method with a noun here doesn&rsquo;t make sense: it usually suggests that you&rsquo;ll be returning an object of that type (think about <code>data(using:)</code> on <code>NSString</code>, which returns a <code>Data</code>). We&rsquo;re not returning any message form objects here. That &ldquo;message form&rdquo; is actually the name of the first parameter. These are very confusing method names!</p><p>Both of these types of delegate methods can be fixed by moving the &ldquo;sender&rdquo; to the back of the line, and bringing the verbs forward. For the first one, the event that the sender is informing the delegate about is <code>didTapCancel</code>, instead of <code>messageFormDidTapCancel</code>.</p>
  207. <p>[&#8230;]</p>
  208. <p>I haven&rsquo;t found a hard and fast rule for which preposition to use yet. I&rsquo;ve found &ldquo;on&rdquo;, &ldquo;for&rdquo;, &ldquo;with&rdquo;, and &ldquo;in&rdquo; to all be useful in different circumstances.</p>
  209. <p>[&#8230;]</p>
  210. <p>These rules aren&rsquo;t endorsed by anyone except for me, but I think they make much more sense than the current rules by which we write delegate methods. Going forward, I&rsquo;ll probably start writing my Swift delegate methods with this structure.</p></blockquote>]]></content:encoded>
  211. <wfw:commentRss>http://mjtsai.com/blog/2016/10/14/swifty-delegates/feed/</wfw:commentRss>
  212. <slash:comments>1</slash:comments>
  213. </item>
  214. <item>
  215. <title>Well Rounded</title>
  216. <link>http://mjtsai.com/blog/2016/10/14/well-rounded/</link>
  217. <comments>http://mjtsai.com/blog/2016/10/14/well-rounded/#respond</comments>
  218. <pubDate>Fri, 14 Oct 2016 19:44:17 +0000</pubDate>
  219. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  220. <category><![CDATA[Technology]]></category>
  221. <category><![CDATA[iOS]]></category>
  222. <category><![CDATA[iOS App]]></category>
  223. <category><![CDATA[Math]]></category>
  224. <category><![CDATA[PCalc]]></category>
  225.  
  226. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16070</guid>
  227. <description><![CDATA[Dr. Drang: The problem with always rounding halves up is that in doing so, you introduce a persistent bias in whatever calculations you do with the rounded number. If you&#8217;re adding a list of rounded numbers, for example, the sum will be biased high. If you round halves to the nearest even number, though, the [&#8230;]]]></description>
  228. <content:encoded><![CDATA[<p><a href="http://leancrew.com/all-this/2016/10/well-rounded/">Dr. Drang</a>:</p>
  229. <blockquote cite="http://leancrew.com/all-this/2016/10/well-rounded/">
  230. <p>The problem with always rounding halves up is that in doing so, you introduce a persistent bias in whatever calculations you do with the rounded number. If you&rsquo;re adding a list of rounded numbers, for example, the sum will be biased high.</p>
  231. <p>If you round halves to the nearest even number, though, the bias from upward roundings tends to be negated by an equal number of downward roundings.</p>
  232. </blockquote>]]></content:encoded>
  233. <wfw:commentRss>http://mjtsai.com/blog/2016/10/14/well-rounded/feed/</wfw:commentRss>
  234. <slash:comments>0</slash:comments>
  235. </item>
  236. <item>
  237. <title>Declarative API Design in Swift</title>
  238. <link>http://mjtsai.com/blog/2016/10/14/declarative-api-design-in-swift/</link>
  239. <comments>http://mjtsai.com/blog/2016/10/14/declarative-api-design-in-swift/#respond</comments>
  240. <pubDate>Fri, 14 Oct 2016 19:44:12 +0000</pubDate>
  241. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  242. <category><![CDATA[Programming]]></category>
  243. <category><![CDATA[Cocoa]]></category>
  244. <category><![CDATA[Craft]]></category>
  245. <category><![CDATA[iOS]]></category>
  246. <category><![CDATA[Mac]]></category>
  247. <category><![CDATA[Networking]]></category>
  248. <category><![CDATA[Swift Programming Language]]></category>
  249.  
  250. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16068</guid>
  251. <description><![CDATA[Benjamin Encz: It has almost no imperative code. Most code describes network request based on instance variables and previous requests. It doesn&#8217;t call the networking layer, nor does it have any knowledge of the type that actually performs the upload. It just describes the intent of each request. In fact, the code has no observable [&#8230;]]]></description>
  252. <content:encoded><![CDATA[<p><a href="http://blog.benjamin-encz.de/post/declarative-api-design-in-swift/">Benjamin Encz</a>:</p>
  253. <blockquote cite="http://blog.benjamin-encz.de/post/declarative-api-design-in-swift/">
  254. <p>It has almost no imperative code. Most code describes network request based on instance variables and previous requests.</p>
  255. <p>It doesn&rsquo;t call the networking layer, nor does it have any knowledge of the type that actually performs the upload. It just describes the intent of each request. In fact, the code has no observable side effects at all, it only mutates internal state.</p>
  256. <p>There is almost no error handling code here. The responsibility of this type is only to handle errors specific to this request sequence (e.g. missing required data from a previous request). All other errors are generically handled in the networking layer.</p>
  257. </blockquote>
  258. <p>With the old version:</p>
  259. <blockquote cite="http://blog.benjamin-encz.de/post/declarative-api-design-in-swift/"><p>Separation of concerns was a lot harder to come by. Instead of simply describing a request sequence, the NSOperations in the NSOperationQueue themselves were responsible for kicking off a network request. This promptly introduced a bunch of other responsibilities such as request cancellation and error handling. While similar code had been implemented in other places that dealt with creating upload requests there was no good way of sharing that implementation. Subclassing wasn&rsquo;t an option since most upload requests were modeled as a single <code>NSOperation</code>, while this upload request sequence was modeled as an <code>NSOperation</code> that wrapped an <code>NSOperationQueue</code>.</p></blockquote>]]></content:encoded>
  260. <wfw:commentRss>http://mjtsai.com/blog/2016/10/14/declarative-api-design-in-swift/feed/</wfw:commentRss>
  261. <slash:comments>0</slash:comments>
  262. </item>
  263. <item>
  264. <title>OpenType Variable Fonts</title>
  265. <link>http://mjtsai.com/blog/2016/10/14/opentype-variable-fonts/</link>
  266. <comments>http://mjtsai.com/blog/2016/10/14/opentype-variable-fonts/#respond</comments>
  267. <pubDate>Fri, 14 Oct 2016 19:44:06 +0000</pubDate>
  268. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  269. <category><![CDATA[Technology]]></category>
  270. <category><![CDATA[Font]]></category>
  271. <category><![CDATA[History]]></category>
  272. <category><![CDATA[Mac]]></category>
  273. <category><![CDATA[OpenType]]></category>
  274. <category><![CDATA[QuickDraw GX]]></category>
  275. <category><![CDATA[Typography]]></category>
  276.  
  277. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16066</guid>
  278. <description><![CDATA[John Hudson (via Avi Drissman): An OpenType variable font is one in which the equivalent of multiple individual fonts can be compactly packaged within a single font file. This is done by defining variations within the font, which constitute a single- or multi-axis design space within which many font instances can be interpolated. A variable [&#8230;]]]></description>
  279. <content:encoded><![CDATA[<p><a href="https:[email protected][email protected]d2369">John Hudson</a> (via <a href="https://twitter.com/avidrissman/status/776096438161989632">Avi Drissman</a>):</p>
  280. <blockquote cite="https:[email protected][email protected]d2369">
  281. <p>An OpenType variable font is one in which the equivalent of multiple individual fonts can be compactly packaged within a single font file. This is done by defining variations within the font, which constitute a single- or multi-axis design space within which many font instances can be interpolated. A variable font is a single font file that behaves like multiple fonts.</p>
  282. <p>[&#8230;]</p>
  283. <p>OpenType Font Variations builds on the model established in Apple&rsquo;s TrueType GX variations in the mid-1990s, but has fully integrated that model into all aspects of the OpenType format, including OpenType Layout, and is available to both TrueType and Compact Font Format (CFF) flavours of OpenType.</p>
  284. <p>[&#8230;]</p>
  285. <p>However, unlike master-based interpolation technologies such as Adobe&rsquo;s earlier multiple master format, an OpenType variable font contains only a single set of glyph outlines, and the other extremes or intermediate shapes are defined as deltas from those outlines.</p></blockquote>]]></content:encoded>
  286. <wfw:commentRss>http://mjtsai.com/blog/2016/10/14/opentype-variable-fonts/feed/</wfw:commentRss>
  287. <slash:comments>0</slash:comments>
  288. </item>
  289. <item>
  290. <title>Git Tower 2.5</title>
  291. <link>http://mjtsai.com/blog/2016/10/14/git-tower-2-5/</link>
  292. <comments>http://mjtsai.com/blog/2016/10/14/git-tower-2-5/#comments</comments>
  293. <pubDate>Fri, 14 Oct 2016 19:43:58 +0000</pubDate>
  294. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  295. <category><![CDATA[Technology]]></category>
  296. <category><![CDATA[BBEdit]]></category>
  297. <category><![CDATA[Developer Tool]]></category>
  298. <category><![CDATA[Git]]></category>
  299. <category><![CDATA[Git Tower]]></category>
  300. <category><![CDATA[Mac]]></category>
  301. <category><![CDATA[Mac App]]></category>
  302. <category><![CDATA[Version Control]]></category>
  303.  
  304. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16064</guid>
  305. <description><![CDATA[fournova: Open Quickly dialog is all new: &#8220;Open Quickly&#8221; (e.g. via CMD+SHIFT+O) is now much faster, more responsive, more clever (and can be closed via ESC).[&#8230;]Custom service accounts are here: In the &#8220;Services&#8221; view, you can now add an account for your self-managed server. This makes authentication for your own servers as easy as for [&#8230;]]]></description>
  306. <content:encoded><![CDATA[<p><a href="https://www.git-tower.com/mac/release-notes">fournova</a>:</p>
  307. <blockquote cite="https://www.git-tower.com/mac/release-notes"><p>Open Quickly dialog is all new: &ldquo;Open Quickly&rdquo; (e.g. via CMD+SHIFT+O) is now much faster, more responsive, more clever (and can be closed via ESC).</p><p>[&#8230;]</p><p>Custom service accounts are here: In the &ldquo;Services&rdquo; view, you can now add an account for your self-managed server. This makes authentication for your own servers as easy as for the supported code hosting platforms like GitHub.</p><p>[&#8230;]</p><p>Fetch processes won&rsquo;t duplicate anymore: If a Fetch process for a remote repository is already running, Tower will not start another Auto-Fetch processes for the same remote.</p><p>[&#8230;]</p><p>File tree in historic commits was improved: when navigating through the file tree of an old commit, expanded folders and selections now survive switching to another app and back to Tower.</p><p>[&#8230;]</p><p>Commit messages with invalid unicode characters: Until now, invalid characters blocked Tower when trying to load the commit history (and &ldquo;No commits&rdquo; was shown). Tower is now smarter and is able to load the history regardless.</p></blockquote>
  308. <p>A lot has improved since <a href="http://mjtsai.com/blog/2014/07/22/tower-2-0/">2.0</a>, but the per-file history feature is still weak, and it still can&rsquo;t search commit contents or blame. I supplement a lot with BBEdit and the command-line tool.</p>]]></content:encoded>
  309. <wfw:commentRss>http://mjtsai.com/blog/2016/10/14/git-tower-2-5/feed/</wfw:commentRss>
  310. <slash:comments>1</slash:comments>
  311. </item>
  312. <item>
  313. <title>Drawing Hairlines</title>
  314. <link>http://mjtsai.com/blog/2016/10/13/drawing-hairlines/</link>
  315. <comments>http://mjtsai.com/blog/2016/10/13/drawing-hairlines/#respond</comments>
  316. <pubDate>Thu, 13 Oct 2016 20:57:11 +0000</pubDate>
  317. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  318. <category><![CDATA[Programming]]></category>
  319. <category><![CDATA[Graphics]]></category>
  320. <category><![CDATA[iOS]]></category>
  321. <category><![CDATA[iOS 10]]></category>
  322. <category><![CDATA[Quartz]]></category>
  323. <category><![CDATA[Retina]]></category>
  324. <category><![CDATA[Swift Programming Language]]></category>
  325.  
  326. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16058</guid>
  327. <description><![CDATA[jemmons: Or, graphically, for any Y in the shaded area, we need to either round it up to the top dashed line or round it down to the bottom dashed line to draw a perfect non-antialiased line. How do we choose if we want to draw above or below our given coordinate? It depends on [&#8230;]]]></description>
  328. <content:encoded><![CDATA[<p><a href="http://www.figure.ink/blog/2016/9/11/hairlines">jemmons</a>:</p>
  329. <blockquote cite="http://www.figure.ink/blog/2016/9/11/hairlines">
  330. <p>Or, graphically, for any Y in the shaded area, we need to either round it up to the top dashed line or round it down to the bottom dashed line to draw a perfect non-antialiased line.</p>
  331. <p>How do we choose if we want to draw above or below our given coordinate? It depends on the situation. If we&rsquo;re trying to draw a line at the very top of a clipping view, we&rsquo;ll want to draw slightly below the Y we give it. Otherwise it will clip and not be visible. The same goes in reverse for drawing at the bottom of a view.</p>
  332. <p>[&#8230;]</p>
  333. <p>Sadly, we don&rsquo;t want to draw perfect single <em>point</em> lines. We want to draw perfect single <em>pixel</em> lines. On non-retina devices, those are the same thing. But on everything else, each point is made up of several pixels. </p>
  334. <p>&ldquo;Plus&rdquo; model iPhones, for example, actually have three pixels per point, represented by the yellow lines here.</p>
  335. </blockquote>
  336. <p>Update (2016-10-13): Previously: <a href="http://mjtsai.com/blog/2014/11/25/iphone-6-pixel-peeping/">iPhone 6 Pixel Peeping</a> (via <a href="https://twitter.com/olebegemann/status/786713798140891136">Ole Begemann</a>).</p>]]></content:encoded>
  337. <wfw:commentRss>http://mjtsai.com/blog/2016/10/13/drawing-hairlines/feed/</wfw:commentRss>
  338. <slash:comments>0</slash:comments>
  339. </item>
  340. <item>
  341. <title>Twitter Changes What Counts Toward 140-Character Limit</title>
  342. <link>http://mjtsai.com/blog/2016/10/13/twitter-changes-what-counts-toward-140-character-limit/</link>
  343. <comments>http://mjtsai.com/blog/2016/10/13/twitter-changes-what-counts-toward-140-character-limit/#comments</comments>
  344. <pubDate>Thu, 13 Oct 2016 20:52:26 +0000</pubDate>
  345. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  346. <category><![CDATA[Technology]]></category>
  347. <category><![CDATA[Twitter]]></category>
  348. <category><![CDATA[Web]]></category>
  349.  
  350. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16055</guid>
  351. <description><![CDATA[John Voorhees: Twitter began to roll out features, first announced earlier this year, that exclude certain things from the 140 character count limit. Users will still be limited to 140-character messages, but, as first reported by The Verge last Friday, media attachments (including images, GIFs, videos, and polls) and quoted tweets will no longer count [&#8230;]]]></description>
  352. <content:encoded><![CDATA[<p><a href="https://www.macstories.net/news/twitter-reclaims-space-for-text-in-tweets/">John Voorhees</a>:</p>
  353. <blockquote cite="https://www.macstories.net/news/twitter-reclaims-space-for-text-in-tweets/"><p>Twitter began to roll out features, first announced earlier this year, that exclude certain things from the 140 character count limit. Users will still be limited to 140-character messages, but, as <a href="http://www.theverge.com/2016/9/12/12891562/twitter-tweets-140-characters-expand-photos">first reported by The Verge last Friday</a>, media attachments (including images, GIFs, videos, and polls) and quoted tweets will no longer count against the 140-character limit, making more room for text.</p></blockquote>
  354. <p><a href="http://www.macrumors.com/2016/09/12/twitter-expanding-character-limit-september-19/">Juli Clover</a>:</p>
  355. <blockquote cite="http://www.macrumors.com/2016/09/12/twitter-expanding-character-limit-september-19/"><p>All @names, such as @MacRumors, will no longer count towards the 140-character count, nor will media attachments, retweets, or quoted tweets, but links will still eat up 23 characters.</p></blockquote>]]></content:encoded>
  356. <wfw:commentRss>http://mjtsai.com/blog/2016/10/13/twitter-changes-what-counts-toward-140-character-limit/feed/</wfw:commentRss>
  357. <slash:comments>1</slash:comments>
  358. </item>
  359. <item>
  360. <title>Why Does Siri Seem So Dumb?</title>
  361. <link>http://mjtsai.com/blog/2016/10/13/why-does-siri-seem-so-dumb/</link>
  362. <comments>http://mjtsai.com/blog/2016/10/13/why-does-siri-seem-so-dumb/#comments</comments>
  363. <pubDate>Thu, 13 Oct 2016 20:48:42 +0000</pubDate>
  364. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  365. <category><![CDATA[Technology]]></category>
  366. <category><![CDATA[Dictation]]></category>
  367. <category><![CDATA[Google Now]]></category>
  368. <category><![CDATA[iOS]]></category>
  369. <category><![CDATA[iOS 10]]></category>
  370. <category><![CDATA[Mac]]></category>
  371. <category><![CDATA[macOS 10.12 Sierra]]></category>
  372. <category><![CDATA[Reminders]]></category>
  373. <category><![CDATA[Siri]]></category>
  374.  
  375. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16052</guid>
  376. <description><![CDATA[Walt Mossberg (MacRumors): Google Now, on the same Apple devices, using the same voice input, answered every one of these questions clearly and correctly. And that isn&#8217;t even Google&#8217;s latest digital helper, the new Google Assistant. If you try most of these broken examples right now, they&#8217;ll work properly, because Apple fixed them after I [&#8230;]]]></description>
  377. <content:encoded><![CDATA[<p><a href="http://www.recode.net/2016/10/12/13251618/mossberg-apple-siri-digital-assistant-dumb">Walt Mossberg</a> (<a href="http://www.macrumors.com/2016/10/12/siri-walt-mossberg-limited-and-unreliable/">MacRumors</a>):</p>
  378. <blockquote cite="http://www.recode.net/2016/10/12/13251618/mossberg-apple-siri-digital-assistant-dumb">
  379. <p>Google Now, on the same Apple devices, using the same voice input, answered every one of these questions clearly and correctly. And that isn&rsquo;t even Google&rsquo;s latest digital helper, the new Google Assistant.</p>
  380. <p>If you try most of these broken examples right now, they&rsquo;ll work properly, because Apple fixed them after I tweeted screenshots of most of them in exasperation, and asked the company about them.</p>
  381. <p>[&#8230;]</p>
  382. <p>For instance, when I asked Siri on my Mac how long it would take me to get to work, it said it didn&rsquo;t have my work address &mdash; even though the &ldquo;me&rdquo; contact card contains a work address and the same synced contact card on my iPhone allowed Siri to give me an answer.</p>
  383. <p>Similarly, on my iPad, when I asked what my next appointment was, it said &ldquo;Sorry, Walt, something&rsquo;s wrong&rdquo; &mdash; repeatedly, with slightly different wording, in multiple places on multiple days. But, using the same Apple calendar and data, Siri answered correctly on the iPhone.</p>
  384. </blockquote>
  385.  
  386. <p><a href="https://myfreakinname.blogspot.com/2016/10/siri-qa-is-broken.html">Ruffin Bailey</a>:</p>
  387. <blockquote cite="https://myfreakinname.blogspot.com/2016/10/siri-qa-is-broken.html"><p>Spend ten million (he said figuratively) and get the best QA staff in the business, and make sure there's no silo making QAing app interactions an issue. If Maps borks like this, the QA team &ldquo;for Maps&rdquo; has to be able to hold Siri and Contacts (or whatever else) accountable. No software ships until this blocking bug is fixed.</p></blockquote>
  388.  
  389. <p><a href="http://daringfireball.net/2016/10/mossberg_siri">John Gruber</a>:</p>
  390. <blockquote cite="http://daringfireball.net/2016/10/mossberg_siri"><p>Indeed, Siri now knows the date and time of the next U.S. presidential debate, but where Siri fundamentally falls apart is its inability to maintain context and chain together multiple commands.</p>
  391. <p>[&#8230;]</p>
  392. <p>These sort of glaring inconsistencies are almost as bad as universal failures. The big problem Apple faces with Siri is that when people encounter these problems, <em>they stop trying</em>. It feels like you&rsquo;re wasting your time, and makes you feel silly or even foolish for having tried. I worry that even if Apple improves Siri significantly, people will never know it because they won&rsquo;t bother trying because they were burned so many times before. In addition to the engineering hurdles to actually make Siri much better, Apple also has to overcome a &ldquo;boy who cried wolf&rdquo; credibility problem.</p></blockquote>
  393.  
  394. <p><a href="http://pxlnv.com/linklog/mossberg-on-siri/">Nick Heer</a>:</p>
  395. <blockquote cite="http://pxlnv.com/linklog/mossberg-on-siri/"><p>I think the inconsistencies are <em>worse</em> than outright failure. The inability to answer a query implies a limitation which, while not ideal, is understandable. Inconsistency, on the other hand, makes Siri feel untrustworthy. If I can&rsquo;t reliably expect the same result with basic queries that are almost identical, I&rsquo;m much less likely to find it dependable.</p></blockquote>
  396.  
  397. <p><a href="http://www.mcelhearn.com/stupid-siri/">Kirk McElhearn</a>:</p>
  398. <blockquote cite="http://www.mcelhearn.com/stupid-siri/"><p>I pointed out similar problems in a <a href="http://www.macworld.com/article/3106088/ios/sirious-mistakes.html">Macworld article in August</a>. For me, Siri is a waste of time. </p></blockquote>
  399.  
  400. <p>The only thing Siri consistently does correctly for me is set timers. I keep trying to use it to add reminders and am usually frustrated. Either the phone can&rsquo;t connect to Siri, or it mis-parses what I said. It&rsquo;s easier to use my finger to create a new action in OmniFocus and then to use the dictation button on the keyboard. iOS is pretty good at transcribing what I say. The problem is that interpreting it is unreliable. And that&rsquo;s why I rarely even try to ask it more complicated questions.</p>
  401. <p>See also: Daniel Jalkut on <a href="https://twitter.com/danielpunkass/status/772448439997124608">Siri logging</a>, David Spark&rsquo;s <a href="http://macsparky.com/blog/2016/10/dragon-for-mac-version-6">Dragon Professional review</a>.</p>
  402.  
  403. <p>Update (2016-10-14): <a href="https://512pixels.net/2016/10/the-inward-looking-siri/">Stephen Hackett</a>:</p>
  404. <blockquote cite="https://512pixels.net/2016/10/the-inward-looking-siri/"><p>Siri should feel like a living, growing platform and it just doesn&rsquo;t. Even SiriKit, which allows developers to build plugins for the service, doesn&rsquo;t get Apple far enough down the road. This is a platform vendor problem, and not one a handful of apps can solve.</p></blockquote>
  405.  
  406. <p>Update (2016-10-17): <a href="http://macsparky.com/blog/2016/10/the-siri-complaint-department">David Sparks</a>:</p>
  407. <blockquote cite="http://macsparky.com/blog/2016/10/the-siri-complaint-department"><p>Why does it take an article by a popular journalist to get these things fixed? I feel as if Siri needs more attention. I don&rsquo;t think the underlying technology is as bad as most people think but it is these little failures that causes everyone to lose faith.</p></blockquote>]]></content:encoded>
  408. <wfw:commentRss>http://mjtsai.com/blog/2016/10/13/why-does-siri-seem-so-dumb/feed/</wfw:commentRss>
  409. <slash:comments>4</slash:comments>
  410. </item>
  411. <item>
  412. <title>favicon.ico Is a Privacy Leak</title>
  413. <link>http://mjtsai.com/blog/2016/10/13/favicon-ico-is-a-privacy-leak/</link>
  414. <comments>http://mjtsai.com/blog/2016/10/13/favicon-ico-is-a-privacy-leak/#respond</comments>
  415. <pubDate>Thu, 13 Oct 2016 20:48:38 +0000</pubDate>
  416. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  417. <category><![CDATA[Technology]]></category>
  418. <category><![CDATA[Privacy]]></category>
  419. <category><![CDATA[Web]]></category>
  420.  
  421. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16050</guid>
  422. <description><![CDATA[Robin Linus (via Jeff Atwood): For most web platforms there&#8217;s a way to abuse the login mechanism to detect whether a user is logged in to that service. [&#8230;] Well, the [Same Origin Policy] is strict for HTML pages, but it allows to receive images from other origins! So if the resource in the next [&#8230;]]]></description>
  423. <content:encoded><![CDATA[<p><a href="https://robinlinus.github.io/socialmedia-leak/">Robin Linus</a> (via <a href="https://twitter.com/codinghorror/status/786259854235009024">Jeff Atwood</a>):</p>
  424. <blockquote cite="https://robinlinus.github.io/socialmedia-leak/"><p>For most web platforms there&rsquo;s a way to abuse the login mechanism to detect whether a user is logged in to that service.</p>
  425. <p>[&#8230;]</p>
  426. <p>Well, the [Same Origin Policy] is strict for HTML pages, but it allows to receive images from other origins! So if the resource in the <code>next</code> parameter would be an image we could read it from our website. It can&rsquo;t be any image though. Facebook checks if the URL in the <code>next</code> parameter starts with <code>https://facebook.com</code>. So we need to find an image on facebook.com. Should be easy, right? Actually it isn&rsquo;t, because facebook hosts almost all images on their CDN servers under the domain <code>fbcdn.net</code>. Though there is one image that you can find on almost every webserver: the good old <code>favicon.ico</code>!</p></blockquote>]]></content:encoded>
  427. <wfw:commentRss>http://mjtsai.com/blog/2016/10/13/favicon-ico-is-a-privacy-leak/feed/</wfw:commentRss>
  428. <slash:comments>0</slash:comments>
  429. </item>
  430. <item>
  431. <title>Swift Type-Erased Protocol Property</title>
  432. <link>http://mjtsai.com/blog/2016/10/12/swift-type-erased-protocol-property/</link>
  433. <comments>http://mjtsai.com/blog/2016/10/12/swift-type-erased-protocol-property/#respond</comments>
  434. <pubDate>Wed, 12 Oct 2016 20:03:09 +0000</pubDate>
  435. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  436. <category><![CDATA[Programming]]></category>
  437. <category><![CDATA[Swift Programming Language]]></category>
  438.  
  439. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16040</guid>
  440. <description><![CDATA[Russ Bishop: Because _AnyFancyBoxBase adopts FancyProtocol it automatically gains an abstract type member the same way it gains a property or function. It can&#8217;t stay abstract though, we need to bind it to something, either a specific type or a generic type parameter. [&#8230;] Now we can define a subclass of the base box; it [&#8230;]]]></description>
  441. <content:encoded><![CDATA[<p><a href="http://www.russbishop.net/inception">Russ Bishop</a>:</p>
  442. <blockquote cite="http://www.russbishop.net/inception">
  443. <p>Because <code>_AnyFancyBoxBase</code> adopts <code>FancyProtocol</code> it automatically gains an abstract type member the same way it gains a property or function. It can&rsquo;t stay abstract though, we need to bind it to <em>something</em>, either a specific type or a generic type parameter.</p>
  444. <p>[&#8230;]</p>
  445. <p>Now we can define a subclass of the base box; it inherits the protocol conformance and we provide trampoline functions that forward everything to the instance in <code>var base: Base</code>.</p>
  446. <p>[&#8230;]</p>
  447. <p>This type&rsquo;s raison d&rsquo;&ecirc;tre is in the very first line where we link <code>Base.Thing</code> (the associated type we got from the protocol) to <code>AnyFancyBoxBase.T</code> (the generic parameter on our base class).</p>
  448. <p>[&#8230;]</p>
  449. <p>Now we can create our type erasing wrapper. The type it is erasing is the concrete type that adopted <code>FancyProtocol</code> in the first place.</p>
  450. <p>[&#8230;]</p>
  451. <p>If we tried to pull this trick with one less type we would end up adding a generic parameter somewhere.</p>
  452. </blockquote>]]></content:encoded>
  453. <wfw:commentRss>http://mjtsai.com/blog/2016/10/12/swift-type-erased-protocol-property/feed/</wfw:commentRss>
  454. <slash:comments>0</slash:comments>
  455. </item>
  456. <item>
  457. <title>ripgrep</title>
  458. <link>http://mjtsai.com/blog/2016/10/12/ripgrep/</link>
  459. <comments>http://mjtsai.com/blog/2016/10/12/ripgrep/#respond</comments>
  460. <pubDate>Wed, 12 Oct 2016 19:46:13 +0000</pubDate>
  461. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  462. <category><![CDATA[Programming]]></category>
  463. <category><![CDATA[Open Source]]></category>
  464. <category><![CDATA[Optimization]]></category>
  465. <category><![CDATA[Regular Expression]]></category>
  466. <category><![CDATA[Rust Programming Language]]></category>
  467. <category><![CDATA[Unicode]]></category>
  468. <category><![CDATA[Unix]]></category>
  469.  
  470. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16038</guid>
  471. <description><![CDATA[Andrew Gallant (via Hacker News): In this article I will introduce a new command line search tool, ripgrep, that combines the usability of The Silver Searcher (an ack clone) with the raw performance of GNU grep. ripgrep is fast, cross platform (with binaries available for Linux, Mac and Windows) and written in Rust. [&#8230;] For [&#8230;]]]></description>
  472. <content:encoded><![CDATA[<p><a href="http://blog.burntsushi.net/ripgrep/">Andrew Gallant</a> (via <a href="https://news.ycombinator.com/item?id=12564442">Hacker News</a>):</p>
  473. <blockquote cite="http://blog.burntsushi.net/ripgrep/">
  474. <p>In this article I will introduce a new command line search tool,
  475. <a href="https://github.com/BurntSushi/ripgrep"><code>ripgrep</code></a>,
  476. that combines the usability of
  477. <a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher</a>
  478. (an <a href="http://beyondgrep.com/"><code>ack</code></a> clone) with the
  479. raw performance of GNU grep. <code>ripgrep</code> is fast, cross platform (with binaries
  480. available for Linux, Mac and Windows) and written in
  481. <a href="https://www.rust-lang.org">Rust</a>.</p>
  482. <p>[&#8230;]</p>
  483. <p>For both searching single files <em>and</em> huge directories of files, no other
  484. tool obviously stands above <code>ripgrep</code> in either performance or correctness.</p>
  485. <p><code>ripgrep</code> is the only tool with proper Unicode support that doesn&rsquo;t make
  486. you pay dearly for it.</p>
  487. <p>Tools that search many files at once are generally <em>slower</em> if they use
  488. memory maps, not faster.</p>
  489. <p>[&#8230;]</p>
  490. <p><code>ripgrep</code> uses a regex engine based on finite automata, so if you want fancy
  491. regex features such as backreferences or look around, <code>ripgrep</code> won&rsquo;t give
  492. them to you.</p>
  493. </blockquote>
  494.  
  495. <p>See also: <a href="http://ridiculousfish.com/blog/posts/old-age-and-treachery.html">The Treacherous Optimization</a>.</p>]]></content:encoded>
  496. <wfw:commentRss>http://mjtsai.com/blog/2016/10/12/ripgrep/feed/</wfw:commentRss>
  497. <slash:comments>0</slash:comments>
  498. </item>
  499. <item>
  500. <title>BinUtils for Swift</title>
  501. <link>http://mjtsai.com/blog/2016/10/12/binutils-for-swift/</link>
  502. <comments>http://mjtsai.com/blog/2016/10/12/binutils-for-swift/#respond</comments>
  503. <pubDate>Wed, 12 Oct 2016 19:37:07 +0000</pubDate>
  504. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  505. <category><![CDATA[Programming]]></category>
  506. <category><![CDATA[Open Source]]></category>
  507. <category><![CDATA[Python]]></category>
  508. <category><![CDATA[Swift Programming Language]]></category>
  509.  
  510. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16035</guid>
  511. <description><![CDATA[Nicolas Seriot reimplemented parts of the handy Python binascii and struct modules in Swift: let d = pack("&#60;h2I3sf", [1, 2, 3, "asd", 0.5]) assert(d == unhexlify("0100 02000000 03000000 617364 0000003f"))]]></description>
  512. <content:encoded><![CDATA[<p><a href="https://github.com/nst/BinUtils">Nicolas Seriot</a> reimplemented parts of the handy Python <a href="https://docs.python.org/2/library/binascii.html">binascii</a> and <a href="https://docs.python.org/2/library/struct.html">struct</a> modules in Swift:</p>
  513. <blockquote cite="https://github.com/nst/BinUtils"><pre>let d = pack("&lt;h2I3sf", [1, 2, 3, "asd", 0.5])
  514. assert(d == unhexlify("0100 02000000 03000000 617364 0000003f"))</pre></blockquote>]]></content:encoded>
  515. <wfw:commentRss>http://mjtsai.com/blog/2016/10/12/binutils-for-swift/feed/</wfw:commentRss>
  516. <slash:comments>0</slash:comments>
  517. </item>
  518. <item>
  519. <title>Yahoo&#8217;s FISA E-mail Scan</title>
  520. <link>http://mjtsai.com/blog/2016/10/12/yahoos-fisa-e-mail-scan/</link>
  521. <comments>http://mjtsai.com/blog/2016/10/12/yahoos-fisa-e-mail-scan/#respond</comments>
  522. <pubDate>Wed, 12 Oct 2016 19:37:03 +0000</pubDate>
  523. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  524. <category><![CDATA[Technology]]></category>
  525. <category><![CDATA[E-mail]]></category>
  526. <category><![CDATA[Privacy]]></category>
  527. <category><![CDATA[Yahoo]]></category>
  528.  
  529. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16033</guid>
  530. <description><![CDATA[Charlie Savage and Nicole Perlroth (via MacRumors): A system intended to scan emails for child pornography and spam helped Yahoo satisfy a secret court order requiring it to search for messages containing a computer &#8220;signature&#8221; tied to the communications of a state-sponsored terrorist organization, several people familiar with the matter said on Wednesday. Two government [&#8230;]]]></description>
  531. <content:encoded><![CDATA[<p><a href="http://www.nytimes.com/2016/10/06/technology/yahoo-email-tech-companies-government-investigations.html">Charlie Savage and Nicole Perlroth</a> (via <a href="http://www.macrumors.com/2016/10/06/yahoo-spam-filter-court-order/">MacRumors</a>):</p>
  532. <blockquote cite="http://www.nytimes.com/2016/10/06/technology/yahoo-email-tech-companies-government-investigations.html"><p>A system intended to scan emails for child pornography and spam helped Yahoo satisfy a secret court order requiring it to search for messages containing a computer &ldquo;signature&rdquo; tied to the communications of a state-sponsored terrorist organization, several people familiar with the matter said on Wednesday.</p>
  533. <p>Two government officials who spoke on the condition of anonymity said the Justice Department obtained an individualized order from a judge of the Foreign Intelligence Surveillance Court last year. Yahoo was barred from disclosing the matter.</p>
  534. <p>To comply, Yahoo customized an existing scanning system for all incoming email traffic, which also looks for malware, according to one of the officials and to a third person familiar with Yahoo&rsquo;s response, who also spoke on the condition of anonymity.</p></blockquote>
  535.  
  536. <p><a href="http://arstechnica.com/tech-policy/2016/10/welcome-to-the-machine-yahoo-mail-scanning-exposes-another-us-spy-tool/">David Kravets</a>:</p>
  537. <blockquote cite="http://arstechnica.com/tech-policy/2016/10/welcome-to-the-machine-yahoo-mail-scanning-exposes-another-us-spy-tool/"><p>At its most basic level, this newly surfaced tool exposes another US digital surveillance program. It differs from so-called <a href="http://arstechnica.com/tech-policy/2015/06/new-snowden-documents-reveal-secret-memos-expanding-spying/">&ldquo;upstream&rdquo; spying</a> in which the authorities tap directly into the Internet backbone and scan for certain search terms&mdash;a spying program with diminishing returns as more and more data on the Internet has become encrypted. This Yahoo situation is also different from the <a href="http://arstechnica.com/tech-policy/2013/06/details-emerge-about-prism-big-tech-companies-release-data-request-reports/">Prism program</a>, where the authorities acquire customer data from tech companies matching chosen search selectors.</p></blockquote>
  538.  
  539. <p><a href="http://macsparky.com/blog/2016/10/yahoogov">David Sparks</a>:</p>
  540. <blockquote cite="http://macsparky.com/blog/2016/10/yahoogov"><p>Yahoo has responded that <a href="http://mobile.reuters.com/article/idUSKCN1241YT">Reuter&rsquo;s original reporting</a> of this was &ldquo;misleading&rdquo;, But again how would we really know? All of this is done under the veil of secrecy.</p></blockquote>
  541.  
  542. <p><a href="http://www.reuters.com/article/us-yahoo-nsa-order-idUSKCN12800D">Joseph Menn</a>:</p>
  543. <blockquote cite="http://www.reuters.com/article/us-yahoo-nsa-order-idUSKCN12800D"><p>The court-ordered search Yahoo conducted, on the other hand, was done by a module attached to the Linux kernel - in other words, it was deeply buried near the core of the email server operating system, far below where mail sorting was handled, according to three former Yahoo employees.</p>
  544. <p>They said that made it hard to detect and also made it hard to figure out what the program was doing.</p></blockquote>
  545.  
  546. <p><a href="http://motherboard.vice.com/read/yahoo-government-email-scanner-was-actually-a-secret-hacking-tool">Lorenzo Franceschi-Bicchierai</a> (via <a href="https://it.slashdot.org/story/16/10/07/1810228/yahoos-government-email-scanner-was-not-a-modified-spam-filter-but-a-secret-hacking-tool-motherboard">Slashdot</a>):</p>
  547. <blockquote cite="http://motherboard.vice.com/read/yahoo-government-email-scanner-was-actually-a-secret-hacking-tool"><p>The spy tool that the US government ordered Yahoo to install on its systems last year at the behest of the NSA or the FBI was a &ldquo;poorly designed&rdquo; and &ldquo;buggy&rdquo; piece of malware, according to two sources closely familiar with the matter.</p>
  548. <p>[&#8230;]</p>
  549. <p>Anonymous sources told <em>The Times</em> that the tool was nothing more than a modified version of Yahoo&rsquo;s existing scanning system, which searches all email for malware, spam and images of child pornography.</p>
  550. <p>But two sources familiar with the matter told Motherboard that this description is wrong, and that the tool was actually more like a &ldquo;rootkit,&rdquo; a powerful type of malware that lives deep inside an infected system and gives hackers essentially unfettered access.</p>
  551. </blockquote>
  552.  
  553. <p><a href="https://www.schneier.com/blog/archives/2016/10/yahoo_scanned_e.html">Bruce Schneier</a>:</p>
  554. <blockquote cite="https://www.schneier.com/blog/archives/2016/10/yahoo_scanned_e.html"><p>Other companies have been <a href="https://techcrunch.com/2016/10/04/twitter-microsoft-and-google-say-they-havent-scanned-messages-like-yahoo/">quick to deny</a> that they did the same thing, but I generally don&rsquo;t believe those carefully worded statements about what they have and haven&rsquo;t done.</p></blockquote>
  555.  
  556. <p>Previously: <a href="http://mjtsai.com/blog/2016/09/28/yahoo-says-hackers-stole-data-on-500-million-users-in-2014/">Yahoo Says Hackers Stole Data on 500 Million Users in 2014</a>.</p>]]></content:encoded>
  557. <wfw:commentRss>http://mjtsai.com/blog/2016/10/12/yahoos-fisa-e-mail-scan/feed/</wfw:commentRss>
  558. <slash:comments>0</slash:comments>
  559. </item>
  560. <item>
  561. <title>What&#8217;s New in Safari 10</title>
  562. <link>http://mjtsai.com/blog/2016/10/12/whats-new-in-safari-10/</link>
  563. <comments>http://mjtsai.com/blog/2016/10/12/whats-new-in-safari-10/#comments</comments>
  564. <pubDate>Wed, 12 Oct 2016 19:36:54 +0000</pubDate>
  565. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  566. <category><![CDATA[Technology]]></category>
  567. <category><![CDATA[Apple Pay]]></category>
  568. <category><![CDATA[Esoteric Preferences]]></category>
  569. <category><![CDATA[GIF]]></category>
  570. <category><![CDATA[Keyboard Shortcuts]]></category>
  571. <category><![CDATA[Mac]]></category>
  572. <category><![CDATA[macOS 10.12 Sierra]]></category>
  573. <category><![CDATA[Safari]]></category>
  574. <category><![CDATA[Video]]></category>
  575. <category><![CDATA[Web]]></category>
  576. <category><![CDATA[YouTube]]></category>
  577.  
  578. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16031</guid>
  579. <description><![CDATA[Apple (Hacker News): Safari&#8217;s IndexedDB implementation now fully supports the recommended standard. You may now use the API to store structured data for web applications that work offline or that require large amounts of client-side data caching. Use JavaScript commands to programmatically cut and copy text to the clipboard with document.execCommand('cut') and document.execCommand('copy'). [&#8230;] Safari [&#8230;]]]></description>
  580. <content:encoded><![CDATA[<p><a href="https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html">Apple</a> (<a href="https://news.ycombinator.com/item?id=12542029">Hacker News</a>):</p>
  581. <blockquote cite="https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Articles/Safari_10_0.html"><p>Safari&rsquo;s IndexedDB implementation now fully supports the <span class="content_text"><a href="http://www.w3.org/TR/IndexedDB/" class="urlLink" rel="external" onclick="s_objectID=&quot;http://www.w3.org/TR/IndexedDB/_1&quot;;return this.s_oc?this.s_oc(e):true">recommended standard</a></span>. You may now use the API to store structured data for web applications that work offline or that require large amounts of client-side data caching.</p>
  582. <p>Use JavaScript commands to programmatically cut and copy text to the clipboard with <code>document.execCommand('cut')</code> and <code>document.execCommand('copy')</code>.</p>
  583. <p>[&#8230;]</p>
  584. <p>Safari 10 brings Picture in Picture to macOS so users can watch video in a separate, resizable window that stays on top of other application windows and remains on-screen when switching desktop spaces.</p>
  585. <p>[&#8230;]</p>
  586. <p>You can give customers an easy, secure, and private way to pay for physical goods and services&mdash;such as groceries, clothing, tickets, reservations, and more. Users can check out with a single touch using Apple Pay with Touch ID on their iPhone, or by double-clicking the side button on Apple Watch.</p>
  587. <p>[&#8230;]</p>
  588. <p>You can now create macOS-native Safari app extensions to sell and distribute in the App Store.</p></blockquote>
  589.  
  590. <p><a href="https://twitter.com/rmondello/status/778288817178419202">Ricky Mondello</a>:</p>
  591. <blockquote cite="https://twitter.com/rmondello/status/778288817178419202"><p>And one of my favorite things about Safari 10: &#8984;Z will reopen more than one closed tab, and &#8679;&#8984;T will restore closed tabs and windows.</p></blockquote>
  592.  
  593. <p><a href="https://twitter.com/simX/status/778296284411072513">Simone Manganelli</a>:</p>
  594. <blockquote cite="https://twitter.com/simX/status/778296284411072513"><p>Safari 10. :epic eyeroll: &ldquo;On iOS, videos without audio tracks or with disabled audio tracks can play automatically when the webpage loads.&rdquo;</p></blockquote>
  595.  
  596. <p><a href="https://twitter.com/rosyna/status/778341329763913728">Rosyna Keller</a>:</p>
  597. <blockquote cite="https://twitter.com/rosyna/status/778341329763913728"><p>Correct, it&rsquo;s so H.264 can replace animated GIFs. It&rsquo;s all detailed in a <a href="https://webkit.org/blog/6784/new-video-policies-for-ios/">WebKit blog post</a>.</p></blockquote>
  598.  
  599. <p><a href="https://twitter.com/lapcatsoftware/status/778403598493442048">Jeff Johnson</a>:</p>
  600. <blockquote cite="https://twitter.com/lapcatsoftware/status/778403598493442048"><p>WebKitMinimumFontSize doesn&rsquo;t seem to work anymore.</p></blockquote>
  601.  
  602. <p>Update (2016-10-12): <a href="https://twitter.com/jnouwen/status/786306286266703872">Jeff Nouwen</a>:</p>
  603. <blockquote cite="https://twitter.com/jnouwen/status/786306286266703872"><p>I like the &ldquo;close tab and go back to the parent tab on Back&rdquo; feature, implemented with &ldquo;parent-tab://&rdquo;.</p></blockquote>
  604.  
  605. <p><a href="https://9to5mac.com/2016/06/17/how-to-enable-picture-in-picture-for-youtube-videos-in-macos-sierra/">Jeff Benjamin</a>:</p>
  606. <blockquote cite="https://9to5mac.com/2016/06/17/how-to-enable-picture-in-picture-for-youtube-videos-in-macos-sierra/"><p>Although YouTube&rsquo;s player doesn&rsquo;t make it readily apparent that its videos work with Picture-in-Picture, it&rsquo;s quite easy to enable the handy feature for all of your favorite YouTube videos on Safari.</p>
  607. <p>[&#8230;]</p>
  608. <p>Step 1: Right click on the YouTube video that you wish to detach</p>
  609. <p>Step 2: Once the menu appears, right-click once more to reveal a second menu and then click Enter Picture-in-Picture</p></blockquote>]]></content:encoded>
  610. <wfw:commentRss>http://mjtsai.com/blog/2016/10/12/whats-new-in-safari-10/feed/</wfw:commentRss>
  611. <slash:comments>5</slash:comments>
  612. </item>
  613. <item>
  614. <title>Optional Non-Escaping Swift Closures</title>
  615. <link>http://mjtsai.com/blog/2016/10/11/optional-non-escaping-swift-closures/</link>
  616. <comments>http://mjtsai.com/blog/2016/10/11/optional-non-escaping-swift-closures/#comments</comments>
  617. <pubDate>Tue, 11 Oct 2016 14:10:26 +0000</pubDate>
  618. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  619. <category><![CDATA[Programming]]></category>
  620. <category><![CDATA[Language Design]]></category>
  621. <category><![CDATA[Memory Management]]></category>
  622. <category><![CDATA[Swift Programming Language]]></category>
  623.  
  624. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16025</guid>
  625. <description><![CDATA[Ole Begemann: However, it&#8217;s impossible to create a reference cycle with a non-escaping closure &#8212; the compiler can guarantee that the closure will have released all objects it captured by the time the function returns. For this reason, the compiler only requires explicit references to self for escaping closures. This makes non-escaping closures significantly more [&#8230;]]]></description>
  626. <content:encoded><![CDATA[<p><a href="https://oleb.net/blog/2016/10/optional-non-escaping-closures/">Ole Begemann</a>:</p>
  627. <blockquote cite="https://oleb.net/blog/2016/10/optional-non-escaping-closures/">
  628. <p>However, it&rsquo;s impossible to create a reference cycle with a non-escaping closure &mdash; the compiler can guarantee that the closure will have released all objects it captured by the time the function returns. For this reason, the compiler only requires explicit references to <code>self</code> for <em>escaping</em> closures. This makes non-escaping closures significantly more pleasant to use.</p>
  629. <p>[&#8230;]</p>
  630. <p>Beginning in Swift 3, non-escaping closures <a title="Swift Evolution Proposal SE-0103: Make non-escaping closures the default" href="https://github.com/apple/swift-evolution/blob/master/proposals/0103-make-noescape-default.md">are now the default</a>. If you want to allow a closure parameter to escape, you need to add the <code>@escaping</code> annotation to the type.</p>
  631. <p>[&#8230;]</p>
  632. <p>There&rsquo;s a catch to the non-escaping-by-default rule: it only applies to closures in <em>immediate function parameter position</em>, i.e. any function argument that has a function type. All other closures are escaping.</p>
  633. <p>[&#8230;]</p>
  634. <p>There&rsquo;s currently no way to force an optional closure to be non-escaping, but in many situations, you can probably avoid making the argument optional by providing a default value for the closure.</p>
  635. </blockquote>
  636. <p>Or you can <a href="https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160912/003300.html">use overloading</a>.</p>]]></content:encoded>
  637. <wfw:commentRss>http://mjtsai.com/blog/2016/10/11/optional-non-escaping-swift-closures/feed/</wfw:commentRss>
  638. <slash:comments>6</slash:comments>
  639. </item>
  640. <item>
  641. <title>We Need to Save the Internet From the Internet of Things</title>
  642. <link>http://mjtsai.com/blog/2016/10/11/we-need-to-save-the-internet-from-the-internet-of-things/</link>
  643. <comments>http://mjtsai.com/blog/2016/10/11/we-need-to-save-the-internet-from-the-internet-of-things/#respond</comments>
  644. <pubDate>Tue, 11 Oct 2016 14:03:47 +0000</pubDate>
  645. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  646. <category><![CDATA[Technology]]></category>
  647. <category><![CDATA[Networking]]></category>
  648. <category><![CDATA[Security]]></category>
  649.  
  650. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16022</guid>
  651. <description><![CDATA[Bruce Schneier: What was new about the Krebs attack was both the massive scale and the particular devices the attackers recruited. Instead of using traditional computers for their botnet, they used CCTV cameras, digital video recorders, home routers, and other embedded computers attached to the internet as part of the Internet of Things. Much has [&#8230;]]]></description>
  652. <content:encoded><![CDATA[<p><a href="http://motherboard.vice.com/read/we-need-to-save-the-internet-from-the-internet-of-things">Bruce Schneier</a>:</p>
  653. <blockquote cite="http://motherboard.vice.com/read/we-need-to-save-the-internet-from-the-internet-of-things"><p>What was new about the Krebs attack was both the <a href="https://motherboard.vice.com/read/15-million-connected-cameras-ddos-botnet-brian-krebs">massive scale</a> and the particular devices the attackers recruited. Instead of using traditional computers for their botnet, they <a href="https://blog.sucuri.net/2016/09/iot-home-router-botnet-leveraged-in-large-ddos-attack.html">used</a> CCTV cameras, digital video recorders, home routers, and other embedded computers attached to the internet as part of the Internet of Things.</p>
  654. <p>Much has been written about how the IoT is wildly insecure. In fact, the software used to attack Krebs was <a href="https://motherboard.vice.com/read/internet-of-things-malware-mirai-ddos">simple and amateurish</a>. What this attack demonstrates is that the economics of the IoT mean that it will remain insecure unless government steps in to fix the problem. This is a market failure that can&rsquo;t get fixed on its own.</p></blockquote>]]></content:encoded>
  655. <wfw:commentRss>http://mjtsai.com/blog/2016/10/11/we-need-to-save-the-internet-from-the-internet-of-things/feed/</wfw:commentRss>
  656. <slash:comments>0</slash:comments>
  657. </item>
  658. <item>
  659. <title>A Mac OS 9 Odyssey</title>
  660. <link>http://mjtsai.com/blog/2016/10/11/a-mac-os-9-odyssey/</link>
  661. <comments>http://mjtsai.com/blog/2016/10/11/a-mac-os-9-odyssey/#respond</comments>
  662. <pubDate>Tue, 11 Oct 2016 14:01:32 +0000</pubDate>
  663. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  664. <category><![CDATA[Technology]]></category>
  665. <category><![CDATA[History]]></category>
  666. <category><![CDATA[Mac]]></category>
  667. <category><![CDATA[Mac OS 9]]></category>
  668.  
  669. <guid isPermaLink="false">http://mjtsai.com/blog/?p=16020</guid>
  670. <description><![CDATA[Richard Moss (via Rosyna Keller): But as hard as it may be to believe in light&#160;of yet another OS X macOS update, there are some who still use Apple&#8217;s long-abandoned system. OS 9 diehards may hold on due to one important task they just can&#8217;t replicate on a newer computer, or perhaps they simply&#160;prefer it [&#8230;]]]></description>
  671. <content:encoded><![CDATA[<p><a href="http://arstechnica.com/apple/2016/09/an-os-9-odyssey-why-do-some-mac-users-still-rely-on-16-year-old-software/">Richard Moss</a> (via <a href="https://twitter.com/rosyna/status/774948684416978944">Rosyna Keller</a>):</p>
  672. <blockquote cite="http://arstechnica.com/apple/2016/09/an-os-9-odyssey-why-do-some-mac-users-still-rely-on-16-year-old-software/">
  673. <p>But as hard as it may be to believe in light&nbsp;of <a href="http://arstechnica.com/apple/2016/09/apple-september-7th-event-what-to-expect/">yet another <del>OS X</del> macOS update</a>, there are some who <em>still</em> use Apple&rsquo;s long-abandoned system. OS 9 diehards may hold on due to one important task they just can&rsquo;t replicate on a newer computer, or perhaps they simply&nbsp;prefer it as a&nbsp;daily driver. It only takes a quick trip to the world of <a href="https://www.reddit.com/r/VintageApple/">subreddits</a> and <a href="https://www.facebook.com/groups/25587413614/">Facebook groups</a> to verify these users exist.</p>
  674. <p>Certain that they can&rsquo;t all be maniacs, I went searching for these people. I trawled forums and asked around, and I even spent more time with my own classic Macs. And to my surprise, I found that most of the people who cling staunchly to Mac OS 9 (or earlier) as a key component of their daily&mdash;or at least regular&mdash;workflow actually <em>have</em> good reason for doing so.</p>
  675. </blockquote>
  676.  
  677. <p><a href="http://www.nobadmemories.com/blog/2016/09/todays-book-apple-tshirts/">Rachel Simone Weil</a> (<a href="https://twitter.com/partytimeHXLNT/status/773252820824752128">tweet</a>):</p>
  678. <blockquote cite="http://www.nobadmemories.com/blog/2016/09/todays-book-apple-tshirts/">
  679. <p>This hardcover book, published in 1997, tells the history of Apple Computer through one-off and low-run t-shirts made for internal programs, conferences, product teams, or just for fun. These shirts reflect the attitudes and culture within Apple in the 1980s and 1990s, and show off unique unreleased products and demos like SegaMac (!!!).</p>
  680. </blockquote>]]></content:encoded>
  681. <wfw:commentRss>http://mjtsai.com/blog/2016/10/11/a-mac-os-9-odyssey/feed/</wfw:commentRss>
  682. <slash:comments>0</slash:comments>
  683. </item>
  684. <item>
  685. <title>Apple and Kapeli Respond About Dash</title>
  686. <link>http://mjtsai.com/blog/2016/10/10/apple-and-kapeli-respond/</link>
  687. <comments>http://mjtsai.com/blog/2016/10/10/apple-and-kapeli-respond/#comments</comments>
  688. <pubDate>Tue, 11 Oct 2016 02:49:34 +0000</pubDate>
  689. <dc:creator><![CDATA[Michael Tsai]]></dc:creator>
  690. <category><![CDATA[Technology]]></category>
  691. <category><![CDATA[App Store]]></category>
  692. <category><![CDATA[Dash]]></category>
  693. <category><![CDATA[Developer Tool]]></category>
  694. <category><![CDATA[iOS]]></category>
  695. <category><![CDATA[iOS App]]></category>
  696. <category><![CDATA[Mac]]></category>
  697. <category><![CDATA[Mac App]]></category>
  698. <category><![CDATA[Mac App Store]]></category>
  699. <category><![CDATA[Phil Schiller]]></category>
  700.  
  701. <guid isPermaLink="false">http://mjtsai.com/blog/?p=15993</guid>
  702. <description><![CDATA[Jim Dalrymple (Hacker News, MacRumors, 9to5Mac): &#8220;Almost 1,000 fraudulent reviews were detected across two accounts and 25 apps for this developer so we removed their apps and accounts from the App Store,&#8221; Apple spokesperson, Tom Neumayr, said in a statement provided to The Loop on Monday. &#8220;Warning was given in advance of the termination and [&#8230;]]]></description>
  703. <content:encoded><![CDATA[<p><a href="http://www.loopinsight.com/2016/10/10/apple-responds-to-dash-controversy-with-proof/">Jim Dalrymple</a> (<a href="https://news.ycombinator.com/item?id=12680131">Hacker News</a>, <a href="http://www.macrumors.com/2016/10/10/apple-dash-developer-fraudulent-reviews/">MacRumors</a>, <a href="https://9to5mac.com/2016/10/10/apple-dash-removal-from-app-store/">9to5Mac</a>):</p>
  704. <blockquote cite="http://www.loopinsight.com/2016/10/10/apple-responds-to-dash-controversy-with-proof/"><p>&ldquo;Almost 1,000 fraudulent reviews were detected across two accounts and 25 apps for this developer so we removed their apps and accounts from the App Store,&rdquo; Apple spokesperson, Tom Neumayr, said in a statement provided to The Loop on Monday. &ldquo;Warning was given in advance of the termination and attempts were made to resolve the issue with the developer but they were unsuccessful. We will terminate developer accounts for ratings and review fraud, including actions designed to hurt other developers. This is a responsibility that we take very seriously, on behalf of all of our customers and developers.&rdquo;</p></blockquote>
  705.  
  706. <p><a href="http://www.imore.com/whats-happening-dash-and-app-store">Rene Ritchie</a> (<a href="https://twitter.com/reneritchie/status/785600852849487873">tweet</a>):</p>
  707. <blockquote cite="http://www.imore.com/whats-happening-dash-and-app-store"><p>My understanding is that the reviews included fraudulent positive reviews for their own apps and negative reviews for competing apps. That&rsquo;s something the App Store simply can&rsquo;t ignore.</p>
  708. <p>[&#8230;]</p>
  709. <p>It also seems like developers are given every chance to make things right in these situations: Get clean slates or open new accounts, make sure they&rsquo;re squeaky-clean, and go on about their business.</p>
  710. <p>[&#8230;]</p>
  711. <p>This concept &mdash; that one bad developer could arrange for false reviews for a competing developer and get them banned from the App Store as a result &mdash; has been generating a lot of stress in the community.</p>
  712. <p>My understanding is that the chances of that happening are virtually zero.</p></blockquote>
  713.  
  714. <p>It&rsquo;s not clear to me why this is. It all seems to hinge on Apple being able to tell who is ultimately paying for the <a href="https://twitter.com/istumbler/status/785656825882349568">fake</a> <a href="https://twitter.com/istumbler/status/785661887954378752">reviews</a>, and I don&rsquo;t see how they could do that.</p>
  715.  
  716. <p><a href="http://daringfireball.net/2016/10/apple_dash_controversy">John Gruber</a>:</p>
  717. <blockquote cite="http://daringfireball.net/2016/10/apple_dash_controversy"><p>Apple typically lets accusations like this slide. It&rsquo;s a no-win situation for Apple, publicity-wise: let an accusation stand unanswered and Apple looks like the App Store is run like a banana republic, but if they dispute it, they face the optics of a hundred-billion-dollar Goliath punching down against a small indie developer. This case with Dash gained enough attention that I think they felt they had to respond. Too many developers believed that Apple acted capriciously, when in fact, according to Apple, this was the culmination of a years-long dispute.</p></blockquote>
  718.  
  719. <p><a href="http://inessential.com/2016/10/10/dash_and_apples_statement">Brent Simmons</a>:</p>
  720. <blockquote cite="http://inessential.com/2016/10/10/dash_and_apples_statement"><p>I don&rsquo;t know what&rsquo;s true here. It wouldn&rsquo;t be right for Apple to make all the evidence public, and it wouldn&rsquo;t be right for Apple to publish their correspondence with him. So it&rsquo;s likely we won&rsquo;t ever know more than we do right now.</p></blockquote>
  721.  
  722. <p><a href="https://blog.kapeli.com/dash-and-apple-my-side-of-the-story">Bogdan Popescu</a> (<a href="https://twitter.com/kapeli/status/785621704081022976">tweet</a>, <a href="https://news.ycombinator.com/item?id=12680597">Hacker News</a>):</p>
  723. <blockquote cite="https://blog.kapeli.com/dash-and-apple-my-side-of-the-story"><p>What I&rsquo;ve done: 3-4 years ago I helped a relative get started by paying for her Apple&rsquo;s Developer Program Membership using my credit card. I also handed her test hardware that I no longer needed. From then on those accounts were linked in the eyes of Apple. Once that account was involved with review manipulation, my account was closed.</p>
  724. <p>I was not aware my account was linked to another until Apple contacted me Friday, 2 days after closing my account. I was never notified of any kind of wrongdoing before my account was terminated.</p>
  725. <p>[&#8230;]</p>
  726. <p>Apple insisted that all communication was through phone calls. Luckily, I recorded my last phone call with them[&#8230;]</p>
  727. <p>[&#8230;]</p>
  728. <p>Just to make it clear, I have complied with Apple&rsquo;s request and have sent a <a href="https://kapeli.com/apple_draft">blog post draft</a> approximately 30 minutes after this phone call ended. I have since not received any contact from Apple in any way, and they did not respond to my calls. Their recent statements come as a shock as I thought we were working together to resolve this issue.</p></blockquote>
  729.  
  730. <p><a href="https://twitter.com/reneritchie/status/785645527950061568">Rene Ritchie</a>:</p>
  731. <blockquote cite="https://twitter.com/reneritchie/status/785645527950061568"><p>The call, absent context, can be read in a number of ways. Ass covering, or bending over backwards to help dev help himself.</p></blockquote>
  732.  
  733. <p><a href="https://marco.org/2016/10/10/dash-app-removal">Marco Arment</a> (<a href="https://twitter.com/marcoarment/status/785616789149511685">tweet</a>):</p>
  734. <blockquote cite="https://marco.org/2016/10/10/dash-app-removal"><p>I&rsquo;m glad our community assumed the best of another developer and pressured Apple to justify this severe action. We should now accept that they have.</p>
  735. <p>[&#8230;]</p>
  736. <p>We don&rsquo;t know what happened between that call and Apple&rsquo;s statements tonight. I&rsquo;m guessing Popescu and Apple couldn&rsquo;t reach an agreement over the wording of the public story, but I think what Apple asked for in that phone call was extremely reasonable.</p><p>It&rsquo;s also notable that Apple investigated this and tried to resolve it as well as they did. If it were any other company &mdash; say, Google for a suspended AdSense or YouTube account &mdash; I suspect the amount of effort devoted to it would be much lower.</p></blockquote>
  737.  
  738. <p><a href="https://twitter.com/drance/status/785634596150849536">Matt Drance</a>:</p>
  739. <blockquote cite="https://twitter.com/drance/status/785634596150849536"><p>Apple developers: the only thing you know right now is that you don&rsquo;t know everything. That is the only lesson from this Dash mess.</p></blockquote>
  740.  
  741. <p>From the call, we learn that Apple is fixated on the idea that the two developer accounts were linked because they used the same credit card and devices. This could be for either innocent or nefarious reasons. Apple doesn&rsquo;t want to admit to any wrongdoing, and neither does Popescu. We don&rsquo;t, and likely will never, know whether the second account was actually operated by Bogdan or by his relative. I&rsquo;m inclined to believe him because, as <a href="http://daringfireball.net/2016/10/apple_dash_controversy#fn1-2016-10-10">Gruber</a> says, &ldquo;it would explain the extreme discrepancy in quality.&rdquo;</p>
  742.  
  743. <p>The mystery, to me, is Apple&rsquo;s statement to the press. First, why send it out without getting back to the developer about the requested blog post draft? Second, in light of the call, Apple&rsquo;s public statement seems deliberately misleading. The developer relations person seemed to acknowledge (1) that Bogdan says the problem account was operated by someone else, and (2) that Apple never contacted him on his Dash account. Yet Apple&rsquo;s statement says that they warned him in advance and implies that both accounts had fraudulent behavior.</p>
  744.  
  745. <p>The fact that the Dash account was terminated seems to support Popescu&rsquo;s contention that that account was never warned. Otherwise, surely this conversation would have happened sooner, and it would have remained a private matter. Why would Apple go to the trouble of closing the account, apparently not telling him it was because of the linked bad account, then helping him to restore it, after telling him that the decision couldn&rsquo;t be appealed?</p>
  746.  
  747. <p>My guess is that Apple found the bad account, and warned it, but did not initially realize that the linked account was &ldquo;good.&rdquo; When they shut down the bad account they just shut down all the linked ones, too. In many cases, that&rsquo;s probably the right thing to do. But this time they didn&rsquo;t check, and that turned out to be a mistake. When Apple learned that Popescu planned to tell the full story, without admitting wrongdoing, they decided to get their version, sliming him, out first.</p>
  748.  
  749. <p>So it seems like Apple made two mistakes: closing the good account without warning and trying to cover that up. However, it&rsquo;s entirely possible that more information will come to light. Given the finality of Apple&rsquo;s initial communication, it sounds like the Dash account would have remained closed were it not for all the press attention. (And it&rsquo;s not re-opened yet.)</p>
  750.  
  751. <p>See also: <a href="https://twitter.com/colincornaby/status/785623437276356608">Colin Cornaby</a>, <a href="https://twitter.com/nicklockwood/status/785605716035903488">Nick Lockwood</a>, <a href="https://twitter.com/lapcatsoftware/status/785624148903096321">Jeff Johnson</a>, <a href="https://twitter.com/owensd/status/785624700701515777">David Owens II</a>, <a href="https://twitter.com/tapbot_paul/status/785627259512029184">Paul Haddad</a>, <a href="https://twitter.com/etresoft/status/785629426662858752">John Daniel</a>, <a href="https://twitter.com/rustyshelf/status/785628591992164353">Russell Ivanovic</a>, <a href="https://twitter.com/owensd/status/785632887534125057">David Owens II</a>, <a href="https://twitter.com/istumbler/status/785635231571124224">istumbler</a>, <a href="https://twitter.com/lapcatsoftware/status/785641795770257409">Jeff Johnson</a>, <a href="https://twitter.com/colincornaby/status/785648453892251649">Colin Cornaby</a>, <a href="https://twitter.com/SteveStreza/status/785635862751088640">Steve Streza</a>, <a href="https://twitter.com/schwa/status/785687899157110784">Steve Troughton-Smith</a>.</p>
  752.  
  753. <p>Previously: <a href="http://mjtsai.com/blog/2016/10/05/apple-removed-dash-from-the-mac-app-store/">Apple Removed Dash From the Mac App Store</a>.</p>
  754.  
  755. <p>Update (2016-10-11): <a href="https://twitter.com/petermaurer/status/785716305617833984">Peter</a> <a href="https://twitter.com/petermaurer/status/785716538976251908">Maurer</a>:</p>
  756. <blockquote cite="https://twitter.com/petermaurer/status/785716305617833984"><p>As a side note, some of the Kapeli apps mentioned in coverage on this, such as [DockView], were actual Bogdan apps. So I&rsquo;d be curious what&#8230;</p></blockquote>
  757. <blockquote cite="https://twitter.com/petermaurer/status/785716538976251908"><p>&#8230;apps exactly triggered Apple&rsquo;s fraud thing, but that&rsquo;s basically a character flaw of mine and really none of my business.</p></blockquote>
  758.  
  759. <p><a href="https://twitter.com/tuxtina/status/785733612817833984">Christina</a>:</p>
  760. <blockquote cite="https://twitter.com/tuxtina/status/785733612817833984"><p>Wayback Machine &amp; Google Cache seem to show all older @kapeli apps xferred to alleged fraudulent account. Not just association through CC :(</p></blockquote>
  761. <blockquote cite="https://twitter.com/gpdawson/status/785736823918108676"><p>That account was selling all his old apps. His story never mentions that insignificant bit.</p></blockquote>
  762. <p>I guess that would explain the common bundle identifier prefix.</p>
  763.  
  764. <p><a href="https://blog.kapeli.com/dear-dash-users">Bogdan Popescu</a> (<a href="https://twitter.com/kapeli/status/785772245213904896">tweet</a>):</p>
  765. <blockquote cite="https://blog.kapeli.com/dear-dash-users"><p>It does not look like Dash can return to the App Store anytime soon. Due to Dash&rsquo;s removal from the App Store, please note that you can no longer download the apps you paid for.</p>
  766. <p>[&#8230;]</p>
  767. <p>Dash for iOS can&rsquo;t be distributed outside of the App Store. My preferred solution would be for a fellow developer to get it back on the App Store, as a free app.</p></blockquote>
  768.  
  769. <p><a href="http://pxlnv.com/linklog/dash-app-update/">Nick Heer</a>:</p>
  770. <blockquote cite="http://pxlnv.com/linklog/dash-app-update/"><p>A public fight isn&rsquo;t ideal from a PR perspective, but it seems like that it&rsquo;s what it can take to get an adequate answer. In his first post on the subject, Popescu said that he asked developer relations why Dash was removed and didn&rsquo;t receive an answer initially.</p></blockquote>
  771.  
  772. <p><a href="http://www.manton.org/2016/10/kapelis-reputation.html">Manton Reece</a>:</p>
  773. <blockquote cite="http://www.manton.org/2016/10/kapelis-reputation.html">
  774. <p>That&rsquo;s the damage Apple has done in going to the press and smearing him. They&rsquo;ve destroyed the goodwill he had in the community from his well-respected app. I always want to give people the benefit of the doubt, yet I hesitated.</p>
  775. </blockquote>
  776.  
  777. <p><a href="http://www.imore.com/solving-dash">Rene Ritchie</a>:</p>
  778. <blockquote cite="http://www.imore.com/solving-dash"><p>At this point, though, it&rsquo;s time to forget working it out. Mistakes were clearly made on both sides, and there may be no way for the real truth to ever be known, or for everyone to win. But there&rsquo;s a way to stop anyone else from losing further: Fix it, unilaterally, because you&rsquo;re Apple, and you can.</p></blockquote>
  779.  
  780. <p>Update (2016-10-12): <a href="http://www.manton.org/2016/10/kapelis-suspension-is-a-test-for-apple.html">Manton Reece</a>:</p>
  781. <blockquote cite="http://www.manton.org/2016/10/kapelis-suspension-is-a-test-for-apple.html">
  782. <p>It&rsquo;s easy to defend someone who is obviously innocent. It&rsquo;s harder when they make mistakes, but in areas unrelated to the crime. In that way, this App Store &ldquo;rejection&rdquo; is unique. It may be the most important test we&rsquo;ve seen of Apple&rsquo;s power in the store.</p>
  783. </blockquote>
  784.  
  785. <p><a href="http://createlivelove.com/1162/ive-left-my-dash-license-in-the-apple-bar/">Michael G&ouml;bel</a>:</p>
  786. <blockquote cite="http://createlivelove.com/1162/ive-left-my-dash-license-in-the-apple-bar/">
  787. <p>Getting your account suspended, canceled, terminated by Apple is nothing unusual - but usually no one hears or cares about it because it happens to developers with smaller apps, or scammers.</p>
  788. </blockquote>
  789.  
  790. <p><a href="https://twitter.com/nicklockwood/status/786292555579265024">Nick Lockwood</a>:</p>
  791. <blockquote cite="https://twitter.com/nicklockwood/status/786292555579265024"><p>I&rsquo;m not sure I agree with the idea of Apple trying to identify &ldquo;linked&rdquo; accounts and apply collective punishment at all to be honest.</p></blockquote>
  792.  
  793. <p>Update (2016-10-13): <a href="http://www.imore.com/dash-developer-speaks-heres-his-full-story">Bogdan Popescu via Rene Ritchie</a> (<a href="https://twitter.com/reneritchie/status/786647547339243520">tweet</a>):</p>
  794. <blockquote cite="http://www.imore.com/dash-developer-speaks-heres-his-full-story"><p>In 2014 I realised that there was no possible way for me to support and develop all of my apps anymore and decided to focus on Dash exclusively. I told my family about this and they thought I wasn&rsquo;t rational, because my old apps were still making some money. My mother proposed I move some of my apps to her account and that she would handle the support and maintenance for those apps. I transferred the following apps: moveAddict, iGuard, iSecure, iClap and Stay Awake.</p>
  795. <p>[&#8230;]</p>
  796. <p>When Apple said that the 2 developer accounts used the same bank account, what they meant was that the bank accounts used the same owner name [his mother&rsquo;s] until 2015. The 2 developer accounts never sent money to the exact same bank account (different IBAN). I have never received any money resulting from the actions of the other account.</p>
  797. <p>[&#8230;]</p>
  798. <p>Once Apple told me what happened, I collaborated with them and did not talk to the press during that time. I also complied with their request to make a blog post telling the truth, which I sent a <a href="https://kapeli.com/apple_draft">draft</a> of, but never received a response. I thought I could leave my family out of this, but following Apple&rsquo;s statement the <a href="http://forums.macrumors.com/threads/apple-says-1-000-fraudulent-reviews-were-detected-across-two-accounts-owned-by-dash-developer-update-developer-responds.2005850/page-15#post-23715421">Internet kept digging</a>, so I had to come forward and tell the whole story.</p></blockquote>
  799.  
  800. <p>One could quibble with the wording in the draft blog post, but it seems like he basically did what Apple asked. So, unless there is more to the story, it sounds like Apple reneged on the agreement and <a href="https://twitter.com/tapbot_paul/status/786653640626798592">went to the press</a> instead. And then he posted the recording of the call to try to defend himself, but at the same time burned his bridge with Apple.</p>
  801.  
  802. <p>Update (2016-10-15): See also: <a href="http://atp.fm/episodes/191">Accidental Tech Podcast</a> and <a href="http://www.coreint.org/2016/10/episode-254-it-blew-up-in-this-case/">Core Intuition</a>.</p>
  803. <p>Update (2016-10-17): See also: <a href="http://daringfireball.net/linked/2016/10/16/the-talk-show-170">The Talk Show</a>.</p>]]></content:encoded>
  804. <wfw:commentRss>http://mjtsai.com/blog/2016/10/10/apple-and-kapeli-respond/feed/</wfw:commentRss>
  805. <slash:comments>10</slash:comments>
  806. </item>
  807. </channel>
  808. </rss>
  809.  
  810. <!-- Dynamic page generated in 0.448 seconds. -->
  811. <!-- Cached page generated by WP-Super-Cache on 2016-10-19 05:13:27 -->
  812.  

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid RSS" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://www.feedvalidator.org/check.cgi?url=http%3A//mjtsai.com/blog/feed/rss2/

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda