Barbara Tuchman’s “The March of Folly”

The March of Folly by Barbara Tuchman cover art

A book review and discussion. This is a first for this particular blog, but I’m planning to make it a more regular occurrence.

You can keep up with the best of my readings here, but if you want more you can get in touch and we can connect on Goodreads.

Now, on with the entirely written show.

I read this book in 2016 and it figures as one of if not exclusively my favorite for the year.

What’s folly?

Tuchman defines it as a policy against self interest conducted across multiple administrations. So, it doesn’t count if only one individual does dumb things. We’re looking for governments, people, and successions of leaders that persist in counter-to-self-interest policies.

The first quote I highlighted is Gustavus Adolphus’s Swedish contemporary in Count Axel Oxenstierna relaying his dying conclusion, “Know my son with how little wisdom the world is governed.”

That quote really sets the stage as we examine the Trojan War from Homer’s Odyssey, the Renaissance Popes, the British loss of the American colonies, and the American self-betrayal of Vietnam. Much of the real world folly is related to the tragic tale of Troy and how clearly the warnings called out the wisdom lacking in rolling a giant wooden horse inside the city walls.

Many German states cared little for the piety of Luther, but they knew a movement when they saw it and jumped at the chance to break with the Holy Roman Church to avoid the financial and political entanglements. The Popes of the age over indulged without regard and believed themselves too unshakably the illusion of power.

The British clearly had no amount of taxes to collect that could recompense them for the potential loss of the colonies, but the enforcement of policy that didn’t even result in revenue as a principle went too far awry for recovery. They repeated folly in their poor preparedness and ill judgement of the colonies ability to fight a professional European army.

The War of American Independence need never have been fought. A wonderful note from this part of the book was the fact that the French did not offer alliance to the Colonists arbitrarily or to help them. It was a cold political calculus that turned on the Colonist’s victory at Saratoga which served not as worthy evidence the Colonists could win, but rather as a sign the French thought even the British could not miss and the French rushed ahead with the alliance before the British could offer acceptable terms to the Colonists. The British terms arrived two weeks late.

The American failures in Vietnam are well chronicled and it was a theme of my readings in 2016. I plan to continue with the 4 part series about LBJ in 2017 or early 2018. The stunning thing about Vietnam is that they were a ready ally in both 1945 and 1954 when we became involved and then equipped and transported a French army respectively. They believed in the dream of America. To top that off, the Kennedy administration knew before escalation that the whole enterprise was folly and doomed to fail but felt we had to press to save face internationally. If we could only bomb them enough, they might accept terms that would be a means to save face. People fought and died on that principle.

I have more highlighted quotes from this volume than perhaps all the other favorites from 2016 combined. For any student of history I highly recommend both The March of Folly and The Guns of August.

Starting with why, B corps, and ceilings

img_20160625_163059
String Lake, Grand Teton National Park

I recently happened upon Simon Sinek’s Start With Why TED talk while I was reading Alex Turnbull and Groove’s excellent startup blog. If you haven’t seen the talk it is a very worthy 18m and this post won’t do much for you without the context.

It took me very little time to get into the talk and reflecting on my own collection of whys. I’d like to summarize what it means for me as I write this.

I’ve built at least three products with a focus and a basecamp setup in the swamps of What. It’s so much more work to communicate why someone should purchase from you in particular and to build trust when you start with making a thing that solves a problem.

I have an awesome new widget. It’s better than ABC Co.’s widget because it has X and Y. It’s also Z times bigger/smaller/faster/easier-to-use.

These claims are not credible on the face of them even if they are true. This is a big reason why testimonials and guarantees are so crucial for most smaller businesses. Often, as a marketer, I hardly believe myself in writing them.

Mr. Sinek’s talk encourages the How portion of your work to be driven by why instead of what. You don’t make a differentiated widget. You believe something about the world. People that believe what you believe should do business with you. This makes a tremendous amount of sense to me and it rings true emotionally.

I am an avid outdoorsman and I like to do business with Patagonia because I share the belief in the power and value of open wild places. I would rather pay more to do business with them because I know how they treat their employees and how they vet their suppliers.

Reading more about these ideas led me to B corps. I stumbled on an open letter by Ian Martin in reference to his decision that their company embrace this movement of harnessing business to do good for people, profit, and the environment. This meant a lot to me and I want to join the B corp movement with my next foray into business.

I think doing right by the environment and the people who work for you resonates deeply with my own sense of purpose. I’m utterly happy to project meaning and purpose where perhaps there is none.

