Author Archives: sgamon

James Garner died

NOTE: this was started last summer. Then noodled on for several months. Then I hit “publish”.) 

James Gamer died last Saturday. He was 86.

I have a ton of affection for Garner, but mostly based on his “Jim Rockford” character. “The Rockford Files” were on in my house every week during it’s initial run. Then every day in re-runs. The Gamon’s were unabashed Rockford fans.

This is a notice, not a lament. Garner did everything I cared about by 1980. I enjoyed his subsequent work, but I don’t get misty-eyed about it.

He was, frankly, an underachiever. Tall, handsome, charming: he should have been the heir to Cary Grant and Rock Hudson. But he wasn’t “actor” enough to escape his true nature. That nature was on display in “Maverick,” “The Great Escape”, and “The Rockford Files.” Garner enjoyed playing the role of the smooth-talking, ethically-flexible, reluctant hero. Rockford, in particular, had a hidden line he would not cross. That’s when he flipped into a hero. Rockford also had an interesting twist on manly pride: You could overpower him in various ways. He accepted that pragmatically. But if you fooled Rockford, he became a relentless foe.

I think Hour of the Gun was Garner’s only effort at a darker role. He fails, in my opinion. But Jason Robards is an outstanding Don Holiday. And the affection between Garner’s Wyatt Earp and Robards’ Holiday seems authentic.

As usual with old celebrities, I don’t really miss or mourn James Garner. But I’m glad he was around.

 

windows delete path too long

One problem with nodejs programming is that npm modules can produce deeply nested folders. So deep, Windows will throw “path too long” errors if you try to delete them.

Path too long errors are really hard to get around. Consider this MS Support page. Skim down to “Cause 4, Resolution 5″: “Use a tool that can traverse deep paths.” Gee, thanks Microsoft.

There are a bunch of commercial tools, starting at $20, that will delete anything for you. However, I don’t think I should have to pay extra to delete files. Call me crazy.

Luckily, there is a free solution: 7-Zip. You should install this anyway, because it is the best Windows zip file system. And totally free.

It turns out 7-Zip has a file manager, like Windows Explorer. Use the 7-Zip file manager to locate the file or folder that you want to delete. Click to select. Then, using the keyboard, press shift+delete. Voila! All gone.

 

Chromebooks: good enough, smart enough, and doggone it, I like ‘em

I bought a chromebook earlier this year. This exact model, for $300, to be precise. I was curious about two things:

  1. Would I miss desktop software?
  2. Would a seemingly underpowered computer frustrate me?

The answers are no, and no.

As usual in life, your mileage may vary. But I found it really easy to transition to browser computing. Most of the things I do on the computer have browser-based alternatives. And I find that living in the cloud gives me an incredible lightness of being. I never install or update software. I don’t get malware. If my chromebook falls in a well, I can just buy another one (they’re cheap, and easy to find), and be right back in business. Heck, I could borrow a browser and be right back in business.

Predictably, I use Google Docs in place of office tools, though I am not a heavy user. Microsoft has ported real Office to the web now, so you could always pay for that if you don’t love Google’s 80% solution.

I’ve ripped my last cd, I think. I subscribed to Google’s music service a couple of years ago. There is so much to listen to, I think I can just live without whatever is missing.

Actually, that’s pretty much the dividing line. Some people are complete-ists. They want every single thing, just in case. They may never use pivot tables, but if your spreadsheet doesn’t support it, they’ll reject it. Those people won’t buy chromebooks. I shed no tears for them.

You can make music, edit video, draw pictures, and even program from inside a browser. You’ll sacrifice some features (for now), but you won’t be blocked from accomplishing your mission.

A few delightful things that I didn’t expect to be a big deal, but they are:

Instant on. Open the lid, and chromebook is up and moving. It’s shocking how useful that is.

Really long battery life. Mac people already know about this superpower, but I’m a Windows refugee. Going hours and hours without plugging in is also really useful.

No malware. Mac people used to know what this is like, until they didn’t. But it was just an accident on the Mac. ChromeOS is military-grade secure by design. I can visit any website, open any attachment, plug in usb sticks of unknown provenance. ChromeOS has my back.

ChromeOS keyboard. At first, I thought it was funky. But the more I used my chromebook, the more I grew to appreciate the thoughtfulness of the special keys. I wish my Windows computers had this keyboard.

What about offline use? Well…

I spend the lion’s share of my time at home, my office, Starbucks, and McDonalds. Lack of internet is not a problem that I actually have. If I were still riding trains on my commute, I might feel differently.

