Content in the "tech" Category

Turning an RC Transmitter Into A Flight Sim Controller
yep


below you'll find how I used a transmitter as a joystick.. this link lets you use the computer as the joystick to control the servos:\ http://www.mh.ttu.ee/risto/rc/electronics/pc2rcv2.htm


I built and adapter to plug my airtronics vgr4 into my mic input so I could use it to control the airplane in FMS (r/c airplane flight simulator)

here are my notes:

some adapters

futaba to usb:\ http://www.milehighwings.com/usb\_cables.htm (autolearn, \$39)\ http://www.geocities.com/simblaster/sbinstructions.html (cheesy, \$39)\ or... airtronics vanguard fm vg4r\ http://www.rc-circuits.com/ (buy it from these guys)\ http://www.heliguy.com/nexus/fmsinterface.html (pictures of the hookup)\

alternative

build your own adapter to go from the 5 pin out on the back of the transmitter to a 1/8th" phono plug you can plug into your mic input. Use SmartPropoPlus to interface to FMS. It actually works. But, if you blow something up (i broke a few things) it is not my fault.. if you try any of this and something breaks, you are on your own.

tips in an email i sent to someon

That's cool an old IBM keyboard plug will work. I dug for a while and found one in my pile of junk. Wiring it up is easy. you need a mono 1/8th" plug. when you look at the back of the transmitter, you'll notice the pins are rotated 1/4 turn clockwise. One wire hooks to the middle (found at the 3 o'clock position) pin. The other wire hooks to the bottom pin (near the 5 o'clock)

Sadly, i do not know which wire goes to the tip of the mono plug and which goes to the sleeve (my ohms meter bit the dust last night so i cannot check). But, i do know you can reverse them without blowing anything up... it's just that the program can't read the joysticks when it is backwards..

Download and install the flightsimulator from:

http://n.ethz.ch/student/mmoeller/fms/index\_e.html

I downloaded Version 2.0 Alpha 8.5 but i just noticed beta 7.0 is the recommended version. you decide.

Find two apps. winmmppm.dll.zip can be found when searching for SmartPropoPlus. I don't know where i found analyser31.exe... it was written by philippe g. de coninck in 2004. It may be called Simple PCM signal analyser v 3.1.

unzip winmmPPM.dll.zip and drop the dll into the FMS directory. ( C:\Program Files\FMS) This tells FMS how to use your transmitter as a controller.

you'll use analyser31.exe to test your controller/mic input:

Plug the adapter into your mic input. Turn the transmitter on. Fiddle with the volume controls until there is a loud, annoying noise coming out of your speakers (you may want to mute the output)

Now start analyser31.exe.

click on the interface menu and select "Audio (MIC)"

now, click the "MONITOR" button near the bottom center. You'll see some bars.. the bars should move around when you move the sticks. If not, there's a problem (check your recording volumes, wired up backwards, etc.) The bars are jittery and don't always center out. I think this is normal.

Once you get something that looks about right, stop the MONITOR and close the app. It is a crappy app.. you may have to reboot before it will let go of the mic input and allow FMS to work.

Start FMS\ click controls\ click analog control.\ highlight joysitck interface, click Resources.\

it should say "smartPropoPlus - general PPM" with 6 axes for Joystick 1. If not, you somehow did not install the winmm dll file correctly.

if all is well, click OK

click mapping/calibration. Move the sticks around, they should move those bar graphs around. Click calibrate and follow the instructions. the bars should be moving along with your joysticks.

The Mapping section will define which channel is assigned to which control and define if it is inverted or not. I do not know what Exp means.

My mapping is:\ rudder - 1\ elevator - 3 - inverted\ aileron - 2 - inverted\ throttle - 4 - inverted.\

Your inverted settings may be different than mine.

Click OK.

Press "i" to reset the flight sim. Give the plane some gas and take off.


Raspberry pi Temperature Monitor
no code, yet

I wanted to build a wireless arduino temperature logger. Well, I did. Except it was a rasberry pi and it logged to google drive. it was awesome. BUT! i lost the code. No worries, though. Here are my notes. I will clean this up soon...