I’ve long struggled with the products I’ve started as not really making much of a difference in the world. I thought myself too shallow to step away from tech and the lifestyle toward something that looks like non-profit work. I have family engaged in that work and I think I have some feel for it, but I have a different vision of what I want my life to look like.

This feels not only like a better path for my convictions, but also for my community and the environment. I’m still fashioning a coherent articulation of my own why for my currently in the shadows project, but I know that this absolutely connects to it. I think having a why and a conviction about what we’re doing will materially impact the ceiling for where the business can go and the chances for success.

The B corp piece isn’t a complete why in my mind. The product and the customers deserve to be included in there as well. I’m excited to pen the piece that outlines our B corp assessment and the details of our commitments and I hope that you will join the movement. Let’s make things better one small moment at a time.

 

Adventures with awk and big data

It took me a long time to appreciate the brilliance of the way command line tools on Unix fit together, but one tool that will hasten that appreciation for anyone is awk. My first use of awk, some years ago, was to find and terminate process ids.

You might use `ps aux` to see the list of running processes.

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   3780  2032 ?        Ss   Mar13   1:24 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Mar13   0:01 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Mar13   4:23 [ksoftirqd/0]
root         4  0.0  0.0      0     0 ?        S    Mar13   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S<   Mar13   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Mar13   0:00 [kworker/u:0]
root         7  0.0  0.0      0     0 ?        S<   Mar13   0:00 [kworker/u:0H]
root         8  0.0  0.0      0     0 ?        S    Mar13   0:06 [migration/0]
root         9  0.0  0.0      0     0 ?        S    Mar13   0:00 [rcu_bh]

If you pipe the result to grep you might isolate the ones with ‘kworker’ in the name.

$ ps aux | grep 'kworker'

root         4  0.0  0.0      0     0 ?        S    Mar13   0:00 [kworker/0:0]
root         5  0.0  0.0      0     0 ?        S<   Mar13   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        S    Mar13   0:00 [kworker/u:0]
root         7  0.0  0.0      0     0 ?        S<   Mar13   0:00 [kworker/u:0H]

Then you’d want the PID for each of them, but it’s just a column and you need to run `kill 4` and so on. This is where awk can be magical.

$ ps aux | grep 'kworker' | awk '{ print $2 }'

4
5
6
7

Now we have the PIDs we need and we can pass them to kill using xargs. Some commands are finicky about xargs and you could opt for a simple inline Unix for loop.

$ ps aux | grep 'kworker' | awk '{ print $2 }' | xargs kill

Awk is killer at manipulating columnar text data and we can also output the information in formats other than one thing per line. The separator in configurable.

$ ps aux | grep 'kworker' | awk '{ print $2 }' ORS=','
4,5,6,7,

This whole post actually belies the nature of awk. It’s a complete language unto itself. We could sum the PIDs.

$ ps aux | grep 'kworker' | awk '{ sum += $2 } END { print sum }' 
22

We can skip the first line. Say we wanted a sum of ALL running PIDs for example:

$ ps aux | awk 'NR > 1 { sum += $2 } END { print sum }' 
345623

There we used NR (I think this is ‘natural rank’ or row number) to only pay attention to rows after the initial titles. We can also select one such row specifically:

$ ps aux | awk 'NR==1 { print $2 }'
PID

I’m still adding tricks to my knowledge of awk, but combining it with sed, wc, redis-cli, and grep lends tremendous power in working with large datasets.

SQL inserts from file failed at unknown point…what do I do?

I was running a nicely pieced together sql text file filled with INSERTs we’ll call ‘something.sql’ recently in a screen session. Unfortunately, when I reconnected much later my data import had failed at some unknown point without an error. Sigh.

Terminal Import I could see that many of the hundreds of thousands of rows had been imported, but how many? I needed to know where to restart the import and I did not want to delete all that data to restart it. That would be its own difficult reclamation project because I already had another import going.

Let’s pretend that I was importing comments for blog posts. The posts were all in the database already. So, how do you know where your import failed? I started with a guess.

 

I knew that another import on the same VM ran for about 5 hours before it completed and I was able to guesstimate that around 300,000 of the rows were probably inserted. The next steps composed a manual binary search. First, I wanted to know an upper bound on my search space.

awk ‘NR==300000 { print }’ something.sql

This shows me the 300,000th INSERT statement. It has an id I can use to check the database.

SELECT count(*) FROM comments WHERE  comments.post_id = <ID>

> 0

We now know that none of the comments for that post made it in and that we’re looking for some point earlier in the file. I decided to limit my search space.

head -n 300000 something.sql > 300k.txt

This creates a separate file with only the first 300k lines or INSERT statements. Now we can binary search, but with a little guess work. I’m fairly sure at least 200,000 made it in and I can test that assumption. I’ll reuse awk to show me the Nth line of the file.

