400 error on heroku git:clone

heroku photo

Photo by jacobian

I’m working on an estimate for changes to a heroku hosted web application.

I was trying to run heroku git:clone --app appname after adding myself as a collaborator. I was running this on a new vagrant box running ubuntu.

However, I kept getting this error message:

vagrant@precise64:~$ heroku git:clone --app appname
Cloning from app 'appname'...
Cloning into 'appname'...
error: The requested URL returned error: 400 while accessing https://git.heroku.com/appname.git/info/refs
fatal: HTTP request failed

And I couldn’t understand why.

After some fiddling, I determined that first you need to have an ssh key generated:

vagrant@precise64:~$ ssh-keygen -t rsa

And then you can run:

vagrant@precise64:~$ heroku git:clone --app appname --ssh-git
Cloning from app 'appname'...
Cloning into 'appname'...
Warning: Permanently added the RSA host key for IP address 'ipaddress' to the list of known hosts.
Fetching repository, done.
remote: Counting objects: 902, done.
remote: Compressing objects: 100% (473/473), done.
remote: Total 902 (delta 433), reused 826 (delta 379)
Receiving objects: 100% (902/902), 28.06 MiB | 556 KiB/s, done.
Resolving deltas: 100% (433/433), done.

Hope this helps someone, somewhere.




Twitter as conversation

tweet photo

Photo by MDGovpics

I confess, I’ve been guilty of using twitter as a broadcast only mechanism.  I have two main accounts and one of them is purely broadcast (I use tumblr to post links to Twitter and a Facebook business page–more on that experience).  But, inspired by this analysis of Marc Andreesen’s tweets during 2014, I was inspired to start using Twitter as a way to have conversation.  As of late December,  I’m committed to responding to at least one tweet when I open up Twitter.  Not a retweet, not a favorite, but an honest to god reply.

So far, I’ve enjoyed this.  If someone is tweeting out an article, it forces me to read the article critically.  If someone says something provocative, I can respond with a question.  I have started to unfollow people who just post links (like I did) because I’m looking for conversation.  Seeking conversation gets addictive pretty quickly.

The downside is that this takes more time.  Not much more (it’s only 140 characters after all) but more time.  Frankly, it can also be a bit scary to yell your opinion to the whole world (or at least that subsection of the world that is on Twitter and is reading your tweets, which is much smaller).  I do that on this blog all the time, but responses on Twitter are far less polished.

I know this is old hat to many Twitter users, but it is a new paradigm to me. I’d love to have stats on this to make myself more accountable, but I wasn’t able to find an easy way to show my Twitter usage (new tweets vs replys vs retweets)–does anyone know one?



On failing to enter a partnership

I recently explored a business partnership opportunity that was quite exciting.  I had met the possible partner a few years ago.  He has technical chops (a software developer) and runs a company in a sector I’m very interested in.  He had a SaaS application that had real traction–users, revenue.  It wasn’t profitable, but looked like it could be shortly.  If we could find a way to work together, I could own the technical side of things and let him focus on selling and marketing.

However, it didn’t end up working out.  No blowups, thankfully, just a failure to find an arrangement that worked for both parties.

It was quite the emotional roller coaster ride for me.  A business partnership is like marriage without the sex, and so we were both cautious, but it was very easy to get excited about working together and building a big business.  It was all the more exciting to me because he’d done this before.

Here’s what went right:

  • We had open conversations about each of our financial needs.
  • He built a budget and business plan.
  • We used Skype for conversations so that non verbal cues were available.
  • We worked together for a month before hand, which gave us some context.
  • We checked references and had our spouses meet.
  • We planned to get together and work face to face.
  • We used Google docs, which was a great way to share spreadsheets and documents about the business.
  • I reached out to a few mentors to get advice.  Every single person said: “write your expectations down”.  Every one.
  • On the advice of one of the mentors, I read the Nolo books about LLCs, partnerships and business buyouts.  These were tremendous.  Not only did they lay out scenarios I had never considered (what if one of the members of the partnership is disabled?  what if you want to bring someone new in?  what if you want to give time rather than money in exchange for equity?  and many many more), they also give you sample agreements.
  • We set deadlines, both for documents and for coming to a final decision.  We stuck to those.
  • We parted amicably.

And here’s what went wrong:

  • We put off explicitly valuing the existing company until late in the game.  Then it became clear we had pretty different numbers in mind.  We should have done this as soon as we were both interested.
  • We didn’t really know each other, the month of working together notwithstanding.  Just as for investing, I am beginning to think that partnerships work best with lines, not points.
  • The budget and business plan were limited in scope (one year out, then some major assumptions about future years).  Hard to make more detailed predictions about the future, especially since the plan called for major new products.
  • I was in a different state than he was.  This would have made finding common service providers (CPA, mediator, etc) difficult.  No real fix for this, other than one of us moving.
  • Valuing an ongoing, non profitable bootstrapped business is really hard, because most of the value of the business is in the future.  I found some articles, but didn’t find much about this particular scenario.
  • We didn’t really nail down whether this was a partnership, a buy in to an existing business or a valued employee relationship.  Each of these have different equity implications.
  • I didn’t sell myself as well as I should have.

All in all a great experience.  I learned a ton.  Of course, I would have been happier if we could have reached agreement, but I understand why we ended up where we did.


Symfony2 Impressions

violin photo

Photo by mitch98000

Recently, I had a short engagement for a client who had an existing application written in Symfony2.  I haven’t really touched the modern PHP frameworks (the most recent experience was CakePHP 1.2, which was last released almost 3 years ago).  It was a pleasant surprise.