I bought a raspberry pi and a DHT11 temperature/humidity sensor. Hooked it up and ran it. I used software/instructions from:

https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/software-install-updated

The sensor is accurate to 2 degrees C. It takes 2 seconds to get a reading and it isn’t as accurate as the DHT22. But, it was what was in stock at gateway so I used it and am logging data to a google spreadsheet via this code:

import sys

import gspread

import Adafruit_DHT

import time

import datetime

gc = gspread.login('daisy.wood@gmail.com', ‘password’)

sh = gc.open_by_url('https://docs.google.com/spreadsheets/d/1RIvyUzV--PWNfihjMS4OZQD9JKXuPZHTgXKVSc5GCnE/edit?usp=sharing')

worksheet = sh.get_worksheet(0)

sensor = Adafruit_DHT.DHT11

pin = 4

for x in range(2,2000):

humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)

if humidity is not None and temperature is not None:

    print 'Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity)

    worksheet.update_cell(x, 1, datetime.datetime.now().strftime("%Y-%m-%d"))

    worksheet.update_cell(x, 2, datetime.datetime.now())

    worksheet.update_cell(x, 3, temperature)

    worksheet.update_cell(x, 4, humidity)

else:

    print 'Failed to get reading. Try again!'

time.sleep(60)

LOL, i need to get code formatting figured out on this site..

Here is the ardunio library and example code: http://learn.adafruit.com/dht

BUT, probably want to do what this guy is doing: http://blog.the-jedi.co.uk/tag/nrf24l01/

In fact, that’s the direction I want to go in. He does use the same temp sensor, which is guess is fine. But, he uses nrf24L01+ and an arduino so that’s the next step I suppose.

This is good, he uses protobufs: http://theboredengineers.com/2014/01/piweather-how-to-communicate-wirelessly-between-an-arduino-and-a-raspberry-pi/

As for WIRED communication between an arduino and raspberry, http://arduino.stackexchange.com/questions/1628/arduino-to-raspberry-pi-wired-communication

thank you for playing.


Javascript Micro-Frameworks
fun for the DIYers

A month ago a friend showed me a toy he was building. Basically, he was trying to do angular without having to install all of angular. (This was just after angular announced 2.0 which he said "is going to be... weird.") He built it using microframeworks. That is, tiny javascript libraries and frameworks that do one thing really well in a small footprint. He told me to go look at microjs.com which is a catalog of these types of libraries. I did and I liked it.

I took a look at his code again today and thought I might try using one of these libraries to DIY routing in a simple app. I wanted to build a single page app that acted as a questionnaire/wizard. Almost a Choose-Your-Own-Adventure type application that, when finished going through the questions, provides some sort of insight or guidance to the user. My friend used RLite so I thought I'd do the same.

The idea is to store the questions as an object (so we can easily create a service that returns these questionnaires as JSON) and have the app guide the user through them. Start with a simple index.html:

<!doctype html>
<html>
<head>
    <link rel="stylesheet" href="/css/apptest.css">
    <title>JS Webapp Playground</title>
</head>

<body bc-cloak> <header> <nav> <ul> <li><a href="#/">Home</a></li> <li><a href="#/first_visit_type">first_visit_type</a></li> </ul> </nav> </header>

<main id="main">Loading...</main>

<footer> <p>Special thanks to <a href="https://github.com/bchociej/apptest/&quot;>Ben</a></p> </footer> <script src="/js/lib/lodash.min.js"></script> <script src="/js/rlite.js"></script> <script src="/js/apptest.js"></script> </body> </html>

Notice all that does is set up the structure of the page and include rlite, lodash, and a custom js file called apptest.js. Apptest.js simply sets up the rlite router based on the questions object which is called lower_back:

