Test image We’ve recently embarked on an effort to develop several new tests for Smarterer. They’re still relatively new and unpolished, but we need guinea pigs (preferably who actually know something about the topic at hand) to actually take some of them so that the scoring algorithms can kick in to help calibrate them.

Each test should only take a few minutes and your scores are private (unless you decide to share them).

Clearly they need some calibration, I got a Master level in Twitter development and super-beginner in Facebook development (I would assume I’d be closer to the middle for both of those). Lets not talk about Samba, wow I did terribly.

Any help is appreciated!

{ 0 comments }

Web Server Logging Tip

One of my recent favorite techniques when using nginx is to modify the logging format to make it easier to work with. It’s a simple thing, but it made me slap my forehead and say “Why have I not been doing it this way all along?” I’m using nginx for most of my projects these days, but obviously this will work with any web server that lets you modify the log format.

I’ve used the standard “Common Log Format” format for as long as I can remember. This means I’ve invariably ended up writing simple, one-off, custom parsers or looking for existing tools to extract interesting information from the web logs. This little bit of extra work has always irritated me whenever I’ve wanted a quick answer to some simple question that I can only get from the log (for whatever reason).

Now I use a custom web log format that includes tabs as field separators and removes the extra delimiters from the CLF. Like I said, simple, but makes my life just a little bit easier. I also include a few other fields (like response time information) that are available in the nginx log_format directive.

So in your nginx.conf (or virtual server conf), first you define a log format:

log_format timed_tab_combined \
 '$remote_addr\t$time_iso8601\t$request\t'
 '$status\t$http_referer\t$http_user_agent\t'
 '$body_bytes_sent\t$msec\t$request_time';

Then you specify that format in your access_log directive. If you want, you can also keep the common log format and write out two log files (although this is really unnecessary).

access_log  /var/log/nginx/custom-weblog.access.log timed_tab_combined;

Now if I ever need to check for a particular field, I can use the ‘cut’ command line tool to extract just the fields I care about. This makes visually scanning log data a lot easier without the extra noise.

I can get quick answers to simple questions like “How many times did Googlebot GET my ‘/scores’ URL in the current log file? I ‘cut’ on fields 3 and 6, the request uri and the user agent respectively. Then a little grep-foo and a line count and voila, an answer.

$ sudo cut -f3,6 /var/log/nginx/custom-weblog.access.log | grep -P "^GET /scores" | grep "Googlebot" | wc -l
3117

Another example: whats the distribution of IP addresses in my current log file? (ip addresses in the example blanked for privacy).

sudo cut -f1 /var/log/nginx/custom-weblog.access.log | sort | uniq -c | sort -n | tail
   1439 108.xx.xx.xx
   1442 79.xx.xx.xx
   1442 92.xx.xx.xx
   1689 60.xx.xx.xx
   1746 65.xx.xx.xx
   2034 142.xx.xx.xx
   2141 66.xx.xx.xx
   2542 82.xx.xx.xx
   2697 182.xx.xx.xx
   8334 66.xx.xx.xx
I, for one, welcome our new robot overlords…

It also means if I have to write a one-off parser, it becomes trivially easy since it’s just a tab-separated file. Since all of the information is still present, it’s also super easy to convert this back into Common Log Format if you need to use existing, off-the-shelf, log parsers.

There are other ways to skin this particular cat, but the simplicity of this approach appeals to me.

{ 0 comments }

This post originally appeared as part of a two part series on greenhornconnect.com

While I believe the best way to evaluate potential co-founders is to work together, often times the first steps in the process are quick introductions and elevator pitches. In this part, I outline some tips for looking at idea pitches as starting points to exploring potential long-term working relationships rather than quick filters.

There are many characteristics that can be used to evaluate a potential co-founder but determining whether we think their first idea is a “good one” shouldn’t be the only one. We need to focus on the whole startup process. Ideas should be viewed as ways to start the conversation with the understanding that no startup idea is really “good”. We should be evaluating our common interest, passion for solving problems and our ability to think and work together. Here are some quick tips for reframing the way you think about evaluating co-founders when listening to pitches.

1) Focus on the problem

