Ah Berlin!

I’ve recently returned from an extended stay in Berlin, Germany.  Berlin has quickly become one of my favorite places in Europe and, like Saint Louis, it has been experiencing its own startup boom.   A low cost of living, a stellar public transportation system, an abundance of energetic, educated (and highly inked) young people from diverse cultures, and some smart investors are driving the startup scene forward.  Places like the BetaHaus are popping up everywhere, repurposing once rundown, state-owned buildings and providing cool, low-cost workspaces to many startups and aspiring entrepreneurs (as well as a place to build a shelf or fix your bike).  If you’re in Berlin, stop by the BetaHaus for a tour (you might even get interviewed by the BBC).  Don’t worry, most people there speak perfect English if your Deutsch ist nicht so gut.

More Javascript fun

I’ve been using a nifty little JS library that really simplifies animation effects.  It’s called wow.js.  It works in conjunction with animate.css to implement around 50 different animation effects that can transform a boring page into something with a little more visual interest.  Give it a try.

Building a Pirate Box.

I love playing with technology and the satisfaction I feel after successfully adapting it to suit my whims.  For me, this primarily involves manipulating software, but recently I came across an article on how to hack a wireless router equipped with a USB flash drive to create an anonymous, offline file sharing system.  Having some free time and a few unused Amazon gift cards lying around, I decided to give it go.  The hardware required wasn’t expensive (I’ve paid more for lunch in some cases) and the software is free.

The build process involves replacing the wireless router’s firmware with the pirate box software which allows the router to act as a standalone web server disconnected from the internet.  Although there were only a dozen or so steps required, it took me multiple attempts (and recoveries) before the router’s firmware was successfully reprogrammed and the router booted properly.  Once set up, the router appears to your computer or mobile device as a normal wifi hotspot but connecting to it directs all requests to the internal server rather than the internet.  The result is that it displays a web page that contains some basic information about what a pirate box is, a chat server, and a file server where you upload, download and stream digital media.  With some basic web programming knowledge and a little hacking it is easy to modify these services to provide your own custom functions.

There are many possible uses for such a device:

1. Share files anonymously.  This is the what the stock pirate box software is primarily designed to do.  Set up the box, plug in it, and anyone who connects to it can upload and download files.  Use it in your office for your team to share documents.  Put one in your dorm or apartment building and share digital content (that you*cough* own the rights to *cough*) with your neighbors.

2. Distribute content to a select audience.  Because it is small and disconnected (possibly even battery or solar powered), it’s easy take the box to a special event loaded with exclusive content for event participants.  Since the server isn’t connected to the internet and the router has a limited wifi range, only those people at the event can access the server’s contents.  I imagine bands using these to distribute exclusive or pre-release music and videos to their fans at their concerts.

3.  Encourage people to explore their city with citywide cyber scavenger hunts.  Build and hide multiple boxes throughout the city each containing clues on where to locate the next “treasure” box.  Preload each box with historical trivia, old photos, and other information about the current location as well as rewards.  Allow users to upload photos of themselves at that location as a digital time capsule.

4. Be completely evil (please don’t do this).   Because the box is so portable, disconnected and untraceable it is possible take one to a cafe or other public place, power up the wifi hotspot and then (because you are evil hacker) use the internal server to create your own “fakenet”.  By hacking the server software, you can mimic the login pages of popular websites and capture the ids and passwords that users unwittingly type in (most internet users don’t know how to ensure a server’s authenticity).  Once you have their credentials all you need to do is program the server to display a “Down for unscheduled maintenance.  Try again later.” message so the user doesn’t catch on to the fact that they are not connecting to the real internet. Thinking there is an issue the site (happens all the time) they will try logging into another one (and provide yet another set of credentials).   Scams like this are all too common and it is why you should never enter your login credentials for any site when using a open public wifi, but people still do it.

There are probably dozens of other uses for such a device (good or evil).  With the costs of hardware dropping all the time, there is no valid reason not to experiment and have fun. But please boys and girls use your superpowers for good.  Happy hacking!


Fun with Javascript

I recently came across 2 nifty javascript frameworks by the same developer Ian Lunn.   Sequence is a framework for creating basic animations by defining the elements in your HTML and the animation effects in CSS.   Parallax is a script for creating a background image parallax effect.  Both are solid and do what they should.  Good job Ian.