;
(function () {
    "use strict";

    var question = .template('<b>name:</b> <%= name %> <b>type:</b> <%= type %> <b>exits:</b> <% .forEach(exits, function(exit) { %><a href="#/<%- exit %>"><%- exit %></a><% }); %>');

    var lowerback = {
        _id: 'lower_back',
        type: 'doineedthis',
        title: 'lower back',
        description: 'total description here',
        reference: 'http://www.guideline.gov/content.aspx?id=47586&search=odg&#39;,
        questions: [
            {
                name: 'first_visit_type',
                type: 'router',
                description: 'select specialist type and initial result ',
                specialist_type: ['MD/DO', 'ORTHO', 'CHIRO', 'PAIN'],
                exits: ['first_without_radioplathy', 'first_with_radioplathy']
            },
            {
                name: 'first_without_radioplathy',
                type: 'router',
                description: 'firstwithout ',
                specialist_type: ['MD/DO', 'ORTHO', 'CHIRO', 'PAIN'],
                exits: ['end']
            },
            {
                name: 'first_with_radioplathy',
                type: 'router',
                description: 'first with ',
                specialist_type: ['MD/DO', 'ORTHO', 'CHIRO', 'PAIN'],
                exits: ['end']
            },
            {
                name: 'end',
                type: 'exit',
                description: 'Thank you ',
                exits: []
            }
        ]
    };

    var main = document.getElementById('main');
    var views = {};

    var decloak = function decloak() {
        document.body.removeAttribute('bc-cloak');
        decloak = function decloak() {
        };
    };

    var loadQuestion = function loadQuestion(n) {
        return function () {
            main.innerHTML = question(n);
            decloak();
        };
    };

    (function (r) {
        .forEach(lower_back.questions, function (n) {
            r.add(n.name, loadQuestion(n));
        });

        var update = function update() {
            var hash = location.hash || '#';
            r.run(hash.substr(1));
        };

        window.addEventListener('hashchange', update);
        update();
    })(new Rlite);

})();

The router will replace the contents of the #main div with html created by the lodash template using lower_back for data. The "exits" array tell the template which links to create at the end of the question (that way your questions can branch based on user input.)

The code doesn't do much, but it taught me that microframeworks give you a nice, low-level approach to building a javascript app. This functionality is exactly what I wanted and it only took a few lines of code. For simple projects like this, it might not make sense to lug angular or backbone along for the ride. It just makes more sense to use HTML5 and modern browsers to get the job done.


Personal Environment Checklist
some notes

The reason for this is not to map out an environment for a legit company, but more a way to keep a small, budget diy setup organized and complete. I want to utilize my home network and figure out the most minimalist way to host services that won't just die out. I want a few things just so I have them:

postgres elasticsearch jenkins automatic backups a way to not worry about a failure monitoring

Generally, i want to host a few things on a machine in a datacenter but be able to automatically fail over to my house if that server barfs.

service how it is monitored where it is backed up how to manage security credentials

email - get the fiftytwo.net email working via google apps

install virtualbox. make a big ubuntu 14.04 box and install:

salt: https://www.digitalocean.com/community/tutorials/how-to-install-salt-on-ubuntu-12-04 https://www.digitalocean.com/community/tutorials/how-to-create-your-first-salt-formula http://docs.saltstack.com/en/latest/topics/tutorials/quickstart.html

how to add formulas - http://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html

cd /srv/formulas git clone https://github.com/saltstack-formulas/jenkins-formula.git vi /etc/salt/master service salt-master restart

what's done? git, nginx, jenkins, es, logstash, kibana, nodejs, pm2, nagios(?), ipython. jenkins can pull from github and my private git repo (i added jenkins and jordan public keys to the git user) jenkins can build and test a node project but to get angularNonsense to really test, read and implement this: http://karma-runner.github.io/0.12/plus/jenkins.html

the full salt config is in my personal git server.