If the pitch doesn’t outline a problem, ask them to explain it. Failure to describe what problem is being addressed is more common than you might expect (this can be an effect of the curse of knowledge.) Is it a common problem? Is it a problem you’ve encountered personally? Is the problem compelling? Is this a space that you are, or can see yourself being, passionate about? Can you already imagine other ways to potentially attack the same problem? Would it be worth something to gain experience grappling with the problem?

Beware of ideas or pitches that have no clear problem. This is often a sign of a “technology looking for a market”. Startups founded in this way have a difficult time evolving their initial idea because they have no clear way of evaluating their progress.

2) Questions, not blueprints.

Since startups rarely achieve success with their initial ideas, it’s useful to think of the initial idea as an exploratory question. Try rephrasing the idea in a way that allows this exploration. This is an approach proposed by Paul Graham.

There’s a real difference, because an assertion provokes objections in a way a question doesn’t. If you say: I’m going to build a web-based spreadsheet, then critics– the most dangerous of which are in your own head– will immediately reply that you’d be competing with Microsoft, that you couldn’t give people the kind of UI they expect, that users wouldn’t want to have their data on your servers, and so on.

A question doesn’t seem so challenging. It becomes: let’s try making a web-based spreadsheet and see how far we get. And everyone knows that if you tried this you’d be able to make something useful. Maybe what you’d end up with wouldn’t even be a spreadsheet. Maybe it would be some kind of new spreasheet-like collaboration tool that doesn’t even have a name yet. You wouldn’t have thought of something like that except by implementing your way toward it.

Treating a startup idea as a question changes what you’re looking for. If an idea is a blueprint, it has to be right. But if it’s a question, it can be wrong, so long as it’s wrong in a way that leads to more ideas.

3) Gauge their willingness to explore

One of the most important aspects of being co-founders is being able to evolve ideas together. Offer alternative ideas for attacking the problem. Even if you think the proposed solution is a good one, offer how you might attack the issue differently. How does the person react? Do they seem annoyed that you’re stepping on their idea? Are they defensive? Or do they embrace your suggestions and start building on them? If you get a feeling of collaboration, possibility and exploration, that’s a good sign that this person may be a good potential co-founder.

4) Execution trumps intuition

Lastly, if you’re even remotely interested in the question or the problem space, spend a small amount of time doing something to help out. Think of this time as an investment in learning what kind of working dynamic you might have together. Keep this first set of engagements lightweight and be clear there is little or no commitment from either of you. It can be something as simple as a follow up meeting to give advice based on your particular area of expertise.

You will learn a lot about each other in this way, and equally as important, you’ll will come to more fully understand the problem and idea. The only way to truly understand the opportunities of a problem / solution space is to actually work on it. It has been my experience that some of the problems I became most passionate about were ones that I initially dismissed. My first startup was one such case. I only understood the exciting potential once I started building something.

Conclusion

Next time you’re in a position to evaluate potential co-founders based on quick conversations, dial back the the “good idea” filter. Instead of listening passively to an elevator pitch, think of it as an opportunity to kick-start the startup process. Imagine that you’re already co-founders and view it as a brainstorming session where you engage and explore the problem and possible solutions. You may find that together you will come up with something that transcends the original idea. That’s a first step towards becoming co-founders.

{ 1 comment }

Playing iOS spotify app through AppleTV

I had previously posted a quick tip about using the OS X desktop version of Spotify on an AppleTV. I’ve been pinged a few times by some people asking me “What about the iPhone / iPad app?”

While Spotify is playing, just double click the home button to bring up the multitasking display and swipe to the right, twice. You’ll see see the airplay icon. Select the option to choose AppleTV as the audio output.

Ios spotify

{ 0 comments }

I found a quick fix for a comment repeating problem I was seeing on my blog with disqus. I’m not a PHP or wordpress hacker (normally) so take this with a grain of salt.

I had recently updated my blog’s theme to a new, major-version-release of Thesis. After the update all of my posts began showing the comments from the same post. I tried uninstalling and reinstalling the disqus plugin but that didn’t work.

A little googling and I found a few posts on the subject:

So now I had a hint as to the problem but I didn’t find a clear fix on the googs.

Looking at the generated HTML for each post I found that the disqus_identifier was being set to a single space ‘ ‘.

