In my experience junior developers write clear and simple code, because it’s easy for them to understand; mid-range developers write complicated code, because it proves what a clever developer they are; and senior developers write clear, simple code, so that they won’t have to answer questions from junior and mid-range developers about how it works.

Windows RB

On and off over the last year or so I have spent some time in Windows 10. Mostly with the Eve V, but also on my XPS 15. I have found the experience pretty terrible on many occasions. The hostility and lack of respect towards the user shown by Microsoft and some Windows software developers is egregious and angers me every time I encounter it.

I’m aware that the vast majority of computer users manage to use Windows but I’ve concluded it’s not for me. I find it unpleasant to use, slow, full of junk, and offensive to its users.

Scathing critique of Windows, though after looking at his sample screen shots I can’t say I disagree.

Feminism’s Dependency Trap RB

A further concern I have with the message and tone of contemporary feminism is that women have evidently forgotten that we have power over men as a result of the fact that we’re women—men adore us, and almost all their efforts at work or at home or in social settings, are made to win our approval, if not our admiration. In short, I am bewildered by the fact that in a culture in which The Patriarchy has never had less power over women, women seem to want to attribute to it a greater power than men in fact have, thereby confining women to a position of victimhood and powerlessness.

The orthodox line of feminism is that women don’t need men, and that it is men who keep women in a state of dependence. This is the doctrine of women’s liberation: we are trying to liberate ourselves from our dependency on men. Pragmatically speaking, the notion that we don’t need men is largely true. (As a single mother and single woman, I’m certainly poorer than my married counterparts, but I am running a family household successfully, if chaotically.) Paradoxically, however, the rhetoric of orthodox feminism implies the reverse: we need men in order to prove to ourselves that we don’t. I don’t need to sleep with a stuffed animal at night, but were I to insist on mentioning this at every opportunity, it would become abundantly clear that the idea dominated me. At a time when Western women have achieved economic independence, control over their reproductive rights, legal equality, and equal professional opportunities, the continued obsession with the need to win independence from the thing that we are, in every measurable way, already independent from, reveals just how subservient we are to the idea of powerful men. After all, only a child still dependent on the comfort of a stuffed toy needs to insist to herself that she isn’t.

Worth some thought.

California considers a texting tax RB

Cell phone owners in California could soon pay extra for the privilege of sending text messages, thanks to landline-era legislation and changing usage patterns. According to recent public law filings, the state’s Public Utilities Commission (PUC) is considering a plan that would bill users a monthly fee for any text message services they use, and phone service carriers aren’t happy about it.

Feels not so long ago that SMS became a free element of most cellular plans… and now the government wants to start taxing it? Ugh.

And of course, there’s always the risk that applying such a charge will push consumers away from traditional SMS altogether, which would certainly impact the PUC’s estimated $44.5 million figure, and subsequently the people the charge is meant to help in the first place.

A completely valid concern and definitely a possibility - if people even notice the new charges on their bill. I don’t see anything mentioned about how much the tax could be.

A College Student Was Told to Remove a ‘Fuck Nazis’ Sign Because It Wasn’t ‘Inclusive’ RB

Gruber:

Essential reading in today’s world: Popper’s Paradox of Tolerance. In the mid-20th century there wasn’t any debate in the West over whether we should tolerate the intolerant, because they had to fight the Nazis in a bloody war. We don’t want to learn this lesson that way again.

When someone draws a goddamn swastika on a “Happy Hanukkah” sign, “Fuck Nazis” is the appropriate response.

Amen. “Fuck Nazis”, indeed.

What kind of fuck you give me? What kind? American people, eight kind of fuck. Love fuck, hate fuck, sex-only fuck, break-up fuck, make-up fuck, drunk fuck, buddy fuck, pity fuck.

Ngoc Lan Tran in Downsizing

jekyll-feed: You aren't gonna need it

I think I’m going to turn this into a series of posts, about a lot of popular Jekyll plugins - and how you just aren’t gonna need them. We’ll see how far we get. And where better to start than jekyll-feed? The popular feed plug-in that publishes an Atom feed that includes your 10 most recent posts, no more, no less, and no option to configure that number.

