Three Markdown Tools I’ve Known And Loved

There have been many programs that build upon Markdown’s principle of readability in pure-text formatting, and I wanted to share a couple of them here.

Since issue #2 of my newsletter, I’ve written almost everything in Markdown, the text-to-HTML conversion software originally written by John Gruber, the Daring Fireball himself.

It’s shockingly easy to use when you get the hang of its syntax. Fortunately, there are a number of “cheat sheets” available to help you get started if you’re not familiar with it. I personally prefer writing in Markdown (specifically MultiMarkdown) on a plaintext editor to writing in a WYSIWYG environment these days because it’s a little closer to the metal and gives me a lot of options for how I want to share my work.

Since the original release of Markdown, a lot of developers have built Markdown editors into their software to excellent effect. Since Markdown was originally built by and for writers, it’s no surprise that it’s used as the markup language of choice for Github pages, blog posts on Ghost and other blogging platforms, and other places where text is written and published on the web.

What I find most interesting about Markdown is the design philosophy. First and foremost, as Gruber says in the original spec:

“The overriding design goal for Markdown’s formatting syntax is to make it as readable as possible. The idea is that a Markdown-formatted document should be publishable as-is, as plain text, without looking like it’s been marked up with tags or formatting instructions.”

There have been many other programs that build upon Markdown’s principle of readability in pure-text formatting, and I wanted to share a couple of them here. is a simple, web-based Markdown editor with a pane that renders your Markdown as formatted HTML in really-close-to-real-time. It’s a great site for playing around with Markdown for the first time.

(It’s kind of like Codepen for text.)

iA Writer

iA Writer, is a minimalist and un-opinionated Markdown editor for MacOS and iOS, and it’s been my Markdown editor of choice basically since it launched. I first used it on my first generation iPad with that amazing keyboard dock, and continued to use it as iA built the Mac app and built out the feature set.

One of my favorite features of iA Writer is its syntax highlighting. Unlike with a code editor, iA Writer lets users highlights English words based on the part of speech they represent. So, if I’m working on a sentence that’s lexically dense, I’m able to visualize its bits and pieces to ensure that I’m not veering too deeply into run-on territory.

It also features easy integration with Dropbox and iCloud Drive, full-screen editing, metadata support by way of MultiMarkdown, a range of export modes, easy image/file embedding, and custom document templating for PDF exports, a feature near and dear to my heart.

There are other Markdown-driven editors out there, including Ulysses and Scrivener, which are geared toward toward users who want more software-based assistance with project management and organizational structure. I’ve tried Ulysses and quite liked it, but I still prefer iA Writer’s somewhat hands-off approach.

At time of writing, iA Writer is still my tool of choice for writing my weekly-ish newsletter. It’s one of the best pieces of software I use and can’t recommend it highly enough.


Marp is an open source, cross-platform editor for making presentations using Markdown. It utilizes Github-flavored Markdown’s syntax and a simple text editor with more traditional syntax editing and so-called “directives” for how Marp’s rendering engine treats pagination and aspect ratios. To that end, using Marp, you can set aspect ratios for standard paper sizes in A and B 0-8, as well as other popular aspect ratios.

For now, the software is still in a pre-release beta, and it lacks some of the features of more fully-developed Markdown presentation apps like Deckset or the Remark.js library, but it’ll be interesting to see where the project goes.

Closing thoughts

I am a big, big fan of Markdown, and since it’s become the default plain-text input syntax for extremely popular websites like Github, reddit, Hacker News, StackExchange and others, it seems to have cemented itself as the default standard on the web.

However, like anything that isn’t purely WYSIWYG, Markdown still feels like a thing for programmers, power-users and professionals. This reputation, to me, feels somewhat undeserved because, again, it’s really freaking easy to pick up.

So, if you’ve never tried writing in plain text like this, give a Markdown editor a spin. There are literally hundreds of great options out there.

April 18, 2017

