How NOT to make money as a software company

Yesterday I accidentally flicked a switch on our eCommerce store that caused Poked Copilot to be free. If you tried to buy Poker Copilot from on online store yesterday you received a 100% discount.

Giving all customers a 100% discount is not a good business practice. Fortunately only a couple of people “bought” Poker Copilot before I realised what was happening.

 

Zoom Poker HUD Early Access Edition

You can now download an early access update of Poker Copilot with a working Zoom Poker HUD. Download now.

This is under development still, so expect possible problems. It works on one table at a time, on No Limit Hold’em, with real money.

How to use the Zoom Poker HUD:

1. From Poker Copilot’s menu, select “Head-up Display” -> “Zoom Poker HUD (Experimental)”

2. (Optional) If you want your already-played Zoom hands to be included in the HUD statistics, select “Tools” -> “Recalculate Statistics” and wait for it to finish.

3. Open PokerStars, and sit down at a Zoom Poker table.

4. Maximise the Zoom Poker table. If your monitor doesn’t have at least 1600 x 900 resolution, you won’t be able to make the window big enough. Sorry. I do intend to make Zoom Poker work at smaller window sizes eventually.

5. Make sure you’ve selected one of PokerStars’ “Nova” table themes.

6. All things going well, you should see your own statistics now:

Screen Shot 2012 03 30 at 5 00 18 PM

 

Understanding the “Zoom Poker HUD” info window:

As you play more Zoom Poker hands, Poker Copilot will show statistics on a higher percentage of players. Here’s how to use the “Zoom Poker HUD” info window:

Screen Shot 2012 03 30 at 5 19 21 PM

The first column is the seat number, starting from the upper-left hand seat and continuing clockwise.

The second column is Poker Copilot’s “normalised” name for each player, determine by screen-scraping. It is all caps, with spaces and punctuation removed, and letters with umlauts and other diacritical marks converted to their closest plain latin alphabet equivalent.

The third column is the matched name in Poker Copilot’s database, if any. If a match is found, then you’ll also see a “tick” symbol or checkmark. The tick means that Poker Copilot is showing statistics on that player.

The matching uses fuzzy logic, so that “Poker Copilot” will match “Poker Oopilot” and “Pker Copilot”. This allows for the difficult of 100% success with screen scraping.

How you can help:

If there is a player at your table which Poker Copilot seems to scrape erroneously, you can help me. After your session, you’ll find the following folder in Finder:

 Documents/Poker Copilot Images/

This contains the scraped images from the most recent session. It is deleted and started anew when you restart Poker Copilot. Find the image in there for the player that Poker Copilot didn’t scrape successfully and email it to me at steve@pokercopilot.com.

Feedback welcome.

Changes to the Poker Copilot Hand Formatter

In the next Poker Copilot update there will be two small but important changes to the hand formatter.

1. Players are now anonymised. This is in keeping with poker forum etiquette.

2. Stacks change throughout the hand. Each player’s revised stack is now shown at the beginning of each street. This gives you an idea of how much a player’s current stack they are betting.

Note that the second change is only in the “Formatted” view at the moment. I’ll introduce this to the “2+2” format in a future update.

Here’s an example of me being a calling station with KTo.

Screen Shot 2012 03 29 at 7 21 13 PM

Thanks to loyal Poker Copilot customer Gregory for suggesting these changes.

 

Coming in the Next Update: Zoom Stats can be separated

The Stake Level summary will treat Zoom Poker separately from other types of poker:

Screen Shot 2012 03 28 at 11 32 56 PM

 

You’ll be able to filter by Zoom Poker stake levels:

Screen Shot 2012 03 28 at 11 33 08 PM

Likewise, the HUD will not mix Zoom Poker stats with regular Poker stats.

Poker Copilot and Zoom Poker: played my first session with a working HUD

Like the subject says. Last last night I played 100 hands or so of Zoom Poker with the new Poker Copilot Zoom Poker HUD. It was recognising an increasing number of people successfully, so that eventually I was seeing statistics on most players.

Now for some tidying up, further OCR “teaching”, and then I can release a early-access version.

 

Poker Copilot and Zoom Poker: Progress Update

I’ve got the basics working. When I play Zoom Poker, Poker Copilot promptly identifies about 50% of the players correctly. The basic components are in place, but all need to be improved, tightened up, and tidied up. The biggest problem is the letter k – I’ll need to tune my code to handle this better.

 

What character is that?