This bugs me. I’ve seen Feedly do annoying things with a small number of feeds in the past. I have some feeds I like to read periodically, but not regularly. Very rarely some of these same feeds would start disappearing their old items far too quickly (like within a few weeks, not a month). But I digress, and maybe this didn’t have anything to do with their feeds.

In any case 10 seems like a completely arbitrary number to me and also a bit small for my personal tastes. Thankfully, you don’t need jekyll-feed or it’s limitations. I glanced at Daring Fireball’s atom.xml feed for a little inspiration and just built my own from there. Here’s what it looks like:

atom.xml

---
layout: null
---
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>{{ site.title | xml_escape }}</title>
 <subtitle>{{ site.description | xml_escape }}</subtitle>
 <link href="{{ site.url }}/atom.xml" rel="self" type="application/atom+xml"/>
 <link href="{{ site.url }}/" rel="alternate" type="text/html"/>
 <id>{{ site.url }}/</id>
 <generator uri="https://jekyllrb.com/" version="{{ jekyll.version }}">Jekyll</generator>

 <updated>{{ site.time | date_to_xmlschema }}</updated>

 <author>
   <name>{{ site.author.name | xml_escape }}</name>
   <email>{{ site.author.email | xml_escape }}</email>
   <uri>{{ site.author.url | xml_escape }}</uri>·
 </author>
 <rights>Copyright © {{site.time |date: "%Y" }} {{site.author.name}}</rights>

 {% for post in site.posts limit:30 %}
 <entry>
   <title><![CDATA[{{ post.title }}]]></title>
   {%- if post.link_to %}
   <link rel="alternate" type="text/html" href="{{ post.link_to }}"/>
   <link rel="related" type="text/html" href="{{ site.url }}{{ post.url }}"/>
   {%- else %}
   <link rel="alternate" type="text/html" href="{{ site.url }}{{ post.url }}"/>
   {%- endif %}
   <id>{{ site.url }}{{ post.id }}</id>
   <published>{{ post.date | date_to_xmlschema }}</published>
   <updated>{{ post.last_modified_at | default: post.date | date_to_xmlschema }}</updated>
   <content type="html"><![CDATA[
     {{ post.content | markdownify }}
   ]]></content>
 </entry>
 {% endfor %}

</feed>

The post.link_to conditional is just how I do my link/commentary style posts - allowing the default link to point the content itself rather than to my blog post. If your use case is simpler just remover that if/else; and that’s half the point of just using a template rather than a plug-in - so easy to bend to your own use.

Why alternate between CDATA and xml_escape? No reason. I may just as likely go back and change them all to CDATA later. It that’s your style, go for it. My goal here isn’t to say “use my great templates” or to publish another feed plug-in - it’s to point out how easy this all is to do it yourself - the way you want.

But perhaps you’ve head XML is dead or at the very least it sucks.

feed.json

---
layout: null·
---
{
  "version": "https://jsonfeed.org/version/1",
  "title": "{{site.title}}",
  "home_page_url": "{{site.url}}",
  "feed_url": "{{site.url}}{{site.json_feed}}",
  "author" : {
    "name" : "{{site.author.name}}",
    "url" : "{{site.author.url}}"
  },
  "icon" : "",
  "favicon" : "",
  "items": [
  {%- for post in site.posts limit:30 %}
  {
    "title": {{ post.title | jsonify }},
    "date_published" : {{ post.date | date_to_xmlschema | jsonify }},
    "date_modified" : {{ post.last_modified_at | default: post.date | date_to_xmlschema | jsonify}},
    "id" : "{{ site.url }}{{ post.id }}",
    "url" : "{{ site.url }}{{ post.id }}",
    {%- if post.link_to %}
    "external_url" : {{ post.link_to | jsonify }},
    {%- endif %}
    "author" : {
      "name" : {{site.author.name | jsonify }}
    },
    "content_html" : {{ post.content | markdownify | jsonify }}·
  }{% if forloop.last == false %},{% endif %}{%- endfor %}
  ]
}

And of course don’t forget to add your fancy new feeds to the <head> section of your template:

<link rel="alternate" type="application/atom+xml" href="{{site.url}}/atom.xml" />
<link rel="alternate" type="application/json" href="{{site.url}}/feed.json" />

Transitioning to Subscriptions RB

