The Poker Copilot Blog

Tracking the development of Poker Copilot, Mac OS X software for poker analysis and statistics.

Monday, 30 June 2008

Day 30: Launch!

It's 30th June, 8:43pm, it's the target launch date, and I've made it.

A few minutes ago I uploaded the live version of the Poker Copilot website. Now you can download the trial version. You can also buy Poker Copilot.

Let me just reach over my own shoulder and pat myself on the back. Okay, done. That felt good. Now I can take a break from development for a few days at least. Time for me to fire up this Poker Copilot thing and see if it can't help me play a mean game of poker.

Sunday, 29 June 2008

Day 29: Testing, Bugs, Retesting

Today I did systematic testing. Not fun. Not fun at all. But necessary. We (my tester and I) decided on a workable approach and determined some "equivalence classes". That phrase "equivalance classes" probably suggests how tedious the day was.

The good thing is, we did find some bugs in the calculations of the charts and tables. I got rid of all the known bugs, then did a retest.

Now I've generated a new build. I also fixed the small flaws in the web site. That means everything is ready to be uploaded tomorrow. Launch is on track.

Finally, today's my birthday. So enough work for today. Time to relax and celebrate.

Saturday, 28 June 2008

Day 28: Website Mostly Done

It's amazing how productive I am when I tackle a task in the morning, fully rested, without distractions. After trying repeatedly to get the website for Poker Copilot together, but getting nowhere fast, today I finally got it done. Screenshots are currently missing, because I want to massage them a little first, but otherwise it is done. Take a look at www.pokercopilot.com. Feedback, as always, is appreciated.

...brief pause...

I just used browsershots.org to do multi-OS, multi-browser website layout testing and it seems things look a bit odd in the IE family of browsers. Sigh...

Friday, 27 June 2008

Day 27: Rest Day, Future Plans

Being a Friday, and having a full-time consulting gig currently, I chose to spend the evening relaxing rather than frantically working on the last steps towards launching next week.

While working on Poker Copilot over the last month, I talked extensively to my poker guru. I also talked extensively to my Mac guru. Fortunately they happen to be the same person. Today my poker/Mac guru and I talked a little about what features I should introduce in Poker Copilot version 1.1. We thought of two features that I believe will make Poker Copilot a compelling companion product for online poker players. Naturally the temptation was to start designing and implementing these features right away. However I exercised some restraint and added them instead to the future feature list.

Thursday, 26 June 2008

Day 26: Poker Copilot App Completed

Poker Copilot 1.0, my Mac OS X app for tracking and analysing online poker hand histories is now finished. No, that's not quite true. Testing and debugging still await. The weekend is dedicated for testing with the help of my girlfriend, who just happens to be a software tester. Very convenient.

It's nice to see my own app in the Applications folder in Finder, right next to Full Tilt Poker:



I went through my to-do list this evening with brutality. Anything that isn't essential for version 1.0 has been assigned to a later version. Everything else I took care of in a burst of energy. I intend to release version 1.1 within a few weeks of launching, which will add many small touches, especially improved data visualisation.

I'm also still to finish the website. That's looking ever more like a last minute task.

Wednesday, 25 June 2008

Day 25: The Logo

I contacted a talented graphic designer I know. I asked him to make me the logo and icon for Poker Copilot. He told me that he would be too expensive and I should use a web based offering such as http://logopond.com/. Personally I thought his rough estimate was a good price, but if he as a professional thought a low-cost solution would do for now...well, I won't argue with that.

So I ran a competition on crowdSPRING, received 20 entries, and chose something I can launch with. If I sell more than a few copies I'll revisit the design issues again later.

Now I'm struggling with the website. The struggles are partly with the design and partly with the final copy. I just keep reminding myself, if I can't get it right now, it's easy to change all this stuff again in a week, two weeks, a month's time.

Tuesday, 24 June 2008

Day 24: License Key Generator Completed

I've been getting the occasional e-mail from an online poker player who is interested in my software. Each e-mail helps boost my enthusiasm and my motivation to get Poker Copilot out by next Monday.

Today I got stuck into a task I've been avoiding: the license key generator. Fortunately it wasn't so hard once I had worked out how I would do it. It took a few sketches on paper, some time getting familiar with Java's cryptography API again, and an evening of coding.

The basic model is this:

30-Day Evaluation
when you download Poker Copilot you have an automatic 30-day evaluation.

Creating a License Key
When you buy a license I generate a key from your user name and a couple of other things. I encrypt this using public-private key encryption. I send you the encrypted key by e-mail.

Using a License Key
Poker Copilot knows how to decrypt the key but not how to encrypt. It decrypts the key and checks that it contains your username and some other information.

