The Poker Copilot Blog

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

Monday, 30 November 2009

ServerPronto: The Hotel California of Server Hosting?

I don't need my ServerPronto account anymore, because I use SliceHost's flexible and easy-to-use solution. So time to close my ServerPronto account and save myself $30 or so per month...except...

...it seems to be very difficult to close a ServerPronto account! I've tried. I've jumped through the hoops they set. More than a month has passed since I completed the process but my account is still merrily open...

A little bit of googling reveals that many people have trouble closing their ServerPronto account.

Any tips on what I can do from Germany, to force a Florida, USA based company to get their act together and close my account?

The Ongame Network Problem

Here's a quick illustration showing why Poker Copilot doesn't yet have a HUD for Winamax and other Ongame Network clients on Mac OS X.

On your Mac, in Spotlight, type Accessibility Inspector, and run the app. Move your mouse over an application, such as iChat, and notice the Accessibility Inspector give you a bunch of info about that app:

Screen shot 2009-11-30 at 12.44.39 PM.png


Now start Winamax and move the mouse over the Winamax app. Notice how the Accessibility Inspector doesn't show info for Winamax, and furthermore freezes up for a few seconds?

So Ongame Network team, if you are reading this, that's a simple way to reproduce this problem on the Mac with your P5 engine. We here in the Mac OS X world would all be extremely grateful if you could fix this.

I check this every so often to see if it has been fixed.

Bob Walsh's Top 5 Tips for Improving Your Software

Some good stuff from Bob Walsh in this discussion:

1. Look at trial downloads to sales ratio. If it's dismal [<2%], look hard at improving your customer's first 2 minutes using your product.

2. Look at your overall traffic. If it's low, what are you going to do about it? Consider a microsite: it works.

3. Look at your primary market (the keywords that people find you with). Is it too narrow? Use Google's new Wonder Wheel to find better keywords.

4. Look at your product - does it have a regular online heartbeat of incremental goodness (fixes/improvements) so people know it's alive?

5. Look at yourself - Is your tech support giving your customers a great experience or making them hate you? Lou Carbone is the master re engineering customer experience: highly recommend his book.


So how is Poker Copilot doing on these 5 items?

1. I'm happy with the customer's first-time experience, although I do want to add a couple of short video tutorials to explain things a bit.

2. Poker Copilot traffic has a continuing upward trend. However I suspect that with some concerted effort I could improve the slope of the trend. For a long time I've been thinking of seeking help with this from Dave Collins' crew at SharewarePromotions.

3. I'm not so concerned about this at the moment.

4. Regular online heartbeat? Yep, yeppity, yep. I even fixed some minor glitches this morning. Heartbeat is pulsing regularly and strong.

5. Book now added to my to-read list.

Sunday, 29 November 2009

Show Mucked Hands Only on Showdown?

An anonymous commenter asks:

One thing with the mucked cards - it really isn't necessary to show them if the hand does not go to showdown. Is this something that could be changed easily?

Makes sense to me. Unless I hear a good case for otherwise, I'll make the next update of Poker Copilot only show mucked cards if the hand goes to showdown.

Saturday, 28 November 2009

Finding Leaks with Colour and Bars

In preparation for a set of new "Leak Detector" screens in Poker Copilot, I'm reading Stephen Few's "Now You See It: Simple Visualization Techniques for Quantitative Analysis". The subtitle is tedious, better would be "Make Awesome Charts."

I'm getting a lot of value from Few's book on using colour and simple charting techniques to make analysis easier. Here's what I started with:

Screen shot 2009-11-28 at 12.05.26 PM.png


The info is there, but you have to read and compare all numbers carefully to spot the patterns.

Step 2: I added colour to show positive and negative numbers:

Screen shot 2009-11-28 at 12.05.38 PM.png


Now we can immediately see that I've been losing money with 44, and winning with all other pocket pairs. But some info is still hiding, requiring careful manual analysis.

Step 3: Show the magnitude with a coloured bar:

Screen shot 2009-11-28 at 12.05.45 PM.png


Ho ho! Now the patterns are clear. I'm doing something wrong with TT and 99, which should be good earners: my winnings are positive but only just. Aces, Kings, Queens, Jacks are all paying out well, so I'm happy with the way I play them.

Friday, 27 November 2009

The Tao of Programming

From The Tao of Programming:

A manager went to the master programmer and showed him the
requirements document for a new application. The manager asked the
master: "How long will it take to design this system if I assign five
programmers to it?"

"It will take one year," said the master promptly.

"But we need this system immediately or even sooner! How long will it
take if I assign ten programmers to it?"

The master programmer frowned. "In that case, it will take two
years."

"And what if I assign a hundred programmers to it?"

The master programmer shrugged. "Then the design will never be
completed," he said.

Preview of Poker Copilot 2.20

Poker Copilot 2.20 is now available to download. This is a preview release. It's almost identical to last week's update, except it works. PowerPC HUD problems and HUD flakiness are, to the best of my knowledge, fixed.