Cook, Steven A. “RIP Turkey, 1921 – 2017.” Foreign Policy, April 16, 2017.
Fitzpatrick, Brad. “Thoughts on the Social Graph.” Personal Site., August 17, 2007.
Honan, Mat, and Alex Kantrowitz. “Here’s What Mark Zuckerberg Told Us About The Wild Things Facebook’s New Camera Will Do.” BuzzFeed, April 18, 2017.
Kantrowitz, Alex. “Meet The Man Who Makes Facebook’s Machines Think.” BuzzFeed, April 17, 2017.
Knight, Will. “There’s a Big Problem with AI: Even Its Creators Can’t Explain How It Works.” MIT Technology Review, April 11, 2017.
Ortiz-Ospina, Esteban, and Max Roser. “Trust.” Our World In Data, 2016.
Shaw, Mike. “From OpEx back to CapEx.” HPE, April 17, 2017.

Refs: April 14, 2017

Ethan Kurzweil, “An inside Look at Bessemer Venture Partners’ Investment Process for Twilio,” TechCrunch, April 11, 2017,

Jeff Bezos, “Exhibit 99.1,” Shareholder Letter, (April 13, 2017),

Yinmeng Zhang, “How to Measure User Retention and Track Improvement,” Apptimize, July 28, 2016,

josephg, “Josephg’s Comment on ‘How We Built r/Place,’” Comment, Hacker News, (April 14, 2017),

Bruce Booth, “Of Abundance And Scarcity In Venture Capital,” LifeSciVC, March 13, 2017,

Ty Magnin, “The 4 Customer Retention Metrics You Need to Measure Now,” Appcues Blog, accessed April 15, 2017,

Colin Dickey, “The Elements of Bureaucratic Style,” Longreads, April 12, 2017,

Eric Newcomer, “Uber, Lifting Financial Veil, Says Sales Growth Outpaces Losses,” Financial News,, (April 14, 2017),

Alex Wilhelm and Katie Roof, “Uber Shares Growing Financials to Distract from Negative Publicity,” TechCrunch, April 14, 2017,

Refs: April 13, 2017

American Bar Association, ed., Fund Director’s Guidebook, 4th edition (Chicago, Illinois: ABA, Business Law Section, 2015).

Kurt J. Berney, Mitchell S. Presser, and David H. Wasserman, eds., Private Equity & Venture Capital Investing: Legal, Financial & Strategic Techniques for Successful Investing, Corporate Law and Practice Course Handbook Series, no. B-1276 (New York, N.Y: Practising Law Institute, 2001).

Danah Boyd, “Toward Accountability: Data, Fairness, Algorithms, Consequences,” Data & Society: Points, April 12, 2017,

Justin J. Camp, Venture Capital Due Diligence: A Guide to Making Smart Investment Choices and Increasing Your Portfolio Returns, Wiley Finance Series (New York: Wiley, 2002).

John Henry, “Mastodon Is Dead in the Water,” Hacker Noon, April 5, 2017,

Ilya Pestov, “How PCs Were Advertised in the 1990s,” freeCodeCamp, February 11, 2017,

M. G. Siegler, “The Squid,” 500ish Words, March 27, 2017,

Andy Sparks, “All the Venture Capital & Fundraising Bloggers You Should Be Following,” Medium, January 25, 2017,

Rick Turoczy, “An Open Source Guide for Building the Startup Accelerator of Your Dreams,” Medium, April 4, 2017,

Alex Wilmerding, Term Sheets & Valuations: An inside Look at the Intricacies of Term Sheets & Valuations (Bedford, MA: Aspatore Books, 2001).

“How We Built r/Place,” Upvoted, April 13, 2017,

April 12, 2017

Stef Aupers, “‘Trust No One’: Modernization, Paranoia and Conspiracy Culture,” European Journal of Communication 27, no. 1 (March 1, 2012): 22–34, doi:10.1177/0267323111433566.

Josh Constine, “Facebook Messenger Hits 1.2 Billion Monthly Users, up from 1B in July,” TechCrunch, accessed April 12, 2017,

Dan Motzenbecker, “Fast Drawing for Everyone,” Google, April 11, 2017,

Mike Preuss, “Financial Modeling for Startups,” OpenView Labs, April 11, 2017,