With this model, anyone who reverse engineers Poker Copilot will be able to decrypt keys. However only I can encrypt - and therefore create - keys.

I hope the concept proves valid. Now I'm going to finish the day with 30 minutes of poker.

Monday, 23 June 2008

Day 23: The Name Revealed

Poker Copilot. That's the name for my application. I bought the domain, pokercopilot.com, although the content on that domain is, shall we say, somewhat spare.

Email should now be functioning too, via Google Apps. If you feel like it, you can help me test it out by emailing me at AnyNameYouLike at pokercopilot dot com.

Day 23: One Week and One Big Task Remaining

I had limited Internet connectivity all weekend. This meant no blogging but high productivity.

It's going to be a stressful week getting all the bits and pieces together. Not quite finished tasks include: the logo, the website, integration with the payment processor, testing and debugging, and putting on the finishing touches. But there's one big task I haven't started yet: the software licensing system.

I've decided to issue license-free 30-day evaluation copies. When the user buys a license, it will be only functional for the specified user's name and the current version of my poker app. Now I've got to design and implement the algorithm for this in Java. Any advice gratefully received.

Friday, 20 June 2008

Day 20: Latest Screenshots

Today I had a super productive coding session where I was "in the zone". Everything I coded seemed to work first time and the cause of bugs seemed to leap out of the screen at me. These types of sessions don't happen often but I love it when they do.

Here are some screenshots showing the current state of affairs:



Thursday, 19 June 2008

Day 19: Setting Priorities

I signed up with Google Apps last night. It seems like an easy way to have a top-notch mail server and client for supporting and promoting my poker app. I don't need to worry about spam filtering because Google will do it for me.

I just managed to crush a sporadic concurrency problem I've had for a few days. It's not the nicest bug to be hunting down after a day at work, so I've been putting it off. However I've decided to set some new priorities:
Highest Priority: Get all features working
High Priority: Get all known bugs and issues resolved
Low Priority: Tune the fine details of the UI. These are the things I can leave to the last days before launching.

That means I won't spend another whole evening trying to get a iTunes-style look to my tables, unless the app is feature complete and fully functional.

Wednesday, 18 June 2008

Day 18: Stress Testing, a Big Win, and a Serious Bug

Last night I performed some stress testing on my poker app. Although it passed the stress testing, in the process I discovered an important bug.

First the intentional stress testing. While my app was running, I played Full Tilt Poker on three tables simultaneously. Therefore my app had three tables to monitor. I also had Mac OS X's Activity Monitor running to see the load my poker analysis app puts on the computer. The results were excellent. Once the initial hand history loading is over, my app causes barely any CPU usage. Activity Monitor itself was using more CPU. So it seems my strategy of regularly polling for updated hand history files is fine.