Update Instructions:

  1. Download version 2.20 here.
  2. Open the downloaded file.
  3. Drag the Poker Copilot icon to the Applications icon.
  4. If prompted to replace an existing version, confirm that you do want to replace.
Now you're done and ready to hit the tables.

Thursday, 26 November 2009

PowerPC Issue Resolved

Software bugs are so much easier to fix when you can reliably reproduce them. I now realise I should have got myself a PowerPC Mac for testing Poker Copilot eons ago.

With the help of my newly-purchased old school PowerPC-based Mac Mini, not only did I quickly and easily find and fix the "No HUD for PowerPC in Poker Copilot 2.19" issue, I also found some other minor issues.

Before I release an update though, there's more testing to be done. So far the signs are positive. I played on four poker tables at once for a couple of hours, tracking Poker Copilot's CPU usage and memory usage. I'm happy with the results. This chart shows Poker Copilot's CPU usage for a period of about an hour from that 4-tabling session:

Screen shot 2009-11-26 at 11.32.54 AM.png


Wednesday, 25 November 2009

Mac: It Just Works...Except When It Doesn't

I bought a PowerPC Mac Mini on eBay last week. The goal: use it to reproduce problems Poker Copilot users experience on PowerPC Macs. And to improve my test lab.

The Mac Mini came from a Berlin eBay seller to Cologne on Saturday morning. But the OS X reinstall DVD wouldn't work. Turns out it was for a slightly different model of Mac Mini, and didn't like being used on my model. So back to Berlin with the Mac Mini on Monday morning.

This morning it came back to me as speedily as a well-thrown boomerang, this time with the correct DVD. At start-up, a freshly installed Mac OS X 10.4 greeted me. Nice. Exactly what I wanted. But it wouldn't connect to my wireless Internet modem. With no good reason why. Ah bugger. These are supposed to be the problems that Windows users faces. Not me in my brave new world of Apple.

So...there went the greater part of the day figuring out a solution. These are problems I enthusiastically embraced when I was a student. But not now.

The cause of the problem: I had Mac OS X 10.4. The original. 10.4.nothing. Once I got a newer version of Tiger on to the machine, life became better. Updating on a machine without Internet access made things somewhat tricky.

And best of all...when I run Poker Copilot 2.19 (a sort-of unreleased blog-readers only version) with Full Tilt, I experience the exact problem people raised. Yes. Now I can try the solution I've quietly put together.

Stay tuned...

Tuesday, 24 November 2009

Queues, the Software Panacea

There's a fun story here about how two Microsoft support guys back in the late 80s worked out how to crash the entire support team's phone system.

It was right about then everyone's phones died. Anyone who was talking to a customer was cut off, and our phones didn't work at all for about 20 minutes.


The underlying problem was too many logging statements being written to a database, which got overloaded, crashed, and then crashed the phone system. My immediate thought: they needed a queueing system for logging statements.

It's quick to put something in a queue. The system can take items from the front of the queue at its leisure. It will catch up with backlogs when people are at home sleeping.

Poker Copilot is full of queues. Queues, queues, queues. It seems almost every difficult technical problem I face in Poker Copilot can be solved with a queue.

When hand history files are updated, Poker Copilot places them in a special queue where the most recently updated files go to the front. A busy little worker thread takes a file off that queue, parses the file and places each parsed hand into another queue. When you move poker tables around, causing the HUD to move, there's a queue. Feature usage tracking is placed in a queue. Twice. First on your computer and then on the feature tracking server. All database queries in Poker Copilot are placed in a queue.

Java version 5 and upwards makes queues easy. It has several types of thread-safe queues with high concurrency built in.

Monday, 23 November 2009

You know someone likes your software when...

...he buys it twice. Here's the story:

"I bought Poker Copilot twice because I absolutely needed it at the time to make money. My email was broken, and one of my hard disks containing the Poker Copilot license key was broken too, so I bought it again."

Of course all he had to do was e-mail me for the original key, but it may have taken some hours or even a day for me to respond.

Java Then And Now

Alex Miller ponders how software development in Java has changed over the last ten years:

I did all my coding back then in Programmer’s File Editor (PFE), which had the basic advantage that it wasn’t Notepad.


In 2005 I still found some people coding Java in basic text editors instead of wonder-doing IDEs.

Sunday, 22 November 2009

Sentence(s) of the Day

From Clay Shirky:

An internet user in rural Utah has access to more books than a citizen of Greenwich Village had before the web. Millions more books.

Friday, 20 November 2009

Nifty iPhone Poker App

It's called THETA Poker and it lets you play No Limit Texas Hold'em on the iPhone. You play against a range of surprisingly subtle AI players, each with their own characteristics.

It's highly playable. And perfect for passing time on public transport or in a doctor's surgery.

This game got me thinking about what it would take to make a good AI poker player.

The danger of any computer game where you play against a computer-controlled player is that you quickly learn the style of that player, and develop a counter-style. You become adept at beating the computer but not necessarily at beating real life players. Real life players adapt to your counter-style and develop a counter-counter-style.