My ScreenScraping Teaching tool I’m using to create the Poker Copilot Zoom Poker HUD shows an image on screen and what character it thinks that image contains. I tell the Teaching tool if the character is correct or not.

Problem is, I can’t tell whether it thinks an image is an upper case 0 or the number 0. I can’t tell if it thinks a letter is an upper case i (l) or a lower case L (l).

So I’ve created a small Java class which will give me a textual description of a character. Now it will tell me that l is either:

UPPERCASE LETTER I

or

LOWERCASE LETTER L

It will tell me that 0 is

UPPERCASE LETTER O

or

DECIMAL DIGIT NUMBER 0

The Java class is called Characters, and the source code follows:


public class Characters {

public static String getDescription(char ch) {
return CharacterType.getDescription(ch);
}

private static enum CharacterType {

UNASSIGNED,
UPPERCASE_LETTER,
LOWERCASE_LETTER,
TITLECASE_LETTER,
MODIFIER_LETTER,
OTHER_LETTER,
NON_SPACING_MARK,
ENCLOSING_MARK,
COMBINING_SPACING_MARK,
DECIMAL_DIGIT_NUMBER,
LETTER_NUMBER,
OTHER_NUMBER,
SPACE_SEPARATOR,
LINE_SEPARATOR,
PARAGRAPH_SEPARATOR,
CONTROL,
FORMAT,
NOT_USED,
PRIVATE_USE,
SURROGATE,
DASH_PUNCTUATION,
START_PUNCTUATION,
END_PUNCTUATION,
CONNECTOR_PUNCTUATION,
OTHER_PUNCTUATION,
MATH_SYMBOL,
CURRENCY_SYMBOL,
MODIFIER_SYMBOL,
OTHER_SYMBOL,
INITIAL_QUOTE_PUNCTUATION,
FINAL_QUOTE_PUNCTUATION;

private static String getDescription(final int c) {
final int type = Character.getType(c);
final CharacterType characterType = CharacterType.values()[type];
return characterType.toString().replace('_', ' ') + ' ' + (char) Character.toUpperCase(c);
}

}
}

 

Some sample usage:


System.out.println(Characters.getDescription('O'));
System.out.println(Characters.getDescription('0'));

PokerStars screen names

In order to get Poker Copilot’s HUD working with PokerStars Zoom Poker, I need to know what symbols are acceptable for PokerStars. This a valid PokerStars screen name: ÀÁÂÃÄÅÆ

Now that’s going to be hard to determine purely via naïve screen scraping. Wish me luck.

Here’s another valid name: þ o k e r Ð

That name includes two icelandic letters, and five spaces. Incidentally, Iceland abolished the letter z in 1973. Things you learn from Wikipedia…

 

 

Poker Copilot and Zoom Poker

On Sunday PokerStars released Zoom Poker. It seems to be equivalent to the late Full Tilt Poker’s Rush Poker.

I’m having a go at making a working HUD for Zoom Poker. Fortunately I went a long way down this path for an experimental Rush Poker HUD back in the day. So a lot of my necessary learning is already done, as is a semi-working solution.

Every hand in Zoom Poker is with a different set of opponents, so Poker Copilot’s approach of determining who is at the table from the hand history after a hand does’t work here. After ruling out other possible approaches, it seems clear to me that I need to use screen scraping.

To make the problem easier to solve, I’m setting some strict constraints at first: 9-player tables, using any of the “Nova” table themes, on one table, with the table made as big as PokerStars allows (1320 pixels by 932 pixels). Once I get that working satisfactorily here in the lab, I’ll make it available for eager testers, to weed out problems. Then once that is working, I can look at removing the constraints one at a time.

After two days’ work, I’ve got parts of the solution in place. In the following screenshot you can see some of the workings: in real-time, Poker Copilot is grabbing the player names in image form, then converting each image to a binary image via a technique called thresholding.

Screen Shot 2012 03 20 at 5 45 47 PM

A further process trims each binary image, then separates the image into free-standing images of individual characters as much as possible. I intend to build up up a repository of as many images as possible so that I can “teach” Poker Copilot which image is equivalent to which character (or characters).

Here’s a glimpse of the tool I created to “teach” Poker Copilot about the letters. You can see the whole player name, the individual letters, and the third column where I manually tell Poker Copilot which letter is represented.

Screen Shot 2012 03 20 at 5 58 14 PM

If any brilliant researchers into screen scraping and character recognition are reading this, please do send me links to any helpful documents in this area that I can use…