Showing posts from 2015

2015 Year in Review

Here's my take on tech trends in 2015 and predictions for 2016.

Personal trends in 2015. I started using Twitter, following a mix of optimistic tech bloggers, economists and comic-book artists. Always something interesting to read. I don't tweet much. (Nothing to say :-P)Podcasts. I'm following a bunch of tech, gamer, and comedy podcasts. I especially like The Voicemail, Accidental Tech Podcast, Melton, and Guys we F*cked (NSFW) .I switched to a large-sized iPhone 6s+. The big screen is great.I stopped maintaining my "Terminal Emulator for Android" program, because I lost interest in the idea of an on-device terminal emulator for Android. (And I lost interest in maintaining the project in the face of frequent Android UX and build system churn.) Open Source I've been doing less open-source software work than in previous years. My OSS work has been driven by emotion and "hack value". This year I haven't come up with any ideas that were exciting eno…

Family IT Information, end-of-year edition

Just an update on my family IT use.

The T-Mobile family plan has worked great for us. T-Mobile's plans are nice for us because: The third, fourth, and fifth lines are only $10 / month.When the paid-for data is exhausted, the plans automatically switch over to unlimited free low-speed data for the rest of the month.Streaming music doesn't count against the data caps.Free phone calls, texts, and low-speed data in Canada and Taiwan. (It was great using Google Maps to get around Vancouver. I was using many short cuts that I didn't know about when I was navigating using paper maps.)For the last 3 months of 2015 T-Mobile had a special where they gave everyone unlimited high-speed data for free. I ended up getting used iPhone 5s's for all my kids. I had the kids pick their own otterbox commuter cases. 
My son was initially frustrated at having to give up his rooted and customized Android phone for the smaller, less customizable iPhone. He's grown used to it, and likes it n…

Happiest recent purchases

A few products that made my summer family travels happier:
Photive 6 port Desktop USB Charger.
Anker 4-port USB car cigaret lighter charger.
Car vent phone holder (don't remember the brand.)
Short stereo audio cable. It's ghetto compared to bluetooth, but more reliable.

Family Computers, 2015 edition

As summer draws to a close, I am planning my family's computer use for the 2015-2016 school year.

My plans for this year are:
Each family member gets their own mobile phone and laptop.We also have a shared desktop and a few shared tablets.Shared network scanner/laser printer.We print color documents and pictures at the library or at the drugstore.Android TV for shared movie watching.Chromecast for audio sharing.Comcast Business InternetApple Time Capsule for backup / WiFi / NAT Note the lack of a dedicated game console. The kids play games on mobile, tablets, and laptops (for Minecraft specifically!).
My two youngest kids are getting their first phones this year. I'm worried about their phones getting lost, broken, or stolen. So for the first six months my kids will use hand-me-down phones. After they've learned to take care of phones, I'm going to give them better phones. (Still used, though!)
To achieve my plan I need to buy one laptop and three mobile phones. For the…

There's (Already) an App for That

Story of my hobby hacking life these days:

Think of an idea for a small application to write to learn a new technology and incidentally make my life better.Prototype the app.Plan a MVP, estimate costs in time and money to develop.Search Play Market and/or IOS App Store, find that reasonable equivalent already exists, and is only $2.Buy the existing app, get on with life. This happened to me last week with the concept of a "comic book reader". I wrote a prototype that let me browse my collection. I was starting to list out all the features I needed to add (zooming, panning, sorting,RAR archive support...). And then I did a web search for comic book reader, spent a couple of minutes reading reviews, and bought one of the popular ones for $2. Sure it's got UI issues, and bugs, and doesn't quite work like it should, but I saved myself weeks of development time.
I need to think through how best to spend my hacking time in today's world of super abundance. What's my…

Pixar Non-Commercial Renderman for OS X

Pixar released their Non Commercial version of Renderman. Woo! Hurray for patent expiration dates!

If you don't have Maya and you do have Mac and you just want to play with the command-line version, you have to jump through several hoops:

You need to install XQuartz before trying to install Renderman. (Otherwise the Renderman installer will fail.)

You need to copy /Applications/Pixar/RenderManProServer-19.0/etc/rendermn.ini to ~/.rendermn.ini  (Note the added "." in the front.)
You need to edit .rendermn.ini to add the line

    /licenseserver    ${RMANTREE}/../pixar.license

You need to add these lines to your bashrc (or equivalent, depending on your shell.) 
(Found on

export RMANTREE=/Applications/Pixar/RenderManProServer-19.0/ export DYLD_LIBRARY_PATH=/Applications/Pixar/RenderManProServer-19.0/lib/ export RMANFB=it export export PATH=$PATH:$RMANTREE/bin:$RMSTREE/bin/$RMSTREE/bin/

An Update on "Terminal Emulator for Android" development

I am shutting down "Terminal Emulator for Android" development again.

Why am I doing this?

I have lost interest in the core idea of an on-device terminal emulator.Maintaining project, even in its mostly stable state, is taking up too much of my time.I do not want to give control of the app to other developers, for fear that they will ruin the app by adding bugs, ads, in-app purchases, or malware.
What this means:

I will make one or two more releases based on the current source tree. (Which has a few small bug fixes.)I will be closing all open bugs as "won't fix".I will be rejecting all future pull requests.
What you should do:

If you're a user, the app will continue to be available in its current state.If you're a developer, you are welcome to fork the app to start your own version. Maybe get together with other developers and make something great!

Crash Bandicoot Dev on rendering techniques

As seen on Hacker News:

dmbaggett1 hour ago
Maybe Andy forgot to mention it; it's been a while since I've read the whole series. The code was C and lisp so it didn't really require any effort to port other than replacing the rendering pipeline. And we used the SGIs to pre-render every frame anyway, to precompute the polygon sort order. (The PS1 had no Z-buffer, so you were stuck sorting polygons at run-time if you didn't do something clever.) So we already had the rendering pipeline ported. Obviously you couldn't save your game to the memory card, etc. -- some stuff didn't work. But the game was playable (albeit very frustrating with keyboard controls). reply marktangotango49 minutes ago
That blows my mind, I always assumed it did have a z buffer. So what did you guys do to remedy 'z fighting' triangles? My interest is; I wrote a 3d renderer in Java using fillPolygon() many years ago, and used polygon sorting in place of a z buffer. Z fighting was of course a…

Run a Minecraft Server on OSX Boot2Docker

Run a Minecraft Server on OSX Boot2Docker Here's how I did it. I hope you find it useful! One-time Setup Do these steps once, to initialize Boot2Docker:
Step 1: Install Docker for OS X

Step 2: Create a directory to hold your Minecraft files. This needs to be under the /Users part of your file system because boot2docker automatically mounts /Users to the boot2docker-vm.

mkdir /Users/yourname/minecraft/data

Step 3: Initialize boot2docker

boot2docker init

Step 4: Forward the TCP port Minecraft uses from the Mac to the boot2docker-vm.

  VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port25565,tcp,,25565,,25565";
Start Minecraft Do these steps every time you want to start your Minecraft server.
Step 1: Start boot2docker.
 boot2docker start

Step 2: Set up the shell variables so you can use the docker command.

 $(boot2docker shellinit)
Step 3: Run the minecraft container.
CONTAINER=$(docker run -v /Users/yourname/minecraft/data:/data -d -e EULA=TRUE -e VERSION=LATEST -p …

"Masters of Doom"

I've been reading the book Masters of Doom about the careers of John Carmack and John Romero. I have ported their games Doom and Quake to manydifferentplatforms. It was interesting to read about their lives and game business.

The book brought back memories of development in the '80's, and '90s. Things were simpler (and worse) then.

Some other John & John links:

The Rise and Fall of Ion Storm
Stormy Weather

Carmack QuakeCon Keynotes

Reverse engineering my own game

I've long-since misplaced the source code to my Atari 800 game Dandy Dungeon. But thanks to the Atari800MacX emulator and the emulation scene, I've been able to play an emulated version of my original game. That's been helpful for remembering all the little details of gameplay.

For example, I was able to determine that the original game animated the arrows at 15 Hz and the players and monsters at 7.5 Hz.

FWIW I think the emulator may be slightly incorrect about the HBLANK processing emulation. I'm pretty sure that the color background for the 4th line of text should be a different color from the color background of the 3rd line of text.

The iOS version of the game is progressing -- the dual thumbstick virtual controls work well.

The next step (and it's a big one) is going to be multiplayer support. GameKit here I come.

Fun with shaders

There are a total of 3 draw calls and 2 textures in this scene:

The whole tile map is rendered as a single draw call: a single 2-triangle tile that's instanced Row x Column times, using a 3D texture as a texture atlas. I originally used point sprites, but switched to instanced triangles because I wanted to use non-square tiles.

The virtual joystick is rendered as two coarse triangle strip rings, using a 1D radial texture. Note the anti aliasing. (I could have used quads, but wanted to minimize overdraw.)

So far Metal has been fairly straightforward to use, at least for someone like me coming from a DirectX 9 / Xbox 360 / Android OpenGL ES 2.0 background.

3*(N+1) Devices for N People

At my house we are trending towards having N+1 laptops for N people, because (a) I need to keep my work laptop separate from my home laptop, and (b) frequently everyone in the family wants to use their laptops at the same time.
The same goes for tablets, and when the kids are old enough to have phones I expect it will be the same for phones.
I tried using multi-user accounts on shared family tablets and laptops, but ended up assigning each kid their own devices. It was simpler from an account management point of view, and the kids like personalizing their devices with stickers and cases.
Having assigned devices also makes it easier to give different Internet and gaming privileges to different kids, depending on age and maturity.
A downside of assigned devices is that not all the devices have the same features. People complain about hand-me-down devices, as well as the perverse incentive created when an accidentally broken device is replaced by a brand new, better device.

Letting go of the Web and Embracing Mobile

When I started working on Android in 2007, I had never owned a mobile phone. When Andy Rubin heard this, he looked at me, grinned, and said "man, you're on the wrong project!"

But actually, being late to mobile worked out well. In the early days of Android the daily build was rough. Our Sooner and G1 prototypes often wouldn't work reliably as phones, and that drove the other Android developers crazy. But since I was not yet relying on a mobile phone, it didn't bother me much.

Seven years later, mobile's eaten the world. But I still haven't internalized what that means. I think I'm still too personal-computer-centric in my thinking and my planning.

Here's some recent changes that I'm still trying to come to grips with:

Android and iOS are the important client operating systems. The web is now a legacy system.Containerized Linux is the important server operating system. Everything else is legacy.OS X is the important programmer's desktop OS (…

Game Programming Patterns Book

I've been reading Game Programming Patterns by Bob Nystrom.

It's available to read online for free, as well as for purchase in a variety of formats.

A good book for people who are writing a video game engine. I found myself agreeing with pretty much everything in this book.

Note - this book is about internal software design. It's not about game design, or graphics, physics, audio, input, monetization strategies, etc. So you won't be able to write a hit video game after reading this book. But if you happen to be writing an engine for a video game, this book will help you write a better one.

Edit -- and I've finished reading it. It was a quick read, but a good one. I consider myself an intermediate level game developer. I've written a few simple games and I've worked on several other games. (For example, I've ported Quake to many different computers over the years.)

For me the most educational chapters were Game Loop and Component, although Bytecode and D…

What I was up to 2012-2014

It's been a while since my last post -- I've been posting inside the Google internal ecosystem, but haven't posted much publicly.

What have I been up to in the past 3 years?


Prototyped a Dart runtime for Android. Amusingly enough, this involved almost no Dart code. It was 90% Python coding (wrangling Gyp build system scripts) and 10% C++ coding (calling the Dart VM).

Extended the Audio players for Google Play Music's Web client. I learned ActionScript, the Closure dialect of JavaScript, and HTML5 Audio APIs (Web Audio and EME.)

Started working on the Google Play Music iOS client.  I learned Objective C, Swift, iOS and Sqlite.

Personal Projects

Prototyped a Go language runtime for Android. Unpublished, but luckily the Go team is picking up the slack.

Finished working on Terminal Emulator for Android. I'm keeping it on life support, but no new features.

Personal Life

Started exercising again after a 10 year hiatus. It's good to get back into shape.

Switched to …