awk ‘NR==200000 { print }’ something.sql

Turns out, that INSERT did make it in. Next up was checking line 245,000. It’s not there.

222, 000 is there. 233,000 is not. I kept on like this until I found a post that had 111 entries in the database. Was 111 the right number? We can grep the lines of the file for the post id and count the matches using wc.

cat 300k.txt | grep ‘<POST-ID>’ | wc -l

> 467

Now I know that it failed somewhere in those 467 INSERTS, but I don’t know where in the list I’m pointing to. I could be at any of those 467 INSERTs. I needed to know the line number of the first one in the file. Print out the line number of the first match for me, awk.

awk ‘/POST-ID/{ print NR; exit }’ 300k.txt

> 222,137

It failed between 222,137 and 222,604 (467 later). In fact, we know there were 111 INSERTs for that post so we’re pretty sure it failed on (222,137+111=) 222,248. We can verify with a few SQL queries similar to the one above and by verifying the comments we expect are present or not. Lastly, we need to restart that import:

tail -n +222,248 something.sql > missing.sql

psql -f missing.sql

tail helped us keep only the last lines we wanted and psql is off and running.

And that is that. It took two guesses, about 10 spot checks, and a few simple SQL queries to save hours.

Running Hadoop on Mac OS X Single Node Cluster

This guide will get you past the troubles of getting Hadoop installed and running on Mac OS X. I’ve tested it for Hadoop 2.2.x and OS X 10.9.

The meat of the process you need to follow is well documented by Michael Noll. I’m only going to add the steps here that are required over and above the Ubuntu guide for OS X. You should probably use brew unless you have a great reason not to.

in <HADOOP>/etc/hadoop/hadoop-env.sh add or edit these lines:

# The java implementation to use.

export JAVA_HOME=`/usr/libexec/java_home -v 1.6`

# Extra Java runtime options.  Empty by default.

export HADOOP_OPTS=”$HADOOP_OPTS -Djava.net.preferIPv4Stack=true”

export HADOOP_OPTS=”$HADOOP_OPTS  -Djava.awt.headless=true -Djava.security.krb5.realm=-Djava.security.krb5.kdc=”

YARN_OPTS=”$YARN_OPTS -Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk -Djava.awt.headless=true”

For x permissions problems over ssh

xhost +

Make sure you enable ssh using System Preferences > Sharing > Remote Login.

Starting Hadoop.

<HADOOP>/sbin/start-dfs.sh

<HADOOP>/sbin/start-yarn.sh

Running the WordCount Examples (download the files as in Michael’s guide).

bin/hdfs dfs -mkdir -p /user/hduser/gutenberg