Here is another cool parallax framework that I haven’t played with yet but it looks pretty interesting.

The practical use of these effects is probably limited by they might add a little eye candy to your otherwise boring webpage.

Keep coding!

What did you do last weekend?

Last weekend I participated in GlobalHack.  I say “participated” rather than “competed” because I didn’t ever have a chance at winning. Why?  I don’t actually work in the Saint Louis tech scene. My current team is global and distributed so I don’t know many local developers.    I decided rather than risk trying to build an effective team of 10 strangers during a 2-day event, I would see just how far I could go it alone.  And although the $50,000 prize would have been nice, my reward was in taking up this more personal challenge.

The parameters of the problem presented were to “create an application that scores and weights sales opportunities in Salesforce.com according to an algorithm and then displays the ranked and scored opportunities in a graphical user interface”.   Although I had no experience with Salesforce, I felt I understood the problem domain better than many people at the event.

Here’s how I approached the challenge:

The problem, to me anyway, wasn’t about how to create a pretty app with a ton of features.  It was how to analyze data and make predictions based on past experience, so I focused my efforts on building a kick-ass Analytics Engine.

As I said, I knew very little about Salesforce.  I had read a bit and gone through some tutorials prior to the event, but that was it.  So rather than try to build my app inside of Salesforce, I would build it as a standalone application using tools I was already familiar with and connect to Salesforce as needed through their APIs.  I also saw some distinct advantages to building a product that was independent of Salesforce and extendible to other CRM systems in the future.

We were given a tiny amount of sample data to work from.  This consisted of 30 opportunities currently in the sales pipeline.  There were no closed opportunities and no history of previous opportunities won or lost.   I knew right away that this wasn’t going to work for what I was envisioning.   I needed more data, a lot more data.   But first, I needed clarification on the requirements to see just how far I could push things.  I asked the sponsor of the event, Jim Eberlin, how tied I was to the data he provided.  Luckily, he understood where I trying to go and said to make up any additional data that I needed to demonstrate my idea.  I did, I created another 150 opportunities won and lost over the past year.  I then set out to analyze that data and predict how the current opportunities might unfold.

The opportunities consisted of several stages with attributes assigned during each stage.  These included things like customer pain rating, and product fit.  So I first analyzed the closure rate of past opportunities based on their stage.  How many were lost or never progressed beyond stage 1, stage 2, stage 3, etc.   This gave me a historical “rate of decay” that I could apply to the current opportunities to determine their odds of closure based on their current stage.  The next step was to look at the attributes assigned during each stage to see how they affected the odds of moving to the next stage and apply that to my algorithm.  Given that I was still working with a relatively tiny amount of data, I had to make some assumptions.   Opportunities with a low customer pain rating or product fit would be far less likely to progress to the next stage than those with a higher rating, etc.

The last variable was to figure in the sales rep’s projected odds of closure.  Was the opportunity “Likey”, “”Upside”, “Commit”, etc.  Knowing that sales reps are typically very optimistic, this became a small component of the algorithm, choosing to focus more on historical performance vs gut feel.

I applied the algorithm to the current opportunities to determine an “opportunity odds” for each opportunity and ranked the opportunities by that percentage.    I also applied the percentage to the opportunity amount to determine a sales forecast using opportunities projected to close during the sales quarter.

This data provided the VP of Sales of our fictitious company with a clear picture of what opportunities were in the pipeline, their projected odds, a sales forecast based on those odds and a difference between the forecast and the sales goal for the quarter.  Simple, sweet, to the point.

Having worked with sales people I know how difficult it is to get them to input or manipulate data so I wanted the Analytics Engine to also provide the VP with recommendations on how to close any gaps between the sales forecast and the sales goal.   This was achieved by adding one button to my user interface.   When pressed the Analytics Engine cycles through the top opportunities and highlights which ones must close in order to achieve the sales goal.  It also provided any risks associated with the opportunity that might hinder the closure.

So that’s what I was able to achieve during the event.  There are several ways to further improve the analytics such as looking at closure rates by sales rep (some reps are better closers than others), closure rates by geography, industry, company, etc, all factors that could be applied to future predictions.

Needless to say, I didn’t walk away $50,000 richer.  But I had fun, met some amazing people, and am extremely proud of what I accomplished.  Not a bad weekend.