Starting a todo app: part 2, technologies

Last week, I wrote about my desire to make a todo app. this week, I’m going to talk about the technologies I’m using and what I think so far.

Currently, I’m building this app on the following technologies:

  • C#
  • Azure
  • DocumentDB
  • Xamarin

Notice any pattern? I am a giant Microsoft shill. My career focuses on Microsoft SQL server and Power BI, so It’s in my best interest to learn surrounding technologies.

Of course Microsoft keeps doing weird things like including Git in Visual Studio, or putting SQL Server on Linux. So the surrounding technologies get a big broader these days.


I really like C#, but I don’t feel like I “get it” just yet. I think it’s clean and understandable as a language, but it feels like 80% of the language is learning about random libraries and classes. And if you don’t know that Microsoft.Azure.Client.Document.UriFactory exists and you need it, then you are out of luck. It just doesn’t feel as discoverable as it should.

In contrast, when I worked with Python, I felt like everything was laid out in orderly modules and it was easy to fit it all in your head. When they said the batteries were included, I felt like you could count all the batteries.

Maybe the work I did with python was just simpler, maybe C# has a richer set of standard libraries. I’m really not sure. I just wish I knew when C# would really click for me.

I’m really excited that they combined Web Forms, MVC and WebAPI into one project type. You can even gracefully add them after the fact. However, your Global.asax.cs may look like this as a result.


I can’t say I have a good idea when to choose between one or the other within a project. It seems like 3 very different modes of working and routing.


Azure is to today what virtualization was 5 years ago. The cloud is just going to keep getting bigger and bigger and bigger. If you aren’t learning about it now, you are going to be very remiss about it 5 years from now.

Unfortunately most of us don’t have a need for cloud hosting. You probably don’t have a need for your own personal Azure Active Directory or Hadoop Cluster. So a lot of times, that means doing projects and labs to learn it preemptively. If you are waiting until it comes up at work, it’s going to be too late.


DocumentDB is… interesting. Brent Ozar mentioned that he is using NoSQL for a new project. He picked Amazon DynamoDB over DocumentDB. I’m picking DocumentDB as a way to learn Azure.

So, why go the NoSQL route? Partly it’s something new to learn, but there are a couple of advantages. I think Document databases when you want to store lists of things or hierarchical data. In my app, I have lists for times of day, task categories, and tools/contexts. I want to be able to do filtering on these things, which can be clunky in SQL.

Things I like

Some other things I like so far are the dynamic schema, dynamic serialization, and TTL. Normally I appreciate have a well-defined structure to my data. However, this is a design that’s constantly evolving and changing. It’s hard to plan it up front. With Document DB, I can add a field to my model class in C#, set a good default, and that’s it. Now I have a due date field

The other thing I like so far is the TTL feature. I can mark completed tasks with a ttl of a week. Then, if I don’t touch them for  a week, they will self-destruct. That is a really cool feature.

Things I don’t like

One of my big pet peeves with DocumentDB is that collections are billing containers not logical containers. This to me just seems silly. If I want to have different types of objects, such as summary data, I have to store them all in the same place or pay 2-4x as much. That approach feels really messy.

Another thing that’s an issues is case sensitivity.  Because it’s a dynamic schema, if I get a column name wrong, it won’t tell me I screwed up. So I have to remember if my columns start with a capital or not. Also, if I do a contains I have to get the case right for that as well. This is more of a mindset shift than an actual issue with Document DB.

Finally, because it’s JSON there isn’t a date standard. C# does a great job of serializing and deserializing things. However, if I want to store the dates in a human writable way, I have to find another option. For all of my pure dates I’ve been using an integer for now. So September 11th would be 20160911. It requires an extra step to convert or add days to a date, but at least it’s easy to edit. Additionally, because it’s an int, it allows for range filtering.


Xamarin technology is pretty exciting. I absolutely love the idea of being able to write C# and deploy it to a bunch of platforms. It’s especially exciting because my phone is a great place to run a todo app.

That being said, if understanding C# is difficult, then understanding C# that’s a thin wrapper on Java is even worse. I am finding the learning curve on Xamarin to be a bit difficult.

Starting a personal todo app

Todo apps and gamificiation

Todo apps have been done to death. If you go on Google Play, there’s at least 200 of them. There’s even a website that uses todo app tutorials to compare Javascript frameworks.

Still, I’m a huge fan of David Allen and Getting Things Done. I love the idea of tracking all your “open loops” and the next action on everything. I love the idea of context aware lists that take into account location, time and energy.

I’m also a huge fan of gamifying your life. If video game developers can use psychological tricks to get me to play more video games, why can’t I use the same concepts to get me to be healthy and accomplish more.

A great example of this is Beeminder. It’s this really cool application where you set a goal and track the goal on a daily basis, sometimes automatically. If you don’t meet it, they take your money, and then restart with higher stakes. I love it. If there was a single startup idea I wish I had thought of, this would be it.