While other companies may require all their existing paid customers to subscribe in order to get future updates, we instead decided that none of our existing customers should require a subscription! Slowly, we hope to earn each one of your subscriptions by continuing to deliver great updates to the features you have, and by introducing exciting, subscriber-only features that (we hope) will be difficult for you to pass up.

What a great approach. And some funny examples to top it off:

Capo {VERSION_FROM_THE_FUTURE} adds an all-new Virtual Reality Song View that allows you to walk through your favorite songs! Want to isolate an instrument? Take a virtual lawn-mower and trim away the sounds you want to eliminate. Pretty cool, right? Unfortunately, you would not get this for free.

Replace "master" and "slave" terms in Redis RB

Suggestion on Github issues for Redis:

The summary is: master and slave have racial meanings (especially in North America, but also more generally) and it would be good to avoid them.

I’m anti-slavery (of course) but I think some of this recent “sensitivity” to all topics is a bit ridiculous.

Some great comments:

Mariano Pérez Rodríguez: Most words have a plethora of meanings, it is YOU (the reader) the one who chooses to take a system’s dynamic description term as a racial thing, so, maybe you should just not do it.

Itamar Haber: IMO dominatrix and submissive is the politically correct terminology, since it is in fact consensual as well as puts the gentler gender in the proper place.

Just some guy: It’s slave/master which are very well established terms for “the thing that controls the databus” or “the bit of software that dictates what the others do and coordinates things and the other ones that obey”. If it was “Massah” and “N!gger” I’d totally agree with you.

And the conclusion:

TLDR: If I would start Redis from scratch I would pick a different terminology. … 3.Redis has a SALVEOF NO ONE command that was designed on purpose as a freedom message. So I’ll leave it as it is.

But it gets better:

Again, by using this term in Redis and by linking to external pages, I want to take the opportunity to remember that we are all slaves. Slaves of businesses, of food advertising, of industrial complex, of politically correct rules to follow, and so forth. Feel free to address the same problem in different ways in other software projects, but for Redis I want to purse this way I said.

Rising Instagram Stars Are Posting Fake Sponsored Content RB

A decade ago, shilling products to your fans may have been seen as selling out. Now it’s a sign of success. “People know how much influencers charge now, and that payday is nothing to shake a stick at,” said Alyssa Vingan Klein, the editor in chief of Fashionista, a fashion-news website. “If someone who is 20 years old watching YouTube or Instagram sees these people traveling with brands, promoting brands, I don’t see why they wouldn’t do everything they could to get in on that.”

Sydney Pugh, a lifestyle influencer in Los Angeles, recently staged a fake ad for a local cafe, purchasing her own mug of coffee, photographing it, and adding a promotional caption carefully written in that particular style of ad speak anyone who spends a lot of time on Instagram will recognize. “Instead of [captioning] ‘I need coffee to get through the day,’ mine will say ‘I love Alfred’s coffee because of A, B, C,’” Pugh told me. “You see the same things over and over on actual sponsored posts, so it becomes really easy to emulate, even if you’re not getting paid.”

I bet brands love this. So much about modern consumerism culture just makes me sad. I hope I’m getter truly wiser and not just curmudgeonly.

Apple Says Bent iPad Pros Are Not Defective RB

Apple has confirmed to The Verge that some of its 2018 iPad Pros are shipping with a very slight bend in the aluminum chassis. But according to the company, this is a side effect of the device’s manufacturing process and shouldn’t worsen over time or negatively affect the flagship iPad’s performance in any practical way. Apple does not consider it to be a defect.

This seems very bad to me.

This type of response makes me think this affects a LOT of units - and is some sort of subtle flaw in the manufacturing or structure of the device. If it was very, very limited you’d think Apple would be more like “Bring it back - we’ll be happy to give you a perfect one to replace it.”

Marko Karppinen: Apple should decide whether they want to be the company that ships iPads a little bent from the factory and calls it normal, or the company that charges up to $1899 for an iPad. Doing both seems untenable

Typical of a lot of the responses (collected here), and feels spot on to me.

Setapp loses iMazing as of Dec. 28 RB

Setapp says it’s adding a “substitute app” with similar functionality, and of course, the existing app will remain on users’ Macs—it just won’t ever be updated.