Robert Safian and Robert Safian, “Mark Zuckerberg On Fake News, Free Speech, And What Drives Facebook,” Fast Company, April 11, 2017,

Strange Parts, How I Made My Own iPhone – in China, accessed April 12, 2017,

Daniel Tomlinson, “It’s Not the Gig Economy, Stupid.,” openDemocracy, April 11, 2017,

Benjamin Wallace-Wells, “The Despair of Learning That Experience No Longer Matters,” The New Yorker, April 10, 2017,

An Awkward Twitter Exchange With A Former Employer

edit: apparently, this article has gotten a fair bit of attention from Hacker News. There’s a link here.

edit 2: the HN link was flagged and removed.

edit 3: like adults, Kevin and I talked out our differences. I still think he came off as exceedingly callous, and we still fundamentally disagree on several core issues here. But we both have a fair bit of common ground. While I still feel justified in initially writing this little post, know that I feel comfortable discussing these issues with him and anyone else on reasonably civil terms.

Unless you’ve been living under a rock, you’ve probably heard that the American Health Care Act, known by many as Trumpcare, died a somewhat ignominious death on the floor of the US House last week.

I say good riddance to the bill. And, moreover, I tweeted out “Next stop: Single Payer” because I’m a fan of the idea of single payer healthcare. (I’m no policy expert in much of anything, much less healthcare, so I openly admit that my affinity for single payer is purely based on feelings.)

So anyways, who parades into the @-replies like the little kid in the Robert Kelly BBC video but the CTO of the company I used to research and write for… Continue reading “An Awkward Twitter Exchange With A Former Employer”

Autogenerating Currency Conversion Formulas In Google Sheets Using GOOGLEFINANCE(CONCATENATE())

I forgot where I heard this, but on some or another podcast it was declared that “Microsoft Excel is the gateway drug to programming.” And I’m coming to believe this more and more.

I’m someone with more than a passing interest in programming who simultaneously lacks any serious proficiency with writing code. Irony of ironies, right? Also, I’m now in this weird liminal space between being really good at manipulating data in a spreadsheet-type environment and seeing the possibility of what I can do with a real programming language while still sorely lacking in the practical know-how to get a lot of things done.

And that’s why I’m still tied to using Excel and Google Sheets for a lot of my data analysis work. Both are fine tools, albeit with their own quirks and limitations. Although Excel is good for the kind of work I do, which typically involves big CSVs that Google Sheets kind of chokes on, I strongly prefer Google Sheets for its more expressive functions and easy connectivity to outside data stores, including Google’s own services.

It’s for this reason that I’m going to be covering the subject of creating abstract, auto-generating formulas in Google Sheets only. Also, I’m like 90% sure one can’t use CONCATENATE() in Excel for the use case I’m presenting here, but I’d love to be proven wrong.

The challenge

Part of my job is to analyze venture capital data, and oftentimes the scope of my analysis expands beyond US borders. Accordingly, I often have to deal multiple currencies, which can be a pain.

So imagine a column containing data for an arbitrarily large number of VC deals priced in an arbitrary number of different international currencies. (For the sake of this example, let’s assume these are all fairly recent deals, so historically accurate currency conversion figures aren’t important.)

Remembering that our dataset can be arbitrarily large, what’s the easiest way to convert those foreign currencies into USD so we can make comparisons on equal terms?

An example dataset

Below, to avoid using proprietary data, I fabricated an array of 20 sample deals using a random number generator and multiplying its output by different scalars depending on the round type. The size of deals do not necessarily correspond to any real-world averages and are here for demonstration purposes only.

Also, I picked 20 rows because it’s small enough to fit in a screenshot. For a sample size of 20 rows, it’s still easy to do all the conversions by hand sorting, but the ideal solution would scale to sheets with hundreds or thousands of rows and a huge combination of currency conversions. This is why we’re going to emphasize abstraction here.

Here’s what we’ve got to work with…

Screenshot 2017-03-23 14.07.14

(Yes, the numbers are hideous. Deal with it.)

Here, we have sample deals from five different countries: the USA, Canada, the UK, France, and Germany. (I intentionally picked two countries that use the same currency for reasons that will become apparent later)

