Monday, July 06, 2015

Tetris Over SSH

I wanted to try out Google Compute Engine, but I wanted to build something other than a simple web app. Hence, I setup a virtual server that runs tetris when you log into it, and I gave everyone the credentials :)

$ ssh -o UserKnownHostsFile=/dev/null -o CheckHostIP=no -o StrictHostKeyChecking=no tetris@104.154.80.84 # Password: tetris

Here's the code. I set it up so that gotetris is the login shell, and the user doesn't have permissions to modify any files. Hence, it should be relatively safe to share with the world ;)

Friday, May 29, 2015

Go

I finished reading "A Tour of Go", "Effective Go", and the entire language specification.

They were very well-written. My brain hurts ;)


Tuesday, May 26, 2015

Tetris Written in Go

I implemented a console-based version of Tetris in Go.

In general, it was a pleasant experience. I made use of the termbox-go library for console graphics, and it was enjoyable as well.

I've been reading a lot of blog posts recently about Go, and I think this blog post is the one that captures my opinions best. It's also a treasure trove of useful links to various other blog posts and tidbits.

Anyway, as I said, it was a fun experience :)


Saturday, May 16, 2015

Go: A Surprising Edge Case Concerning append and Slice Aliasing

In Go, the append function reallocates the underlying array if there's no more room. Hence, if you have two slices that point to the same array, after you append to one of the slices, the other slice may or may not point to the same array. This can lead to some unexpected behavior:

package main

import "fmt"

func main() {
 // Create a slice of length 1 and capacity 2.
 a := make([]int, 1, 2)

 // b "aliases" a
 b := a

 // If I set something in a, you see it in b.
 a[0] = 1
 fmt.Println(a[0], b[0]) // Prints 1 1; they're equal.

 // append returns a new slice, but with the same array.
 // Hence, if I set something in a, you still see it in b.
 a = append(a, 2)
 a[0] = 2
 fmt.Println(a[0], b[0]) // Prints 2 2; they're equal.

 // I'm doing the same thing as last time. However, this time,
 // append has to allocate a new array because there's not enough
 // space. Hence, if I set something in a, you don't see it in b.
 a = append(a, 3)
 a[0] = 3
 fmt.Println(a[0], b[0]) // Prints 3 2; they're *not* equal.
}

Having multiple aliases to the same mutable data can lead to some subtle behavior and lots of bugs if you're not careful. It's perhaps even more surprising to the naive reader since a and b don't look like pointers. In fact, they're not. They're slices which are a value type that have a pointer within them.

Immutable data structures (like lists in Lisp) don't have these issues. However, you lose some of the performance that a raw array can provide.


Saturday, May 02, 2015

Books: Getting More: How You Can Negotiate to Succeed in Work and Life

I finally finished Getting More: How to Negotiate to Achieve Your Goals in the Real World. It was one of the most influential books I've ever read. It has impacted every area of my life!

Saturday, November 29, 2014

Monday, November 10, 2014

Play Framework Essentials, Learning Scala, and Functional Programming Principles in Scala

I've been really busy over the last six months or so:

First, I was a technical editor for Play Framework Essentials. It's a fun book because every example is first shown in Scala and then in Java, which makes it kind of a Rosetta Stone for the two languages.

Then, I was a technical editor for Learning Scala. That was a great book! Jason did a great job making a really complex language very approachable. This wasn't the first book I've read on Scala, but it's certainly one of my favorites!

Finally, I took Martin Odersky's class on Coursera, Functional Programming Principles in Scala. I really liked that as well because it gave me a much stronger grasp of functional programming fundamentals. Furthermore, I participated in a study group at Twitter, which made the whole experience much more rewarding.

My hope is that I'll get to the point where I can teach a few Scala classes at work. Hence, I've been working my butt off two hours a day on BART and a couple hours on Saturdays in order to get up to speed with Scala. I still haven't written anything large, but at least I'm feeling a lot more comfortable with it these days.