Monday, September 15, 2014

Innovate on Experience, Not Features

A lot of hubbub has been circulating around the recently announced iPhone 6 and its feature set.  Firstly, most analysts point out how its not so innovative.  Second, seeing as there were 4 million pre-orders, at a measly $240 profit per phone (40% margin on a $600 unsubsidized price), that stands to net Apple a cool $1 billion in profit....on predorders.  It literally has not shipped yet but already made a billion dollars.

Here's where I think things get interesting: there's chatter about how there's nothing really all that new about what the iPhone 6 does: it has all of the features that Samsung phones do from two years ago.  And it's absolutely true: NFC has existed for 10+ years, so there's nothing new here.  Call it the Android fanboy in me that sees that on paper, it's a hilarious 1:1 match for a Samsung Galaxy Note...from 2012.

However, the innovation is not in features, it's not in specs.  Apple innovates on user experiences.  Did no one learn anything about Mac specs always being slightly behind PCs?  It wasn't about how many gigahertz the processor was clocked at, or how much RAM it sported, it was "how pleasant is this thing to use?", "how much of my time does it take to maintain?", or "what apps all come for free?"

I think the same applies to the iPhone 6:  it's not about how Android phones had NFC years ago -- they did, as did many other implementations a decade ago -- but rather the user experience sucked because no merchants really invested in accepting it.  How useful is an NFC feature if no store takes it?  Apple's innovation here is getting merchants to lean in and finally do it -- because if their competitor "works with Apple" to adopt NFC and they don't, they look terrible.  Simply by making NFC relevant again, Apple uses their bodyweight and momentum to get others to play ball....innovation without even a drop of technology.

The same goes for the other numerous "copycat" features: larger screen, messaging, apps, photos: they didn't invent this stuff, each feature has already been done, sometimes better, by another competitor.  However, the innovation isn't on the feature: it's on the software experience, and that's what competitors miss.  Messaging is simple and no where near the awfulness that is Hangouts.  Photos are easily taken and easily sync'ed (modulo being hacked) rather than depending on Google+, that you may not want.  I already mentioned NFC.  No bloatware added by the OEM.  And so on and so forth.  The features aren't new, a non-shitty software user experience is.  And that is something that competitors haven't understood for 20 years, even longer than NFC has existed.  (Affectionately known as "it just works")

I won't be buying an iPhone 6 myself -- it costs more for a phone than a laptop for crying out loud, and I live in the Google ecosystem.  But I will attest that Apple is pushing the user experience innovation forward.


Elder Scrolls Online Review

I've been a bit quiet on the blog for a while, and it's mainly because I got my hands on Elder Scrolls Online (an MMO, like World of Warcraft) for the last month or so.  But I'm now done with it.  Since it's on me to catch up on a month-plus of blogging, I'll at least start with my own personal review of ESO.

I feel like reviewing ESO is almost cliche now, since it has been reviewed a gazillion times by a gazillion people.  But I feel like I have to give an on-the-ground view of what the game is like for someone who has limited time to play:  If you can only play when your kids are asleep, is it worth it?  (perhaps I should make a series out of this kind of review?)

First, since I started up after the game launched, I did not have any of the pre-signup issues that people complained about.   That said, I had the "premium" version that let me play a Breton in the Aldmeri Dominion (Elf-land).  After creating my character and stumbling through the intro/training area,  I started hunting around and doing quests in the starting area.

First, I'm glad the quests were not of the typical MMO variety ("kill 10 bears"), which grow boring quickly.  However, quests are still mind-numbingly empty:  simply click through all the discussion-tree options, and then follow the marker on the map to whatever you need to kill or examine.  The story behind every quest is completely inconsequential -- just click through the options and you're done, who cares what they say or what the background of the problem is?  Wash, rinse, repeat.  They could fix this by simply removing the "goal marker" on the map and forcing people to read what they say.  Even those quest choices that make you choose a permanent choice (usually "do you kill this person or not") have little to no difference on results and rewards.

The options for customizing a character through the skill tree are awesome: the options go far, far beyond just what is available to your class, so you can create a bow-wielding battle-mage or a magic-wielding, mace-favoring assassin regardless of what class choice you made.  Seriously, every MMO should let you customize your character this way, rather than forcing you into 2-3 builds that work for your class.  However, having played Skyrim, I wanted a customization tree that was as deep and customizable like Skyrim's.

Crafting is ok, but confusing.  There are a lot of options, and you pick up a lot of crafting ingredients to do every craft.   But it's not clear which one you should do.  It's almost like I felt I had to do all of them because I had so many crafting ingredients.  I ended up creating a lot of my own equipment, but I also just bought a bunch from vendors.  Do I need to do this to max out my character?  Yes?  Maybe?  No?

Which brings me to one of my biggest gripes: no game-wide auction house.  I had a slew of junk that would be useful to someone else that was worthless to me.  But you have to join guilds and then sell only to guildmates who want to buy your stuff.  This is completely worthless, and provides absolutely no value to the game.  I joined guilds just to get access to sell things in their stores, not to socialize or join a group.  I ended up accumulating a stack of gold that I couldn't use to buy anything, and a stack of [crafting] items I couldn't use.  There is no need for this crap in the game, and the designers should simply do away with it.