I think they could even go a step further - and allow you to reinstall it in the future if you’d installed it in the past. This “just keep it if installed” only works until you get a new PC and hope to set it up “magically” from Setapp. Better have good backups.

Slack is banning some users with links to Iran even if they’ve left the country RB

Thursday morning, many Slack users with ties to Iran discovered their accounts had been abruptly deactivated. The bans affected users living as far as Finland, Canada and the United States, many with few remaining ties to Iran in either citizenship or physical presence.

“In order to comply with export control and economic sanctions laws…Slack prohibits unauthorized use of its products and services in certain sanctioned countries,” the notice from Slack read.

This is what scares me the most with “big business” and how disconnected the average user is becoming from the businesses we frequent. Individual people lose their identities and instead it becomes all about statistics and dealing with “people” or “accounts” in the aggregate, in ways that increasingly seem less and less personal.

Social Media Needs A Travel Mode RB

We need a ‘trip mode’ for social media sites that reduces our contact list and history to a minimal subset of what the site normally offers. Not only would such a feature protect people forced to give their passwords at the border, but it would mitigate the many additional threats to privacy they face when they use their social media accounts away from home.

To work effectively, a trip mode feature would need to be easy to turn on, configurable (so you can choose how long you want the protection turned on for) and irrevocable for an amount of time chosen by the user once it’s set. There’s no sense in having a ‘trip mode’ if the person demanding your password can simply switch it off, or coerce you into switching it off.

I’m glad someone is thinking about this, and I do get how this is a real problem - but I’m not sure we’ve stumbled onto the right solution yet. This seems a bit of a shotgun approach to me.

They can travel with special laptops and phones used for travel only, without social media apps or browser history. But such feints are easy to circumvent, particularly at the US border, where your identity is known to the border patrol hours before you land. Border agents can find your profile online and make you log in on their own machine.

(emphasis mine) Make you login? OMG, is this seriously a thing that happens? This is terrible. How would having a device in travel mode help in this case? I guess your on-line account would also have to lock you out until vacation was over? Talk about a support nightmare for service providers - and rife for social engineering if support departments are given any power to help correct “mistakes”.

Anatomy of a Moral Panic RB

The implication is clear: home cooks are being radicalized by the site’s recommendation algorithm to abandon their corned beef in favor of shrapnel-packed homemade bombs. And more ominously, enough people must be buying these bomb parts on Amazon for the algorithm to have noticed the correlations, and begin making its dark suggestions.

But as a few more minutes of clicking would have shown, the only thing Channel 4 has discovered is a hobbyist community of people who mill their own black powder at home, safely and legally, for use in fireworks, model rockets, antique firearms, or to blow up the occasional stump.

Close call. Thankfully for now Amazon is only a monopsony, not a supporter of terrorism.

Gatwick Airport: Drones ground flights RB

More than 20 police units from two forces are searching for the perpetrator, who could face up to five years in jail.

Supt Justin Burtenshaw, head of armed policing for Sussex and Surrey, described attempts to catch whoever was controlling the drones as “painstaking” because it was “a difficult and challenging thing to locate them”.

“Each time we believe we get close to the operator, the drone disappears; when we look to reopen the airfield, the drone reappears,” he said.

I hope when they catch him he spends a few years in jail. This is reckless and juvenile behavior and I imagine downright dangerous also - when they go to the trouble of grounding all the planes.

Refactoring and Performance. Ignore it: mostly.

Martin Fowler in Refactoring2:

Firstly, I know readers will again be worrying about performance with this change, as many people are wary of repeating a loop. But most of the time, rerunning a loop like this has a negligible effect on performance. If you timed the code before and after this refactoring, you would probably not notice any significant change in speed—and that’s usually the case. Most programmers, even experienced ones, are poor judges of how code actually performs. Many of our intuitions are broken by clever compilers, modern caching techniques, and the like. The performance of software usually depends on just a few parts of the code, and changes anywhere else don’t make an appreciable difference.