Spelunking around in the plugin code, first I found where the javascript was being created in comments.php.

<script type="text/javascript">
/* <![CDATA[ */
    var disqus_url = '<?php echo get_permalink(); ?>';
    var disqus_identifier = '<?php echo dsq_identifier_for_post($post); ?>';
    var disqus_container_id = 'disqus_thread';
    var disqus_domain = '<?php echo DISQUS_DOMAIN; ?>';

Following that function I found defined in disqus.php:

function dsq_identifier_for_post($post) {
    return $post->ID . ' ' . $post->guid;
}

So it looked like the $post global wasn’t available or being set.

This made me believe that the structure of the new version 2.0 Thesis templates has somehow resulted in the disqus plugin code not being able to access the $post global variable. I changed the function to use the get_the_ID() and get_the_guid() functions and now all seems to be working again.

function dsq_identifier_for_post($post) {
    return get_the_ID() . ' ' . get_the_guid();
}

As far as I can tell from the wordpress docs, those functions should, in theory, work in the same scope as the $post global so I’m not sure why the functions work but the global doesn’t (and I stopped poking around wordpress at this point since it started working, nothing like being a monkey in the control room of a nuclear reactor :) ).

Thought this might help someone out there that hits this specific problem.

{ 33 comments }

note: This is for the Mac OSX version of Spotify, for the iOS app: how to use the Spotify iphone/ipad app with AppleTV

I’ve been using Spotify a lot lately. I also recently purchased an AppleTV. While entertaining some guests, I was thinking it might be fun to play Spotify through the sound system connected to the AppleTV.

It was then that I found a neat little feature of the latest OS X version (Mountain Lion 10.8), the ability to play all audio from your Mac to the AppleTV. Caveat: this might be limited to only certain Macs, I’m using a late-ish model Macbook Air so YMMV.

Just choose “System Preferences” -> “Sound” and choose the AppleTV as the sound output for the Mac. Then all application sounds will play over AirPlay, including Spotify or any other music app. Not earth-shattering, but definitely neat. I didn’t see this mentioned in the searches I did on Google for this so I thought I’d write it up as a quick tip. Hope this helps someone.

Sound through airplay appletv

{ 0 comments }

Seems like the only times I’ve been writing on this poor blog lately is when there’s a new piece of smarterer tech to experiment with / publish :) . I do intend to pick up writing on this blog again soon, but for now, here’s the Smarterer Embeddable Test widget!

Excel Python Beers and Brewers

This allows any site to embed a smarterer test in a modal popup while remaining on the site. Give it a spin and let me know what you think. The excel test is a lot harder than you might think.

{ 0 comments }

Skills, Skills, and more Skills

We’ve updated the sharing options on Smarterer to allow sharing larger embeddable “badge widgets” to highlight more than one skill at a time. This is an interesting way to package the skills you think are important to share with others and to embed them on digital resumes, blogs, etc….

For example, if I wanted to highlight my particular set of web development skills, I could include only those skills that I think make sense, like javascript, css, html and python.

With Smarterer, our motto is not only to “know what you know” but to “show what you know”.

{ 0 comments }

Fun with Pi

Geeky fun: search to see if your name appears in π when the digits are converted to base 27 and mapped to the alphabet.

From the site:

MIKEPK In pi!!!

I searched 31415929 digits of pi, and found MIKEPK once.
The first occurrence was at position 6898826. What this means is that


pi = 3 + . . . + M

276898826
+ I

276898827
+ K

276898828
+ E

276898829
+ P

276898830
+ K

276898831
+ …


Where A=1, B=2, C=3, and so on.

This is much earlier than usual! About 1.7% of 6 letter names occur earlier than that.

{ 0 comments }

I gave this presentation a few months ago at the Boston Python Meetup. I promised to put the slides up but didn’t get the chance until now. We decided to do a major push for Smarterer that same week (with media coverage in TechCrunch and presenting at Webinno) so needless to say I was a total zombie after not getting enough sleep. I didn’t cover as much material as I’d hoped, but I think it went OK.

At some point I’d like to do a follow up and get into more of the details with more code examples.

Python demo files:

{ 0 comments }