The problem with Beeminder is you either need to pick just a few simple goals, or you need to guarantee you have an even workload. If your day-to-day has a lot of ups and downs, it can be stressful.

Finally, I like the idea of externalizing my executive function. I seem to run into the problem of having to many things I want do to, have trouble choosing, and do none as a result. It’s very frustrating. If I can outsource that analysis paralysis, I think I would get more done.

The idea for the app

This is actually the second time I’ve tried to make a todo app. The first time had more of a gamification feel and I called it EugeneQuest. I figured if I was going to be paying someone to motivate me to do things, why not pay myself. It worked out decently well, but I mostly broke my addiction to Magic The Gathering by accident.

Despite how that went, it’s still really important to me to have personal projects. I think personal projects are the best way to learn and I’m desperate to learn C# and Azure. So I’m trying again, but focusing more on filtering tasks by time and energy. So far it seems promising.

Next week I’ll talk about the technology I’m using and what I’ve learned so far.

Jumping back into gamedev with Unity

My motivation

As I’ve been getting older, I’ve found a simple trick for introspection: look at yourself a decade ago and ask that person what makes him happy. The core parts of you, the essential parts of you, probably haven’t changed much. For me it was 3 things: boardgames, video game programming, and first-person shooters. Those are the only things that would regularly get me out of my own head.

Other things, however, have changed in the last 10 years. First, for some reason I seem to have a 1/5th of the leisure time that I used to have as a kid. Second, someone now pays me to program 8 hours a day. Suddenly, the idea of spending 2 hours every night working on video games seems onerous, burdensome. It’s just not as fun when you spend every day programming stuff.

But, as I said, your core self rarely changes. Just because you don’t have the time or energy to be passionate doesn’t change what gives you joy. Growing up is kinda like being a pokemon and going through evolutions. You are still some weird, blue turtle-monster. You just have cannons coming out of your shell now. So, I’ve been working my way back to the things that make me happy.


Adulthood. It’s like having cannons coming out of your shell.

Since I got married, I’ve started playing a boardgame every night with my wife. It’s really been beautiful to watch. It’s great seeing a hobby you thought was lost forever, come back to life. It reminds me of the signs at the Phipps Conservatory. On some of the plants they say, “I’m not dead, I’m dormant!”.


Your passions. Not dead, just dormant.

Now that boardgaming has come back to life for me, next up is reviving game development. Of course, since it’s been 7-10 years since I’ve really been into video game programming, my analogy is more like the corpse flower than the African tree grape. Oh well.

Picking an engine

One of the things I wanted to do first was find a game engine to work with. The biggest frustration point I had working with something like pyGame was that you had to build everything from scratch. It felt like one of those popular survival games where you have a rock and some flint, and you have to build a rocket launcher. A game engine is a great way to avoid all the boilerplate and focus on what makes your game unique.

There are tons of game engines out there, but just a few popular ones that come to mind. The ones I keep hearing about are Unreal Engine, Unity and GameMaker. Of the three, I would expect GameMaker the easiest to jump into, but also the most limiting.

The biggest thing it came down to was programming language. Unreal uses C++, Unity uses C# and GameMaker uses a custom scripting language. I use C# in my day to day work, and if I can learn it as a hobby, that’s a big win.

The only other big C# based engine I know of is MonoGame, which was built on the corpse of XNA Game Studio. I’ve played around with MonoGame and it seems well made, but the asset pipeline situation is frustrating. Additionally, you still have the rock-to-rocket-launcher issue just like pyGame, but not nearly as bad.

Unity has some other things going for it as well. First off, they recently announced the free version would have feature parity with the professional version. This is absolutely amazing. And until you are making $100,000 a year you don’t have to pay for the professional license.

Additionally, Microsoft also announced a partnership with Unity. This means strong support for integration with Visual Studio. Being able to take advantage of my favorite IDE is a great feature.

My progress so far

So, I’ve been working on the very first tutorial. So far I can make a sphere roll and jump around on a small.

Animation of a ball rolling around in a box

Jumping means my game is inherently better than Stanley Parable

It’s not a lot, but I can already see a lot of the power and appeal of the tooling. Additionally, the tutorials are top notch and very easy to follow. I really expected working with 3d to be a lot more intimidating.

Overall thoughts

Even after working with Unity for less than an hour, I have a few first impressions.

It’s easy to get started

The first tutorial takes just over an hour to complete. At that point you’ve created the minimal definition of a 3d game. It would probably have taken me a week to do all of that from scratch, hand writing OpenGL calls.

It’s also got a very quick debug cycle. You code something, test it, make a tweak, test it again. It’s literally as simple as hitting play on the scene. Additionally, much of the details are accessible as GUI controls. This is especially cool when it’s your own custom scripts. All public variables on your scripts become editable. You can even drag and drop, if the variable is a game object. For example, for the camera controller we drag and drop the player object.


