Computer Education



Server Mungery


This & That

Tools I use


New Post Checklist

  • Commit it
  • Also push, dummy!
  • Add it to your atom feed & publish.
  • Publish it.
  • Link it into homepage
  • Tweet about it.
  • Put it on Google+
  • Send out email to the newsletter

Blog stuff

Would be nice if the literate programming stuff was in doccos style like:

I'd like to have a small fly-out when you get to the bottom of the site to subscribe to my newsletter.

I'd like to have content dynamically provide next-click actions to other articles on my site [js?]

To Rewrite

Customizing django forms
Django portfolio application
bash forgotten #1. – Its written for people who know export, but don't know how to change their prompt? Mixed audiences
server switch: light and fast?
consider removing the most used programs list. It isn't very evergreen. Perhaps restructuring it as "This is software I have at one time used."

To Write

Composition vs Inheritence code review

When/how/why to comment

Why standardize w/r/t tooling

Software Quality issues at

  1. Lack of frontend tests.
  2. Lack of selenium coverage
  3. Undocumented features, which lead to unknown regressions
  4. Complex interactions around drag / drop / sort
  5. Data loading issues w/ lazy loading & deep caching.

Master is my supported branch

A coworker of mine was writing some code that relied on Berkshelf, a tool for managing dependencies in chef cookbooks. We were using the last released version, 2.0.10, and hit a snag. No big deal: file an issue, figure out a work around, etc. It turns out the bug was fixed in version 3.0. No worries, we'll just upgrade. The problem here is that 3.0 isn't released yet. It's just the master branch. Uh oh.

This spurred a discussion around maintainership in open source code with Troy Howard. My position in this:

  1. Master is the stable version is irresponsible. // bugs, etc.
  2. A release implies support. // deprecation policy, maturity, etc
  3. Quickly evolving libraries errode confidence in tech & tightly couple you to a product release cycle. // either taking on ownership of the library, or forced to divert resources to stay current.

monitoring for an existing, semi-important system

converting an existing server to puppet/chef

Learning paths I recommend

  • Making games with python & pygame
  • Smashing Node.js (seems really good, but not an intro-to-js book)
  • Treehouse
  • Code Academy

TODO Setting up testing for node + web project

mocha runner

When / Where to mock

Do I mock django ORM calls?
Question: What are we testing here?
Suggestion: Replace "I'm mocking the …" with "Assuming X works as advertised…"

If you tell a newbie they should learn vim or emacs, you are an asshole.

Tools I use

X (with related dotfiles)
misc: ttconf, mailcap, hg, bin/{imgur,}, import

Leveling up, by bringing others together.

Personal finance for nerds

Loosely coupled systems: Money and your Job. (how I was able to leave Google to work at and live on minimum wage)


Heuristics for when to use goroutines
How to structure an app into multiple packages


Building mutual respect via transparency
  • The realization
  • My History
  • Exposure Therapy