And speaking of crap, there are bots, and many of them.  This is all over tons of articles, but it was never a big problem for me.  It was annoying getting gold-spam, but at the same time, the spam was for selling me gold I couldn't use because there was no auction house.  Why did botters/spammers choose this game to automate?  Pretty dumb.  It was fun to steal their kills, though.

I didn't get to level 50 before I started trying out PvP, but the game scales up your level.   I was lucky to choose a "campaign" of PvP where my side was winning -- I would jump into the PvP area, try to find a group, and then run to where everyone was fighting.   I liked that PvP was a viable way to earn skill points, stat points, and experience, which is rare for MMOs.  You could just not do the usual PvE experience and still get to 50.  However, I spent most, if not all, of my time in PvP running from a friendly-owned keep to a contested keep.  Die, run back to battle for 10 minutes, die, repeat. Maybe there was some point to getting lots of PvP points, but I got nothing from it, so it was lost on me.  Why would I spend my time on this?  I guess to try to gamble on more items, but what a waste of time.

There also seemed to be few people around.  I tried to do one of the earliest "group" dungeons, and I just couldn't find another living soul who wanted to do it...and I wasn't on a backwater server.   Did the entire world already level up and skip this dungeon?  It seemed so odd, considering in other MMOs (WoW) how the first group dungeon is packed and run by teams repeatedly.  I guess ESO is just a ghost town.

Beyond that, there were "little bugs" that made it hard to play.  Some characters that wouldn't follow or show up.  Switching quickslot actions sometimes wouldn't work.  Rewards for PvP were randomly worthless.  It exposes rough edges that other MMOs have smoothed out.

I didn't renew my subscription to ESO.  I don't care what happens to any of the characters in the story, and PvP is a repetitive grind at best.  There are some cool ideas within: customizing specialization paths, but under the surface, it's not all that unique of an MMO.







Thursday, July 31, 2014

First Try With Google Domains

So I got an invite to use Google Domains, which is Google's new domain registrar service.  I have to say that I'm impressed with how smooth and easy the transaction was.  I realize that it probably sounds biased coming from me, but you may want to check it out for yourself.

The search mechanism was quick and pretty straightforward -- you enter in the site name you want, and it checks the availability...very similar to other registrars.  It makes other suggestions of available names too, nothing shocking there.  I liked some .us domains, but found that you can't register them anonymously, so I went with another that seemed ok -- glennwilson.info.

However, the benefit comes from checking out.  It was smooth to just say "yep, that's it, I'm done" and put in contact/credit card info, and *poof* done.  None of the sneaky upsells or additional charges you normally see with registrars.

Then switching my blog from the standard *.blogspot.com domain over to my new domain was pretty easy too -- I just went to the blog settings, added my new domain under "Blog Address", and then went to my domain account and set up a new CNAME record.  This part was kind of awkward and I had to dig for it in the blogger documentation, and stumbled through creating an arcane DNS thingy, but it didn't take more than a few minutes to do.

Next, I might try to get an app engine instance running on the new domain to see how that works.  In the meantime, kudos to the Google Domains team for a nice product so far.

Saturday, April 26, 2014

All In on a Mac

I thought this day would never come.  After decades of swearing I hated Macs and would never own one, I finally took the plunge and got my own Macbook Pro 15".   For the majority of my lifetime, I swore I would only use "open" and easy-to-hack on (like Windows!  ha ha) systems.   At some point along the way, the value proposition changed, and a Mac became a better choice for coding, gaming, and cost of maintenance.



It wasn't like I didn't try to look at other systems.  Of course, I went straight to Chromebooks first, but knew that I would have to wipe / dualboot it to even get Linux on it, and even then, the modest computing power wouldn't be able to handle heavier applications.  On my way to the Mac counter at Best Buy, I even stopped over at the Windows laptops.  There were dozens of them, all happily running their Windows 8 kiosk-style and not another soul in sight around them -- when I touched one to try to launch the big "weather" app from Metro mode, it then went into "edit your Metro tiles" mode.  Huh?  I just wanted the weather, and clicking on this thing makes me edit my tiles.  Nope, I'm out.

Instead, I plunked down several thousand bucks and walked out with a small, thin white box.  Giddy.

One week in, I have to admit that I'm happier than ever, and I've been extremely surprised by the experience:
  • Finding applications that run on Mac is easy.  Everything I wanted to run, including IDEs I've used before, and games I was playing on my Windows Doorstop all have Mac versions.
  • It had all the "power" of Linux already in it.  I fired up a terminal and checked the version of git.  It was all ready to go out of the box.
  • Navigating around the OS was not a problem.  I always thought "I know where to find everything on a Windows/Linux machine, but not on a Mac." -- turns out, it's just a matter of running the Finder or Launcher. 
  • I was able to easily install Hearthstone and battle.net, and they ran smoothly without even making the fan run.