It would be fun to be a computer science honours student these days. If that were me, my honours project would be developing an adaptive AI poker player that measures up each opponent and alters its play accordingly. It would also add a random factor to particular plays. And would modify its playing style every so often, to confuse the humans. Tight-aggressive for 10 hands or so, then Loose-Aggressive for another 10 hands or so. A few rounds of obsessive blind-stealing, then backing off for a few rounds.

It could be that every second CS honours student is already doing this - and then unleashing it as a bot on the world of online poker.

Disclaimer: The creator of THETA Poker and I did a "you can have my software if I can have yours" arrangement.

I was interviewed for a podcast...

...a year ago at a software conference. The interview was conducted by Mike Dulin from the Association of Software Professionals. Listen here.

Thursday, 19 November 2009

30 Day Trial AND Money Back Guarantee

Someone on the Business of Software forum asked about using a "if you are not satisfied, we'll give you your money back" guarantee instead of a 30-day free trial.

I think a software company should consider offering both.

You want to reduce the feeling the potential customer has of "taking a risk" when they buy your product. This makes people far more likely to purchase.

Take stock of your own feelings next time you are parting with a significant amount of money. Feel the sense of risk. Feel the sense that it might not be what you want. Consider what would alleviate that sense of risk. What about a chance to try it first? and a no-questions-asked money back guarantee?

It works. That's why many software companies offer both. That's why the Poker Copilot home page mentions both:

Screen shot 2009-11-19 at 7.11.05 PM.png

Full Tilt's New "Run It Twice" Gimmick

Ah crap. Full Tilt has introduced a new feature called "Run It Twice". "Run It Twice" hands seriously screws things up for Poker Copilot.

There's a sample hand history below in which I've changed the names to protect the innocent. One game number, one flop, two turns, two turns, two rivers, two pots. This doesn't fit into Poker Copilot's database, model or user interface.

I'm not sure what to do about this. Any smart readers got a nifty suggestion?

Full Tilt Poker Game #1111111: Table ZZZZZZ (heads up) - $5/$10 - No Limit Hold'em - 11:11:11 ET - 2009/11/11
Seat 1: XXXXXX ($1,029.50)
Seat 2: YYYYYY ($1,273.50)
YYYYYY posts the small blind of $5
XXXXXX posts the big blind of $10
The button is in seat #2
*** HOLE CARDS ***
Dealt to XXXXXX [3d Ad]
YYYYYY raises to $30
XXXXXX calls $20
*** FLOP *** [4c Qd 6d]
XXXXXX checks
YYYYYY bets $50
XXXXXX raises to $150
YYYYYY has 15 seconds left to act
YYYYYY has requested TIME
YYYYYY raises to $390
XXXXXX raises to $999.50, and is all in
YYYYYY calls $609.50
Players agree to Run It Twice
XXXXXX shows [3d Ad]
YYYYYY shows [Qh Th]
*** TURN 1 *** [4c Qd 6d] [8h]
*** RIVER 1 *** [4c Qd 6d 8h] [4h]
*** TURN 2 *** [4c Qd 6d] [As]
*** RIVER 2 *** [4c Qd 6d As] [Kh]
*** SHOW DOWN 1 ***
XXXXXX shows a pair of Fours
YYYYYY shows two pair, Queens and Fours
*** SHOW DOWN 2 ***
XXXXXX shows a pair of Aces
YYYYYY shows a pair of Queens
YYYYYY wins pot 1 ($1,029) with two pair, Queens and Fours
XXXXXX wins pot 2 ($1,029) with a pair of Aces
*** SUMMARY ***
Total pot $2,059 | Rake $1
*** SUMMARY 1 ***
Pot 1 $1,029
Board: [4c Qd 6d 8h 4h]
Seat 1: XXXXXX (big blind) showed [3d Ad] and lost with a pair of Fours
Seat 2: YYYYYY (small blind) showed [Qh Th] and won ($1,029) with two pair, Queens and Fours
*** SUMMARY 2 ***
Pot 2 $1,029
Board: [4c Qd 6d As Kh]
Seat 1: XXXXXX (big blind) showed [3d Ad] and won ($1,029) with a pair of Aces
Seat 2: YYYYYY (small blind) showed [Qh Th] and lost with a pair of Queens

How to Be Rich

Marshall Brain has a fun slide-show called "How to Make a Million Dollars":

Last week I was invited to speak to a group of 200 students at Duke University. The organizers gave me pretty much free rein in picking my topic, so I decided to talk about [How to Make a Million Dollars].

How to make a million dollars is: a) something students are interested in, and b) something I am qualified to talk about. And the talk went really well. So well, in fact, that I have received requests for copies of the presentation.

The gist of it is to start a business. If it doesn't work out for you, start another. And another. And another. Until you succeed.

Here's three alternative ways to be rich:

1. Regularly spend less than you earn. It's slow but effective. You won't be mega-rich but you'll be richer than you are now.

2. Measure your wealth against those poorer than you. We usually define ourselves as rich or poor in comparison to those around us. So move to a neighbourhood where people mostly earn less than you. You'll have the biggest house and nicest car in your street. Better still, move to a country much poorer than yours. If you can keep your current income, you'll have a lifestyle the envy of those around you. Be careful though: with envy comes venom. You'll be an obvious target for theft.

