MacBook, defective by design banner

Put the knife down and take a green herb, dude.

One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for

Back-up your data and, when you bike, always wear white.
Tuesday, December 06, 2016


You can select which level of diagnostic and usage data to provide, but some diagnostic data is vital to the operation of Windows and cannot be turned off. Full is the recommended setting because it gives you the same benefits of Basic and Enhanced, plus all the most effective troubleshooting of Enhanced and Full.

  • Full includes everything in Basic and Enhanced levels, plus additional diagnostic data including the memory state of your device when a system or app crash occurs (which may unintentionally include parts of a document you were using when a problem occurred). It also turns on advanced diagnostic features that can collect additional data from your device, which helps us further troubleshoot and fix problems. When we learn that devices are experiencing problems that we have trouble diagnosing or replicating internally, we will randomly select a small number of devices from those at the Full level that are experiencing those problems from which to gather the data needed to diagnose and fix the problem (including user content that may have triggered the issue). If an error report contains personal data, we won't use that information to identify, contact, or target advertising to you. Full is the recommended option for the best Windows experience and the most effective troubleshooting.
[emphasis mine -- mfn]

I don't know. That sounds like too much to me.

And "unintentionally"? No, that's completely intentional. It's Windows' intention to send back everything that's in your RAM, and that could be gigs of information, couldn't it?

And boy, a little pushy on what's their "recommended" setting, even though there's very little in there that explains why it should be mine.

To, um, "fix" in Windows 10, hit the Windows key, type in "feedback", and then select the "Feedback privacy settings" option.

Feedback Privacy Settings

Then select "Basic" in the "Diagnostic and usage data" section.

Telemetry Feedback Frequency to Basic

I don't think there's an option for less info than "Basic". I also don't remember being asked this when I set up this box, and I'm pretty sure I did the "custom"/manual setup. /shrug

Labels: ,

posted by ruffin at 12/06/2016 12:08:00 PM
Monday, December 05, 2016


[Consistency works] Except when it doesn’t

As far as consistency will get you, if you work with startups or other rapidly growing businesses, sometimes they’ll struggle with cashflow. To manage these problems, you need to apply fair but undesirable consequences when a client consistently doesn’t pay on time. While individual tastes vary, popular selections include:

  • With[h]olding IP rights to the work in question
  • Charging interest
  • Ramping down or halting development after a warning period
  • Telling a client “[Forget] you, pay me” (advanced users only, offer not valid in Hawaii or Canada)

[highlighting and PG censoring performed by me -mfn]

Had a "duh" moment reading this one. I've been lucky that most of my clients pay on time. I'm probably also lucky that I don't act like I'm only around to pluck every living dollar out of what one might act like is their tightly clenched hand. I bet it helps you to get paid in some-to-many situations if you don't act like getting paid is the only reason you're interested in them. Clients are not ATMs; they're [usually, ultimately] people. If you're interested in helping them succeed -- and can competently help them do it -- they'll be happy to bring you along.

But the "duh" moment -- to be clear, a moment when I'm slapping myself in the head -- is to withhold IP. You might do yourself one better and include in your contact that you will also assume rights to any design elements and other IP that you've been made privy to while working. I realize you could get into a mess if the client has licensed stuff that they shouldn't or can't officially allow you to use, and some folks would balk at their current clients or test data, but you get my point.

Clients don't always respond to "time out"

