Hacker School, Tuesday, June 17th, 2014


I have been eating out a little more often than I'd like, given my money constraints, and given that I'm normally very careful about what I eat. I'm on a fairly strict carnivorous diet, and most days I typically don't even eat plants in the form of spices. Coffee is my plant extract vice.

When I first got to Hacker School, I brought along an electric egg steamer, and I've had steamed eggs (which are indistinguishable from boiled eggs) as part or all of my food intake almost every day. However, I ran out of eggs on Monday, and I accidentally navigated past the egg store on the way to the office, and so I decided not to bother with them until the next day.

Having no food near, and work to do, resulted in my not desiring to eat until around 3 o'clock. This is normal on a ketogenic diet. (A carnivorous diet is usually ketogenic as a side-effect of the lack of carbohydrate.) On a ketogenic diet, your blood sugar gets decoupled from your food intake, and is generated on demand by the liver, so most people can fast for long periods without energy disturbances. Ketogenic endurance athletes don't even "hit the wall".

Upon going outside, I found I had the strong urge to run. This is not usual for me. The first time it happened was when I first started my current diet, but it still doesn't happen very often. And yet, this was the second time this has happened here, and the other time I had also not eaten until mid-afternoon. So I went for it. It was a short run, and a slow run. I'm no athlete, really. But it felt good.

My guess about what is going on is that the increased length of fasting is helping me get into deeper ketosis, thereby releasing more energy. I typically eat large amounts of protein, which can inhibit deep ketosis, and when I have measured, my ketosis levels are often barely detectable. So I'm happy about this development, because deeper ketosis has been a goal of mine for a long time!


I feel like I'm getting into a good rhythm with goal setting and goal meeting. The things I worked on on Tuesday are continuations from Monday, and although I'm still at the steep part of the learning curve, it's not so steep as to prevent progress. It's a sweet spot to be in, because I want the learning to be as hard as I can take it. My son's chess coach, in response to the question of how difficult the games you should play to get better should be says: Lose as many games as your ego can bear.

I've noticed that I consistently list more things than I actually get through, and this bothered me at first. I've decided it's ok. It gives me some flexibility, without confronting the overwhelming choice of my entire Posssible Projects List at every turn.


I got through the problems I planned for Haskell, and was very pleased about writing one of the answers completely as a composition. I think I'm in love.

I made several small commits to protagonist, and learned a lot of Factor along the way. I did have a bug at one point that took me a while to find. The error message and stack trace didn't make sense to me, and I finally found the error by inspecting the changes I had made since the previous commit. I had been about to go on, but Zooko asked me "Well what was the compiler trying to do when it got to that mistake?"

This was a revelation for me. Some of the people I admire most here are those who delve into the internals of programming languages to deeply understand the behaviour. I can certainly appreciate, first of all the pleasure of that understanding, and second the utility of it when something doesn't work. However, my impulse when I am working on a task is often to understand only what I need to to get through the task. And of course, it doesn't necessarily make sense to try to understand the entire compiler workings before writing any code.

The difference here was that I had an opportunity that I almost missed! Now that I knew what the bug was, I could go back and decrypt the error messages in light of my knowledge. So I poked around the REPL a bit to replicate the error more minimally, and I plan to write about what I learned doing that next time.

Here are the details of my plan and actual.


  • Learning Haskell:
  • Protagonist:
    • Get help with the compile error I'm currently stuck on in the minimal test.
    • Write a test for add_tag. This will involve figuring out how to parse the command line from Factor.
  • Tahoe-LAFS:
    • Complete the first draft of my design proposal and ask Zooko to proofread it before I put it on the dev list.
  • Rust:
    • Tuesday night is Rust date night with Zooko. Maybe we'll get to the end of the tutorial this time.


  • Haskell:

    • Did the exercises I planned to.
    • I got really excited after solving problem 4 in one line using point-free style and a lambda. It was really beautiful!
    • (Spoiler!) The line was

    validate = (\x -> mod x 10 == 0) . sumDigits . doubleEveryOther . toDigits
    • The only way that that could be more beautiful, in my opinion, is if the operators went in postfix order. Then you could read it left to right and it would look imperative. I think this may be one of the design motivations of Twisted callback chains being written on a stack. On that note, time to move to Factor.
  • Factor / Protagonist


The community here at Hacker School is wonderful. I have set it so that notices pop up constantly in my peripheral vision from the Zulip chat, and I love to see people geeking out about various things all day. Even topics as contentious as type systems are handled with respect. I love to see what people are working on and discussing, even if it is over my head, or in a language I know nothing about. Tom's GitHub commit tracker is especially fun when working on your own, because it's a way of saying "I'm here", even if you don't have a question to ask or an opinion on a current topic.