3. Choose to define wealth in non-monetary terms. If you earn little but live as a bum in a Western Australian surfing town, catching glorious waves on a glorious beach every day, you'll have a rich quality of life. Expect to be looked down upon by your relatives who don't understand your lifestyle choices.

Wednesday, 18 November 2009

Problems with PowerPC Macs and Poker Copilot 2.19

I'm not certain if I've correctly identified the problem, but it seems that Poker Copilot 2.19 doesn't show the HUD on PPC Macs.

Here's what I've done about this:

You can download Poker Copilot 2.17 here. It seems that this works fully on PPC Macs.

Secondly I bought a PowerPC based Mac Mini on eBay today. You haven't been able to buy these things new for some time, so eBay was my saviour. As soon as it arrives I'll try to isolate and fix the problem.

What hands does a player take to showdown?

Loyal Poker Copilot customer Regan asks,

Is there a way in Poker Copilot's SQL database console to search for a player's showdown hands?


Here's the answer. This returns all hands I ('stevoski111') took to showdown in the last 10 days in ring games:

select  playerid, playername, handtype
from gameplayersummary
where starttime>sysdate-10 -- returns data for last 10 days
and isplaymoney=false
and istournament=false
and wenttoshowdown=true
and playername = 'stevoski111'

Documentation Week

What remains of this week is "write better Poker Copilot documentation week." It's dirty work but it's gotta be done.

Tuesday, 17 November 2009

Preview of Poker Copilot 2.19 Ready to Download

Poker Copilot 2.19 is now available to download.

I've spent a lot of time hunting down remaining performance hot-spots. It's tempting fate to say so, but I feel very positive about this release's stability and performance. Feedback is welcome. If no major issues surface I'll make this an official release.

What's changed:

  • The "Mucked Cards Window" now stays hidden between Poker Copilot sessions.
  • Fledgling UltimateBet support. It's ring games only at the moment, due to an UltimateBet hand history problem in tournaments.
  • When you select extra columns to show in the Hands summary, Players summary, Stake Level summary, and Position summary, they stay shown between Poker Copilot sessions.
  • The Advanced Dashboard for Tournaments shows "In the Money %"


What's fixed:
  • Calculating the take for Ongame Network uncalled bets
  • Better handling of PokerStars tournament summaries for freerolls and play money tournament.
  • Performance and stability improvements.


Update Instructions:
  1. Download version 2.19 here.
  2. Open the downloaded file.
  3. Drag the Poker Copilot icon to the Applications icon.
  4. If prompted to replace an existing version, confirm that you do want to replace.
Now you're done and ready to hit the tables.

Monday, 16 November 2009

"Sticky Columns" in Next Poker Copilot Update

Poker Copilot allows you to select which columns to display in some of the summaries. The next update will remember which columns you select between sessions.

Screen shot 2009-11-16 at 3.31.47 PM.png


This is often requested. It's one of those small things that never are "high priority" but need to get done.

I've reworked the "choose your own columns" a little to work more like iTunes. So as of the next update you can right-click on the table headers to choose which columns you want to see.

"In the Money" in Next Poker Copilot Update

The next update of Poker Copilot will include how often you finished a tournament "in the money".

Screen shot 2009-11-16 at 11.44.17 AM.png


I put off adding this for a while because I figured it would be hard with the current Poker Copilot database schema. It was easier than I thought.

Sunday, 15 November 2009

UltimateBet Tournament Summaries?

Do any of you UltimateBet players know how to get tournament summaries?

I checked my UB hand history folder - no summaries there. I searched through the Mac client - no joy. I perused the UB website - drew a blank.

On the theme of UB: UltimateBet support in Poker Copilot is mostly coming along well. I hope to have a preview release available in the next couple of days.

Friday, 13 November 2009

When to Make a Blind Steal Attempt

[Updated: An anonymous comment pointed out an error in the small blind table. Now fixed]


When playing poker I often attempt to steal the blinds. Too often, perhaps? I want to know which hands pay off for me with blind steal attempts.

If only I had a tool that allowed me to find out...hold on, there's this Poker Copilot thingy I've been creating, marketing, selling, and supporting. Maybe that could help.

Poker Copilot doesn't seem to have a "Blind Stealing Genius"...yet. So I did a manual query of the Poker Copilot database.

With the aggregate data I have, the following hands on average give a better result when trying to steal the blinds instead of folding. There are some unexpected gaps, probably due to some big losses.

.

Button
Avg return > 0
Avg return
in big blinds
Small Blind
Avg return > -0.5
Avg return
in big blinds

.

AA11.64AA13.89

.

KK9.03KK10.40

.

TT4.23QQ5.51

.

JJ3.72AQ2.77

.

AK3.32992.48

.

QQ3.07JJ1.97

.

A22.39AKo1.94

.

T71.78AJ1.77

.

221.58AT1.34

.

KJ1.54JT1.19

.

AKo1.41331.16

.

KQo1.39KQ1.07

.