Sales is hard: A look at the other side. (interview)
Marketing is hard: A look at the other side. (interview) Tactics: Running A Team
  # Tactics: Running a Team
  ## Welcome to is a tool for cross-functional collaboration, increasing
  transparency across your organization. This guide will help you set
  your team up for success. We'll also cover a few of the key views that
  you'll want to be aware of in the product.
  We're assuming you're coming from the management side of things and
  are also interested in using effectively for your team.
  In this guide, you'll learn about:
  - Products and how to use them
  - How to plan your iterations
  - How to track progress during iterations
  If you have any questions here, please reach out to us at
  ## Products
  ### What is a product?
  Products are's coarsest level of granularity of modeling
  your organization. Products are meant to be hard separation
  mechanisms. You can create as many as you want at no additional
  cost. They have their own internal list of users which power all of
  the autocomplete drop-downs in the app and their items are separated
  from other products' items.
  ### When does it make sense to have multiple products?
  Multiple products make sense when you have items that won't ever need
  to reference one another. A great example of this would be a web
  agency with multiple clients. The work on's website won't
  reference the tickets relevant for and vice versa. These
  will likely be worked on by entirely separate teams.
  Another reason you might want a separate product is for access
  control. You may have a top-secret internal project that not all of
  the business can be aware of. While this isn't a common occurance,
  products make a great deal of sense for this as well.
  ### How do I structure teams?
  Teams are one key area where products don't make sense. Given an
  example company with a few mobile apps, backend services and a
  frontend service, separate products would be a poor fit. This is
  because the Android team is very likely to be blocked on tickets owned
  by the backend team. Blocking and similar interactions only work
  within a single product. Instead, we suggest using tags to assign
  something to a group. Folks who are interested in these groups
  (Managers, Individual Contributors) can filter their results by this
  team name. Examples of these teams-specific tags might be "mobile" or
  ## Planning iterations
  Everyone does planning a little differently and provides
  tools to facilitate the your existing process. These tools revolve
  around prioritizing and estimating items, structuring them
  to be worked on and validating that they've been finished.
  ### The Items View
  The central place that iteration planning starts is in the Triage
  section of the Items view. This view presents the items in the Someday
  on the left and the Backlog on the right. A good way to think of these
  two columns is the the someday column represents ideas of things
  you'll get to one day and the backlog is the stuff you're going to get
  to soon. For most people, "soon" means in the upcoming iteration.
  ![ triage view][triage_view]
  You can position things in these columns vertically by drag & drop to
  indicate priority. The higher they are in the column, they more
  important they are. We do this in an effort to reduce shoulder taps
  within the organization. As a developer, when you have 2 priority #1
  tickets, you have to bug someone to see which is more important.
  ![Drag + Drop in Backlog][drag_drop]
  To facilitate altering things en masse during your planning phase, supports bulk edit functionality. This allows you to select
  multiple tickets and alter them as a group. This might be things from
  "assign these all to James" or "tag these with our current
  milestone". You can mark things for bulk edit by checking the checkbox
  in the upper right corner of the item card and make your changes at
  the top.
  ![Bulk Edit][bulk_edit]
  ### Estimation allows you to estimate tasks based on complexity using a
  t-shirt size menu. We chose t-shirt sizes because they're easily
  understandable across the organization. Most people have a fairly
  innate understanding that when I say something is an "XL" task, that
  its much different than a "M" task. We've found that the same isn't
  true if we were to say something is worth "8 points" vs "3
  points". What's the scale? Is 8 a lot? Is that big?
  ![T-shirt size menu][tshirt_sizes]
  While there are many ways to manage estimation, there are a few
  tactics our customers have found helpful.
  While there are many ways to manage estimation, one tactic that can be
  helpful is to **have the person doing the work do the
  estimation**. While technically anyone can set estimates, we've found
  them to be most accurate when filled in by the people doing the
  work. There are always little "gotchas" when it comes to estimating
  tasks and the more familiar you are with the moving parts, the better
  the chances you'll take those into consideration. A prime example of
  this is while "update the marketing copy on the website" sounds like a
  small task when I assign it to Cameron, he knows that the last time he
  had to do that it involved a lot of work because he needed to
  coordinate with translators to get it translated into 4 other
  The most important aspect of estimation is consistency, which you can
  encourage by having **benchmark tasks for a given size**. As long as
  you are consistent, will automatically adjust velocity and
  projections to match how much actual work you're getting done. To this
  end, its helpful to have benchmark tasks for given sizes so people can
  easily compare. You might say that writing a test for code you are
  very familiar with is a "S" task and a "L" task is writing a document
  explaining some proposed architecture. When you go to estimate tasks,
  you have points of comparison. How does "mock up activity feeds"
  compare to your benchmark tasks? For these two, it's probably
  somewhere between "M" and "L". Benchmarks provide a method of
  callibrating team members to an agreed upon definition of complexity
  which serves to make predictions more accurate.
  ### Grouping Tasks for work
  At, we use tags to represent many things: components,
  keywords, teams, sprints and more. This means we're very interested in
  making tagging more powerful and are receptive to any suggestions you
  have on this front. One example of making this more powerful comes
  from our global filtering UI. This allows you slice and dice the
  underlying data to find just the tickets you're interested in.
  ![Global Filter with tags][global_filter_tags]
  As a way to quickly trigger a pivot on the data, you can just click
  the tag and it will add it to your currently selected filters.
  At, we tend to coordinate iterations around specific
  tags. An example of this is "1.0", which was for our initial 1.0
  launch. Following that, we all rallied around the tag "backfill",
  which was the short list of things we didn't *quite* get in for the
  1.0 launch. Several of our customers use "sprint1", "sprint2",
  "sprint3", etc for tracking individual sprints.
  At the item-level, we use stories as points of coordination. One
  example of this is our ticket to add observer roles to the app. The
  story outlines the feature being requested, who might use it and why
  its necessary. High-level discussion for the feature happens in the
  activity feed for that story. This tends to be things like how it
  might work, which areas of the UI it might be enabled, and so on.
  ![Subtasks indicating lower level work items][story_subtasks]
  From here, we've broken the main task of a sketched out feature into
  concrete sub-tasks assigned to different people on the team. The
  design work was given to our designer, Grant, and the backend and
  frontend work was split up to the relevant folks. This has a few
  interesting implications for discussion. 
  Because Grant is assigned the design ticket, he and the creator of
  that ticket (in our case, the story author) are members of the item's
  team. The item's team, indicated on the right of the permalink page,
  shows who is interested in this ticket. People are added to this if
  they comment, explicitly click follow or are mentioned by someone else
  in the ticket. Any comments or attachments will be sent to these folks
  via email. This allows them to go back and forth with design
  iterations until they settle on something they're happy with. This
  discussion happens separately from the main ticket or any of the
  developer tickets so only the people who are interested in those
  discussions hear about them. This means the designer can trade mockups
  back and forth while the developers haggle about technical details
  without people getting emails about things they aren't interested in.
  Another discrete benefit of breaking things down into subtasks is you
  get a finer granularity on completion. If you just have one giant
  ticket called "implement bulk edit", its difficult to see where things
  sit. By looking at the subitem breakdown, you can see that design is
  done, most of the frontend work is done and the backend has yet to be
  ### Iteration Checkup
  You've gotten your sprint planned and estimated, but how can you see
  how its going?'s answer to this is our timelines view. In
  timelines, you can get an at-a-glance view into who has the most work
  assigned to them. The blocks above the avatars represent work that is
  currently in progress by that person. Things below the avatars
  represent work in the backlog that is assigned to the person. From
  this view, you can clearly see who is overloaded and who is starved
  for work.
  ![Timelines show work across your team][timelines]
  Another interesting aspect of the timeline view is the bubble in the
  top left column with a number of days. This represents how long thinks this will take to complete all the work in the
  "current" column. This is based on a 3 week rolling average of the
  size of tasks that have been completed. If your familiar with story
  points, we map our T-shirt sizes to story points on the backend for
  our calculations. If you're not familiar, its not important; Just know uses historical data to make its predictions.
  On the bottom half of the graphs, we make predictions (again, based on
  your historical data) on how far we think you'll get in the backlog in
  the next few weeks.
  [triage_view]: " Items view"
  [drag_drop]: "Drag + Drop for absolute priority in the backlog and someday columns"
  [bulk_edit]: "You can select individual tickets and change them all at once"
  [timelines]: "Timelines show team load and estimations"
  [tshirt_sizes]: "We use t-shirt sizes to indicate item complexity"
  [global_filter_tags]: "The global filter UI allows you to slice & dice your data."
  [story_subtasks]: "Subtasks are a great way to break a story into smaller parts"
  • Feedback: dcamp in IRC
    • It might be worth mentioning that products can (presumably) share users, even if they don't share project data (assuming that's actually true) Tactics: Developer Productivity
  # Tactics: Developer Productivity
  ## is for developers too! is a tool for cross-functional collaboration, which means
  helping our users communicate with each other. A key aspect of this is
  making sure everyone feels at home using the tool. For developers, we
  do this by embedding ourselves in their existing workflow so they
  don't have to change how they work, but everyone benefits.
  ## GitHub & Other SCM tools
  The central aspect of every developer's day is source
  control. uses this fact to listen in on commit messages and
  ties those back to items.
  To link a commit to a item, you can use our
  [commit syntax]( If
  you include "Refs #42" in a commit, it will post your commit message
  to item #42 and email everyone attached to the ticket. If the item is
  in the backlog, we move it to current for you. We have several forms
  of [commit syntax]() which you can use to reference, close, or re-open
  your tickets. These commands work across SVN, BitBucket, GitHub or
  which ever repository hosting you use.
  For information on how to set up with your SCM of choice,
  refer to our
  [help documentation](
  One of's goals is to reduce shoulder taps. For developers,
  this means sending commits and pull requests out to the team every
  evening at 5pm PST, so you don't have to keep updating everyone with
  daily status updates.'s activity feed is also a fanstatic
  resource for answering the "what did you do yesterday?" question.
  ![ Activity Feed][activity_feed]
  ### GitHub
  At, we love GitHub! Our love manifests itself in our
  top-notch pull request integration. Provided you've enabled the
  [ GitHub service](,
  when you create a pull request, we search the body for our
  [commit syntax]( This
  attaches an activity item to the item indicating the pull
  request has been opened. When the pull request is merged, if the pull
  request uses the "fixes" syntax, we'll close the associated ticket for
  the user automatically.
  ![ Pull Request activity][sprintly_pr]
  ## Command-line tools
  The developer community has generated a few really great auxillary
  tools for interacting with which we feel enhance the
  overall experience.
  ### Sprintly-Github
  ![ by Next Big Sound][sprintly_github_tool]
  a project by [Next Big Sound](, allows
  you to see which things you have assigned to you via the `sprintly`
  command. The tool will also hook into your github repo and listen for
  commits. If you don't specify a ticket to match your commit, it will
  prompt you for a ticket.
  ### Posh-Sprintly
  If you develop on Windows,
  [Posh-Sprintly]( hooks into
  your Windows PowerShell telling you the next ticket you can work
  on. It also allows creating new items directly from the command
  line. There's also a rather nifty feature which will auto-start
  upcoming tasks for you. When you're ready for a new task, it will
  "start" the next one in your current column. If there are no tasks in
  your current column, it will find the highest priority thing assigned
  to you in the backlog and start it for you.
  ### Sprintly-for-Alfred
  While not technically a command-line tool,
  is an [Alfred 2]( plugin which will allow
  you to start, stop, find or create tickets in A fantastic
  addition if Alfred is already part of your workflow.
  # API offers a rich API which allows you to do nearly everything
  you can in the UI. At any given time, there's probably an 80% overlap
  between the UI and the API. 10% of things are in the API and haven't
  quite made it to the frontend yet and the other 10% is in the frontend
  and hasn't made it to the backend yet. While we try to keep this as
  close to complete as possible, things move fast. If there's something
  you don't see in the API, please reach out to
  []( See our
  [API documentation](
  for more information.
  Along with our standard JSON endpoint, we also offer a
  [csv export](
  option via the API. This is really great if someone on your team wants
  to download things from into excel for additional data
  # Markdown Everywhere
  As developers, we know you have rich formatting needs. Code samples,
  images, emoji. The important stuff. That's why we support
  Github-flavored markdown in all long-form text areas.
  [activity_feed]: "'s activity feed reduces shoulder taps to keep everyone 'in the know'"
  [sprintly_pr]: " <=> GitHub Pull Request activity"
  [sprintly_github_tool]: "Sprintly-Github shows you your assigned tickets"
Item Mentions

It's important to stay in the loop on tickets that are related to the tickets you follow. To facilitate this, we've added item mentions to the activity feeds of individual items.

Watermelon Problem

I was helping a friend of mine with some engineering management questions recently. He was having issues with things shipping late. As a result of the conversation we were talking about sprint planning and I was reminded of an antecdote about fairness. What's the fairest way to split a watermelon between 2 people? You let one person cut it and let the other choose which half they want.

Its a fun antecdote, but if we break that down a bit, there are a few reasons why this works.

  1. Aligned incentives (they both want the most watermelon)
  2. Checks & Balances (if the cutter is unfair, they get less watermelon)

How do you split a watermelon evenly? Let one person cut it and the other person choose.

How do you properly balance power between PM and Eng? One decides how long things take, the other gets to set priority.

How do you quantify work item size?

Dissecting technical papers

Example path through technical papers

Practical Parsers

Computer Science for self-taught programmers


You should understand the value this book provides, why I'm qualified to tell you about it, and what you should expect from the book.

  1. Who are you?
  2. What gives you authority to talk about this?
  3. What is the value of Comp Sci?
  4. What should I expect from the book?


big O notation
  • DONE What is Big O? Why do I care?
  • DONE How can I determine the Big O of a given function?
  • What are the different classes of complexity?
    • Examples of Various Time Complexities

      There are a few time complexities that you'll come across in day-to-day work. Know that there are more, and you can find the full list on Wikipedia, but this is a minimum set to understand.

      • O(1) – Constant Time

        Constant time things, as we've discussed, are things that don't change relative to their input. This means simple things like figuring out whether two integers are equal. Lots of binary, bit-twiddly things fit into this as well. This will be important when we do hash functions later.

        Getting the minimum from a sorted array is a simple example of a constant time function. It doesn't matter how big the array is, we just check the first and last attribute, which we can access in constant time. We'll get more into how I know this when we talk about data structures.

          def get_minimum(sorted_array):
              if sorted_array[0] < sorted_array[-1]:
                  return sorted_array[0]
                  return sorted_array[-1]
      • O(log N) – Logarithmic Time

        Logarithmic time is when you're operating on something that gets cuts in half every time you operate on it. This comes up in "binary search" which is an algorithm for finding something in a list of sorted elements.

        A good example of O(log N) would be printing a string that is half as long on each time through a loop. Note: I'm assuming that print and len also run in constant time. Below is a recursive function that prints a string, then keeps printing the first half of it until it gets to just 1 character.

          def print_half(the_string):
              strlen = len(the_string)
              print the_string
              if strlen > 1:
      • O(N) – Linear Time
      • O(N log N) – Linearithmic Time
      • O(N2) – Quadratic Time
      • O(N!) – Factorial Time
        • algorithms
          • What is an Algorithm? Why are they useful?
          • sorting algorithms
            • What practical use do sorting algorithms have?
            • Why is it important for things to be sorted?
            • Insertion sort
            • Quick Sort
            • Merge Sort
          • seaching algorithms
            • Binary Search
            • Tree Traversal (implemented in raw javascript w/ DOM stuff?)
          • string algorithms
            • levenstein distance
            • string matching
            • text compression
            • diffing
        • data structures
          • list
            • What's it good for?
            • An easy implementation (with explanation)
            • Evaluating the implementation
            • Comparison of other implementations
          • hashmap
          • set
          • graph
Data Structures & Algorithms
  • Abrstract Lists
    • What's a List?
    • Linked Lists
    • Arrays
  • Abstract Maps
    • HashMap
  • Abstract Sets
  • Abstract Graphs
  • Other interesting things
    • Binary Trees

Software engineering for self-taught programmers

  • logging
  • testing
  • API design
  • principles of scaling software
  • design patterns
  • security
  • principles of a well-designed deployment system
  • Functional Programming?
  • OO?
  • Profiling & Benchmarks

pycon proposals 2014

DONE Dependency injection with Pinject
  • 400chr description

    Dependency injection is a technique for making your code more testable by passing in its dependant modules. This talk will tell you more about this topic and give you a tour of Google's Pinject library for dependency injection.

  • When they leave the room, what will folks know about?

    Attendees of this talk will be able the following questions:

    1. What is Dependency Injection (DI)?
    2. Why do I want DI?
    3. When is DI not the answer?
    4. I want to start a new app. How do I write my code with DI in mind?
  • Outline. Will be public.
    • Who am I and why should you listen to me?
    • What is dependency injection (DI)? 3min
      • kwarg based
      • constructor based
      • manual (eg setters or similar)
    • Why might you want DI? 3 min
    • How do you get DI? (introducing pinject)
      • Short API tour (10 min)
    • Code tour of a small application using pinject
      • main code (5 min)
      • test code (5 min)
  • Detailed abstract. Will be printed

    Dependency Injection is a technique used in larger code bases to make code easier to test. It has some slant associations with functional programming's pure functions (functions operate on their inputs, nothing else).

    Dependency injection is used a great deal by the Java community. Google's pinject, however, is not a direct port of their popular Guice (java framework), but rather built from the ground up with Python in mind (and with all of their experience to back them). Join me as we look at how this technology can make your code more testable.

DONE Exploring with pisces, a testable micro-framework.
  • 400chr description

    The current set of Python micro-frameworks optimize for speed of development. What might a micro-framework look like that is built to foster testable code? What about a framework that starts simple, but allows you to grow into a large web application? In this talk, I'll introduce Pisces, a framework to explore these ideas.

  • When they leave the room, what will folks know about?

    People who leave this talk will:

    1. Be familiar with Pisces (the testable micro-framework)
    2. Have a sense of what makes code testable.
    3. Will understand what changes a resilliant application will need to handle.
  • Outline. Will be public.
    • Who am I?
    • Tour of the problem. (some example code from other frameworks) (5 min)
    • Attributes of a testable system (5 min)
    • Attributes of a organizationally scalable system (eg separation of concerns) (5 min)
    • Intro to Pisces. (10 min)
    • How you can apply these concepts to your code without switching (5 min)
  • Detailed abstract. Will be printed

    Writing software can be a difficult job. We ship bugs with every release of our code. What's a small app today can quickly turn into a successful product with scaling issues. Using techniques that other programming languages take advantage of, we can ship code with fewer bugs that is more resilliant to change.

    Join me as we talk through the concepts of the single responsibility principle as it applies to web frameworks. The result of exploring this topic has reaches from the testability of your system to how well your code stands up over time.

TODO Solving problems with system design; aka how I decompose problems into classes.
  • 400chr description
  • When they leave the room, what will folks know about?
  • Detailed abstract. Will be printed
  • Outline. Will be public.
DONE Computer science fundamentals for self-taught programmers
  • 400chr description

    When people talk about Big O notation do you go cross eyed? Do you not get the point of learning about implementing linked lists or depth first search? Join me as I introduce the CS fundamentals that helped me ace my Google interview, even though I didn't get a formal CS education.

  • When they leave the room, what will folks know about?

    People leaving this talk will understand what big O notation is. I'll also introduce a few data structures, go over their implementation and talk about some of the algorithms used internally.

  • Outline. Will be public.
    • Who am I? Why should you listen?
    • Big O
      • why?
      • description
      • go over a few code examples, determining the big O of them.
    • Linked List
      • Who cares?
      • Defining a list object
      • inserts
      • removal
      • searching
    • Overview of a few classes of algorithms and what some interesting, practical problems are in there. (only if 40 min talk)
    • What you might look at next to progress your knowledge
  • Detailed abstract. Will be printed

    Big-O notation, data structures and algorithms. These are scary topics for many self-taught programmers, but don't need to be. The underlying concepts are relatively straight forward. The main difficulty is having an opportunity for someone to explain them to you. It's also especially helpful if that person is a self-taught programmer who understands that not everyone has a deep understanding of math theory.

    Here is your excuse to finally take the time to learn these important, fundamental concepts.

TODO tutorial: ^^ that, but with actual deep-dives into implementing a few data structures from scratch
  • Outline (which is different & expanded from the previous one.
    • Who am I? Why should you listen?
    • Big O
      • why?
      • description
      • go over a few code examples, determining the big O of them.
    • Linked List
      • Who cares?
      • Defining a list object
      • inserts
      • removal
      • searching
    • Dict (hashmap)
      • explain how it works
    • Overview of a few classes of algorithms and what some interesting, practical problems are in there. (only if 40 min talk)
    • What you might look at next to progress your knowledge

Portland PyCon Proposal

Portland Tech Scene

Portland is a great home for Pythonistas. We have a very active meetup group called PDX Python. It has over 900 members meets twice a month. It's been going strong for many years, with over 95 meetups under their belt.

We also have a fantastic PyLadies group here. That group alone is 150 pythonistas strong. They have weekly hacking meetups and a monthly presentation night.

Portland is also home to, a meetup posting website. Just going there is a fantastic sense of the vibrancy of the tech group in PDX. On any given day of the week there are between 5-10 meetups, which can make it hard to pick which one to go to.

  • Bikes

    Bicycling is a very "Portland" method of travel. With the highest of bicycle commuters1, we boast one of the most bicycle-friendly places in the US. There are several bicycle rental facilities available in Portland.

  • Public Transit

    Portland is home to two major forms of public transit: the TriMet bus system and the MAX light rail. No need to choose just one form of transport; there is dedicated bicycle storage on both the busses and the MAX.

    The city of Portland has extended a free transit pass to all attendees of the conference!

    The bus system spiders across the map with several frequent service bus stops adjascent to the convention center. Tickets to ride the bus is normally $5 for an all day pass, or $2.50 for a 2 hour pass, but, as stated above, is free for conference attendees. You can purchase these tickets online in advance or through TriMet's mobile app. The City of Portland has graciously offered a free one week transit pass to all attendees of the conference so these prices are free once you have this pass.

    The MAX offers convenient access to both Portland's city-center as well as to the airport. It costs the same as the bus system but offers speedier service to the destinations it visits.

  • Cars

    Portland is also a car-friendly city. The convention center is nearby the highway system which will take you to many of Portland's outdoor activities. There are car rental locations at the Airport (just a $2.50 train ride away!). If your needs are shorter term, Portland is also home to ZipCar and car2go services which offer competitively priced short-term rentals, great for a hiking trip in the Gorge or a cross town meeting (respectively).

    Need a car, but don't care to drive? Portland has taxi service just like other major cities.

Bars & other drinking establishments

Portland is city split between a love of beer and a love of coffee. Thankfully, no one has made us choose.

Our city is well known for its microbreweries. With over 60 breweries, we are #1 in the world for beer lovers.2 Our city tends to tilt more towards the IPA side of the beer spectrum, but we have a respectable selection no matter your preference. Drinks in Portland are affordably priced, even as you get into more and more craft beers.

Within close proximity of the convention center, there are a few really great breweries. There is Bailey's Tap Room which sports 20 constantly rotating taps (and a nifty LCD screen to show you how much is left). We also have both the Rogue, Deschutes, and Widmer Brothers breweries which offer their own selections of brews and tasty food.

Over-indulge in Portland's beer selection? You'll delight in knowing our coffee is the remedy. Delicious coffee and espresso can be found at Stumptown, a nationally distributed brand of tasty beans. We also have many micro-roasters scattered through the city like Barista and Coava.


Portland is "one of the best places in the country to dine," according to The Washington Post.3 We have many varieties of food from Thai to BBQ. In particular, we are a city who takes its meat seriously. It's not uncommon to find a shop selling locally cured meats, slow roasted to perfection and served with care. Not to be outdone, Portland also boasts great options for vegetarians.4

Something you won't find in every city is Portland's food cart scene. We have many types of carts from those that sell gourmet french fries to pizzas to Ethiopian food. With over 600 lisenced food carts, you're sure to find something that suits your fancy. CNN sure did when they named our street food scene #1 in the world!5

Other Activities

Portland is not just a place for great food and drink. We also have a plethora of options for outdoors-y activities.

  • The Outdoors

    Forest Park is a lush green forest 20 minutes away from the convention center. It has over 70 miles of hiking trails and its lush green forest opens up to a fantastic view of the city.

    Looking for something a bit farther out? We're also situated in close proximity to the Columbia Gorge. The Gorge is home to tons of great hiking trails like Angel's Rest which showcases wide vistas of the river valley. You can also find Multanomah Falls here, a 620ft, two-tiered water fall that's sure to take your breath away. To get here, you'll want to rent a car. Its a 20-30 minute ride away.

    A bit further out (~1 hour), we have Mount Hood, a large snow-capped glacial peak. Great for a challenging summit or an easy hike around the base. Depending on the year, there is some fantastic skiing here as well!

    If nearby and rivers are more your thing, Portland straddles the Willamette River, a major off-shoot of the Columbia. Flowing through the center of Portland, you can explore its shores in kayaks or other boats. Along the banks, there are many bike and walker friendly trails for your enjoyment.

  • Shopping

    Not into the outdoors? The convention center is also located a few blocks away from the Lloyd center mall. Complete with an ice skating rink on the ground floor, this mall has all you could want. There is the usual assortment of nice stores as well as an on-premisis movie theater (and another across the street, if you like).


How do I even network?

sending some info to another computer
visualizing packets

How do I even Operate this System (OS)?

What are the components of an OS?
Go through each one, implementing a toy version. String them together.

Math notation for programmers? Find this book. It exists.

Backbone is just software. Engineering principles still apply.

Programmer thinking: inputs & outputs

Programmer thinking: divide & conquer

The role of queues in architecture design

Introduction to protobufs

The role of "constructor" ownership in framework design

How pen & paper help thought

Designing web services stubbed interfaces

Write about the work of Turing award winners

Written Elsewhere

How to figure out what to sell for your side project?

After a week of hacking, you have a side-project and it provides tangible value for your users. You want to translate the user's value into money to make your project self-sustaining (or more). How do you decide which features are free and which are premium?

For me, the side-project was, a service which provides email digests for GitHub activity. I knew early on that I wanted to charge money for the service. I've had side-projects in the past, and they would get less and less of my attention until they had no users and I would kill them. That's no fun for anyone! As Nathan Barry said in a recent edition of, "What benefits your customers is a company that stays around and delivers quality products & serves them well." Charging is a key ingredient in the equasion.

Decide if these features are core to the experience.

I had a product that solved an issue, users had signed up and validated that they agree (by not opting out of my emails). What do I charge for? There were a few key phrases that were reoccuring in the feedback I was getting.

"I follow too many repositories, so the emails are too dense". This is a cry from a power user. These people follow hundreds or thousands of GitHub things and even in digest form sent once per day. My service aims to reduce the burden of getting the information, so it has particular value for these users.

"This works for public-only repositories. Can you make it work for my private (aka work) repositories?" This is a commercial user requesting a feature to help him at work. The nature of my audience is that they are highly paid workers that greatly value their time. I can help them save time for a fee that they aren't likely to miss. It is also helpful that companies tend to have a budget for these sorts of tools. Having a productive employee as your evangelist sounds like a pretty good signal to me!

There is a central complaint behind each of these phrases. "I'm already finding this valuable, but it would be even MORE valuable if I could.." I think these users are the target for any sort of freemium business.

Where am I now?

Now that I've decided how to price my tool, I'm just waiting for the spare hours of development to catch up to the ideas. I'm pursuing relationships with designers to turn the MVP into something that's a pleasure to view each day.


Justin Abrahms is an engineer at, a business collaboration tool built by developers for CEOs. He is steeping himself in the world of business in an effort to understand how the other half lives. He welcomes any feedback or hellos you might like to send his way. Please send email to

The omission of "Why?"

A few years back, I worked at a company which made a very simple mistake in how they delivered product, which unduly limited the amount internal innovation: the omission of why.

The company was in the advertising space which is a morass of opaque terms like “piggyback pixels”, “real-time boom lists” and “demand-side platforms”. Contrast that with something like a music player. Most people understand how music players should work, why you might want one and, if pressed, come up with some potentially innovative new features. Advertising, on the other hand, isn’t as clear. What features does an advertiser look for in their ad buying platform?

The way we dealt with this complexity was by pushing the burden of knowledge onto a few experts within the company. These folks distilled customer desires into features and wrote up a implementation plans. When they vetted this with the others on the business-side, they gave what amounted to a very specific todo list to engineering.

This is harmful because, as a business, you’re trying to hire the best and brightest folks across your organization. By not allowing your employees to operate on the same data across the organization, you breed a culture of assembly-line workers: folks who don’t ask questions, just do what they’re told. This is not what you want the best and brightest to be doing!

The key behind solving this issue is sharing the whys behind decision. By coloring in some of the context around why a feature is necessary, you allow lateral thinking among your employees. If I, as an engineer, can accomplish the same “why” for a given story but with dramatically less work than the proposed implementation plan, that’s better for everyone involved.

At, we address this by including the “why” as a central part of any user story. By answering why, you educate everyone else in the business of customer needs and reinforce the notion of consistently delivering value.

Empowering people in your organization is important for increasing throughput and minimizing the need for active management. Sharing knowledge and the expression of intent (e.g the whys of something) is paramount. Without it, you’re hamstringing the development of your employees and the success of your business overall.

Decided not to write

using gnus to read/write to gmane (or rss?)

server switch: light and fast (rewrite)

getting running with django-gencal

Inclusive communities vs Exclusive communities

My thoughts on the "pyladies as women only" thing.

Programming as a superpower

Consider using programming as a method of gaining advantage at your current job.

Codescouts: A mentor's perspective.

Neat Ideas

Grocery Savings thing.

Possible ideas
  • OCR reciepts to break down ingredients
  • Meal planning tool
  • What do you currently spend on groceries per month?
  • How does this compare to your goals?
  • How many times to you cook each week?
  • Do you cook breakfast? Lunch? Dinner?
  • How do your costs align with these meals. eg Are dinners the most expensive?
  • Do you freeze food?
  • Do you cook in large batches?
  • Do you have a meal rotation?
  • Do you have a sense of the relative cost of your meals?
  • How much time do you have to cook meals on weeknights?
  • How much time do you have to cook meals on weekends?
  • Issac Kelly
      [Sun Oct  7 2012]
      <issackelly> [12:57:38] Ahoy This is not an email                     [10:58]
      <issackelly> Derp, weird disconnect                                   [11:05]
      <justinlilly> issackelly: oahi                                                [11:31]
      <justinlilly> sorry, was just finishing up breakfast                  [11:32]
      <issackelly> no worries
      <justinlilly> So I've been really diving into personal finance stuff and
                  groceries is something that my fiance and I have struggled with.
      <issackelly> Cool.  We've been on as little as $40/week since we've been
      <justinlilly> wow. very cool.
      <issackelly> $115/wk is much more plesant                             [11:33]
      <justinlilly> Do you have a sense of what you currently spend?
      <issackelly> yeah, ~450/mo
      <issackelly> that doesn't include eating out, which for the last couple months
                 has been higher
      <justinlilly> How does that number (450/mo) compare with your goals?    [11:34]
      <justinlilly> ie: about right? way high? too low?
      <issackelly> It's right with my current goals, yes
      <issackelly> that's what we budget, and we hit it
      <justinlilly> cool.
      <issackelly> our "going out to eat" goals are lower than what we are currently
                 spending                                                   [11:35]
      <issackelly> so total food budget is over
      <justinlilly> Do you have a sense of what motivates the going out to eat
      <justinlilly> is it not knowing what to eat at home? not having good options
                  at home? time? ease? 
      <issackelly> yeah. Social stuff. Lunch with coworkers, my brother is in town
                 for a couple months, so we go out 2-3 times with them
      <issackelly> for time @ home I've found trader joes to be the best balace
                 between good/cheap                                         [11:36]
      <justinlilly> I like TJs. :)
      <issackelly> Whole foods packaged foods are crazy priced in comparison
      <justinlilly> How many nights a week do you guys eat at home?
      <issackelly> nights are like, ~4 since Kasey has been here, and ~6 before that
      <justinlilly> What are some of your normal meals each week?
      <issackelly> Lunches are about ~4-5
      <justinlilly> I'm assuming you guys have a rotation like we do. :)
      <issackelly> Trader Joe's pizza baout once a week, Caprese Salad, Tacos
      <issackelly> Chili
      <issackelly> Maria has started going low-carb, which I think kicks up your
                 budget a bit because you spend more on greens and meat, which
                 per-calorie are much more expensive                        [11:39]
      <justinlilly> yea, I did paleo for a while.
      <justinlilly> That did nothing nice to my budget.
      <issackelly> I do yogurt+fruit+granola for lunch when it's warm, and
                 oatmeal+dried fruit + nuts for lunch when it's cold        [11:40]
      <issackelly> just buying what's in season at the farmer's market is the best
                 way to do that I think
      <justinlilly> I'm back to what I call "old-time cooking" which is basically
                  lots of beans and veggies with meat when its on sale.
      <issackelly> yeah
      <justinlilly> ++ definitely.
      <justinlilly> do you have a sense of the relative cost of each of your meals?
      <issackelly> You save so much money buying ingridents versus buying meals
      <justinlilly> ie: how caprese salad compares with tacos?
      <issackelly> oh yeah
      <issackelly> tacos are cheap unless I'm making guacamole              [11:41]
      <issackelly> I use stew meat because it's cheaper
      <issackelly> than steak
      <issackelly> caprese salad is -- fresh basil, fresh soft mozarella, fresh
                 tomatoes, and it doesn't really fill you up
      <issackelly> so overall very good, but a bit expensive
      <justinlilly> I have this sense that people buy some things just to sort of
                  fill out their grocery list.                              [11:42]
      <justinlilly> not because its like one of their favorite things.. but they
                  need to have a meal for thursday lunches.
      <issackelly> that's the easiest way to waste food/money
      <justinlilly> and that is a really good place to save money.
      <justinlilly> :)
      <issackelly> "we should have fruit in the house"
      <justinlilly> I just threw out a pretty tomato which had molded b/c I had
                  thought I would eat a tomato sandwich this week.          [11:43]
      <justinlilly> but didn't. :(
      <issackelly> counter to that though, is planning meals that take food that is
                 out of season that you intend to buy fresh, grocery stores show
                 that stuff, but if you don't look at the price (berries) you can
                 get screwed
      <justinlilly> true.
      <justinlilly> Do you guys freeze food?                                        [11:44]
      <issackelly> Maria and I are slightly different in that way. I go to the
                 grocery store and then plan meals, she plans meals and then goes
      <justinlilly> ie: bulk batch cook then freeze leftovers, or buy ingredients in
                  bulk when cheap and freeze?
      <issackelly> no
      <issackelly> not yet rather
      <issackelly> but if I do chili, we'll just eat it three times in a row
      <justinlilly> We have a tiny freezer at the moment, but I've strongly
                  considered getting a chest freezer.
      <issackelly> The best way I ever saved money on meat was this:: Buy a half-cow
                 from a butcher with some friends (2 other families)        [11:45]
      <justinlilly> so when you see chicken on crazy sale, you can buy a large thing
                  of it.
      <issackelly> yeah
      <issackelly> we can't do that because of our apartment
      <justinlilly> so I read an ebook by someone and this is how they did it..
      <issackelly> my parents also have about a quarter-acre garden, I'm super
                 jealous of their food budget
      <justinlilly> find something on super sale, then ask the butcher "If I buy X
                  pounds.. would you give me a discount?"
      <justinlilly> she said she's gotten an additional 15-30c off per pound (for
                  something relatively cheap like chicken)                  [11:46]
      <justinlilly> yea, we live in an apartment too. I've been thinking that an
                  upright chest freezer would be nice as another surface.
      <issackelly> Yeah, but buying a half-cow, you basically get the whole thing
                 for ground-beef prices
                  -- something like that.                                   [11:47]
      <issackelly> same with pigs
      <issackelly> oh nice
      <issackelly> that looks reasonable
      <justinlilly> holds a fair amount too. I think 20 pounds of meat is 1 cubic
                  foot, iirc.
      <justinlilly> or maybe 20 pounds is 5..                                       [11:48]
      * justinlilly is fuzzy on it.
      <issackelly> 20:1 feels right
      <justinlilly> agreed.
      <justinlilly> -- also
                  amazing, if you've never done that.
      <justinlilly> whole chicken fall off the bone good with minimal watching.
      <justinlilly> not sure about that particular recipe. My fiance does it and it
                  works really well.                                        [11:49]
      <issackelly> :) I used to have a crock-pot before we moved across the
                 country. probably time to get one again
      <justinlilly> oh, also beans.
      <issackelly> do you buy dried or canned?
      <justinlilly> Do you guys eat beans?
      <justinlilly> I buy dried.
      <issackelly> yeah. dried+crock-pot seems great
      <justinlilly> I have a 25lb bag of pintos in my closet. and 2x25lbs of
                  garbanzo b/c my fiance makes hummus every week.
      <issackelly> we used to do yogurt in the crock-pot                    [11:50]
      <issackelly> oh man, I could save a lot of money if I made my own hummus
      <justinlilly> ^^ that's what I use for pintos.
      <justinlilly> ^^ plus that.
      <justinlilly> best meal ever.
      <justinlilly> yea, I think Tracy does garbanzo beans (cooked in crock pot),
                  mixes them in the kitchenaid with oil and tahini paste.
      <justinlilly> and she buys the tahini paste in 5 lb jars from amazon super
                  cheap.                                                    [11:51]
      <issackelly> yeah, good excuse to buy a kitchenaid
      <justinlilly> I also make my own feta every once in a while.
      <justinlilly> which is a lot of fun, actually.
      <issackelly> ooh
      <justinlilly> pro tip: don't try to do all of this in a weekend.
      <issackelly> yeah
      <issackelly> My parents do SO MUCH WORK on their food                 [11:52]
      <justinlilly> feta is an all day affair (not much activity, but just being
                  around a lot and babysitting a thermometer)
      <justinlilly> --
                  feta recipe
      <justinlilly> I do a lot of work, but only every few weeks.
      <issackelly> having a large garden means every weekend you're busy doing
      <justinlilly> ie: feta is once every 2 months, hummus is every 2 weeks, we do
                  fresh bread every week (loaf bread one week, pita the next)
      <justinlilly> then bulk batch stuff like chili, beans, etc.           [11:53]
      <issackelly> planting seed inside, plowing, sowing, watering, harvesting,
                 canning (last two on cycle all summer/fall) then start over again
                 in January
      <issackelly> omg i need to do bread
      <justinlilly> I wish I had a garden. :-P
      <issackelly> my bread only keeps about a week
                  -- bread recipe
      <justinlilly> fair warning: it makes pretty dense bread
      <issackelly> I just have one in my head from my dad                   [11:54]
      <issackelly> same with chili
      <issackelly> I'm not big into recipes :)
      <justinlilly> I do it when I don't know what I'm doing.
      <issackelly> of course. me too
      <justinlilly> The issue with big batching everything is that I only make it
                  once every 2-3 weeks.. so I forget.
      <issackelly> You know what's fun and feels like science but doesn't save you
                 any money?
      <justinlilly> though I do know some things.
      <issackelly> Making soap
      <justinlilly> hah. nice.
      <justinlilly> I made toothpaste and some other cleaning stuff.                [11:55]
      <justinlilly> its kinda awesome.
      <justinlilly> though I do need to make soap.
      <issackelly> it's fun
      <issackelly> but you can't beat the price on bulk dr-bronners from amazon
      <justinlilly> -- I want to do
                  everything here, basically.
      <issackelly> yeah
      <issackelly> I think that if you lived somewhere cheap, and did this stuff,
                 10-20k/yr you could live really well                       [11:56]
      <justinlilly> My goal is to make 30k/yr and do this indefinitely.
      <justinlilly> there's a really good book which has basically changed my
      <issackelly> Yeah I love thinking like that
      <justinlilly> name isn't so good, really.                             [11:57]
      <issackelly> right
      <justinlilly> its a financial philosophy book.
      <issackelly> I have this idea though… I'm sort of thinking about working out
                 here for a few years and saving enough money to buy a house
                 outright somewhere else
      <justinlilly> if you have a 50% savings rate, for every year you work, you can
                  take a year off.
      <issackelly> ^^
      <issackelly> that's what I'm doing
      <justinlilly> Our goal is a 70% savings rate.
      <issackelly> but that assumes you keep expenses the same
      <issackelly> that would be awesome                                    [11:58]
      <justinlilly> then investing the remainder and eventually living on dividends
                  of our investments.
      <justinlilly> and surprisingly.. we're kinda on our way with it.
      <issackelly> so much of my mental focus has been on "increase income" not
                 "reduce expenses"
      <justinlilly> increase income is really fn hard after you hit like 80-100k.
      <issackelly> yeah that's awesome
      <issackelly> Yeah, I think I'm hitting the top-ish                    [11:59]
      <justinlilly> you should really pick up that book. I can't say enough good
                  things about it.
      <justinlilly> The guy in there is more extreme than I am about his life, but
                  it at least puts a lot of assumptions you have into question.
      <justinlilly> ie housing. Where does need transition to want?
      <issackelly> yeah
      <justinlilly> is your need for shelter covered if you live in a tent? rv? 1br
                  house? 5br house?                                         [12:00]
      <issackelly> I'm definitely somewhere between need and want in my current
      <justinlilly> also interesting fact,
      <justinlilly> each unused bedroom is roughly $200/mo in home price increase.
      <justinlilly> ie: as a renter, the difference between a 2br place and a 1br
                  place is ~200/mo (market dependant)
      <issackelly> (WAY MORE HERE)
      <justinlilly> so when you have that guest room "for when the family comes"..
      <issackelly> like 1k/mo
      <justinlilly> you're paying like 2400/yr so family has somewhere nice to stay
                  for a week.                                               [12:01]
      <issackelly> I could put somebody up in a hotel 3 days every month for what an
                 extra br would cost me
      <justinlilly> you have expensive taste in hotels ;)
      <issackelly> s/you/palo alto/
      <justinlilly> you should try out portland. Things here are nice. :)     [12:02]
      <issackelly> Yeah, we considered it, and it's a possible "after PA" spot
      <justinlilly> we had a list when we lived in NYC.
      <issackelly> I wanted to spend some time in SV. and we actually have  avery
                 reasonable place for the area
      <justinlilly> portland, seattle, austin, boulder, raleigh.. were the ones on
                  the list, I think.                                        [12:03]
      <issackelly> seems about right :)
      <issackelly> we may end up back in Columbus one day
      <issackelly> or Columbus-ish
      <justinlilly> yea, I sometimes think that I'll move to SFO as a pilgrimedge to
                  tech.. but having lived in NYC.. not really interested in the
                  price hike.
      <issackelly> SFO as a city was not a good place for us                        [12:04]
      <issackelly> Portland would have made the cut if not for the weather I
                 think. It's so sunny here, which is a big benefit          [12:05]
      <justinlilly> just sayin'
      <justinlilly> but yea.. having lived in seattle.. I can understand. :)  [12:06]
      <issackelly> Yeah, I know, and it was always nice when I was there too, but I
                 spent a lot of time looking at aggregates
      <issackelly> Weather was a big deal for us in Ohio. I think if we went back I
                 would also try to figure out a "get the hell out of ohio Jan-Mar"
      <justinlilly> sounds reasonable. :)                                   [12:08]
      <issackelly> So, what made you leave google?                          [12:10]
      <issackelly> if you don't mind me asking
      <justinlilly> not at all.
      <justinlilly> its a very large company.
      <justinlilly> I wanted to work on a smaller team again.
      <justinlilly> I wanted to be really connected with the desires of customers.
      <issackelly> Cool
      <justinlilly> also, I was in advertising which made me uneasy due to my
                  personal priorities.
      <justinlilly> but really, I think it boiled down to the team I was on, and I
                  think all of Google, didn't hold the same priorities for me.
      <issackelly> I've got this feeling that Google has turned into a giant
                 enterprise that wouldn't actually be all that fun to work in
      <justinlilly> for me -> as me.
      <justinlilly> its not bad, actually.
      <justinlilly> its really good if you want to just hunker down and solve some
      <justinlilly> but I think what I really like is the interaction of delighting
      <justinlilly> I basically want filtered user concerns delivered to me. :)
      <justinlilly> on the not-same-priorities thing: not really using open source
                  tools (nagios, django, etc) but lots of in house variants of it.
      <justinlilly> also.. I was writing java all day, which wasn't appealing.

Better code review system

system for having up-to-date performance metrics in your blog posts.


Its really difficult to tell which library is the fastest at something like parsing JSON.

Possible Solution
  1. User uploads a fixture of test data. An example might be a file of json.
  2. The user uploads one or more test cases. Test cases are forkable entities so people can improve individual test cases.
  3. User embeds the whole thing via an iframe in his blog. The service

periodically updates the performance metrics using up to date libraries.

Potential Issues
  • How do we separate performance issues of loading setup stuff? Ignore b/c it should be consistent across apps?
  • How often is periodically?
  • What if updating the library causes the test case to break?

Better code review tool


Current generation code review tools make it difficult to review code at the macro level.

Seeing walls of text make it difficult to grok how something is used in a larger context. There is little to no visibility into how and how often something is used.

People naturally get mired in details because its too difficult to understand the larger picture. As such, people focus on syntax issues and trivial things.

The ideal code review process.

I think its worth thinking a bit on what the ideal code review process might show and how someone might operate in it.

  • class design
    • What sort of public interface are we exposing in this class?
    • Does the class have sane inputs? or is it calling deeply into its constituents?
    • What is the class's responsibility?
  • test coverage
    • Which portions of this diff are uncovered by tests?
    • For each line of code, link to all tests which cover this line.
    • Maybe show relevant tests side by side with the code itself.
  • formatting & style
    • Show any style violations.
  • performance
    • Is any of this code called during a critical code path?
    • How do we define / denote critical code paths?
    • What data structures are being used here and are they well suited for the task?
  • Other
    • checklists?
    • automate testing that the tests written fail w/o the rest applied, then passes with it applied
    • possibility of finding trends per developer
    • What about providing a map for potential reviewers? "Start at X, I changed that roughly b/c of Y, which meant that Z also had to be updated."
How does something like this get built?
  • Need to get a code viewer up.
    • Navigate multiple files
    • Syntax highlighting
    • Basic diffing of the full file to show you where the changes are.
  • Need static analysis to get into a common format.
    • file
    • line
    • type (of notation)
    • level (severity)
    • message (text for user)
    • maybe a full proto of the error context and the tool's output
  • Need a cross referencing mechanism so I can say "file x: line y links to file z: line a, perhaps with some context like 'inherited by'"
  • Generic:
    • text with the static analysis piece being spell checker?
    • comments
    • login accounts
    • inbox
      • incoming review requests
      • in progress review requests
      • outgoing review requests

Ability to generate RSS feed from orgmode blog thing.

Server Provisioning


# Provisions a server from nothing to a working blog.
useradd justin
mkdir /home/justin
chown justin:justin /home/justin

# add entry:

passwd justin
# enter 1 use password

# local
cat ~/.ssh/ | ssh justin@$HOST "mkdir ~/.ssh; cat >> ~/.ssh/authorized_keys"

passwd -d justin # delete password

# change /etc/ssh/sshd_config to:
# PermitRootLogin no
# PasswordAuthentication no
sudo service ssh restart

# Update software to latest stable versions
sudo apt-get update
sudo apt-get upgrade -y

# Install base blog info
sudo apt-get install nginx -y
sudo groupadd www
sudo chgrp -R www /etc/nginx/sites-enabled
sudo chgrp -R www /etc/nginx/sites-available
sudo usermod --append -G www justin
sudo chmod g+w /etc/nginx/sites-available
sudo chmod g+w /etc/nginx/sites-enabled

## Setup TLS config requirements via
sudo openssl dhparam -out /etc/nginx/dhparams.pem 2048

# locally
scp ./_server/nginx/ justin@$HOST:/etc/nginx/sites-available/
ssh justin@$HOST  ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
ssh justin@$HOST rm /etc/nginx/sites-enabled/default

scp ./_server/ssl/*.crt justin@$HOST:
scp ./_server/ssl/*.key justin@$HOST:

sudo mv /home/justin/*.crt /etc/ssl/certs/
sudo mv /home/justin/ /etc/ssl/private/
sudo chown root:root /etc/ssl/private/
sudo chmod 400 /etc/ssl/private/

sudo service nginx restart

sudo mkdir /srv/
sudo chown root:www /srv/
sudo chmod g+w /srv/

# deploy via normal org publishing mechanisms

# --
# Setup IRC bouncer
sudo apt-get install znc
sudo adduser znc-admin
sudo su znc-admin; cd
znc --makeconf  # follow instructions

Project alist

  (require 'ox-publish)
  (require 'ob-gnuplot)
  (require 'ox-html)
  (require 'htmlize)
  (require 'ox-latex)

  (defun cleanup-html-output ()
    (replace-string "&#57345;" "")  
    (replace-string "&#57344;" ""))

  (setq org-html-head-extra "<link href='//' rel='stylesheet' type='text/css'>
                <link href='//' rel='stylesheet' type='text/css'>
                <link href='/static/css/code.css' rel='stylesheet' type='text/css'>
                <link href='/static/css/test.css' rel='stylesheet' type='text/css'>")

  (add-hook 'htmlize-after-hook 'cleanup-html-output)
  (setq org-export-latex-default-class "IEEEtran")

  (defun org-publish-attachment-and-make-readable (plist filename pub-dir)
    (org-publish-attachment plist filename pub-dir)
     (expand-file-name (file-name-nondirectory filename) pub-dir)
     (file-modes-symbolic-to-number "oug+rw")))

  (defun stats-tracking-code (_) "
                <!-- stats tracking -->
                <script type=\"text/javascript\">
                  var _gaq = _gaq || [];
                  _gaq.push(['_setAccount', 'UA-615313-5']);
                  _gaq.push(['_setDomainName', '']);
                  (function() {
                    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
                    ga.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + '';
                    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
                <!-- end stats tracking -->")

  (defun my-org-confirm-babel-evaluate (lang body)
    (not (string= lang "gnuplot")))  ; don't ask for gnuplot

    org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate
   org-html-htmlize-output-type 'css
   org-link-file-path-type 'relative
      :components ("blog-content" "blog-static" "blog-webmaster-tools" "blog-newsletter"))
      ;; newsletter confirmation pages for stats tracking purposes.
      :base-directory "~/src/"
      :publishing-directory "/"
      :base-extension "org"
      :publishing-function org-html-publish-to-html
      :author nil
      :with-toc nil
      :creator-info nil
      :html-postamble nil
      :html-preamble stats-tracking-code
      :timestamp nil
      :creator nil)
      ;; google webmaster tools verification
      :base-directory "~/src/"
      :publishing-directory "/"
      :base-extension "html"
      :publishing-function org-publish-attachment-and-make-readable
      :author nil
      :with-toc nil
      :creator-info nil
      :html-postamble nil
      :html-preamble nil
      :timestamp nil
      :creator nil)
      ;; placeholder directory to put pastes in for scpaste.
      :base-directory "~/src/"
      :publishing-directory "/"
      :base-extension "html"
      :publishing-function org-publish-attachment-and-make-readable
      :author nil
      :with-toc nil
      :creator-info nil
      :html-postamble nil
      :html-preamble nil
      :timestamp nil
      :creator nil)
      :base-directory "~/src/"
      :base-extension "org"
      :publishing-directory "/"
      :recursive t
      :publishing-function org-html-publish-to-html
      :export-with-tags nil
      :headline-levels 4             ; Just the default for this project.
      :with-toc nil
      :section-numbers nil
      :sub-superscript nil
      :todo-keywords nil
      :author nil
      :creator-info nil
      :html-preamble (lambda (_) (concat (stats-tracking-code "") "
                <div id=\"header\">
                  <h1>Justin Abrahms</h1>
                  <ul id=\"nav\">
                    <li><a href=\"/\">Home</a></li>
                    <li><a href=\"\">Feed</a></li>
                    <li><a href=\"\">Projects</a></li>
                    <li><a href=\"\">Gittip</a></li>
      :html-postamble "<hr /><!-- Begin MailChimp Signup Form --> <link href=\"//\" rel=\"stylesheet\" type=\"text/css\"> <style type=\"text/css\"> #mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width: 400px; margin: 0 auto; }/* Add your own MailChimp form style overrides in your site stylesheet or in this style block. We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */ </style> <div id=\"mc_embed_signup\"> <form action=\";id=7c57fe5fe7\" method=\"post\" id=\"mc-embedded-subscribe-form\" name=\"mc-embedded-subscribe-form\" class=\"validate\" target=\"_blank\" novalidate> <label for=\"mce-EMAIL\">Get notified when new articles are published</label> <input type=\"email\" value=\"\" name=\"EMAIL\" class=\"email\" id=\"mce-EMAIL\" placeholder=\"email address\" required> <div class=\"clear\"><input type=\"submit\" value=\"Subscribe\" name=\"subscribe\" id=\"mc-embedded-subscribe\" class=\"button\"></div> </form> </div> <!--End mc_embed_signup-->"
      :timestamp t
      :exclude-tags ("noexport" "todo")
      :auto-preamble f)
      :base-directory "~/src/"
      :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf\\|otf"
      :publishing-directory "/"
      :recursive t
      :publishing-function org-publish-attachment-and-make-readable)
      :base-directory "~/src/"
      :exclude "*"
      :include ""
      :publishing-directory "/tmp/"