There are, in fact, many things you can do offline with your chromebook. The same things, mostly, that you can do offline on regular computers. But you need to plan ahead. When you own a chromebook, you get used to just streaming everything off the cloud. To do offline stuff, you have to remember to save files to local storage. Then you can access them offline. You can read Kindle books, watch movies, play music, look at pictures, and work on office docs.

A few notes on the hardware:

There probably are no bad chromebooks, but I think you’ll be happiest with an Intel Haswell processor. Benchmarks show the Haswell outperforming the other chromebook chips, and anecdotal reports on the internet say the other chips sometimes lag. There is no price premium ($200 for the Acer C720), so prefer the Haswell.

I, personally, love the 11″ screen form factor. It’s the right size for couch-surfing, and makes an unobtrusive companion around town. But there are 13″ and 14″ inch screens too.

Surprisingly, 2GB of ram is fine. I guess 4GB would be even better, but I really haven’t felt any pain.

My chromebook has a touch screen. I don’t use it a ton, but I’m glad it’s there.

Some chromebooks come with 16GB of storage. Others, like mine, come with 32GB. It never hurts to have more, but I wouldn’t notice if someone stole half my storage. Everything is stored on Google Drive.

 

Traveller, part 2, Enhanced Classic Traveller

In 1977, GDW published a set of rules for a science-fiction-role-playing game. That set of rules is known as Classic Traveller. Ten years later, there was a re-boot called MegaTraveller. In between, there were a raft of supplements and expansions. Classic Traveller + some number of supplements and expansions is what I call Enhanced Classic Traveller (ECT).

The obvious problem with ECT is, what precise set of supplementary material forms the canon? For me, it was Books 1-6, Azhanti High Lightning (AHL), and Stryker. This evolved over time, of course. Let me give you some flavor.

Traveller was published as a set of three 36-page rulebooks. But since the book pages were about half the size of a letter-sized page, you could say that Classic Traveller had just 54 pages of rules. Classic Traveller was published in 1977. It was an overnight hit.

GDW published Mayday the following year. Mayday expanded lightly on the ship combat rules, adding Newtonian movement. We embraced it immediately.

Snapshot followed the next year. You’ll recall from the previous post that my gaming group did not discover Traveller until the back half of 1979, so Snapshot was available to us. As soon as we discovered it, we adopted it. Snapshot introduced Traveller’s famous square scale (15mm=1.5m), and the action point combat system. Basically, it turned Traveller combat into a wargame. As converted wargamers, this was familiar and safe to us.

Snapshot, however, was swiftly superseded bay AZH. AZH rationalized the action point system, while retaining the the core combat system.

My friends introduced me to Book 4 – Mercenary, and Book 5 – High Guard. These books radically changed the character generation system, for the better. Book 4 also added a lot of new personal combat gear. Book 5 also introduced a whole new starship design and combat system.

Book 5′s ship design and combat system grew into a game unto itself. GDW held annual tournaments to see who could build the best Trillion Credit Squadron.

The last piece of the puzzle was a system for designing vehicles and weapons.  Striker, in 1981, filled that gap. We never adopted the Striker combat rules, sticking instead to AHL.

Book 6 – Scouts, in 1983, finally turned scouts into a first-class character. It also had a detailed solar-system generation system that cried out to be converted to a computer program. Many people did so. Including me.

There was a wealth of other supplementary material, both official and otherwise. Dragon magazine published an alternate character generation system that I admired. It used no dice, and had players allocating points for attributes and skills.

By 1983, it was obvious that no two gaming groups were playing the same game of Traveller. This was a problem for the brand, though not for me. My core gaming years skidded gently to a halt after that year. For me, and probably for the rest of my life, ECT, as I defined it above, is the pinnacle of gaming.

Traveller, part 1

Traveller is a role playing game. I had a relationship with it. This is my story.

 

My story begins in the summer of 1979, when I was 14 years old. I was already a nascent wargamer.

I was obsessed with a pulp-fiction book series called The Executioner, by Don Pendleton. The Executioner series was not high art. But, like Edgar Rice Burroughs before him, Pendleton wrote intelligently. His “Mack Bolan” character was believable, given that this was pulp-fiction. Before the Great Purge of 1988, I owned almost every one of the original 38 books.

However, this is not a post about the The Executioner series. It is about Traveller.

I’m not sure when I bought Traveller. I know that I bought a game called Top Secret early that summer. Back then, the internet did not exist. There were exactly three places for a 14-year-old boy to buy a modern wargame: Toys R Us, Tower Records, and  my Friendly Local Game Store (FLGS).  I spotted Top Secret at Toys R Us.

Top Secret, according to the back cover, had complete rules for personal combat. This was exactly what I needed to for my imagined Executioner game! It was also a “role playing game”, which I did not understand at all.