Converting foreign currencies to USD, some methods of varying efficiency

We have several choices for how we want to make the conversions of foreign currencies to USD. Here, I’ll share three ways, with each successive option being more abstract and scalable than the last.

To remind ourselves of what we want to convert our currencies into here, we’ll add a “Target Currency” column and set all values in that column to USD. And we’ll also add a “Conversion Rate” column where we’ll set our conversion ratio. (This column isn’t absolutely necessary, strictly speaking, but it keeps things organized and clear from a visual perspective.)

Screenshot 2017-03-23 14.22.16

Brute force

Let’s say you’re a masochist with a fetish for tedium and frustration. This is the method for you.

Remember, I said “masochist” and not “primitive cave dweller” here, so I’m going to run on the assumption that, being an enlightened user of spreadsheeting tools, you understand how to sort columns.

So we start by sorting the “Base Currency” column to make things at least somewhat easier to deal with… Note how all the base currencies are now grouped.

Screenshot 2017-03-23 15.09.54

Now for the brute force part. We search Google for each conversion pair (“CAD USD,” “EUR USD,” etc.), copy and paste the ratio into our spreadsheet, and manually fill down.

Brute Force Conversion Table Making

For this small sample set, it took me almost exactly a minute to build a conversion column using brute force. But this is only for a small handful of currency pairs. If I was dealing with dozens of pairs, this would have been a much bigger task.

Enter The Joys of GOOGLEFINANCE()

Like I may have mentioned earlier, one of the nice parts about Google Sheets is that it gives users direct access to some of Google’s services directly through a series of bespoke functions.

For example, the GOOGLETRANSLATE() function lets users translate strings in spreadsheets from one language to another using the Google Translate engine. In conjunction with DETECTLANGUAGE(), one can generate some interesting formulas.

But here we’re going to talk about the joys of the GOOGLEFINANCE() function.

There’s standard syntax for pulling current and historical stock market prices:

GOOGLEFINANCE(ticker, [attribute], [start_date], [num_days|end_date], [interval])

So, if I wanted to find the closing price of Apple on March 7, 2014, I’d write the formula like this,


And Google automatically returns that information and builds a table to display it.

It turns out that the GOOGLEFINANCE() function also lets you find the current conversion rate between two currencies. (Unfortunately, at time of writing, it doesn’t let you find historical conversion rates.)

Here’s that syntax:


Using the official, three-character currency codes, we’d convert Canadian Dollars to USD using this function:


Now, for our table of VC deals we want to convert into USD, we could hard-code the currencies we want to convert into our formulas by group.

Here are the other hard-coded formulae:


Google Finance will return the current conversion rate and embed it as a number in the spreadsheet.

