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 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?
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:

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:

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:

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:

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:
- Download version 2.20 here.
- Open the downloaded file.
- Drag the Poker Copilot icon to the Applications icon.
- If prompted to replace an existing version, confirm that you do want to replace.
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:

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:

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:
- Download version 2.19 here.
- Open the downloaded file.
- Drag the Poker Copilot icon to the Applications icon.
- If prompted to replace an existing version, confirm that you do want to replace.
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.

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".

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.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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:

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

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:
- Download version 2.18 here.
- Open the downloaded file.
- Drag the Poker Copilot icon to the Applications icon.
- If prompted to replace an existing version, confirm that you do want to replace.
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:

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:

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:
- Keep the standard as simple and stupid as possible. My standard nightmare was specified in hundreds of pages of XML schemas.
- 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.
- 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.
- Standards should have precise encodings. My standard nightmare got this right.
- 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.
- 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.
- 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 Translation Project
About This Blog
This blog tracks the ongoing development of Poker Copilot. Who would find this blog interesting? People interested in 1-person software development, in Poker, or in both.
Contact me via email at steve at pokercopilot dot com.
Blog Archive
-
►
2012
(31)
-
►
January
(29)
- Coming in the Next Update: Ignore Old Hand History...
- Coming in the Next Update: Poker Copilot can forma...
- From the "It's About Time, Too" Department
- Poker Copilot Business Cards
- Playing on Entraction Network?
- Unofficial Update for Ongame Players
- One Person with Two Accounts Playing on Ongame?
- Small Tweaks in Poker Copilot Preferences
- Ongame Network and Poker Copilot
- Buy Poker Copilot via Bank Transfer
- Improvement to Appearance of HUD Popup
- Improvement for Poker Copilot Translators
- Coming in the Next Update: HUD Layout has an extra...
- Unofficial Poker Copilot Update for Ongame Network...
- Poker Copilot Demo Video in French
- Reason I Like My Mac #17,823
- Updated Poker Copilot Demo Video
- Poker Copilot 3 Coming...
- News for Poker Copilot Translators
- Updated Poker Copilot Translations
- New Poker Copilot Screenshots Reveal How Version 2...
- Poker Copilot Translation Project: Update
- PokerStars now has built-in Auto-Hotkeys
- Reflection on the PokerStars Update that Broke Pok...
- Poker Copilot 2.101 Now Available
- Poker Copilot Website in French
- Spanish Website Translation
- Poker Copilot Website in Spanish
- Update for PokerStars Denmark Users (PokerStarsDK)...
-
►
January
(29)
-
►
2011
(154)
-
►
December
(10)
- New Unofficial Update
- Poker Copilot Discussion Forum in French
- Coming in the next update: multiple HUD layouts
- Poker Copilot Fact of the Day
- Unofficial Poker Copilot Update for the Brave
- Coming in the next update: All-in Equity in $ or B...
- Who uses BarrierePoker.fr?
- Coming in the next update: Filter tournaments by t...
- Help Wanted: BlazingStars or AHK for Merge Network...
- Coming in the next update: choose a language for P...
-
►
November
(13)
- MacKeeper's "Real-time protection" breaks Poker Co...
- PokerStars Playing History Audit CSV Problems with...
- Poker Copilot 2.99 Now Available
- HUD not working on PokerStars in update 2.98?
- PartyPoker support in Poker Copilot
- End of a Troublesome Week
- Poker Copilot 2.97 Problem Fixed?
- Desperately Seeking Help to Solve the Crashing Pro...
- Is Poker Copilot 2.97 Crashing For You?
-
►
December
(10)
-
▼
2009
(337)
-
▼
November
(44)
- ServerPronto: The Hotel California of Server Hosti...
- The Ongame Network Problem
- Bob Walsh's Top 5 Tips for Improving Your Software...
- Show Mucked Hands Only on Showdown?
- Finding Leaks with Colour and Bars
- The Tao of Programming
- Preview of Poker Copilot 2.20
- PowerPC Issue Resolved
- Mac: It Just Works...Except When It Doesn't
- Queues, the Software Panacea
- You know someone likes your software when...
- Java Then And Now
- Sentence(s) of the Day
- Nifty iPhone Poker App
- I was interviewed for a podcast...
- 30 Day Trial AND Money Back Guarantee
- Full Tilt's New "Run It Twice" Gimmick
- How to Be Rich
- Problems with PowerPC Macs and Poker Copilot 2.19
- What hands does a player take to showdown?
- Documentation Week
- Preview of Poker Copilot 2.19 Ready to Download
- "Sticky Columns" in Next Poker Copilot Update
- "In the Money" in Next Poker Copilot Update
- UltimateBet Tournament Summaries?
- When to Make a Blind Steal Attempt
- How are Table Statistics Calculated in Poker Copil...
- Fluid: Turning Websites into Desktop Apps
- Top Ten Blog Posts
- Deadly Drugs
- Preview of Poker Copilot Update
- Poker Copilot Sales Breakdown
- Japanese Launch of Windows 7
- What I Really Hate...
- UltimateBet Support Coming to Poker Copilot
- Rococoa - Bringing Cocoa to Java
- Oh to Have His Problems
- Community Cards
- Table Stats
- Customers Over Competitors Recanted?
- Customers Over Competitors
- Improved Memory Usage in Poker Copilot
- How Long is a Day?
- My Standard Nightmare
-
▼
November
(44)