It seems really well polished

I don’t know if there is any one thing I can point to, but overall a couple of things stick out:

  • The UI seems fairly easy to navigate.
  • There are a ton of features regarding components or physics.
  • I can see right away how I could use the power of C# instead of being limited.
  • It makes adding behavior to an object super simple. Just a few lines of code and your object is controllable.

It just seems like a quality piece of software. I’ll be interested to see how it looks after 100 hours isntead of just 1.

It’s different than what I’m used to

Unity does things very differently than I have in the past. Using components over inheritance is new to me. I can see how it makes it really easy to add behavior or functionality to entities.

Another thing is there seems to be a heavy focus on encapsulation and separation of concerns. Components have functions for the event cycle: start, update, fixedUpdate, lateUpdate, onDestroy, etc. The components know only as much as they need to, and you have to work to go outside of that. I’m used to one giant loop of logic and processing behavior manually.

My way or the highway

One of the downsides of using a framework or engine is that there is usually a “right” way to do things. The downside of having guard rails is when you want to go out of them. Working with Unity, I definitely get a vibe that there is a “Unity way” of doing things. Not in any way that is a problem at first. But I immediately have a few questions in my mind:

  • How do you determine which entities get processed first in an event? Do you have any control?
  • How do you handle mass interactions between entities?
  • What if you want to use a different physics engine?
  • What if I don’t want to use scenes?
  • What if my whole game is procedurally generated?

It’ll be interesting to see if it presents a problem or not.

Final thoughts

Overall, I’m very excited to be learning Unity and see where it takes me. It’s used by tons of indies and has a lot of potential.

Why the Raspberry Pi 2 is my main computer

So this here is my primary personal computer.


Did you miss it? I don’t blame you. It’s the exact same size as my mouse.


[Left: A multi-purpose Linux computer. Right: A logitech mouse.]

I’m using the Raspberry Pi 2 for most of my computing computing needs at home, even though I’ve got two laptops that are loads more powerful. So the question is, why would I choose the raspberry pi over a beefier Lenovo Thinkpad or HP Pavilion?

1. Because I can!

Probably the biggest reason I do it is because it feels silly. There is something just wrong about being able to run Linux on a computer I can fit into my pocket. It just shouldn’t be possible. Every time I look at the board, I think “This can’t be it.Nope, this must be a joke.”

My favorite type of poem to write is the villanelle. Largely because it’s such a pain to do. You are given a very specific set of constraints and have to work your way out. The Raspberry Pi is the same way. How much compute can you get out of a $35 computer (and $105 dollars in accessories)? It turns out a surprising amount.

2. Because I can (now)!

I tried to do this before with the regular Raspberry Pi and failed. The Model B was just below the threshold of usability.The desktop was just way too slow, and trying to use Midori to surf the web was a nightmare. On top of that, the original Model B only has 2 usb ports. So if I wanted to use keyboard, mouse and a wifi dongle, I’d have to add a usb hub.

I tried using command line only, but having lynx as your main browser is not much of an improvement. I absolutely love the command line, but I don’t want to live there. Not when I want to look up reference material or do web development.

The Pi 2 passes the threshold of usability for me. It has 4 usb ports which is one more than I need. It runs Iceweasel like a champ (except for the Azure portal Sad smile). And best of all, it has 4 cores, so the desktop can be responsive even if something else is running slow.

3. Because I surf the web too much!

It turns out that most of what I do now is in a browser. I think that’s true for a lot of people these days. That’s why you see things like the Chromebook taking off.  Once you get browsing to work, you’ve hit 80% of people’s computing needs. And as I said, Iceweasel runs very well on the Pi 2, giving me modern HTML support.

4. Because forced simplicity is good.

It’s amazing how many things you can do with a modern computer and how much crap you can install on it. I’ve definitely had the problem of being on my laptop to do Serious Things©, but instead I just surf Hacker news. With the Pi, at least I’m being intellectually honest. Either I’m surfing the web or coding something in vim. That’s it.

When I need to use iTunes, or Steam, or play around with SQL Server, I go to a different computer. As a result, my brain gets context clues about what I’m doing. If I’m on this computer I must be working on something. If I’m on my Pi I’m probably relaxing. That sense of clarity is nice.

5. Because I need to justify impulse buying.

Did you know I have 4 Raspberry Pi’s? I keep telling myself I’m going to do something with all of them but I just haven’t. There’s something sad about buying tiny little $35 dust collectors. By using the Pi as my primary computer I can tell myself that at least one of those expenses was worth it.

6. Because I want a change of pace

Finally, it’s nice to just have a change of pace. I work with the Microsoft stack all day and after a while it can get tiring. It’s nice having a completely different environment for leisure than for work. Linux on a credit card size computer is a sizable leap, for sure. This also provides me a nice way to learn Linux and diversify my skillset a bit.