AQo1.36QJ0.95

.

KT1.25550.87

.

881.22660.79

.

991.10AK0.53

.

AT0.94770.52

.

AJ0.94T80.46

.

AJo0.86KT0.43

.

A80.86T90.42

.

T80.77A40.39

.

A40.76KJ0.38

.

750.64A9o0.32

.

ATo0.64970.32

.

K40.63A50.30

.

J90.63540.28

.

520.54980.21

.

76o0.46A80.17

.

T60.45K30.00

.

K60.45KQo-0.01

.

K70.41Q4-0.05

.

J80.41K6-0.07

.

JT0.3976-0.10

.

T40.3944-0.13

.

A4o0.39AJo-0.16

.

K30.38A3-0.16

.

530.35K7-0.16

.

970.34Q9-0.19

.

QTo0.34AQo-0.21

.

Q30.3365o-0.22

.

A50.3164-0.22

.

A6o0.30A8o-0.22

.

KJo0.2998o-0.22

.

950.28A7o-0.23

.

QT0.25ATo-0.24

.

QJo0.25J9-0.25

.

98o0.24Q8-0.25

.

Q50.2395-0.26

.

K3o0.22QTo-0.28

.

Q80.21K5-0.30

.

420.21T4-0.31

.

Q70.20A2-0.31

.

980.20Q2-0.32

.

J20.2063-0.33

.

K6o0.19Q6-0.33

.

A60.18KJo-0.33

.

640.18J4-0.33

.

K8o0.17J6-0.34

.

740.14TT-0.34

.

Q9o0.13K9o-0.34

.

630.13J7-0.35

.

T8o0.10A6-0.35

.

65o0.10J5-0.35

.

920.10Q3-0.36

.

Q90.10K6o-0.37

.

J3o0.08K2-0.37

.

K5o0.07QJo-0.38

.

J6o0.07A6o-0.38

.

J60.0683-0.39

.

A9o0.06K4o-0.39

.

74o0.0585-0.41

.

A90.05T5-0.42

.

A3o0.0574-0.42

.

T7o0.04J3-0.42

.

Q4o0.04J7o-0.42

.

J40.04KTo-0.43

.

Q3o0.04T6o-0.43

.

830.0332-0.43

.

Q6o0.0396o-0.43

.

J4o0.03J8o-0.44

.

870.03Q2o-0.44

.

Q2o0.03T9o-0.44

.

64o0.0397o-0.45

.

T5o0.03Q5o-0.45

.

840.03Q8o-0.45

.

K20.0262-0.45

.

820.02K5o-0.45

.

Q5o0.01J4o-0.45

.

53o0.0175-0.46

.

770.01T2o-0.46

.

T6o0.01Q9o-0.46

.

Q8o0.0094o-0.46

.

T3o0.00J2o-0.46

.

92o0.0083o-0.46

.

97o0.0022-0.46

.

T4o0.0062o-0.47

.

J8o0.0092o-0.48

.

52o-0.48

.

42-0.48

.

53o-0.48

.

73o-0.48

.

T5o-0.49

.

T8o-0.49

.

72o-0.49

.

32o-0.49

.

64o-0.49

.

73-0.49

.

82-0.49

.

Q4o-0.49

.

87o-0.50

.

A4o-0.50

.

63o-0.50

.

T3o-0.50

.

42o-0.50

.

A9-0.50

.

Q7o-0.50

.

82o-0.50

.

Q6o-0.50


This is only a guideline; actual results are affected by many variables including your table image, the tightness of the big blind, and how you and the big blind play post-flop.

In general: from the button steal with Ax, Kx, Qx, Jx, all pocket pairs, and most connectors. If the big blind is tight, increase the range a bit.

From the small blind you can be more liberal. Steal with any picture card as well as pocket pairs, suited connectors, and the highest unsuited connectors.

Note to self: add to Poker Copilot the ability to find this easily information for your own hands.

Here are the queries I used:

For the button:

select handtype, count(*) as times, sum(takeinbigblinds)/count(*) as return
from gameplayersummary
where
starttime>DATE '2008-01-01' -- forces use of the best index for faster queries
and isplaymoney=false
and istournament=false
and ishero=true
and positionid=3 -- button
and gametypeid=3 -- no limit hold'em
group by handtype
having return > 0
order by return desc

For the small blind:

select handtype, count(*) as times, sum(takeinbigblinds)/count(*) as return
from gameplayersummary
where
starttime>DATE '2008-01-01' -- forces use of the best index for faster queries
and isplaymoney=false
and istournament=false
and ishero=true
and positionid=2 -- small blind
and gametypeid=3 -- no limit hold'em
group by handtype
having return > -0.5
order by return desc

Saturday, 7 November 2009

How are Table Statistics Calculated in Poker Copilot?

I've updated the Head-up Display docs to include the table statistic calculations.

Fluid: Turning Websites into Desktop Apps

Loyal Poker Copilot customer Miguel unwittingly introduced me to Fluid. This is a nifty Mac OS X app that turns web apps into desktop apps. It solves a headache for me - rapidly switching between web apps and desktop apps to copy & paste or consult. It is a mixture of switching apps and switching tabs.