So I bought this game and shut myself up for a few days. I ginned up an Executioner scenario, using the as-advertised personal combat rules. Life was good.

At some point, I let on to my friend Rick that I had this game. Rick was a year older than me. Although he was one of my closest friends at the time, he also had a wider network of friend his own age. Bottom line: he knew what a “role playing game” was. He grabbed my rules, and the sample mission. Before long, he was GM-ing a game of Top Secret, with me and my friend Tom as players. It was one of the most wonderful weeks of my life.

Once we exhausted the sample mission in Top Secret, we resumed our normal schedule of wargames. At some point, before the end of the summer, someone introduced Traveller. I don’t think it was me. But by the time I went to high school at the end of August, I owned a copy. I remember reading the rules in the original 3 Books during the first weeks of my freshman year.

I know that, during that freshman semester, we played a good bit of classic, Classic Traveller. The meaning of the of the double “classic” will become clear in later posts. I’m not sure when we ascended from Classic Traveller to Enhanced Classic Traveller. And if you think that I am splitting a hair… Stay tuned….

 

Javascript multi-line string idiom

Javascript lacks support for multi-line strings. An obvious omission that will finally be corrected in ES6. But until that great day…

We could use the escaped newline trick:

var foo = "all good men \
must come \
to the aid of the party";

That is fraught with peril. Best to avoid it.

So  we fall back to concatenation:

var foo = "";
foo += "all good men ";
foo += "must come ";
foo += "to the aid of the party";

That’s what I used forever, until this hit me today:

var foo = [
  'all good men',
  'must come',
  'to the aid of the party'
].join(' ');

It reads nicely. Less typing. You can join on newline, space, or whatever. Insert another line easily.

In a word: elegant.

I’m using this until ES6 is real.

To be clear: not claiming original scholarship. It hit me today. Probably hit someone else long ago. They are bad at publicity, so it was new to me. Rock on!

 

 

A year without BabyCenter

jekyll-hyde

This time last year, I took a last long walk down 4th Street to the Powell Street BART station.

I worked at BabyCenter for 9 1/2 years. A long time! Time enough in a man’s life to be significant. Long enough to deserve a blog post.

When I left, I was full of raw emotion. I told myself not to blog about it for a year. I wanted perspective. Space. Good idea!

I still think about BabyCenter a lot. Too much. I wish it was safely behind me by now. Time does heal all wounds. But you need a lot of it. A year, clearly, is not enough.

Wounds? Well… When I left, I had reasons. A year later… Let’s say this: I had reasons for leaving. They were valid. I am happy now. It’s all good.

Other thoughts:

  • I miss the high-quality people. Something about BabyCenter attracted high-quality people. Some left, some stayed. I really appreciated working with all of them.

BabyCenter is in the heart of the SOMA startup community. But the staff is composed of people who don’t want to be at startups. Older, experienced, professional, serious about the craft. We didn’t have a programmer under 30. No one wanted to work overtime. But no one wanted the business to suffer either. There is a balance. The staff at BabyCenter grokked that balance. (er… mostly)

  • Not everyone was great. I danced on more than a few graves. That’s part of the fun though. I out-lasted those losers, and told bawdy stories about them at the bar.

  • You can’t go back. I ran into an old colleague one day, on the way to work. He’d been gone for just a year, yet most of the people he worked with had left as well.  It was a sobering realization. Last month, I talked to another colleague, one who kept in touch. It turns out that a bunch of significant people left in the last year.  I’m not minimizing the friends who remain. It’s just that it wouldn’t be the same if I went back now.

  • We were really, really good at process. I wish my current day job was half as good. At the same time, we became slaves to that process. We started worshiping the rules, and not the meaning behind the rules. We turned into a software factory. I never want to work at a factory again.

  • I learned a ton, from outstanding people. And I learned a bit from ridiculous people. The ridiculous people make great cocktail-party stories. But I love those outstanding people. They made the whole thing great.

  • Before BabyCenter, I was an arrogant SOB. I was the smartest guy in every room. Or close enough for hand-grenades. I had friends and admirers, sure. But also enemies. Enemies wore on my mind. When I joined BabyCenter, I made a conscious decision to re-invent myself as a nice, accommodating person. Enemy free! Mission accomplished, I think. The problem is, I was wearing a mask, playing a role. Every day for a decade. It wears on you. When I left, one of the things I hoped to accomplish is a reconciliation between my Jekyll and my Hyde. Can I be nice, but also awesome? So far, so good. Still working on it…

BabyCenter made me a better person.

“If you have an enemy, do not requite him evil with good, for that would put him to shame. Rather prove that he did you some good.” (Nietzsche – Zarathustra – p.180 of Kaufmann’s Portable Nietzsche)

 