Now the accidental bug discovery. I had a very good hand of poker, where I won $11. I play only very low stake games (in this case $0.05/$0.10 Pot Limit Hold'em), so this is the best win I've ever had.

I expected to see a enormous uptick in my real-time results graph. Unfortunately the opposite happened. The graph actually swung sharply downwards! A bit of investigation revealed that under some conditions, I was incorrectly calculating the result.

Tuesday, 17 June 2008

Day 17: Website Draft Content Written

With the help of Bob Walsh's book, "From Vision to Reality", I wrote some draft website content. For a first draft I'm quite happy with it. The next step is to find, steal, or create a website design which can contain the aforementioned content.

Quickly the pieces are coming together.

I think I'll put a freeze on development at the end of next weekend. I keep thinking of more features that my Poker app absolutely must have...I'll have be stricter about putting them in the "version 2" bucket, so that I'll have a chance of meeting the end-of-June deadline.

BTW: "From Vision to Reality" is a very common book title or sub-title.

Monday, 16 June 2008

Day 16: Payment Processing with a Personal Touch

It's a rarity to receive a personal touch when signing up to something online. Usually everything is automated, and you are just numbers in a database.

I completed signing up with FastSpring, the company I chose to handle my online shopping and payment processing. It was probably the nicest experience I've had when signing up online. I had a pleasant e-mail conversation with a human being at FastSpring. He did all the initial setup for my poker app in their online ordering system. He also had some encouraging words for my app.

The FastSpring admin console is a nice online app. I especially appreciated the different levels at which I can integrate. The facility to handle test payments was nice too.

For the dubious, the sceptical, and the Turing Test fanatics: I'm almost 100% sure there was no automated pretend-personalisation involved.

Friday, 13 June 2008

Day 13: A Monastery, Wine and Berlin

Yesterday I went on a work "team building exercise" to the scenic Eberbach Monastery for wine tasting and dining. 800 years old or so, for the last 200 years it has functioned as a winery instead of a monastery. Some indoor scenes of The Name of the Rose were shot there.

Straight after work today I am going to Berlin to visit a friend for the weekend. With the monastery and Berlin taking up my free time, I've put aside my poker analysis and statistics app for a few days. It's a four hour train ride to Berlin so I might do a little work on the website to kill time.

Thursday, 12 June 2008

Day 12: Google Likes Me More Every Day

I'm glad I added Google Analytics to this blog the day I started. It gives me some heartening statistics. It's great watching the upward trend in visitors. It seems there are plenty of people who enjoy reading along as I try to launch this poker app by the end of the month.

Even better, the number of people who find this site through Google Search is increasing. The search terms people use to find my site are varied. Not all have something to do with poker. Some are matching are things like "JFreeChart" and "FastSpring". But motivatingly, a significant amount of searches are for terms like "full tilt poker history parser" and "mac poker stats".

If I have a problem with Google Analytics, it's that I find it too addictive. When I get up in the morning, even before I have my first coffee, I'm scouring the latest Google Analytics reports.

Day 12: Icon and Logo Rethink

Contrary to my decision two days ago regarding icons, I've sought a quote by a professional designer for a logo and application icon. I want my poker app to look elegant and professional. The whole appearance could be marred by a cheap icon and logo.

This will be the only major up-front expense for my poker app. Because this will involve more than a trivial amount of money, it constitutes a sort of psychological commitment to the project. With this one step I am elevating it from hobby to business.

Wednesday, 11 June 2008

Day 11: Website Hosting

I have a hosted web server that I use for solidsimplesafe.com. It's vastly underutilised, so I decided to use it to host the website for my poker app. I knew that would involve mucking around with intricate details in obscure configuration files, which is something I don't enjoy. Programming is my passion, and system administration is my pet hate. I rate it almost as badly as going to the dentist.

With a one-person software company, I have to do many things I wouldn't normally choose to do. So I rolled up my sleeves, doused my body in caffeine, and gave it a shot.

After a couple of hours of tinkering, I was successful. My new domain now points to my web server. My Apache Tomcat installation maps different domains to different folders. A test index.html file is served up correctly.

Now that hosting is completed, I can turn my attention in the days ahead to the somewhat harder - and rather more enjoyable - task of creating the website for my poker app.

Tuesday, 10 June 2008

Day 10: Icon Indecision

This evening I researched my options for obtaining an application icon. It seems my options are:

  • commissioning a graphic designer to make an icon
  • using a free icon available on the web
  • purchasing a stock icon
I ruled out the option of getting something custom-made pretty quickly, due to the cost.

The free icons I found on the web were simply not good enough.

That leaves stock icons. There are some decent stock icons available. Nevertheless this is a compromise. Currently I'm leaning towards an icon from StockIcons' "Sprite Basic" set. It's the middle one on the second row that has grabbed me. The only thing holding me back is that to obtain that one icon, I have to buy the whole set for US$349.

I'd love to hear your opinions on my choice, as well as other icon recommendations.

Monday, 9 June 2008

Day 9: Resting, Testing, Listing

My work schedule has been quite relaxed of late, which has given me plenty of time and energy to work on my poker app. Nevertheless, I'm taking a break from any active development today. I'll still spend an hour or so "dogfooding", as the mangled phrase goes, by playing Full Tilt Poker with my app running.

Here's what I have to achieve before launch on June 30th:

  • buy, borrow, create, or steal a logo
  • create a website
  • arrange web hosting
  • integrate with a payment processor (probably FastSpring)
  • create a registration system. Any recommendations for a third party solution that is cross-platform and works with Java apps?
  • systematic testing
Update: change of plan. Instead of testing I'm heading to a local mexican bar to watch the Euro 2008 soccer with some friends. When in Rome...

Sunday, 8 June 2008

Day 8: The New Interface Revealed

It took me a while playing around with mock-ups, but I've now got my poker app's user interface just the way I want it. "Eating my own dogfood" helped.

While playing poker with my app running, I often check the latest raw values for "flops seen" and "take/100 hands". It makes sense to make these values stand out. So I used a larger, bolder typeface and moved them to the top of the window.

The rest of the screen was getting cluttered, something I'm trying earnestly to avoid. I don't want new users getting overwhelmed by too much information. Therefore I've split the charts, tables and additional statistics between different tabs.

This is the not-quite-complete result:


There's another requirement that's been guiding my progress. It must be practical to resize my poker app small enough so that two online poker tables and my app can be viewed simultaneously. I don't want the user having to switch between windows constantly to monitor progress while playing.

Here's the poker app reduced to roughly half the default size.


As you can see from the screenshot, the design still works at this size.

Saturday, 7 June 2008

Day 7: Sparklines

I'm writing from my favourite cafe in Cologne, Germany. As I walked in, the owner greeted me with a crisp German hello, as he always does. Then he started making my latte macchiato - without me even having to order. It's the sort of local cafe where everyone knows the owner, the owner knows everyone, and half the customers know each other. There's free wireless too, and a laser printer for the customers to use. For a bit of authentic Europe-ness, the street the cafe is on is a 2000-year-old road built by the Romans, although it has been modernised considerably since then. They've been digging up the road lately to create a new subway line, and they keep finding centuries-old artifacts and buildings underneath.

Now to sparklines. Sparklines are a nifty concept popularised by Edward Tufte. They are a way to show a number in context using very little space. Consider this statistic from my poker app:

Winnings/100 Hands: $1.82

Looks good, right? It's a positive number, which means currently I am making money, instead of losing it the way I normally do.

But what if I normally win $5 per 100 hands? Then this number is bad. It indicates that either I am playing worse or my current opponents are better than usual. What we need is to see that number in context. Enter the sparkline. It's a tiny graph reduced of all the usual graph paraphernalia. No labels, no title, no axes, simply a line showing the ups, downs, and tendencies.

Here's the same statistic with a sparkline:

The "spark" in the word "sparkline" refers to the glowing red ember at the end. This is important, because it gives the user a visual clue that the value "$1.82" is the latest value. Without this red spark, the user might think the value is an average.

The sparkline in the example above shows me not only that I'm currently winning $1.82 per 100 hands. It also shows me that this is an improvement. It also shows me that I've have an ongoing tendency to improve my winnings per 100 hands. All this is shown in a small space.

I'm trying hard with my poker app to make the data easy-to-understand. Without care, I could easily overwhelm users with too much indecipherable information. Sparklines play an important role in achieving that.

Friday, 6 June 2008

Day 6: Creating the Charts

Charts are important for my poker app. I'm using a nice open source Java charting library called JFreeChart. Well, sort of nice. It's powerful and flexible but comes with no documentation. If you actually want to know how to use it, you have to pay 30 euros for the documentation and demos. However I found it was well worth paying the money. With the help of the docs, sample code, and forums, you can make JFreeChart do just about anything.

I use JFreeChart not only to create my poker app's main charts, but also the sparklines. The sparklines were tricky, but with the helpful JFreeChart forums I soon had it sorted.

A great benefit of using JFreeChart is the ability to customise just about every aspect of a chart. Here's what my line charts looked like before I customised the line renderer:


With a bit of inspiration from Google Analytics, here's what my line charts look like now:


The customisation took about 10 lines of code. As ever, the difficulty lies in knowing what 10 lines of code to write.

Thursday, 5 June 2008

Day 5: Importing Hand History Files

When I tell poker players about my software, the first question is "does it import hand histories?" The sample space is small, but it seems like this is a must-have feature.

I have something better than "importing" in my poker app. The user can use the preferences to add additional folders to the hand history search path. All hand histories are read freshly every time the app is started. All recognised hand history files in any specified folder are loaded when my poker app starts. Additionally all these folders are polled for updates.


And that's what I implemented today.

Day 5: Battles with Swing Layouts

Are you a Java programmer? Have you used Swing? Then you'll probably feel my pain. I almost always use a GUI builder but for my preferences dialog I needed to do it manually. Working with Swing Layout Managers often feels like a particularly nasty type of voodoo.

It's because I wanted to use the little '+' and '-' buttons normally used in OS X preference panels to add and remove things. Apple calls them "segmented gradient buttons". Unfortunately it is tricky to get them just right. I eventually found the answer here: http://lists.apple.com/archives/java-dev/2008/May/msg00394.html

Wednesday, 4 June 2008

Day 4: Decided on a Name

I've finally decided on my Poker app's name. I bought the domain I'll use. I won't say what it is yet, because I want to get Google Analytics in place first.

Rumours are that my Poker app is called Poker Sidekick. Although I like this name, the owner of pokersidekick.com - a registered but unused domain - wanted too much money for it. Better to get a $10 domain instead. In the meantime I've been using the name "Poker Sidekick" as a holding place.

I had been thinking of calling my app "Poker Pilot". Not only was the domain taken, there is also an app (not linked with the domain) called "Poker Pilot" which is definitely the work of scum and villainy. I've no desire to be associated with it.

I've been playing around with some major snazzing up of my user interface. I did this with Mac OS X's Interface Builder. If I can get it looking pleasing enough, I'll dedicate some time on the weekend to reworking the app's GUI. This is the benefit of getting the parser and stats engine fully in place. Now I can redo the interface as much as I like, knowing that there is a solid app behind it.

But perhaps I should save the reworked interface for version 1.1. Or version 2. :-)