With Fluid, each web app becomes its own desktop app - including a Dock icon.

Here's three web apps I tend to have open all the time now converted to desktop apps:

Screen shot 2009-11-07 at 11.15.35 AM.png




Top Ten Blog Posts

While toying around with Google Analytics I found this list: the ten most viewed pages on The Poker Copilot Blog:

Screen shot 2009-11-07 at 10.54.46 AM.png


A couple of these have nothing to do with Poker Copilot.

Number 5 (Poker Software on Mac OS X) is one of the few entries I wrote hoping for it to be link bait. It seems it is working. It might be time to update it.

Friday, 6 November 2009

Deadly Drugs

What drug killed via poisoning more people in the UK in 2008 than cannabis, ecstasy, cocaine and methadone combined?

Alcohol. Only heroin killed more.

That's from one of my favourite websites, Information is Beautiful.

Preview of Poker Copilot Update

You can download Poker Copilot 2.18 here: http://pokercopilot.com/downloads/pokercopilot2.18.dmg.

Quite a lot has changed internally, so there may be some problems I haven't discovered yet. So I'd like to ask my loyal customers to try this out before I make this release official.

What's changed:

  • Tracking of hand history files for the current tables is cleaner and quicker. Less CPU usage spikes.
  • Community cards for the previous hand are shown for a few seconds with the mucked cards.
  • Table stats are shown: vpip, pre-flop raise, and aggression.
  • The order in the position summary has changed.


What's fixed:
  • No more "Out of memory exceptions" when dealing with extremely large hand history files
  • Poker Copilot now co-operates with custom PokerStars themes.
  • The take for uncalled blind steals in Ongame clients is now correctly calculated.


Update Instructions:
  1. Download version 2.18 here.
  2. Open the downloaded file.
  3. Drag the Poker Copilot icon to the Applications icon.
  4. If prompted to replace an existing version, confirm that you do want to replace.
Now you're done and ready to hit the tables.

Poker Copilot Sales Breakdown

My sales breakdown for October:

By CPU:


By Operating System:


How do I know this? I don't really. The data I have is data sent by your browser from the computer you used to purchase Poker Copilot. It's as close as I'll get to the real data.

Is it worth still supporting PPC users and Tiger users? At 7% and 8% respectively, I think it is.

Japanese Launch of Windows 7

http://www.youtube.com/watch?v=sYZH-6lyJhU

It almost made me want to ditch my Mac and go back to Windows.

Highlights: the corporate guy whose multi-touch demo just doesn't work. And the triceratops-like creature that snorts steam.

Thursday, 5 November 2009

What I Really Hate...

...when playing Poker, is this: I'm the big blind, I get dealt pocket aces, and everyone folds to me.

UltimateBet Support Coming to Poker Copilot

First, I feel I should make sure you are aware of the UltimateBet scandal. I'm surprised UltimateBet managed to survive the scandal, trust being paramount when playing online poker.


I recently investigated adding UltimateBet support to Poker Copilot. The good news is it seems feasible. The UltimateBet client is HUD-able. The hand histories are stored locally. I can't determine from hand histories whether a table is full-sized or 6-max, though.


Rococoa - Bringing Cocoa to Java

In my opinion, Objective-C's big strength is the awesome Cocoa libraries. So as a Java programmer I was pleasantly surprised to discover the Rococoa project. Rococoa allows any Java program on Mac OS X to (sort of) easily access any Cocoa library.

If you want to use Rococoa I recommend learning how to code in Objective-C first. That will make it easier to understand what's going on and why you need to do things like creating an auto-release memory pool.

The hardest part of Rococoa's learning curve was getting a small but useful program working. Once I achieved that the other parts fell into place. So to help others, here is a working example, in two classes. The first class, NSWorkspace is an access point to Cocoa's NSWorkspace class. The second class uses NSWorkspace to dump to the console a list of all applications currently running on your Mac.

You'll need to add the Rococoa libraries to your classpath.

package com.barbarysoftware.pokercopilot.jna;

import org.rococoa.NSClass;
import org.rococoa.NSObject;
import org.rococoa.Rococoa;
import org.rococoa.cocoa.foundation.NSArray;

public interface NSWorkspace extends NSObject {

public static final _Class CLASS = Rococoa.createClass("NSWorkspace", _Class.class);

    public interface _Class extends NSClass {
        // class (aka static) methods go here
        NSWorkspace sharedWorkspace();
    }

    // instance methods go here
    NSArray launchedApplications();
}

---

package com.barbarysoftware.pokercopilot.jna;

import org.rococoa.Foundation;
import org.rococoa.NSObject;
import org.rococoa.cocoa.foundation.NSArray;
import org.rococoa.cocoa.foundation.NSAutoreleasePool;

public class HelloRococoaWorld {

    public static void main(String[] args) {
        final NSAutoreleasePool pool = NSAutoreleasePool.new_();
        try {
            showRunningApplications();
        } finally {
            pool.drain();
        }
    }