What was awesome about Symfony?

  • It forces you to think in terms of components (called bundles).  Even the core functionality is a bundle.
  • There are many bundles out there to let you get up to speed quickly.
  • It uses Composer, a dependency management tool much like Maven or NPM, to manage packages.
  • The documentation is extensive and versioned.
  • There is a clear product roadmap, including long term releases and clear deprecation dates
  • It has built in integration testing functionality, which lets you test clicks and form submissions and search the DOM for expected results.
  • There is clear configuration support for different environments.
  • It uses an ORM which seems capable–I didn’t get to dive into this too much.

Of course, the proof is in the pudding, and I didn’t get a chance to live with this solution for more than a few weeks.  I don’t know how active the community is, though the google group seems relatively active.  I’m sure there are warts in Symfony2–searching for ‘symfony2 sucks’ turned up a few rants.  But, for a greenfield webapp project, I’d happily use Symfony2.



How should the Boulder Denver New Tech Meetup evolve?

technology photo

Photo by katerha

I attended BDNT last night and four of the presenters had cancelled the day before.  For shame!

Instead of scrambling to find new presenters, Robert Reich, the organizer for nine years(!), had a free ranging discussion about the nature of the meetup and how it could best serve its audience.  He also asked for suggestions on how to make the meetup better, from both new attendees and regulars.  People came up with a wide variety of suggestions:

  • fostering networking
  • setting up mentoring
  • focusing on technology rather than business
  • having a joint meetup with other meetups in the area

In a testimonial to the willingness of the people who run BDNT to experiment (or to the lack of imagination of participants), Robert had tried almost all the suggestions at one point or another, and they’d all been abandoned because of either lack of manpower, lack of success or lack of adoption.

Robert also mentioned that the BDNT seems to be a great ‘top of funnel’ meetup for people who are new to town.  They come the BDNT, learn about the Boulder scene, and move on to other, more focused groups and meetups.  Because so many different types of people use this meetup as a jumping off point, that can make it difficult to focus.

I think it is great that we could have such a discussion, and someone suggested ‘discussing roadblocks’ as a topic that the meetup could focus on.  Robert immediately asked ‘who has a roadblock’ and someone mentioned hiring as a tough one.  There then was a fairly free form but moderated discussion about hiring–what the best way to hire was, what the right questions for founders, employers and employees were, and how to think about risk profiles.

Unlike in past meetups I have attended, the room wasn’t packed (only about 100 people, which makes that a small BDNT).  Additionally there was very little Twitter backplane discussion (I saw three comments on the #bdnt hashtag, and two of them were mine).

There were also two of the more typical presentations, from a marijuana dispensary product search engine and a piece of hardware that modifies music based on sensor input.  I unfortunately wasn’t able to fully view either of these presentations, but it was nice to end up where I think the BDNT is unique: demos and pitches.

I don’t have any great advice for Robert on making the meetup better.  It seems that getting 100-400 people to take a few hours out of their lives to discuss new technology for almost a decade is a success any way you measure it.  If he still loves the meetup and the people he’s meeting, he should continue on.  If he doesn’t, then it might be time to quit, if he can’t find someone to take it over.

Sometimes things end.


Fun with Apache Spark And Census Data

I recently downloaded Apache Spark.  After working with HBase for a bit on my last project, it was a joy, even though I know little Scala.  I also downloaded some data from the Census Bureau (the 2010 Business Patterns, a pipe delimited file containing information on the business activity of the USA). I used the prepackaged data sources, so I didn’t have to use the Census API, which I have written about previously.

I was able to quickly start up Apache Spark on my workstation (thanks, quickstart!), and then ask some interesting questions of the data. I did all this within the Spark shell using Scala.  The dataset I downloaded has approximately 3M rows, so it is large enough to be interesting, but not large enough to need to actually use Spark.

So, what kinds of questions can you ask?  Well, given I downloaded the economic activity survey from 2010, I was interesting in knowing about different kinds of professions.  I looked at primarily at MSAs (which are “geographical region[s] with a relatively high population density at [their] core and close economic ties throughout the area”).  I did this because it was easy to filter them out with a string match, and therefore I didn’t have to look at any kind of code mapping table which I would have to dig into smaller geographic regions.

First, how many different professions are there in the Boulder Colorado MSA? This code:

val datfile = sc.textFile("../data/CB1000A1.dat")
val split_lines = datfile.map(_.split("\\|"))
val boulder = split_lines.filter(arr => arr[7].contains("Boulder, CO Metropolitan"))
val boulder_jobs = boulder.map(arr => arr(10));
boulder_jobs.count();

tells me in 2010 there were 1079 different types of jobs in the Boulder MSA.

Then I wanted to know which MSAs had the most jobs. Thanks to this SO post and the word count example, I was able to put together this query:

val countsbymsa = split_lines.map(arr => arr(7))
.filter(location => location.contains("Metropolitan Statistical Area"))
.map(location => (location,1)).reduceByKey(_+_,1).map(item => item.swap)
.sortByKey(true, 1).map(item => item.swap);
countsbymsa.saveAsTextFile("../data/msacounts");

And find out that the Los Angeles-Long Beach-Santa Ana, CA MSA has the most different jobs, at 2084 (nosing ahead of NYC by 14 jobs), and the Hinesville-Fort Stewart, GA MSA had the fewest at 700 (at least in 2010).

I didn’t end up using the XML utilities I found here, but found the wiki full of useful tips.



© Moore Consulting, 2003-2014 +