Tuesday, 3 June 2008

Day 3: Scum and Villainy

Patrick writes:

I'm interested in seeing how Steve plans to promote something cleanly in an online field saturated with scum and villainy."
That sounds foreboding and I'm grateful for it. It's a reminder that promoting my app won't be easy. I'm not quite sure what I will do yet, but what's certain is that I won't be joining the ranks of scum and villainy.

Thankfully there are also plenty of honest and reputable firms in the poker field. Outstanding people write poker books and articles. Websites give sensible playing advice. The major online poker firms themselves are on the level. There are quality products that my app will be competing with. I'm aiming to overcome their shortcomings, especially in ease-of-use.

Day 3: 100 Nice Touches

Sohail asked:

"Is your parsing still slow?"
I think my parsing is anything but slow. On my own MacBook Pro, the app parses at up to 4000 hands per second. On a multi-core computer it utilises all cores for parsing.

I improve the user's perception of speed by parsing the newest data first. If the user has six months of hand history files, the most recent month will be parsed first, on the assumption that this is the data the user is most interested in.

Also for user perception, as each file is parsed, the GUI is updated so that the first graphs appear almost immediately upon startup.

This is part of my "100 nice touches" approach. These nice touches are the things that don't make it on the feature list but make the product a joy to use. If all goes to plan, this "100 nice touches" approach will give me users who enthusiatically recommend my app.