    private static void showRunningApplications() {
        final NSWorkspace nsWorkspace = NSWorkspace.CLASS.sharedWorkspace();
        final NSArray nsArray = nsWorkspace.launchedApplications();
        final int size = nsArray.count();
        for (int i = 0; i < size; i++) {
            final NSObject nsObject = nsArray.objectAtIndex(i);
            // dump object to console the Java way
            System.out.println("nsObject = " + nsObject);
            // dump object to console the Cocoa way
            Foundation.nsLog("%@", nsObject.id());
        }
    }
}

Oh to Have His Problems

In Joel Spolsky's latest column in Inc. magazine he laments the dangers of his company's 'slow' growth. How slow?

We've gone from two to 25 employees in about a decade by growing, on average, 54 percent a year.
According to Joel's other writings, he achieved and maintained this growth without a cent of debt or outside funding. I'd call that high growth. Impressive even. Maybe I'd go as far as stellar.

Wednesday, 4 November 2009

Community Cards

Poker Copilot 2.18 will complete the on-table Mucked Hands display by also showing the community cards from the the previous hand:

community cards.png


The mucked hands and community cards display for five seconds.

This feature can be turned off in the HUD preferences.

Table Stats

Table stats are coming in Poker Copilot 2.18:

table stats.png


I asked for suggestions about this feature 3 weeks ago. There were 3 main types of feedback: "Awesome!", "Just something else cluttering the screen", and "Make this be based on the historical averages of the players at the table.

I hope I've managed to find a way to make this discreet enough for the anti-clutter camp, while making it easy to access for others.

Customers Over Competitors Recanted?

I wrote yesterday's post late at night while tired. On re-reading it today, I realised that it seems arrogant and doesn't say what I wanted to say. So here's my second attempt to get my message across.




An anonymous poster asked a good question yesterday on the Poker Copilot discussion forum. To paraphrase,
"Why doesn't Poker Copilot have feature X that some Windows products have?"


The reason is this: Poker Copilot is a one-person operation. I have a finite amount of time and need to prioritise. He specifically asked about more filters, which is something that's been on my list of things to do for some time.

This got me thinking about the wider question of competitors in software development. I believe in general that a software development team should not obsess over their competitors. It's natural to want to keep tabs on the competition, but one should not add features simply because the competitors have it. One should add features because customers want it. And because it helps customers achieve their goals.

My mantra could be: Don't obsess over competitors. Obsess over customers.

I call it a mantra because I have to repeat it to myself over and over to follow it. It's natural to obsess over competitors and I have to fight the temptation to do it. And I do sometimes (but seldomly) in my moments of weakness browse through the screenshots of Poker Tracker or Hold'em Manager.

It's hard to determine if a particular feature your competitor has is one that adds value to customers. If I follow my competitors closely, I'll become preoccupied with the wrong things. I'll start obsessing over the features they have. I believe I should be obsessing over the features my customers ask for instead of the features my competitors have.

Some features competitors have are highly valuable. Some are not. It is hard for me to tell the difference.

I'm finding that people tell me what important features Poker Copilot is missing. I try to focus on the most highly requested ones. Sometimes I'll suddenly get an avalanche of requests for a specific feature. I interpret that as a sign that a) a Windows poker analysis product has added that feature; and b) people like it. And therefore it becomes high priority.

Tuesday, 3 November 2009

Customers Over Competitors

An anonymous poster asked a good question yesterday on the Poker Copilot discussion forum. To paraphrase,

"Why doesn't Poker Copilot have feature X that some Windows products have?"

There are two reasons.

The first reason is this: Poker Copilot is a one-person operation. I have a finite amount of time and need to prioritise.

Secondly, I don't pay much attention to competitors. Even if Poker Tracker finally releases their Mac OS X version, I won't give it much attention. If I follow my competitors closely, I'll become preoccupied with the wrong things. I'll start obsessing over the features they have. I believe I should be obsessing over the features my customers ask for instead of the features my competitors have.

Why re-invent the wheel, you may ask? Why not use the most popular Windows products as a spec, and copy what they do? The little I have seen of the Windows products are a usability disaster. They use what I call Matroshka tabs: tabs within tabs within tabs. Buttons and icons and check-boxes are flung everywhere. I try hard to add important features without making the user interface overwhelming. It's a tough balance.

I'm finding that people tell me what features Poker Copilot is missing. I try to focus on the most highly requested features.

Sometimes I'll suddenly get an avalanche of requests for a specific feature. I interpret that as a sign that a) a Windows poker analysis product has added that feature; and b) people like it. And therefore it becomes high priority.



Monday, 2 November 2009

Improved Memory Usage in Poker Copilot

Warning: This is a highly technical post. If phrases like "garbage collection algorithm" and "hash map" make you bored already, don't read on.

The unofficial 2.17 version of Poker Copilot fixed all major known issues, except one. Sometimes Poker Copilot crashes complaining that it has run of memory. The exact error message is "java.lang.OutOfMemoryError: Java heap space". In Java parlance, this is the feared OOME problem.