Below is a screenshot of our Google Sheet with an escaped version of the formula next to the conversion rate. (Note what’s in the formula bar for the selected USD -> CAD conversion.

Screenshot 2017-03-23 16.57.13

And, once we’ve hardcoded all the formulas, all one would have to do is drag the corner of the cells down to fill in the rest of the table with the appropriate values.

Just like the original “brute force method” this is all well and good if the number of currency pairs is small, there are few rows, and any re-sorting of the rows will be on a whole-sheet basis.

Now, on to the fun part…

Dynamically generating currency conversion formulae using GOOGLEFINANCE(CONCATENATE())

Alright, so we start with the general form of a currency conversion rate query in Google Sheets, the same as what was previously listed.


Now, let’s look at our table and its columns.

  • Column C: “Base Currency”
  • Column D: “Target Currency”

Hmmm… seems familiar… If only there was a way to join those elements into a formula.

Enter Google Sheets’s CONCATENATE() function, which is similar to its cousin CONCAT(), except for the important fact that it lets you concatenate an arbitrary number of elements.

Importantly, in Google Sheets, the output of the CONCATENATE() function is not simply treated as a string. Its output is usable inside another function.

So, to start, let’s concatenate cells D2 and E2 using the following formula:


And as we can see, the result is “CADUSD” which is is the required pairing of source and target currencies we need in our formula.

Screenshot 2017-03-23 17.17.35

Now that we’ve proven we can build our one part of our formula using CONCATENATE(), let’s see if we can build the rest of it.

Typing in the following formula produces outputs what we need to give to GOOGLEFINANCE()…


So, now we can bring it all together…


Before showing the nice gif of how it all “just works,” give me one second to explain how one formula will be able to generate a conversion ratio for all of the currencies in our set.

The D2 and E2 cell references are relative, which means that as I drag the equation down the sheet it will still pull from the cells in the two adjacent columns, but will take the value from each row. So that same equation, if applied to, say, row 3, would read from D3 and E3. From row 4, it would pull from D4 and E4, and so on down the sheet.

So, here’s the moment you’ve been waiting for…

At this point, it’s just a matter of multiplying the “Deal Amount” column by the “Conversion Ratio” column to generate the “Converted Amount.”

Screenshot 2017-03-23 17.54.39

And there you have it…

Next Steps

One of the features of this kind of query with GOOGLEFINANCE() is that it dynamically updates as new currency exchange rate data becomes available. This can be viewed as either a bug or a feature, depending on your particular needs.

In the event you don’t want these numbers to change, simply copy the contents of the columns that update dynamically and paste those cells in “as values”. (In Google Sheets, goto Edit -> Paste Special -> Paste Values Only [⌘ + Shift + V].) As this suggests, it just pastes in the alphanumeric values of the cells, and strips out the formula data.

In the event that you still want to edit the formulas, which in variably you will, my suggestion is to duplicate the tab so you have one dynamic, editable version, and the static version you can work off of in later analysis.

That’s All, Folks!


This has been a somewhat protracted way of saying that a little bit of abstraction makes for a time-saving and viscerally satisfying (at least from my perspective) data analysis experience.

CONCATENATE() can be used outside or inside other functions in Google Sheets to build flexible, extensible auto-generating formulas in your spreadsheets, and I’m very much looking forward to a exploring how else it can be applied in the work that I do.

This is also my first time offering up one of these tutorials, so if you liked it and want me to make more of these, please let me know! Future topics I want to cover include pivot tables, demonstrating a superior alternative to VLOOKUP() and INDEX(MATCH()), and a couple of others.

One Year Ago, I Graduated From College

One year ago, almost to the date, I finally managed to graduate from UChicago with general honors.

I did “the scenic route” through college, taking a long break after three years to work on a startup, only to come back and finish on relatively short notice.

It was worth it to go back and finish, and I’m happy I took the time off in the middle. Even though taking that time off involved a lot of struggling, and ultimately resulted in failure of the project, I maintain it was the best thing for me to do at the time. I’d do like 95% of it all over again.

In general, the last year has been good. I’ve built a platform for myself through my weekly(-ish) newsletter, and gained credibility by writing for Mattermark and now Crunchbase.

The most rewarding thing, though, has been my continued work with the Python Software Foundation. It’s an incredible organization consisting of phenomenally smart and kind people, and I have the privilege of working with some great people, including one of my oldest friends, in making Startup Row happen.

I’ve also found the thing I want to do with the next couple decades of my life, which is to find and invest in interesting startups. And anything I can do to accelerate myself toward that end will be pursued.

In general, it’s been a pretty good 365-ish days.

I’ve learned a lot in the past year, and I’m still figuring out how I want to articulate it. Stay tuned for more.

Also, as petty as it sounds, it still feels good to stick it to my high school guidance counsellor who thought applying to so-called tier-three schools was “a bit of a reach” for me.

Opportunity in Two Flavors

One night this week I met up with one of my best friends. I don’t get to see him that often, but that’s alright. It’s one of those friendships that picks up right where it left off, even if it’s been weeks or months.

He’s had a lot of opportunities, and so have I. This friend of mine is a bit older than me, and, accordingly, has moved farther on in his career. He’s one of these people with a solid job and, like, three side projects, all of which are doing phenomenally well. If he wasn’t so down to earth, it’d be all too easy to resent the guy’s success.

Somehow, we got to talking about opportunities in the meta sense, and I realized his definition of opportunity and my definition of opportunity are quite different. And, now that I’ve had a cumulative fourteen hours on airplanes without internet this week to reconcile these two differing definitions, I think I’ve been won over by his. Continue reading “Opportunity in Two Flavors”

Snapchat, By Some Numbers

Snap Inc., maker of the Snapchat app and face-mounted camera glasses called Spectacles, filed its S-1 with the SEC this past week, the first major step toward going public.

I thought it’d be interesting to compare Snap Inc. to Facebook, considering that Snap CEO Evan Spiegel’s IPO roadshow message is that his company is “The next Facebook,” according to coverage in the Wall Street Journal.

I spent some time digging through Snap’s S-1 filing and found some interesting tidbits:

  • Snap aims to raise $3 billion in its IPO at a $25 billion valuation, up just slightly from the $20 billion valuation it reached in its $1.8 billion “extended” Series F round closed in May 2016 (and reported on here in the 4th edition of this newsletter)
  • Snapchat currently boasts 158 million daily active users. (For reference: the company reported 110 million DAUs in December 2015.)
  • These DAUs are currently creating 2.5 billion “Snaps” per day.
  • 60% of these users use the chat service every day.
  • DAUs check Snapchat more than 18 times per day.
  • Snapchat users spend an average of 25-30 minutes each day.

I found some comparative figures from this article published in ZDNet in February 2012, on the day Facebook filed its S-1.

  • Facebook had 483 million daily active users during the month of December 2011. (Roughly 3x Snapchat.)
  • In that same month, Facebook users uploaded 250 million photos daily to FB. There were an average of 2.7 billion likes and comments made during the 3-month period ending December 31, 2011. (Roughly 1/10th of the photos uploaded but a comparable number of aggregate interactions to Snapchat at time of IPO filing.)
  • Facebook users spent an aggregate of 9.7 billion minutes per day on the desktop site, which works out to about 12-13 minutes per day for each of FB’s then 845 million monthly active users. This also does not count time spent on the mobile app. (To compare: FB users spent slightly less time than Snapchat users on a per-day basis.)

Oh, and Facebook was also profitable and had comparatively more valuable assets and cash on hand at time of its IPO filing.

One of the metrics I find most interesting is to compare the per-user value of Snapchat compared to other platforms and services. I arrive at these figures by dividing the number of Daily Active Users by the then-current (or desired) valuation of the platform. (I’d prefer to use MAUs, but, tellingly, Snap Inc didn’t disclose MAU statistics in its S-1 filing.)

Per user values (DAU/valuation) are as follows:

  • Snapchat: $25 billion valuation / 158 million DAU = ~$158 per DAU
  • Facebook: $103 billion at IPO / 483 million DAU reported in S-1 = $213.25
  • Twitter: $14.2 billion at $26 IPO price / 100 million DAU = $142
  • Line: $7 billion IPO price on July 14, 2016 / 220 million DAU in 2016 = $31.81
  • WhatsApp: $16 billion at time of acquisition by FB / 324 million DAU (72% of 450 MAU, via Sequoia Capital) = $49.38
  • Instagram: $1 billion acquisition by Facebook in April 2012 / 1.38 million DAU in April 2012 (That’s via data from ComScore, but data from AppData suggested that Instagram had only 860,000 DAU at acquisition) = $724.63 per user at 1.38M DAU

It’s interesting to look at these figures, because it might hint at how Snap values and intends to position itself going forward. Whatever signal can be divined from Snap’s per-user-value figures points toward the company’s intention to aggregate attention and data in the same way as Facebook and Twitter did, rather than provide a simple service like Line and WhatsApp. In other words, the per-user value Snap Inc aims to show its investors is in the same ballpark as other massive social platforms of previous generations.

As a platform, Snapchat is compelling for a number of reasons, including its unique augmented reality components, an innovative user experience design paradigm and, importantly, a strangle hold on users’ attention by way of its ephemeral messaging and video play-back features. Whether Snap Inc is able to capitalize on its strengths and deliver on its potential value as a platform is still uncertain.

However, I remain skeptical that Snap Inc will be the next Facebook. I doubt Snap will attain Facebook’s scale or scope, and I’m not the first to point out that Snap’s current price feels a bit expensive.

We’ll see what happens.