But “mostly” isn’t the same as “alwaysly.” Sometimes a refactoring will have a significant performance implication. Even then, I usually go ahead and do it, because it’s much easier to tune the performance of well­factored code. If I introduce a significant performance issue during refactoring, I spend time on performance tuning afterwards. It may be that this leads to reversing some of the refactoring I did earlier— but most of the time, due to the refactoring, I can apply a more effective performance­ tuning enhancement instead. I end up with code that’s both clearer and faster.

So, my overall advice on performance with refactoring is: Most of the time you should ignore it. If your refactoring introduces performance slow­downs, finish refactoring first and do performance tuning afterwards.

Some great thoughts on refactoring and worrying too much about performance. (emphasis mine) I’ve been contributing a lot lately to the great site Exercism and I see this quite a bit - worry about writing fast code vs writing clear code - and all without ever benchmarking anything.

It’s possible to do this “in your head” guessing a bit more with time and experience, but as Martin said it’s still often never as simple as you think. And often your best efforts today can be foiled by a new compiler optimization or future change to the virtual machine. Better to:

  • Write clear code that reveals the intent.
  • Try to avoid anything too ridiculous (i.e., looping 1,000 times when once would do).
  • Optimize only the “hot spots” that reveal themselves to be problematic.
  • Attack the hot spots with the help of code profiling and detailed benchmarking.

Get the book:
Refactoring - Improving the Design of Existing Code

Google Intentionally Favoring Chrome, Hurting Edge? RB

JoshuaJB: I very recently worked on the Edge team, and one of the reasons we decided to end EdgeHTML was because Google kept making changes to its sites that broke other browsers, and we couldn’t keep up. For example, they recently added a hidden empty div over YouTube videos that causes our hardware acceleration fast-path to bail (should now be fixed in Win10 Oct update). Prior to that, our fairly state-of-the-art video acceleration put us well ahead of Chrome on video playback time on battery, but almost the instant they broke things on YouTube, they started advertising Chrome’s dominance over Edge on video-watching battery life. What makes it so sad, is that their claimed dominance was not due to ingenious optimization work by Chrome, but due to a failure of YouTube. On the whole, they only made the web slower.

Steve Troughton-Smith: Make no mistake, Google crippling GSuite on iPad is absolutely intentional. They can singlehandedly propel the narrative that MobileSafari isn’t a good browser, especially in businesses and education. If Apple were to improve Safari, Google would just break something new

I’ve been using a mixture of Firefox and Safari and not missing Chrome one bit. Articles like this make me even more confident in my decision to switch away from using Chrome.

Basecamp policies now on GitHub and licensed under creative commons RB

So that’s why we now invite our customers and anyone else who’s interested in reviewing our policies to collaborate on making them better, making them fairer. To this purpose, we’ve put all our Basecamp policies on GitHub!

This also means that every revision is tracked and date stamped. You can even subscribe to be updated whenever they change, if you care to follow along at that level.

Furthermore, since the spirit of this idea is to collaborate, we’ve also licensed all these policies under the Creative Commons Attribution license. If you’d like to use any of the policies for your own business, feel free! All we ask is that you give us a bit of credit, if you either copy them entirely or materially.

This is very awesome transparency and will be interesting to keep an eye on.

Already is:

https://github.com/basecamp/policies/commit/fe3e141a66d6f20bd182493763d5007201110389

Class action suit alleges Apple lies to customers over size & resolution of iPhone X, XS & XS Max RB

Both size and resolution are misrepresented since Apple ignores the notch and rounded corners the phones have, the suit argues. The company markets the products as if they were no different from devices like the iPhone 8, which has a notchless rectangular screen, yet it tells app developers to design for “safe areas” on X-series iPhones that accommodate physical limitations and the iOS status bar.

The “false pixels” referenced in the suit are ones that have two or fewer subpixels. Only ones with red, green, and blue subpixels allegedly count as “true” pixels, though this also discounts numerous televisions that include extra white subpixels, effectively bringing the count up to four subpixels per pixel.

Are you kidding me? The rounded corners? The notch? Some people are just morons or else have way too much time on their hands. I’m all for honesty in consumer advertising, but this suit is nonsense. Plus typically when I see Apple mention resolution in the phone specs it’s done like so:

1792-by-828-pixel resolution at 326 ppi

In this form I think it makes perfect sense to advertise the “outside” pixel dimensions, which is what Apple seems to be doing.