Farewell Netbeans. I’m with Webstorm now.

I switched to Netbeans back when they rolled out “experimental” php support. This was in the summer of 2008.  I saw the php stuff demoed at CommunityOne that year. I downloaded the alpha/beta, and was blown away. Not just by the php stuff. It also had great javascript support.

For my money ($0), Netbeans was the hands-down best web development IDE from 2008-2014. I was programming in both php and javascript during that time. But even if I was only using what came to called the HTML5 stack (javascript/css/html), Netbeans was still the best.

That ended this year.

Netbeans 8 was released, and I enthusiastically installed it. It adds some useful stuff to php and javascript, no doubt. But with respect to javascript particularly, it is lagging. Javascript is moving super-fast these days. Hard for any team to keep up. Most editor/IDE teams don’t really try.

Obviously, the Netbeans team focused their efforts on integrating Java 8 into Neatbeans 8. Of course they did. I understand the politics.

The problem is, the published roadmap doesn’t show a lot of love for javascript. And, as I said, javascript is moving fast these days. If you don’t have rich support for nodejs development, you are missing the boat. Netbeans has abandoned the chase.

So, dear Netbeans, it’s not you, it’s me.  I’ve changed. I’ve grown. I’m not the same programmer I was in 2008.

For one thing, I haven’t programmed in php for a year now. What?! Yeah, just last year I saw php as a long-term, future-proof skill. I changed my mind about that.

On the enthusiastic recommendation of a colleague, I tried out Webstorm. It has a very reasonable licensing/pricing scheme. I figured if I fall in love with it, it won’t cost me much. I installed the trial.

After more than a month, here’s what I’ve found:

* Webstorm is more stable than Netbeans. Honestly, Netbeans and I were in an abusive relationship. Netbeans would crash. Netbeans would suddenly turn into a resource hog. When I shut down Netbeans with a force-quit, it forgot all my tabs. All my tabs! I must have upgraded a dozen times, but Netbeans never, ever, remembered my tabs after a force-quit. Shame on you Netbeans.

* Webstorm  does everything Netbeans does, mostly as well. Laments: The keyboard shortcuts are different, which is a major drag. Renaming a file is weirdly hard. Renaming javascript variables is essentially unsupported.  And Webstorm insists on spawning a whole new window to open a different project. These are problems.

* But Webstorm supports Grunt tasks, and nodejs debugging. And the next version, due in 6 months, will have Gulp tasks. When I add a file to a folder outside the IDE, it shows up instantly, which never happened in Netbeans.

In the end, I bought a license. I use Webstorm every day now. I would recommend it to any HTML5 or nodejs developer.

So long Netbeans. Good luck. We’ll always have Paris.

 

Where does the time go?

There are 168 hours in a week. (7 x 24).

I sleep 63 hours. 105 hours.

I work 40 hours. 65 hours.

I spend 5 hours each week getting up, getting ready, and leaving for work. 60 hours.

I commute 5 hours each week. (Pretty sweet, eh?). 55 hours.

I spend 10 (non-work) hours eating each week. 45 hours.

At least 20% of the remaining time, I am so tired all I can do is watch TV or surf the web. 36 hours.

So… I have 36 free, awake (but non-contiguous) hours each week. Where does that time go? Stay tuned….

 

 

 

The “right” way to javascript

I try to avoid arguments about curly braces, variable names, and other low-level code practices. But when it comes to javascript, I do have opinions.

Consider adopting the jQuery Style Guide. I don’t observe every last bit of it, but I’d be willing to conform for the sake of consistency with the rest of a team.

Here is my own style as per jsCode.org. (Hint: If the code sample looks ugly, try reloading.) You can generate your own style at jsCode.org. It would be fun to compare and contrast.

In particular, variable names should be camelCase. They should only have initial caps if they are a constructor function.

I don’t care how you indent, as long as you do. My editor automatically converts to 2-space indentation when I open a file. But I am sympathetic to other styles.

Opening curly braces do not get their own lines. Sorry. First, the javascript community has overwhelmingly adopted the “same-line” convention. Second, this. Please save “separate-line” style for the days you write java.

“if” and “for” bodies must be wrapped in curly braces. Javascript is not python.  If you omit curly braces: 1) I will have to read your code very, very slowly to understand it. 2) We can never minify your code safely. Do the right thing.

Use jshint to check your code. There are some arguable warnings, but try to fix as many as possible.

Think hard about globals. Jshint flags them. You should be able to defend every global it surfaces.

Use the array iterator functions: forEach, map, reduce, and filter. Next time you are about to write another “for” loop, ask yourself if you could use an array iterator.

Consider using an IDE. It will flag many javascript issues before you get a chance to check in.