now i need to install aws-cli, put keys on the server and write a cron job to automate backups to s3. things to back up: /home/git/repos (use this gist to figure out how to create the date and whatnot - https://gist.github .com/philippb/1988919 ) /usr/lib/jenkins (install scm-sync-configuration and configure it to sync to my git repo) elsaticsearch - http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/backing-up-your-cluster.html and http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/modules-snapshots.html and https://github.com/elasticsearch/elasticsearch-cloud-aws#s3-repository

wget -O - https://bootstrap.saltstack.com | sudo sh vi /etc/salt/minion add file_client: local vi /srv/salt/top.sls base: '*':

- git
- nginx
- jenkins
- elasticsearch
- logstash
- kibana
- nodejs
- pm2
- nagios
- ipython
- postgres

add a state tree for each state above: vi /srv/salt/git.sls git: # ID declaration pkg: # state declaration

- installed       # function declaration

run salt: salt-call --local state.highstate -l debug

git - host my own git server , gitolite? have nagios check the url to make sure it responds s3cmd sync the project directory and config directory every night. ssh access only

nginx - for everything nagios commit config to git log everything to logstash

jenkins (build/deploy/multi environment) requires a jdk to run. figure out the best place for JENKINS_HOME nagios commit config to git, stored in JENKINS_HOME ssl via fiftytwo.net, password protected behind nginx

elasticsearch nagios commit {path.home}/config to git, s3cmd sync {path.home}/data and {path.home}/plugins ssl via fiftytwo.net, add basic-auth and authorization per this article - http://www.elasticsearch.org/blog/playing-http-tricks-nginx/

logstash - https://blog.devita.co/2014/09/04/monitoring-pfsense-firewall-logs-with-elk-logstash-kibana-elasticsearch/ nagios commit config to git - https://www.digitalocean.com/community/tutorials/how-to-use-logstash-and-kibana-to-centralize-and-visualize-logs-on-ubuntu-14-04 behind nginx basic auth

kibana nagios commit config to git behind nginx basic auth

nagios ? commit config to git behind nginx

ipython notebook nagios commit my environment setup to git behind nginx basic auth

python codebase commit everything to my git

pm2 for running node apps nagios? log to logstash - https://blog.devita.co/2014/09/04/monitoring-pfsense-firewall-logs-with-elk-logstash-kibana-elasticsearch/ s3cmd the startup script every night. (lib/scripts/pm2-init.sh via https://github .com/Unitech/PM2/blob/master/ADVANCED_README.md#startup-script)

postgres nagios https://wiki.postgresql.org/wiki/Automated_Backup_on_Linux then s3cmd to copy to s3, commit pg_backup.config to git

s3 fiftytwo-git fiftytwo-postgres fiftytwo-elasticsearch fiftytwo-securitycameras

security cameras are running on the host, set them up to: nagios, send logs to logstash s3cmd sync mpgs to s3 mysql nagios log to logstash auto backup to s3!

automatic updates apt-get install fail2ban apt-get install unattended-upgrades vim /etc/apt/apt.conf.d/10periodic APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Download-Upgradeable-Packages "1"; APT::Periodic::AutocleanInterval "7"; APT::Periodic::Unattended-Upgrade "1"; vim /etc/apt/apt.conf.d/50unattended-upgrades Unattended-Upgrade::Allowed-Origins { "Ubuntu lucid-security"; // "Ubuntu lucid-updates"; }; apt-get install logwatch
vim /etc/cron.daily/00logwatch /usr/sbin/logwatch --output mail --mailto test@gmail.com --detail high

ops domain is fiftytwo.net = get a wildcard ssl cert.

route53 for DNS.

encrypted, offsite backups

fileserver.

dev and production environments.


Claps
clap your hands, everybody. everybody clap your hands.

Claps is an unreleased hand clap generator that uses random normals to drift hand claps to give them a natural sound. The app allows you to configure the distribution, bpm, and number of actors (clappers.) Configure the pan and volume for each clapper. Of course, volume is not a value, but a distribution.

If you want to generate applause, simply set the number of actors to a distribution instead of a constant.

Claps is a command line app that generates an MP3 stream as output.

UPDATE

I am writing a web-based clap generator. It's on github in my angularNonsense app.


Interfacing an AVR with an ISA Nic
My first microcontroller project

(This was written in early 2002)

I'd been wanting to play with some embedded systems for quite some time but didn't really know where to start and didn't have any impressive ideas. I mean, really, how many computer controlled thermostats or robots does this world need.

One day I ran across the worlds smallest web server. I thought this was pretty cool and wondered just how hard it would be to internet-enable something with an embedded web server. I went out and bought a TINI to play with some ideas, but it was back ordered... for 3 months. While I was waiting i found the \$25 web server and thought, what the hell, I can do that.

I went out and bought me an STK-500 developer board and an Atmel AT90S8515 8-bit microcontroller chip. Good times... I needed to do something easy with it to get started, so I bought an LCD from a surplus electronics place. It was easy enough to wire up the LCD and write some assembly and C programs to display clever messages to impress my friends.

Anyway, I decided it was time to wire up an old 3com ISA ethernet card I got for free from work and try to "internet-enable" something. I couldn't think of anything cool to hook up so I as stuck.

Then I ran across this. HOT DAMN!!! hooking a nic to an avr and an lcd to display udp messages sent to the nic's IP.. how perfect is that? Thanks Dave, whomever you are.

So, I used that PDF (careful, there are mistakes in there) and info from
the $25 web server page to wire everything up. It didn't work. Imagine that. Well, whoever didn't put in big bold letters: 'Hey dumbass, you need an ne2000 card.' needs to get shot. My 3com card is not ne2000, whatever the hell that means. So, i got one off ebay for \$1.99, plugged it in, turned it on and BOOM! the freakin' thing works.

Here's what it does. You compile the IP address in the code and download it to the avr. When you turn it on, the chip initializes the nic and the lcd. It probes the card for a mac address and displays that plus the IP on the LCD. It then sits and listens on port 987 for a UDP packet. When it gets a packet, it decodes it and sends the data to the LCD. I wrote a little java app that will take in a string and send it to an IP using UDP. When you hit send, the message appears on the LCD. How cool is that?

Here's some of Dave's code: ; we have now advanced the read pointer up to the first byte of ; the "data" portion of the IP packet ; ok, now look back at the protocol field and jump to the right ; code to handle the packet type ldi r18,1 ;icmp cp r19, r18 breq ne2k_read_packet_icmp ldi r18,6 ;tcp cp r19, r18 breq ne2k_read_packet_tcp ldi r18, 17 ; udp cp r19, r18 breq ne2k_read_packet_udp

right... needless to say I didn't write any of the code behind this project. I did have to modify it to get it to work, though...

The nic cost \$2, \$8 for the microcontroller, and \$10 for the LCD. Everything else I bought I didn't really need (like the STK-500, breadboard, perfboard, dirty hookers, etc.) but it sure as hell made life much easier.

That's great. Now what?

Now that I've figured out how to work with microcontrollers, and getting some random device to respond to commands sent through the internet I'm well on my way to finally getting my toaster to burn my english muffins from the other side of the planet.


2015-06-07

The Best Customers
This is not a complete entry

Business models are changing.

Success doesn't really depend on an ecosystem or platform. It depends on access to the best customers. At an extremely simplistic level we can think of the best customers are those who are most willing to pay for what you're selling. That definition is broad in that it can encompass any market and the customers within markets are not disjoint. The companies that own access to those customers are the companies that are going to generate the profits. It is them who have the power to direct those customers to the products. They can influence, they can drive desire. This post's idea of success is that a company captures a certain type of customer, knows a lot about that customer and therefore is able to profit by directing them to the most efficient seller.

The modern way to get those users is to first deliver superior user experience. Capture the superfan - others will follow. To capture those fans, you have to have a superior product. Marketing can't make a mediocre product good. It can make is sell a few in the beginning, but it can't create a superstar. Simple as that.

What about the best businesses? It is no secret I am a fan of Aswath Damoaran. The Industry Average Excess Returns data he provides with the post (Investing in Bad Businesses)[http://aswathdamodaran.blogspot.com/2015/05/no-light-at-end-of-tunnel-investing-in.html] is fun to look at. Download it and sort descending by the Average Excess Returns 2005-2015 column. While it is fun to dream of owning a company that consistently achieves double-digit returns and laugh at anyone who works at the bottom, I think the sectors in the middle are those who have the most interesting problems and who will probably be more willing to work on solutions.

This post is falling off the rails:

investing - the only thing that matters is you paid less than you sell it for. one way to do this is to find things that have a higher value than what they're selling for. one way to do this is by simply excluding the losers.

  • future consists as a range of possibilities with the outcome significantly influenced by randomness
  • using forecasts is dumb, unless you can generate a correct forecast that significantly deviates from the average forecast (you think it will drop 5%, everyone else is saying +2%. you'll make lots of money)
  • if you can't control the game, it is better to avoid losers than try for winners.
  • exclude the losers, hold on to the average or better. you make money by avoiding the losses.

  • primacy of risk control

  • emphasize consistency
  • the market has to be inefficient otherwise no one could make money
  • specialization is good. it'll give you an edge.
  • macro forecasting is not critical to your investment path but you have to have a framework when you predict the fortunes of an investment.
  • do not time the market. trying is futile.

  • what the wise man does in the beginning, the fool does in the end, first the innovator, then the imitator, then the idiot

  • never forget the 6' tall man who drowned in the 5' average deep stream
  • being too far ahead of your time is indistinguishable from being wrong.

Yep, the post is a complete wreck. must re-write.

YOU SHOULD DO THIS BECAUSE NOBODY ELSE IS DOING THIS AND IT IS A GOOD THING BECAUSE OF REASONS A B C and D. explain the merits, tell the story clearly, concisely and convincingly, you'll get the clients.

Self assessment is important.


2015-06-17

Tech Unicorns
This is not a complete entry

There has been a lot of talk about unicorns lately, or, at least, I'm getting a nice Baader-Meinhof phenomenon for unicorns. At any rate, I think Aswath nicely illustrates some fuckery that can be done in valuation during an up round. It is nicely explained here:

http://aswathdamodaran.blogspot.com/2015/06/billion-dollar-tech-babies-blessing-of.html

And then there is this analysis of biotech unicorns and the idea that maybe it is better to invest in a basket rather than one:

http://mebfaber.com/2015/06/17/would-you-rather-own-the-unicorns-or-facebook/

In that article there is a link to a slideshare that, in fact comes from a bennedict evans post. You might as well check that out, too:

http://ben-evans.com/benedictevans/2015/6/15/us-tech-funding

fascinating stuff.


2015-06-05

I Can't Decide on a Domain Name
Trying to Build a Brand

I knew the day would come when someone would say, "Tricky Keg Stands? Really?" I didn't have a plan for what I'd do next, though. It has been nearly a year and I still do not. On one hand, I want to keep trickykegstands and just own it. On the other hand, it feels like it is time for something new. I am definitely overthinking it, but that's what I do. Also, there are so many domain names available I can't decide on something new. Let's start with the ones I already own.

  • armp.it - By far my favorite domain. Can't use it.
  • fiftytwo.net - My first domain. Too boring.
  • fiftytwodesign.(com|net) - equally as boring.
  • isthepatentsystembroken.com - yes
  • yakbuttertea.com - i wasn't drunk i swear.
  • (men|women)(facing|seeking)divorce.com - unused
  • androidindie.com - should have become a mobile dev.

I want to do some industrial automation work. If I do, I will name the company Standard Automata, Inc. I bought standardautomata.com and thought, hey, that's kind of a mouthful but it still might make a good name. Then I was going to change my twitter name to standardautomata. Sad trombone... too many letters. The best one I can find is standardautoma... but that sounds like hematoma. stndrdautomata? i don't love it.

So, yeah, I've got nothing. Should I keep trickykegstands?


2015-06-01

The Paralysis of What-ifs
success!

I have noticed my friends and colleagues who have had success are different than those who have not. Here, by success, I mean they are able to develop in the languages and frameworks they like the best while being able to hold down a job or book of business with minimal compromise. The difference is the successful devs are able to set ambitious, achievable, and measurable goals, and see their projects through to the end. That is, they wind up building a usable piece of software that installs and runs with minimal fuss. Whether it be a library, framework, or app, it provides a good percentage of wanted functionality out of the box.

What stops more devs from being successful? There is this fear of missing out or falling behind that is pervasive in our industry. Setting goals and committing to them is scary. What if you fail? What if a new language shows up or a cool new framework? What if you work on the wrong thing and no one cares? What if you get tired and abandon the project before it is ready? I call that fear induced by the what-ifs.

Here is what my successful friends do - They commit to their goals and see them through no matter how many what-ifs they make up along the way. They hold off on the immediate gratification of learning a new language or switching out frameworks. They don't waste a lot of time trying that fancy new editor because they know that sticking to their release schedule is more gratifying in the long run.

Money and popularity are a part of the success equation, no doubt about it. A dev cannot bury their head in the sand and pretend they live in some dev utopia where they get food and shelter just for being awesome. With that said, if you don’t make a significant income from your project, you will most certainly have to work a day job. This takes time and energy away from your project so your project will not be as good and therefore will have a higher probability of failure. That’s why you must try to make money from your project.

Imagine it this way - the fact that your project is making money means that it (or you) are providing some real value and inspiration to your users. This is about the most pure (i.e. bullshit proof) metric that exists. And, in some ways, one of the best tests you could possibly write. In fact, I always have a test called generates_cash_flow_test() in my harness.

Excitement and passion will only take you so far. At some point you have to build something and see it through to the end. Organize a concentrated and prolonged assault on business and do everything you can to gain and maintain momentum. This stuff is not magic - grind it out until you have your success.


2015-05-28

Do I Want to be an Amazing Programmer?
Spolier alert - no

I found myself sitting in an airplane seat when this question popped in my head of ouf nowhere. The timing was good - I had plenty of it to entertain the question. I'm not going to lie, I do not like the answer.

An amazing programmer may eschew an ide for vi. They optimize to the hilt and use the latest and greatest tools for the job. I have forever wanted to be that guy. The one who doesn't have tmux and vi cheat sheets taped to his monitor. The one who uses arch linux and a tiling window manager like Awesome. As circumstances go, I cannot be that guy. Instead of worrying about fast runtimes, I tend to worry about cash flow. Instead of doing it right the first time, I tend to push an 85% solution to production as fast as possible to impress a paying customer. I worry about using the latest frameworks because I don't know if I'll be able to hire someone with that skillset when we lose the guy who decided to use it and probably wrote 90% of the code.

Do I want to be an amazing programmer? In theory, yes! I'm an algorithms guy. My first real language was Scheme. In college I wrote x386 assembly on paper and did it without making any mistakes. So, what happened? My priorities have changed, it is as simple as that. I'm excited about erlang, but I'm more excited about optimizing for the 100th, then 1,000th, then 1,000,000th customer. I love thinking about what taking VC money really means. I love cultivating a circle of people who I can call for advice on convertible notes. I spend a lot of time thinking about what certain strategies look like on a cap table and what signals they send to the public.

Do I want to be an amazing programmer? Apparently not. It seems like I want to be an amazing business person instead. I don't yet have a solid definition of what that means but I know I'm headed down that path. Follow your passions, they say, and that's exactly what I intend to do.

I will never let go of my programming roots. I strive for a balance between code (building great products) and business (building frameworks that promote selling those products.) I don't want to be a functional programming mascot thinking about monads all day, nor will I be a businessman who spends the day thinking about how hiring lobbyists could help my product maintain a monopoly in the market. I think being a success requires a little bit of both those sides. So, that is what I'm doing.


2015-05-22

The Successful Programmer
success!

I'm working on a blog post about what I think it takes to be a successful dev where "Success" is defined as being able to create a useful project that adds value.

UPDATE: It took until 2015-06-01 to write it - look for the entry titled "The Paralysis of What-ifs"


2015-01-29

Javascript Micro-Frameworks
fun for the DIYers

A friend showed me some things he was doing with javascript micro-frameworks. So, I did something based on his work. Read about it here.