The problem with "ramping down... development" and "charging interest" is that they don't guarantee you'll get anything. Those are really only useful if the companies want to work with you again, or if you're owed so much it's really worth suing. That is, those two remedies usually require the client to participate in their punishment for them to be effective. (If you're currently still working for a client that agreed to and is not now paying, we need to have a talk.)

It's like being a parent -- if your only punishment requires the punished's cooperation, you're often left with a battle of wills. This includes stuff as simple as, "That's your third strike. Go to time-out." If they don't go to time out, what do you do? Pick 'em up and put them there? Stand over them and forcibly keep them in time-out? (Um, I don't recommend that, btw.) These aren't great situations, are they? [... is a rhetorical question most any parent has likely already confronted.]

But tell someone you now own their ideas and legally become their competitor? Now that's punitive and enforceable.

Litmus testing

I really can't see anyone pitching too big of a fit for that being in your contract either, if it's well written and sounds fair and even, not like you're dying to stick it to your client. Anybody who tells you they're not willing for you to own their stuff if they don't pay might not be who you want as a client, right?

If they're worried about slow times or unexpected issues, I'd feel okay negotiating the, "Pay or I can play" clause as far as they want, until they're comfortable. I'd also probably need to add some soothing language that you wouldn't use their brand itself, and would perform what you felt were minimal distinctive changes to address possible user confusion...

Generic, post-Exxon branded, station

But at some point, a reasonable entity would have to recognize that, if they're not paying their own contractor what they contracted, that's unfair.

I should probably also add now that I don't typically fix-price something past the first contract. I don't mind taking a little bath to try and show someone I'm worth keeping around, but later, I try to make it clear that you're paying for hours of work, whatever they produce. This tends to keep clients on track if they're exceptionally cost-conscious, and also from them asking for the moon -- and from moving the moon biweekly because of some incredible insight!!1!121! they had over breakfast.

Two lessons here:

  1. Well-written contracts work well as a litmus test for your clients.
  2. Clients paying for time tend to be more responsible clients.

Google fails in search for blog

Headline, headline; read all about it!

One quick aside: When I was searching for Allen Pike's post, above, using a very specific string of words from the post, "to manage these problems, you need to apply fair but undesirable", Google gave me nothing, at least nothing tempting on the first page of results. That's crazy-insane.

Bing found it, no problems (though its third hit was, um, strange).

Bing vs. Google, searching for Allen Pike's post. Google loses horribly.

Go figure. As I've said before, Programming is Hard, (c) 1842.

Labels: , , , , , ,

posted by ruffin at 12/05/2016 11:25:00 AM
Saturday, December 03, 2016


Eliminating premium subsidies
would put health insurance out of
the financial reach of millions of
Americans who now have coverage.

Both the subsidies and the mandate
are needed to keep young, healthy
 in the insurance pool.

Insurance companies need
young, healthy people to help
pay for older, sicker customers.
Without them, the companies
would have to raise premiums,
and millions more could
be priced out of insurance.

Oh, I get it. You mean it's a pyramid scheme. Kind of like how the stock market should continually improve if you wait long enough. If the population doesn't keep increasing significantly, we'll have fewer hands to pay out than those from which we can collect, so I guess we'll at least keep natal services affordable, right?

Can I perhaps modestly propose reading John Scalzi's Old Man's War?

Labels: , ,

posted by ruffin at 12/03/2016 02:53:00 PM
Thursday, December 01, 2016

Seems some of the blowback against the new MacBook Pros gets caught with the 16 gig RAM limit. That's a good place to start. I get sort of tired of the lumping Gruber does to work himself out of RAM being a problem.

From Daring Fireball: Baldur Bjarnason: 'The Downside of Believing in Apple':

Most of us, if given the choice between making compromises to our productivity and compromises to the battery life of the machines we buy, would choose a shorter battery life every time.

This is the nut of the argument against the new MacBook Pros. If the 16 GB RAM limit in the previous MacBook Pros was a limiting factor for your productivity, the new ones are no help at all. And I’m sure Bjarnason is correct that those people would gladly trade battery life for the ability to install 32 GB of RAM.

But that’s not most MacBook Pro users. Most MacBook Pro users will do just fine with 16 GB of RAM (in fact, most will do just fine with the 13-inch models’ default configuration of 8 GB). For most MacBook Pro users, Apple is right to prioritize battery life over the maximum RAM configuration. That is, if they’re only going to offer one lineup of “pro” notebooks — which is how they’ve done it for at least 15 years.


Because we’ve bought into Apple’s design myth, we are forced to come to one and only one conclusion:

Apple really, really doesn’t care about its professional Mac users.

I disagree with that conclusion. If your priority is the display, the new displays are brighter (500 nits) and offer wide color gamut. The new MacBook Pro SSDs offer industry-leading read and write performance, years ahead of the competition. The 15-inch MacBook Pro offers a quad-core i7 with speeds up to 3.8 GHz. For many demanding use cases, these are professional machines. Just not all professions.

A less punchy, but more accurate title for Bjarnason’s piece would be “The Downsides of Depending Upon a Company With a Relatively Sparse Product Lineup When Your Personal Needs Are Outside the Mainstream”.[highlighted emphasis mine -mfn]

I'm sighing just reading back through this.

  1. Not only did Apple only make one line for pros (why the quotes, John?), they said one version of the MacBook Pro was their intended replacement for a consumer box. rly?
  2. Web developers are not outside of the mainstream when it comes to pros using laptops.
    • If anything, web developers are archetypal.
    • (Not a majority, but representative.)
  3. It's not a zero-sum game between battery and RAM.
    • Why not make the 15" 2mm taller? Who'd care short of Apple design?
    • Why are we so obsessed with thin and 10 hours of battery life?
  4. Can Stephen King make a living writing books on a MacBook Pro? Sure. That doesn't make it a professional laptop.
    • We're starting to lose the meaning of the word professional.

But let's take a quick second to see what Baldur talked about. Does he really need 16 gigs of RAM today? Remember when we used to do fine with 4 megs? ;^)

From The downside of believing in Apple – Baldur Bjarnason:

I’m writing this on a fairly high spec 2015 13’ Macbook Pro with 16GB of RAM and that amount of RAM wasn’t enough even on the day I bought it. Since then the memory requirements of basic web development work has only increased:

  • Most web developers now use VMs and Docker for server-side code because it’s much more reliable. It also consumes much more RAM than just using node.js on its own.
  • Browsers have, if anything, increased their memory use over the past couple of years and web developers need to run several of them at a time.
  • Some of those browser have to be run in their own VMs because they don’t run natively on the Mac.
  • Having a test environment in a VM on your machine is also much more productive than always going to your test machine (which you should also have).
  • The dominant web development IDEs are now built using browser tech (Electron/Chromium) and have much higher memory requirements than good old BBEdit. If you use TypeScript, you pretty much have to be using Visual Studio Code. If you use Flow, you pretty much have to be using Atom. Switching to a code editor with a more reasonable memory requirement means making workflow compromises.

That’s without getting into the graphics programs we use (a surprising amount of web work involves working with images). And if you’re a native app developer you have all of the above problems (VMs for testing earlier OS versions instead of browser versions) plus a need for fast compilation times.

We're really down to one reason -- VMs. If your developer box is used to host multiple boxes' worth of power, well, you do need more than one box worth of hardware. And Baldur, my man, why in the world do you have your production environment mirrored on your laptop?

But I agree with Bjarnason on the general point. If your laptop for pros is below state of the art for specs and you're charging beyond state of the art prices, well, you've screwed up. If you don't have too much battery life or RAM or CPU (to be clear, having too much should be your goal with a pro box) so that you can make your laptop thin and svelte, that's a problem. In two years, it'll hurt to use this MacBook Pro for VM based development, whether web or native, and that's a disservice from Apple when there's no obvious hardware to fill that gap for professionals. The 5k iMac is the closest, I suppose, but even that's over a year old now (415 days right now).

So Grubes, come on, let's stop pretending that because Apple has a box with a 2.9GHz i7 for OMGWTFBBQ!1! an entry price of $2700 that we've got pros covered. That's not competitive for many developers, who only "need" Macs to test out Safari -- or to host Windows in VMware to code native apps. These developers have other, much more useful, efficient, and affordable options. Apple's failed them, and Bjarnason's conclusion, that, "Apple really, really doesn’t care about its [software developing] Mac users," isn't that far off the mark after all.

Labels: , , ,

posted by ruffin at 12/01/2016 05:27:00 PM
Wednesday, November 30, 2016

From Tips for Writing Portable Node.js Code:

Bonus: Something that Breaks on Linux and Solaris!

Both Windows and, by default, OS X, use case-insensitive file systems. That means if you install a package named foo, any of require("foo") or require("FOO") or require("fOo") will work—on Windows and OS X. But then when you go to deploy your code, out of your development environment and into your Linux or Solaris production system, the latter two will notwork! So it's a little thing, but make sure you always get your module and package name casing right. [emphasis mine -- mfn]

This is a problem when serving files by name with express' static middleware too. Argh. And check out this schmoe's problem, with a huge legacy php site migrating to Linux, from case insensitivity to case sensitive. Ouch. Can you imagine the tech debt there?

So what if you want to use Express to serve files from the filesystem on, I don't know, Ubuntu on linode [which uses ext4]? And what if you want folks to be able to access your privacy policy at both and

Even worse, what if you told your app reviewer to try and that meant they had to reject your app submission now that you've changed servers? /facepalm

From MarkUpDown - Review Results:

Locations: mumduwp1.4.0.0x86x64_arm.appxbundle

Tested OSes: Windows.Universal

Tested Devices: Acer Iconia W700

Notes To Developer

The privacy policy link did not resolve to a functional webpage.


I've never liked it when I've typed in a URL by hand and got a 404 because I had one or two letters in the wrong case. I mean, it makes sense that case sensitive file systems are easier to maintain. It's just an end-use-case pain when you're serving files.

But URL case in Edge is broken too... 🙄😱

And insult to injury? Microsoft Edge (Internet Explorer's replacement in Win10) "remembers" case when you retype a URL! What, wait? So I can't navigate to the "correctly cased" URL with Edge even if I want to -- and I wonder if I get the same reviewer(s) if this'll happen to them too.


How to fix it

How do you fix case sensitivity for express so that it's never a problem with ext4? Well, you could make everything in your filesystem lowercase, and then just always run request.url through .toLowerCase(). That seems pretty nuclear. Slightly better is to try the URL as requested first, and then do this...


When a file is not found, instead of sending a 404 response, this module will instead call next() to move on to the next middleware, allowing for stacking and fall-backs.

Still have to set the filesystem to a single case throughout, and then if you want to use mixed case in your URLs to make them easier to remember or what-have-you, you're creating a good deal of extra work for your server every time mixed case is used.

How bad is it to make your web server take a URL, not find it, then search the filesystem again for a lower cased version? It might be smarter/less work just to lowercase the string every time and ensure your filesystem is in sync. It has to be cheaper to lowercase the url every time than to hit express.static twice in 30+% of your requests, right? Kind of a pain when you're editing files and want to glance at human readable names, but I think that's the only other downside.

So I guess it looks like I get to go through and change the case of my website's files and folders to a single case. Right? Isn't that The Right Thing to do to approximate case insensitivity? Is it ever better for the end user to have a case sensitive http server? I don't think so. Seems unnecessarily processor churny and hacky to lower case the earth, but man, I hate case sensitivity for URLs.

That fishing metaphor that tells you I'm about to comprise my best intentions...

In any event, for now, I've decided to embarrassingly give the server a fish, I'm afraid.

if (req.originalUrl === "/privacy" || req.originalUrl === "/privacy/") {
    req.url = "/Privacy/";

That's probably worth a Unicode facepalm too.

I really enjoy using linode, though my needs are so small I might drop down to Digital Ocean's $5 a month plan if it's just as easy to administer. It's great having your own "box" on the net. So much more powerful than shared hosting. Feel like I was about a decade behind with hosts, but, boy, I'm caught up now. Wonder how long before I start using .NET Core on it...

Labels: , , , , ,

posted by ruffin at 11/30/2016 12:47:00 PM
Thursday, November 17, 2016

Recently I bristled at a fellow who implied that we needed to "touch" a MacBook Pro before critiquing it. Today I did. They're very nice. Very light, well made, great screen.

Here are some fimp-ish comments:

The Touch Bar is an extended replacement for right-click. I like it.

With the Touch Bar, most of what'd be in a context menu is already open, full color, waiting on you. On Windows, I hit shift-F10 to open a context menu. With Touch Bar, it's already open.

Like check this out... I downloaded MacVim, hoping I could try it out with the crazy escape key. When I clicked on the dmg file so that it was selected in the Finder, I got this:

Share menu

That's pretty cool. I can get info, share, or tag it. When I selected "share", I got this share sheet:

share sheet

Mail, Messages, Airdrop, Notes, and the ever-present "More". Neat!

Message Share

I can dig it.

When I tried Mail, I caught this Touch Bar menu (which, again, I'm arguing is essentially a mouse-free, gesture-aware context menu):

Mail Touch Bar Menu

Honestly, that's beautiful. SO much easier than making your user remember lots of keyboard shortcuts if they don't live in your app. And if they live in your app, you could potentially let them set up whatever items they want.

And of course this is better than a context-menu, because you can gesture with it as well.

Seems small, but Touch Bar isn't just a good idea waiting for programmers to do something with it, as I've heard it described. It's a good idea now, and well integreated into OS and first party apps.

Escape is odd. (I'm a VIm user.)

I wasn't able to get MacVim installed, as it was an app from the dreaded "unidentified developer" and I haven't been made privvy to the Apple Store admin login and password, but I could open vi in the Terminal and test drive a little.

Escape is odd.

If you don't know vi, it's a text editor that has two modes: Command Mode, where you give vi commands to perform on the text, and Insert Mode, where you're essentially just typing away like Notepad or TextEdit. And vi isn't the only editor that supports it. Sublime Text has a vi like mode built in, and WebStorm has a nice plugin, for instance.

How do you get from Insert to Command mode? Escape.

Escape key

Escape is now on the Touch Bar, and is just a virtual, not a "real", key. That's not great, but it's not horrible.

Here's the weird part -- it's not where it's supposed to be. See that dead space to its left? If I could trade that for a real, dedicated ESC key, I would in a heartbeat. It's hard to "feel", and since it's to the right of where I expect it to be, it's not natural. For someone who hits ESC scores of times a day, well, that stinks.

Enough. Fringe case.

One interesting tidbit...

But one thing I learned while playing around in the Terminal... See that greyed out button to the right of the ESC and color wheel? It says man page. That's really pretty cool. I wouldn't use it much, but it's context sensitive, and lights up when you type in a *NIX command.

I manned grep. Here it is:

grep man pages

Again, not a big deal, but nice. Makes me optimistic that the Touch Bar will slowly become second nature. Apple seems to be fairly interested in integrating it.

The track pad drives me batty. I couldn't single-click to save my life.

I kept force-clicking or having nothing happen. After switching to tap-to-click, I was okay again. But somehow, I've unlearned clicking. And I didn't have this trouble on the MacBook or early MacBook Pros with Force Trackpads.

(I think I might have been accidentally alt-clicking sometimes; it's a case of having the whole trackpad clickable)

Click-drag drove me crazy too. Windows has a tap, tap-drag gesture I'm used to now, perhaps. But keeping my initial click down is more painful, again, possibily because I was right-clicking at times.

Btw, three-finger drag is really well hidden now. But once I found it, instant happiness.

The keyboard is louder than it used to be. Like most sensible folk, I couldn't care much less.

Aside from my esc issues, above, I've got to say that it's a nice keyboard. I could use it easily when I'm mobile/out of the office/away from my "real" keyboard.

USB-C ports are really small. I get it.

If this is the trade off to get a smaller laptop, I'm all in. USB-C never bothered me. You need replacement cables for some peripherals, but otherwise, you just need a dock.

The new ports (and removal of the old ones) never bothered me.


There are two great times to buy Mac hardware to get your money's worth:

  1. When it's initially released.
  2. When it's sold refurb for the first time.

Both of those maximize your cash, I think. The refurb discount is pretty good.

I'd convinced myself to wait on the 2017 MacBook, and rather than buy a truck, I'd just buy a real computer for my mobile slot. Right now, I carry around a Lenovo 100S for those times that I "don't carry a computer". It's a crap computer for specs, but has great battery life.

The MacBook is nearly the same size, and would actually run rings around the 100S.

But now I wonder. That Touch Bar is a nice addition. If that's a $300 mark-up addition like it is on the MacBook Pro, I'll probably wait for a 2017 "F12" MacBook (one without a Touch Bar) to hit the refurb rack. But now, having "touched" one, I think a refurb 13" MacBook Pro with Touch Bar might be an option I'll consider too. It's not as fast as much Y700, but it's a great mobile laptop. Having touched one, I get what the MacBook Pro is trying to be a little better.

The new MacBook Pro is still not a truck. Walt Mossberg at The Verge nails this on the head...

It's the name, stupid

Neither will unseat my "truck" on the laptop stand in the home office, but either Mac would mean the Y700 stays on the stand a lot more regularly when I leave the house.

I also spent a little time with the iPhone 7. Heeeeeello, nurse. Great feeling phone. You know, I like that home "button" better than the one on my SE. I played around with the settings, and "2" feels great.

Labels: , , , ,

posted by ruffin at 11/17/2016 05:09:00 PM

And for another in the, "How many times must I use this before I commit it to memory?" category: How to change the shortcut for multiple cursors on Sublime Text 2:

    // Multiple carets
    { "keys": ["shift+alt+up"], "command": "select_lines", "args": {"forward": false} },
    { "keys": ["shift+alt+down"], "command": "select_lines", "args": {"forward": true} }

You put that into your KeyBindings - User file:

User Key Bindings Location

Here, I'm changing from the default of Ctrl-Alt-up & down to shift so that it doesn't conflict with my WinSplit Revolution settings.

Speaking of WinSplit Revolution, nice that it still works in Win10. That Win10 "window snapping" was a poor replacement.

Labels: ,

posted by ruffin at 11/17/2016 10:12:00 AM
Wednesday, November 16, 2016

I went to build an app package for my newest app -- Podcasters' RSS Feed Generator, which does, not surprisingly, exactly what it says it does -- I got the following error in Visual Studio.

App manifest references the image 'Assets\StoreLogo.png' which does not have a candidate in main app package.

Turns out this is a pretty cryptic error. We get a partial answer from

Best Answer

... but it's not quite that easy. You can't simply rename the file; the images also have to be exactly the right size. Painfully, all the .scale-xxx extensions to the names that I had weren't from Unity; they were from Visual Studio. Et tu, VS? That stinks. Microsoft is helping me create a situation they don't support.

Anyhow, the three I had complaints about with their "correct" sizes are:

  • StoreLogo.png: 50x50 pixels
  • BadgeLogo.png: 48x48 pixels
  • Square71x71Logo.png: 142x142 pixels (of course, right?)

Blasting all the old ones with StoreLogo, etc, in the name and then dropping the new, "correctly-sized" replacements into the Assets folder, then including them in the project from VS, does the trick.

Or so I thought. Now I get...


Description Project



App manifest references the badge
logo image 'Assets\BadgeLogo.png'
which does not have valid dimensions. It must be 24x24 pixels.



App manifest references the square
71x71 logo image
'Assets\Square71x71Logo.png' which
does not have valid dimensions. It
must be 71x71 pixels.


Which is it, dang it?

Visual Studio complaining about BadgeLogo sizing, though we have the size the error window asked for earlier

Answer: Apparently we wanted the sizes the error window wanted. Ignore errors like the ones pictured, above.

Labels: , , ,

posted by ruffin at 11/16/2016 01:56:00 PM

Support freedom
All posts can be accessed here:

Just the last year o' posts:

URLs I want to remember:
* Atari 2600 programming on your Mac
* joel on software (tip pt)
* Professional links: resume, github, paltry StackOverflow * Regular Expression Introduction (copy)
* The hex editor whose name I forget
* JSONLint to pretty-ify JSON
* Using CommonDialog in VB 6 * Free zip utils
* that hardware vendor review site I forget about is here * Regex Tester
* Read the bits about the zone * Find column in sql server db by name
* Giant ASCII Textifier in Stick Figures (in Ivrit) * Quick intro to Javascript
* Don't [over-]sweat "micro-optimization" * Parsing str's in VB6
* .ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); (src) * Break on a Lenovo T430: Fn+Alt+B
email if ya gotta, RSS if ya wanna RSS, ¢ & Δ if you're keypadless

Powered by Blogger Curmudgeon Gamer badge