Even so, there have been a couple of rough edges.  The first thing I did was to reverse the two-finger inverted scroll nonsense.  The App Store concept was weird -- do I buy apps from Apple's store thingy, or just download them from somewhere else?  The number and quality of apps is questionable.  I wanted an IDE to be there, but the closest one was like $70.  Huh?   And the "app still running until you go to Menu -> Quit" is still bizarre to me.  

Anyways, it's been a helluva purchase, and it's helped me get a couple of broken-then-fixed versions of my extension out.  I'm considering my all-in bet a pretty good one so far.

Sunday, April 6, 2014

Back in the Saddle

My next 30 day challenge hasn't gone so well.  It turns out that sometimes it's easier to commit to something larger and execute on it than commit to something smaller that's easily forgotten.  Oh well, I guess I'll just hit the reset button and try something else.

In the meantime, I found out from a friend who uses my spoofer extension that it completely stopped working with Chrome 35 (dev channel).  This usually happens when Chrome changes APIs that extensions can use to do certain things, and indeed, this is what happened.  Looking through all of the chrome.* APIs I was calling, half of them were deprecated and replaced with something else.  So much for a stable development platform.

So this pushed me a bit on releasing my half-baked 1.0.30 version, that was a significant rewrite from 1.0.26.  Thanks to some very cool and helpful G+ commenters, I isolated a couple of bugs in the 1.0.30 version and knew I needed to get back on the horse and start hacking again.

But, there were several problems:  One, all of my source code was on a 5-year-old laptop that is one power supply away from being a doorstop.  Second, none of the source code is under source control.  And last, I had no error reporting in the extension at all -- it could be failing horribly and I would never know.  I set out to change that and learn new stuff along the way.

First, I set up a bitbucket account, where I could have multiple projects for free.  Usually for open-source stuff, people pick github, but I went otherwise because of (a) all of that weird BS going on around github in general, and (b) bitbucket is free.  I also started using git, and tracking / tagging / etc. the source, so that's good.  Second, I polished off an old CodeEnvy account I had and started and connected it to my bitbucket repos and started hacking online (on my Chromebook, naturally)


CodeEnvy has been surprisingly responsive and usable.  I can deploy an app engine app right from the IDE, push and pull from bitbucket, and can edit multiple languages.  I'm impressed with it so far....I daresay it might be something I'd pay for.

Lastly, I started fixing up the bugs in 1.0.30 and implemented a weak (but workable) error reporting system.  It's anonymous, and just reports how often an error occurs.  I don't have it sending anything back yet, but it's a good start.

Also, I think I made a decision on upgrading my workstation to a Macbook Pro 15".  Now, if I can just get the guts to spend $1900 on it...

Monday, March 31, 2014

Confusing Error

I've been hacking away at my extension again, based on the fact that the old version is completely broken by Chrome version 35.

One of the major operational pieces that I did not have in place is error reporting -- I relied on anecdotal error reports from users, which have typically been enough in the past.  However, with a major refactoring and rewrite, there are so many problems that can pop up, and I have no way to know if I'm causing bad regressions.

So I've been building version 1.0.31, with opt-out error reporting.  But when making the changes and firing it up for the first time, I kept seeing this error in the console:

Error in event handler for (function name here): TypeError: The first argument is the receiver and must be an object.

WTF?  It only seemed to come up when registering a callback, but I didn't change anything significant with any callbacks, I just added some error aggregation and reporting.  After struggling with finding the cause, I used the time-tested method of commenting out large blocks of code and then un-commenting until things work.  I eventually narrowed it down to this new function-class that I added:

function Error(code, message) {
  this.code = code;
  this.message = message;
}

Why would this class cause problems, it's as basic as it gets...?  And why would it cause this weird error? The only answer I could think of was that "Error" is a reserved name and declaring this function effectively overwrote it, causing all sorts of disaster.  So I renamed the class to "ErrorReport" and things worked again.

If you encounter this error, there's a chance somewhere that someone is inadvertently clobbering a "protected namespace" function...one of the wonderful joys of Javascript is the ability to shoot yourself in the foot in mysterious ways.

Sunday, March 23, 2014

Brew For You Service

Here is a quick double feature of what I'm grateful for, and some ideas I came up with:

I'm grateful for:


  • Staying in touch with good friends over 20+ years leads to some awesome (hilarious) reunions that seem like you never drifted apart.  I'm grateful for having life-long friends.
  • I'm grateful for the opportunity to get 5+ free hours to brew.   That picture below is a Belgian Wit, which I'm hoping will come out with a nice light orange-y flavor.  My feet are up on top of the mash tun.



[Bad] ideas of the day:

  • A "brew-for-you" service where you specify the recipe that you want to brew, and the service gets all the materials, brews a 5 gallon tester batch for you, and you pick it up when it's fermented and ready.  I would love this service so I could try out new recipes or tweaks without having to commit an entire afternoon of working to find out if it worked.
  • A DSP that targets mobile ads specifically at *mobile web* rather than mobile app, and detects when users are zoomed in & in a residential geolocation (i.e., at home, browsing).  Not sure if that would be all that useful.