Monday, 2 June 2008

Day 2: Better Integration with Full Tilt Poker

Today I made my poker stats app automatically detect if Full Tilt Poker is installed. If so, it reads the location of the hand history files from Full Tilt Poker's own preferences.

This was somewhat tricky. OS X Application Preferences are stored in a binary format. Although there exists a Java API to read an application's own preferences, there seems to be no Java API to read other application's preferences.

Luckily the Quaqua Look & Feel open source library has a class to help with this. It took some tinkering but the results are good. Now there is a good chance that first-time users will have no configuration to do. Immediately upon starting my poker app for the first time, their hand history files will be magically located and read, and attractive and meaningful graphs will appear in front of their eyes.

Day 2: The Graph Every Poker Player Wants to See

I was just doing some "testing" of my poker tracking app. In other words, slacking off and playing some online poker.

I noticed that my results for the last week are a very attractive curve. Unfortunately the obvious curve extrapolation is far from what will probably happen. :-(

Day 2: Google Likes Me

I just had some astonishing news.

But first, if you found this blog because you play Full Tilt Poker and you want software to analyse your poker hand history, welcome! The launch of the software is scheduled for June 30th.

Now the astonishing news. I added Google Analytics to this blog before I posted a single article. What amazing information does Google Analytics have for me after just 1 week? That people are finding my blog already by searching for terms to do with analysing poker hand history files.

I didn't expect this. I'm blogging for myself, and for others to follow along as I launch a product after little more than 1 month's development time. Now I realise that this blog is also a marketing opportunity.

Sunday, 1 June 2008

Day 1: Learning How to Package OS X Downloads

Today is the official start of the 30-Day challenge. So let's all discreetly pretend that I didn't jump the gun and get a head start. Shhh!

Today I worked on getting the build process complete. The OS X Leopard DVD includes a whole bunch of developer tools. I discovered, thanks to a previous comment, that one of those tools is PackageMaker. These tools also include an excellent article describing how best to package different types of OS X apps. Yet again I'm glad I'm using a Mac these days.

I also found an excellent tool online called BuildDesk. It creates distributions for Java apps. It creates Windows builds and Mac builds. It handles compiling, packaging the code into a jar, creating a native wrapper, obfuscating and creating the installer. I gave it a test, and I think it is great value. After spending a few minutes watching the online demo and another 30 minutes of trial and error, I have ready-to-install distributions for multiple platforms.

BuildDesk does seem to focus more on Windows, because it doesn't quite finish the process on OS X. But a short shell script I wrote takes care of the last couple of steps of creating an Internet-aware DMG.

PS: Thrynn, if you are there, please send me an e-mail.

 

Poker Copilot

Free 30 Day Trial

Only $69

Order risk free with our 30-day money back guarantee.

  • Poker software for Mac OS X
  • Supports Full Tilt Poker and PokerStars
  • Analyses your opponents while you play
  • On-table HUD for Mac
  • Easy to use, easy to understand

Watch a demo of the major features of Poker Copilot