bin/hdfs dfs -copyFromLocal -f /tmp/gutenberg/* /user/hduser/gutenberg

bin/hadoop jar ./share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar wordcount /user/hduser/gutenberg /user/hduser/gutenberg-output

find /usr/local/hadoop -name hadoop*examples*.jar

Conversion Details with Brecht Palombo

I posted an interview with Brecht over at Keepify. He started and runs Distressed Pro, a sales intelligence tool for real estate brokers. The interview is a deep dive into the details of how he acquired early customers and what he does now to make conversions happen.

Also, check out the Bootstrapped with Kids podcast where he and Scott Yewell discuss the progress of their online business pursuits each week.

Pre-Launch Email List Building With Directories

I’ve recently been looking for directories that allow you to connect with prospective customers, build some links, and add exposure to an app pre-launch. I have found some similar lists elsewhere, but typically a lot of the sites in the list are spammy or gone forever.

This is a current list of sites I’ve found for building an email list before you launch. Leave me a comment to add or remove a site and I will keep this list current.

Some of these sites require your app to be launched or in beta, but most could accept it in either state. Quite of few of these sites will accept small to medium sized payments in exchange for an expedited review or posting. A few of these sites are explicitly about advertising.

Beta

  1. BetaLi.st
  2. StartupLi.st
  3. http://momb.socio-kybernetics.net/about
  4. http://www.startuptabs.com/

Launched

  1. http://web.appstorm.net/about/submit-an-app-for-review/
  2. http://www.go2web20.net/
  3. http://www.operation6fig.com/submit-a-start-up
  4. http://webapprater.com/submit-your-web-application-for-review.html

Beta or Launched

  1. http://helpareporterout.com
  2. http://startuptunes.com/
  3. http://techcrunch.com/
  4. http://www.crunchbase.com/
  5. http://www.psfk.com/
  6. http://thetechmap.com/
  7. http://allweb2.com/proposer-un-site/ (French)
  8. http://www.thehightechdirectory.com/
  9. http://boxyblogs.com/
  10. http://nibletz.com/category/start-ups/
  11. http://topecommercestartups.com/
  12. http://productivewebapps.com/submit/
  13. http://www.new-startups.com/submit
  14. http://doers.bz/
  15. http://aboutyourstartup.com/
  16. http://startupdirectory.com.au/submit-startup/
  17. http://www.venturebin.com/submit-venture/
  18. http://thestartuppitch.com/post-a-pitch/
  19. http://appuseful.com/app/add
  20. http://www.startupbooster.com/submit-site/
  21. http://readwrite.com/page/contact
  22. http://techli.com/contact/
  23. http://mashable.com/submit/
  24. http://www.cloudsurfing.com/newsite
  25. http://www.techpluto.com/submit-a-startup/
  26. http://startuplift.com/ (leans toward launched)
  27. http://www.appvita.com/
  28. http://alltop.com/submission/
  29. http://www.killerstartups.com/submit-startup/
  30. http://ratemystartup.com/submit-your-startup/
  31. http://www.inviteshare.com/
  32. http://hackerstreet.in/
  33. http://startupmeme.com/how-to-submit-your-startup-at-startup-meme/
  34. https://angel.co/public
  35. http://thestartupfoundry.com/tip-us/
  36. http://www.betakit.com/tips/ (Canada)
  37. http://startups.fm/contact-us
  38. http://web.startupstats.com/
  39. http://www.techhunger.com/submit-startup/
  40. http://netted.net/contact-us/
  41. http://webdevtwopointzero.com/submit-a-site/
  42. http://www.ontheapp.com/about/
  43. http://www.rev2.org/contact/#submitastartup
  44. http://www.launchingnext.com/
  45. http://apps400.com/submit-your-application-for-review
  46. http://www.appappeal.com/contact/advertise

SaaS/Software

  1. http://www.austinstartuplist.com/ (or your local one)
  2. http://www.capterra.com/vendors
  3. http://getapp.com
  4. http://feedmyapp.com
  5. http://saasdir.com
  6. http://saas-showplace.com
  7. http://www.cloudshowplace.com/add-your-company/
  8. http://www.cloudbook.net/directories/product-services/cloud-computing-directory
  9. http://www.moblized.com/

ADVERTISE

  1. http://www.makeuseof.com/advertise/
  2. http://muckrack.com/

Automate Submissions

  1. https://applaunch.us/pricing

Bold Action and Success

I’ve been reading everything I could about WWII since before I can remember deciding to do so. I watched hundreds of black and white documentaries and shorts about battles, tactics, strategy, and the experience of battle. I enjoy details the best.

What did it feel like to be at Bastogne? What was Halsey’s reasoning at Leyte? Why did Churchill order the British to fire on the French fleet in port at the outset of WWII? What makes a strategic move like an amphibious assault on an enemy’s rear or flank an extraordinary success in one case (Inchon) and near disaster in another (Anzio)?

I’ve read about the war and its details from generals, intelligence officers, politicians, leaders, historians, and grunts. In hundreds of stories about success I’ve seen one vital and common thread. Bold action. John Keegan, the Royal Military Historian at Sandhurst, wrote a great book about the experience of war throughout history from the experience of the rank soldier. Morale is the largest single division between success and rout.

Success in these stories nearly always involves a component of bold action taken with incomplete information and adjusted on the fly by the men in the mud. Sometimes the bold action is a brilliant offensive maneuver. Other times it is a smart retreat to reestablish the line on better terrain and over a smaller area. In other stories the boldness is simple defiance in the face of overwhelming odds — sometimes standing your ground is the boldest move of all. The action is usually unexpected, creative, and carries some real risk. Many of these gambles would never be run with complete information, but all of the successful ones are run with all the force, determination, and courage that the men could muster.

Churchill’s six tome historical account of WWII has an interesting section where he discusses the promotion and reassignment of various commanders. He reinforces that he wants to support failures by commanders that run risks because victory demands risks. Commanders that fear they will be replaced at the first failure by politicians will never take those kinds of risks. Churchill had to replace many commanders in North Africa, but never because they failed undertaking an intrepid campaign.

Like many of life’s lessons, this one is applicable in all sorts of places. Losing weight, getting out of debt, and building a business all qualify. Success demands bold action.

Mastering the Mobile Application Market with Patrick Thompson of Inkstone Mobile

I did an interview with Patrick on how he built his mobile app business last month after hearing him speak at MicroConf this year and speaking with him. Patrick has great insight into the mobile space and I’m really pleased he took some time out to speak with me.

Check out the interview.