There are two ways to deal with a Java "out of memory" error:

  • You can increase the amount of memory available to the Java program, or
  • you can track down what part of your program is hogging memory.

The first approach is the easiest. But it creates other problems, such as excess memory paging on computers with modest amounts of RAM. It's also avoiding the real issue.

The second approach takes discipline, and I've avoided it for some time. But finally these last few days I got to it. With the help of JVisualVM and loyal Poker Copilot customer Andy's 100 Megabyte hand history file, I discovered a couple of problems with the Poker Copilot code.

First, I had an almost pointless hash map in memory that contained 900,000 items. Was it coincidence that I had 900,000 hands in my hand history database? No. Problem identified. Problem eliminated.

The second memory gorging problem was caused by Poker Copilot's parser. This is vaguely how parsing works in Poker Copilot:

Step 1: Obtain the chronological latest hand history file that needs parsing
Step 2: Turn the hand history file into a list of hands
Step 3: Insert the hands in that list into the database one by one
Step 4: Lather and repeat

This works fine with lots of small hand history files. But add a big hand history file, say Andy's 100 Megabyte monster, and things grind to a halt. Step 2 results in a list containing thousands, tens of thousands of hands, eating precious memory.

I changed the parsing as follows:

Step 1: Obtain the next hand history file that needs parsing
Step 2: Parse a hand from the hand history file
Step 3: Insert the hand into the database
Step 4: If the hand history file still has more data, repeat from step 2
Step 5: There is no step 5
Step 6: Repeat from step 1

This is a gross simplification. There's multi-threading and queues in there to keep things humming along at a brisk pace.

The result? The nasty "java.lang.OutOfMemoryError: Java heap space" problems are gone. Poker Copilot runs well now in its allocated 256 Megabytes.

The unexpected additional result? Poker Copilot is faster. The thread that parses hand history files and the thread that inserts hands into the database co-operate on a "just in time" basis that would make Toyota proud.

Something even better? Better use of memory leads to better garbage collection performance in Java, speeding up the overall Poker Copilot show. The engineers at Sun who build the Java Virtual Machine's garbage collector noticed something a few years back. Most Java objects are short-lived. So they optimised for short-lived objects, using an algorithm called "Generational garbage collection". A result of this is that if a high proportion of your Java objects have a short life (that is, mere milliseconds), the garbage collection works more efficiently. The new Poker Copilot approach to parsing the hand history files has only short-lived objects, and therefore works even faster.

How fast? My 2009 iMac gets through a million hands in two hours.

I find it enormously satisfying to fix a problem such as this.

These improvements will be included in the next update.

Sunday, 1 November 2009

How Long is a Day?

I thought the answer was 24 hours give or take a second or so to accommodate a slight wobble in the earth's rotation. The correct answer is of course however long the online poker rooms say it is.

Today, Full Tilt Poker and PokerStars seem to have defined the day as being 25 hours long. I guess this is because USA went from summer time to winter time. This caused Poker Copilot's HUD to not work for one of those 25 hours.

This Poker Copilot issue is going in the "I ain't gonna fix it" category. Because reproducing this problem is something I can only do for one hour a year. That's a long time to wait between test sessions.




My Standard Nightmare

In my most recent (and perhaps final) consulting gig, I had to implement a complex "standard" for statistical data interchange. It was a horrible task. The standard had many problems and even some impossibilities. Eventually I discovered that no-one had ever fully implemented this standard before, including the people who created it.

Which drew me to this post on designing data interchange standards by Adam Bosworth. Here are his points and my comments from standard nightmare experience:


  1. Keep the standard as simple and stupid as possible. My standard nightmare was specified in hundreds of pages of XML schemas.

  2. The data being exchanged should be human readable and easy to understand. My standard nightmare made the data being exchanged complicated. So complicated that two people versed in the standard and the data needed to ponder it and debate it to understand it.

  3. Standards work best when they are focused. My standard nightmare tried to use the same syntax to share wildly different types of data, such as the contact info of a person, and the historical modifications to the reported monthly unemployment data for Sweden.

  4. Standards should have precise encodings. My standard nightmare got this right.

  5. Always have real implementations that are actually being used as part of design of any standard. The creators of my standard nightmare claimed to have done this. But eventually they had to admit that there was no such thing. They were satisfied merely to assume they got it right. But they didn't get it right - there were problems which made some parts of the standard impossible to implement. It was as if you wanted to request a person's phone number, but could only do so by specifying the person's favourite colour.

  6. Put in hysteresis for the unexpected. I had to look up what this means. It means, allow the system to cope with situations you haven't thought of. My standard nightmare was highly rigorous in what it allowed, and therefore made it impossible for us to return some data, or work around the problems in the standard.

  7. Make the spec itself free, public on the web, and include lots of simple examples on the web site. My standard nightmare was free and public on the web. It included only one example which - although simple - was incorrect.


If you are ever offered the chance to work with my standard nightmare, decline. Refuse. Escape. Quickly. Normally I like a challenge. But I like it to have a realistic chance of being solvable.

My standard nightmare is called SDMX – Statistical Data and Metadata Exchange.

 

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