Showing posts with label writing software. Show all posts
Showing posts with label writing software. Show all posts
Friday, June 10, 2016
Software Process - A Retrospective
In 1993 I was working at what was then called Wyatt Data Services (it was called Executive Compensation Services before that and called something else after that as the company was bought, sold, and rebranded even during the three years I worked there). I was given an assignment to work with marketing manager Bob Crane to allow his department to create custom invoices targeted to specific groups of customers. Bob was a bear of a man who was way ahead of his time in terms of using computers, mailing lists, and promotional materials. Bob would create mailing lists using different criteria and target the customers he wanted by running different lists of customers and merging or excluding one list against another as his purposes dictated to target the exact group he wanted. I stole that idea when I worked writing retail software and while other retail companies could export a list of customers meeting criteria, my customers could create lists of customers who bought shoes but never bought shoe laces or which customers purchased merchandise in the main retail store but never from the outlet center across town or even which customers bought both shoes and socks as well as any other conceivable combination. People thought my software’s customer management module was visionary which was pretty funny since Bob was the real visionary who had been using these concepts almost a decade earlier.
I created a mechanism for Bob’s department to create custom invoices with offers for related products offered by our company. The custom invoices would be grouped to particular customer sets and mailed with specific promotional materials. Before and after printing each batch of invoices on the company laser printer (a rarity for 1993) a page with an ‘X’ from corner to corner was output to help the mailroom people separate the batches. Each batch also had a code that was printed on the invoice and a cover sheet showing the code, description, and counts for the batch.
The software worked great and everyone was happy, even Bob who wasn’t especially easy to please. I had accepted a new job and had given my notice when Bob came to talk to me about the invoice program. He told me the mailroom was constantly mismatching the promotional materials with the groups of invoices and wondered if it was worth purchasing a laser printer with two trays so we could separate the batches with a different color paper that would be in the second tray. I told Bob that if the mailroom people couldn’t be bothered to look for the code on the invoice or the page with the giant ‘X’ they weren’t going to look for a different color paper. I said the answer wasn’t to get a new printer – the solution was to get new mailroom people. Bob laughed and said he was going to miss me when I left.
Last year I wrote about the process of updating my centraliowachess.com website to allow for the parents whose children attend my youth tournaments the ability to register for the tournaments using a self-signup feature. In September the changes were put to the test and passed successfully although as with most software projects there were a few kinks to iron out. I ran seven tournaments through the school year and all but a handful of the players were signed up using the new method. This was great for me in that it cut down any misunderstandings about which session and sections someone was going to participate in and each entry didn't require my individual attention.
I hoped that allowing players to see who had signed up would help boost attendance and also get more players to play in the rated section as opposed to the unrated section designed for the casual or beginning players. Neither of these things happened. My attendance was well within historical levels but that mostly due to a large number of players from one school club that came to three tournaments. I allowed players to play in the rated section for free for the first four tournaments and even then there were a few players who wanted to play in the beginner section even though they were well able to play in the rated section for more experienced players.
Once I stopped allowing free entry to the rated section it was a 50-50 proposition as to whether I’d have enough players to have a rated section in the first place. I had been advertising for quite some time that if there weren’t at least four players I wouldn’t have a rated tournament so I was covered on that front. My last tournament of the year was in April. In the morning there were two players signed up for the rated section so I assumed I wasn’t going to have a rated tournament. There were two players that had played in previous rated tournaments but since their parents had signed them up for the unrated tournament I knew there wasn’t a misunderstanding.
I had plenty of players for the unrated section and was checking them in when a player came to play in the rated section without pre-registering. Pre-registering is not a must for the tournament and I explained that I wasn’t going to have a rated tournament unless we had one more player sign up. The player and parent talked a bit and then left. A minute after they left another player came to play in the rated section also without pre-registering. Because the other player left I still didn’t have enough players for a rated tournament and just rolled the three players who wanted to play in the rated section into the unrated tournament.
The tournament was great and everyone was good sports. I got more than a few questions about why I didn’t have a rated section to which I explained about needing four players to have a tournament. The parents whose children had played in previous rated tournaments said they would have had their kids sign up for the rated section but when they signed up for the tournament they saw there weren’t any players in the rated section so they signed up for the unrated tournament instead! Given the precedent of putting the rated players in the unrated section when there wasn’t enough players I think either the parents weren’t paying attention or maybe were trying to sound nice.
My efforts to make it as easy as possible for parents to sign up for my youth tournaments and help boost participation in the rated tournaments by letting people see who had signed up didn’t get the bang for the buck I was hoping for because I forgot the point I was trying to make to Bob Crane nearly a quarter of a century ago. People are going to do what they are going to do and there isn’t much technology can do about it. Showing who is attending a tournament won’t include people who don’t sign up in advance and people who don’t want to play in the rated section aren’t going to do that either. Maybe Bob wasn’t the only visionary…
I created a mechanism for Bob’s department to create custom invoices with offers for related products offered by our company. The custom invoices would be grouped to particular customer sets and mailed with specific promotional materials. Before and after printing each batch of invoices on the company laser printer (a rarity for 1993) a page with an ‘X’ from corner to corner was output to help the mailroom people separate the batches. Each batch also had a code that was printed on the invoice and a cover sheet showing the code, description, and counts for the batch.
The software worked great and everyone was happy, even Bob who wasn’t especially easy to please. I had accepted a new job and had given my notice when Bob came to talk to me about the invoice program. He told me the mailroom was constantly mismatching the promotional materials with the groups of invoices and wondered if it was worth purchasing a laser printer with two trays so we could separate the batches with a different color paper that would be in the second tray. I told Bob that if the mailroom people couldn’t be bothered to look for the code on the invoice or the page with the giant ‘X’ they weren’t going to look for a different color paper. I said the answer wasn’t to get a new printer – the solution was to get new mailroom people. Bob laughed and said he was going to miss me when I left.
Last year I wrote about the process of updating my centraliowachess.com website to allow for the parents whose children attend my youth tournaments the ability to register for the tournaments using a self-signup feature. In September the changes were put to the test and passed successfully although as with most software projects there were a few kinks to iron out. I ran seven tournaments through the school year and all but a handful of the players were signed up using the new method. This was great for me in that it cut down any misunderstandings about which session and sections someone was going to participate in and each entry didn't require my individual attention.
I hoped that allowing players to see who had signed up would help boost attendance and also get more players to play in the rated section as opposed to the unrated section designed for the casual or beginning players. Neither of these things happened. My attendance was well within historical levels but that mostly due to a large number of players from one school club that came to three tournaments. I allowed players to play in the rated section for free for the first four tournaments and even then there were a few players who wanted to play in the beginner section even though they were well able to play in the rated section for more experienced players.
Once I stopped allowing free entry to the rated section it was a 50-50 proposition as to whether I’d have enough players to have a rated section in the first place. I had been advertising for quite some time that if there weren’t at least four players I wouldn’t have a rated tournament so I was covered on that front. My last tournament of the year was in April. In the morning there were two players signed up for the rated section so I assumed I wasn’t going to have a rated tournament. There were two players that had played in previous rated tournaments but since their parents had signed them up for the unrated tournament I knew there wasn’t a misunderstanding.
I had plenty of players for the unrated section and was checking them in when a player came to play in the rated section without pre-registering. Pre-registering is not a must for the tournament and I explained that I wasn’t going to have a rated tournament unless we had one more player sign up. The player and parent talked a bit and then left. A minute after they left another player came to play in the rated section also without pre-registering. Because the other player left I still didn’t have enough players for a rated tournament and just rolled the three players who wanted to play in the rated section into the unrated tournament.
The tournament was great and everyone was good sports. I got more than a few questions about why I didn’t have a rated section to which I explained about needing four players to have a tournament. The parents whose children had played in previous rated tournaments said they would have had their kids sign up for the rated section but when they signed up for the tournament they saw there weren’t any players in the rated section so they signed up for the unrated tournament instead! Given the precedent of putting the rated players in the unrated section when there wasn’t enough players I think either the parents weren’t paying attention or maybe were trying to sound nice.
My efforts to make it as easy as possible for parents to sign up for my youth tournaments and help boost participation in the rated tournaments by letting people see who had signed up didn’t get the bang for the buck I was hoping for because I forgot the point I was trying to make to Bob Crane nearly a quarter of a century ago. People are going to do what they are going to do and there isn’t much technology can do about it. Showing who is attending a tournament won’t include people who don’t sign up in advance and people who don’t want to play in the rated section aren’t going to do that either. Maybe Bob wasn’t the only visionary…
Monday, October 12, 2015
21st Century NBA Basketball Prediction Program - Trouble in Paradise (and random coaching thoughts)
Now that I’ve gotten my two big chess tournaments and my 55th birthday out of the way I have turned my attention back to my NBA prediction program which has lain dormant since August. When I last left my program I found two formulas that gave a 63% result rate on the 2014 season which would not only be the stuff of legends but easily monetizable. I was distrustful of the abnormally high success rate so I loaded the 2013-2014 schedule, results, and lines in my database and ran my formulas against the new data.
My formulas that were so successful for the 2014 season were worse than awful for the 2013 season and scored 40% for both seasons. This unwelcome turn of events leaves me searching for a formula that will work for both seasons. If I can’t find one I’ll have to research what made the two seasons different and as the 2015 season takes shape decide on a formula to use. I could add more seasons of scores and betting lines to my database to determine if the 2013 season is an outlier but that wouldn’t protect me from the possibility of this upcoming season being an outlier also.
As I test various formulas the NBA season is less than three weeks away. I’ve loaded the 2015-2016 schedule into my database and will have to update the point spreads daily as the season goes along. I thought I might have been busy this week watching the Yankees in the baseball playoffs but there was only one game to watch since the Houston Astros of all teams came into Yankee Stadium without a playoff win in a decade and came out with a 3-0 win and moved on to play the Kansas City Royals in the divisional series. It was another lost season for the Yankees. I had some high hopes in late July when the Yankees had a seven game lead in their division with a 57-42 record. My concerns about the age of the starting lineup proved justified as the team went into a collective hitting slump in September. On September 7th the Yankees were 18 games over .500 at 77-59 an only a half game behind the resurgent Blue Jays and their trading deadline acquisitions Troy Tutowitzki and David Price only to collapse with a 10-16 record down the stretch and limp into the playoffs with a mediocre 87-75 record.
This is the third year in a row the Yankees have failed to win their division which is the longest streak in 20 years and this is the 6th year in a row without a World Series appearance which is the third longest streak since 1923. Despite this record of mediocrity manager Joe Girardi’s job is safe. General Manager Brian Cashman said last week about Girardi (here is the story) "He is signed for two more years and managed the team to the playoffs. It’s not his fault we didn’t hit. He managed a perfect playoff game."
I suppose Cashman is right. After all the Yankees were shut out by 20 game winner Dallas Keuchel and when you go up against 20 game winners these things can happen. My question is if Girardi managed a ‘perfect playoff game’ and is such a great manager doesn’t that mean there is something wrong with the talent on the Yankees? Where are the Yankees' 20 game winners? They haven’t had one since C.C. Sabathia (who got so drunk two weekends ago that he had to remove himself from the Yankees’ postseason roster in order to check into rehab) in 2010. Keuchel is 27 years old and was drafted by the Astros in the 7th round of the 2009 draft. It is not like he was a top draft pick yet the Astros were able to develop him into a 20 game winner. I don’t see the Yankees farm system developing 20 game winners and there doesn’t seem to be any superstar every day players either. Under Cashman the Yankees occasionally have developed a relief pitcher but except for Robinson Cano there haven’t been any perennial all-star starting pitchers or everyday players coming from the farm system which leaves the team overspending on mediocre veterans that wear out at the end of the season. I cannot understand how the Yankee ownership can tolerate the poor return on the investment of a huge payroll when low-budget teams like the Royals, Rangers, and crosstown Mets are winning their divisions and still in the playoffs.
One NBA team that is refusing to settle for mediocrity is the Oklahoma City Thunder. Under the leadership of coach Scott Brooks and superstar players Kevin Durant, Russell Westbrook, and James Harden the Thunder went to the NBA Finals in 2012 which they lost to the Miami Heat in five games. The team decided they would not go over the salary cap to keep James Harden and traded him to the Houston Rockets for some role players that never made an impact on the team. In the 2012-13 season, Westbrook was hurt in the playoffs the Thunder fell to the Grizzlies in the second round. In 2013-2014 the team fell to the eventual champion Spurs in the Western Conference finals. Last season saw Durant miss most of the season with a foot injury and the team missed the playoffs for the first time in six seasons despite a 45-37 record.
While the Yankees can make the playoffs for one game in three seasons and management gets contract extensions the Thunder decided to make a coaching change and Brooks found himself out of a job. A large part of the reason for the coaching change was the Thunder are in a ‘win now’ mode that is bordering on desperation. Durant is a free agent after this season with Westbrook following next year and there is no guarantee that these two superstars won’t leave the Thunder to play in larger markets to boost their profile and chase the championship they haven’t been able to obtain in Oklahoma City.
I would have expected the Thunder to get a coach with a proven professional track record or a hot assistant coach but they instead lured longtime Florida Gators coach Billy Donovan from the college ranks to take his first professional coaching position. Donovan won two national championships with the Gators but very few college coaches find success in the professional ranks. Former Butler coach Brad Stevens has gotten favorable reviews for leading the moribund Boston Celtics to the playoffs in his second season but top college coaches Rick Pitino and John Calipari were busts that left the Celtics and Nets (respectively) in shambles after taking over their operations.
I think Donovan will not follow his mentor Pitino and fellow Pitino disciple Calipari into bust status and expect him to be highly successful as a pro coach. While Pitino and Calipari leveraged their college success into complete control of their teams, Donovan is the coach and only the coach so he can concentrate on coaching. When college coaches transition to the pros they tend to have trouble with the lack absolute authority they had over their college players. Donovan may have this problem but since he did have some pro experience in the 1980s as a very marginal player he should know that he can't treat pro athletes the same as his college players.
Donovan is thought of as an offensive genius and the early quotes from Durant and Westbrook seem to be enthusiastic concerning the new offensive system. As much as I think Donovan will be successful if Durant and Westbrook are injured as much as they have been the past few years, the Thunder could miss the playoffs yet again and have a worse record than last year. But until then I’ll be keeping a special eye out for the Thunder this season.
My formulas that were so successful for the 2014 season were worse than awful for the 2013 season and scored 40% for both seasons. This unwelcome turn of events leaves me searching for a formula that will work for both seasons. If I can’t find one I’ll have to research what made the two seasons different and as the 2015 season takes shape decide on a formula to use. I could add more seasons of scores and betting lines to my database to determine if the 2013 season is an outlier but that wouldn’t protect me from the possibility of this upcoming season being an outlier also.
As I test various formulas the NBA season is less than three weeks away. I’ve loaded the 2015-2016 schedule into my database and will have to update the point spreads daily as the season goes along. I thought I might have been busy this week watching the Yankees in the baseball playoffs but there was only one game to watch since the Houston Astros of all teams came into Yankee Stadium without a playoff win in a decade and came out with a 3-0 win and moved on to play the Kansas City Royals in the divisional series. It was another lost season for the Yankees. I had some high hopes in late July when the Yankees had a seven game lead in their division with a 57-42 record. My concerns about the age of the starting lineup proved justified as the team went into a collective hitting slump in September. On September 7th the Yankees were 18 games over .500 at 77-59 an only a half game behind the resurgent Blue Jays and their trading deadline acquisitions Troy Tutowitzki and David Price only to collapse with a 10-16 record down the stretch and limp into the playoffs with a mediocre 87-75 record.
This is the third year in a row the Yankees have failed to win their division which is the longest streak in 20 years and this is the 6th year in a row without a World Series appearance which is the third longest streak since 1923. Despite this record of mediocrity manager Joe Girardi’s job is safe. General Manager Brian Cashman said last week about Girardi (here is the story) "He is signed for two more years and managed the team to the playoffs. It’s not his fault we didn’t hit. He managed a perfect playoff game."
I suppose Cashman is right. After all the Yankees were shut out by 20 game winner Dallas Keuchel and when you go up against 20 game winners these things can happen. My question is if Girardi managed a ‘perfect playoff game’ and is such a great manager doesn’t that mean there is something wrong with the talent on the Yankees? Where are the Yankees' 20 game winners? They haven’t had one since C.C. Sabathia (who got so drunk two weekends ago that he had to remove himself from the Yankees’ postseason roster in order to check into rehab) in 2010. Keuchel is 27 years old and was drafted by the Astros in the 7th round of the 2009 draft. It is not like he was a top draft pick yet the Astros were able to develop him into a 20 game winner. I don’t see the Yankees farm system developing 20 game winners and there doesn’t seem to be any superstar every day players either. Under Cashman the Yankees occasionally have developed a relief pitcher but except for Robinson Cano there haven’t been any perennial all-star starting pitchers or everyday players coming from the farm system which leaves the team overspending on mediocre veterans that wear out at the end of the season. I cannot understand how the Yankee ownership can tolerate the poor return on the investment of a huge payroll when low-budget teams like the Royals, Rangers, and crosstown Mets are winning their divisions and still in the playoffs.
One NBA team that is refusing to settle for mediocrity is the Oklahoma City Thunder. Under the leadership of coach Scott Brooks and superstar players Kevin Durant, Russell Westbrook, and James Harden the Thunder went to the NBA Finals in 2012 which they lost to the Miami Heat in five games. The team decided they would not go over the salary cap to keep James Harden and traded him to the Houston Rockets for some role players that never made an impact on the team. In the 2012-13 season, Westbrook was hurt in the playoffs the Thunder fell to the Grizzlies in the second round. In 2013-2014 the team fell to the eventual champion Spurs in the Western Conference finals. Last season saw Durant miss most of the season with a foot injury and the team missed the playoffs for the first time in six seasons despite a 45-37 record.
While the Yankees can make the playoffs for one game in three seasons and management gets contract extensions the Thunder decided to make a coaching change and Brooks found himself out of a job. A large part of the reason for the coaching change was the Thunder are in a ‘win now’ mode that is bordering on desperation. Durant is a free agent after this season with Westbrook following next year and there is no guarantee that these two superstars won’t leave the Thunder to play in larger markets to boost their profile and chase the championship they haven’t been able to obtain in Oklahoma City.
I would have expected the Thunder to get a coach with a proven professional track record or a hot assistant coach but they instead lured longtime Florida Gators coach Billy Donovan from the college ranks to take his first professional coaching position. Donovan won two national championships with the Gators but very few college coaches find success in the professional ranks. Former Butler coach Brad Stevens has gotten favorable reviews for leading the moribund Boston Celtics to the playoffs in his second season but top college coaches Rick Pitino and John Calipari were busts that left the Celtics and Nets (respectively) in shambles after taking over their operations.
I think Donovan will not follow his mentor Pitino and fellow Pitino disciple Calipari into bust status and expect him to be highly successful as a pro coach. While Pitino and Calipari leveraged their college success into complete control of their teams, Donovan is the coach and only the coach so he can concentrate on coaching. When college coaches transition to the pros they tend to have trouble with the lack absolute authority they had over their college players. Donovan may have this problem but since he did have some pro experience in the 1980s as a very marginal player he should know that he can't treat pro athletes the same as his college players.
Donovan is thought of as an offensive genius and the early quotes from Durant and Westbrook seem to be enthusiastic concerning the new offensive system. As much as I think Donovan will be successful if Durant and Westbrook are injured as much as they have been the past few years, the Thunder could miss the playoffs yet again and have a worse record than last year. But until then I’ll be keeping a special eye out for the Thunder this season.
Monday, September 21, 2015
Software Process - An Idea In Practice
In July I wrote about the process of giving users the ability to sign up for my tournaments using my www.centraliowachess.com website. My first tournament using the self sign up process was on Saturday. There were 52 participants in the tournament with 31 signing up via the website and four more that I set up myself via the website.
The self sign up option was available in July but I formally announced the option in my tournament email of September 5th. I had a few parents create accounts and add their children but weren’t able to sign them up for the tournaments. I looked into the issue and found out that the company that hosts my site (GoDaddy.com) ends user sessions after five minutes of inactivity. Since I store the login information in session variables, when the GoDaddy web server ends the user session my website won’t know who is logged in and doesn’t know who to display when the signup link is clicked or just won’t show the signup link on the tournament page. This meant that anyone spending five minutes reading the tournament announcement or browsing on another tab or being distracted in some other way would have their session ended and get an error when they tried to sign up for the tournament.
I think five minutes is an awfully short time for a session to be terminated but it’s not my world –I just live in it. To combat this problem I built in a ‘your session has ended’ page and a timer to route the user to it after five minutes of inactivity. That solved most of the issues with the only remaining problem being that I don't have a message on the ‘session has ended page’ to remind the user that they’d have to log in again.
A couple of people wrote to ask why they couldn’t see the sign up link and were able to register soon after I wrote back to tell them about the ‘not logged in’ problem. Most users were able to set up an account, add their children, and sign up for the tournament without any help from me. When people emailed me to sign their children up for the tournament, I politely but firmly asked that they attempt to use the self sign up option on my website. If anyone was offended they didn’t say so and at the tournament I got a lot of positive comments about how easy the sign up process was.
As for me, adding the self sign up option made my job as tournament organizer way easier. During the week of past tournaments I'd have a bunch of emails to both of my primary email addresses from parents registering their children. Many of these emails wouldn't say what section (rated) or which sessions (morning or afternoon) so I'd have to send an email asking and wait for a reply to enter the players in my tournament software. It was time consuming and the chance for error good. This past week was completely different. Whenever someone signed up for a tournament my website sent me an email telling who was signed up and the session and section they were signed up for. Each night after work I’d check the emails from my website to see if anyone signed up and put them in the tournament software if they did. I didn’t have to worry about any missed emails – I just went to the website and crosschecked my tournament software’s player list with the tournament signup list. If the counts were off I knew I missed an email – otherwise I was good to go.
There were a couple of problems. I had some people sign up online and then not show up. This happens at every tournament although I think it is easier to forget when signing up online by clicking a mouse instead of taking the time to send an email. The other problem was that some parents put their children in both the rated and unrated section. It wasn’t a big deal but I had to remember to find out which section the player was in before the tournament started.
These small problems were outweighed by the benefits. I already outlined how it made it easy for me to keep track of the signups. I don’t know if the ability to see who has signed up helped attract more players. I do know that it helps with the Okoboji Open and I believe it will help attract players once more parents are aware of the feature. The day after the tournament I was able to easily assemble an email list to let the parents know where they could find the cross tables and pictures because I had the email addresses of everyone who used the self sign up option at my fingertips using an SQL query.
The tournament itself was quite successful from a participation standard with the most players I’ve ever had for a September tournament. From the sporting perspective the tournament was awesome. The kids had a great time playing, there were enough players for the rated sections in both the morning and afternoon, the parents were happy to have my tournaments back after taking the summer off, my energy level was high, and my students all showed improvement. Most chess games have a winner and a loser and there is nothing that can make a group of chess playing kids uncomfortable like having a sore loser that starts crying or accuses their opponent of cheating or pulls some stunts like making illegal moves or knocking the pieces off the board. There was none of that on Saturday.
In the last game of the tournament Nate from St. Francis was playing Meg (a girl from another parochial school). Both players had two points out of four which meant there were no prizes on the line, just bragging rights. The St. Francis player was down two pawns in a desperate situation when he set up and uncorked a beauty of a move.
Because this was the last game going there was a crowd of kids hanging around watching when Nate played his killer move. With the crowd and the tension I would have understood if Meg had gotten upset as she realized there was no way she could stop the pawn but she just smiled, shook Nate’s hand, and congratulated him on a good game. It was an example of how having a great group of kids and parents make for a fun tournament where everyone is playing games of chess instead of a day where there are winners and losers and competition is king.
Adding the self sign up feature to my software didn’t all of a sudden imbue the participants with a ‘good sport gene’ but it made my job as the organizer a lot easier which helped free my mind to give more thought to how to dial down the competition aspect and make the tournaments more fun. Enough parents found it easy to use which makes me think my design was more right than wrong. My next project on the www.centraliowachess.comwebsite is to redesign it suing a new toolkit that will make the website adjust its display from a smartphone to a desktop browser while providing an easy to use interface. I’ve finished all the pieces except the self-sign up part and expect to be finished the next time I have a vacation.
The self sign up option was available in July but I formally announced the option in my tournament email of September 5th. I had a few parents create accounts and add their children but weren’t able to sign them up for the tournaments. I looked into the issue and found out that the company that hosts my site (GoDaddy.com) ends user sessions after five minutes of inactivity. Since I store the login information in session variables, when the GoDaddy web server ends the user session my website won’t know who is logged in and doesn’t know who to display when the signup link is clicked or just won’t show the signup link on the tournament page. This meant that anyone spending five minutes reading the tournament announcement or browsing on another tab or being distracted in some other way would have their session ended and get an error when they tried to sign up for the tournament.
I think five minutes is an awfully short time for a session to be terminated but it’s not my world –I just live in it. To combat this problem I built in a ‘your session has ended’ page and a timer to route the user to it after five minutes of inactivity. That solved most of the issues with the only remaining problem being that I don't have a message on the ‘session has ended page’ to remind the user that they’d have to log in again.
A couple of people wrote to ask why they couldn’t see the sign up link and were able to register soon after I wrote back to tell them about the ‘not logged in’ problem. Most users were able to set up an account, add their children, and sign up for the tournament without any help from me. When people emailed me to sign their children up for the tournament, I politely but firmly asked that they attempt to use the self sign up option on my website. If anyone was offended they didn’t say so and at the tournament I got a lot of positive comments about how easy the sign up process was.
As for me, adding the self sign up option made my job as tournament organizer way easier. During the week of past tournaments I'd have a bunch of emails to both of my primary email addresses from parents registering their children. Many of these emails wouldn't say what section (rated) or which sessions (morning or afternoon) so I'd have to send an email asking and wait for a reply to enter the players in my tournament software. It was time consuming and the chance for error good. This past week was completely different. Whenever someone signed up for a tournament my website sent me an email telling who was signed up and the session and section they were signed up for. Each night after work I’d check the emails from my website to see if anyone signed up and put them in the tournament software if they did. I didn’t have to worry about any missed emails – I just went to the website and crosschecked my tournament software’s player list with the tournament signup list. If the counts were off I knew I missed an email – otherwise I was good to go.
There were a couple of problems. I had some people sign up online and then not show up. This happens at every tournament although I think it is easier to forget when signing up online by clicking a mouse instead of taking the time to send an email. The other problem was that some parents put their children in both the rated and unrated section. It wasn’t a big deal but I had to remember to find out which section the player was in before the tournament started.
These small problems were outweighed by the benefits. I already outlined how it made it easy for me to keep track of the signups. I don’t know if the ability to see who has signed up helped attract more players. I do know that it helps with the Okoboji Open and I believe it will help attract players once more parents are aware of the feature. The day after the tournament I was able to easily assemble an email list to let the parents know where they could find the cross tables and pictures because I had the email addresses of everyone who used the self sign up option at my fingertips using an SQL query.
The tournament itself was quite successful from a participation standard with the most players I’ve ever had for a September tournament. From the sporting perspective the tournament was awesome. The kids had a great time playing, there were enough players for the rated sections in both the morning and afternoon, the parents were happy to have my tournaments back after taking the summer off, my energy level was high, and my students all showed improvement. Most chess games have a winner and a loser and there is nothing that can make a group of chess playing kids uncomfortable like having a sore loser that starts crying or accuses their opponent of cheating or pulls some stunts like making illegal moves or knocking the pieces off the board. There was none of that on Saturday.
In the last game of the tournament Nate from St. Francis was playing Meg (a girl from another parochial school). Both players had two points out of four which meant there were no prizes on the line, just bragging rights. The St. Francis player was down two pawns in a desperate situation when he set up and uncorked a beauty of a move.
Nate was white and played d7!! Not only does the pawn move allow a check from the ninja bishop on b4 which prevents the bishop from capturing it, it covers the e8 square and prevents the king from stopping the pawn from becoming a queen next move. If I could pull off a move like this in one of my games I'd never stop writing about it!
Adding the self sign up feature to my software didn’t all of a sudden imbue the participants with a ‘good sport gene’ but it made my job as the organizer a lot easier which helped free my mind to give more thought to how to dial down the competition aspect and make the tournaments more fun. Enough parents found it easy to use which makes me think my design was more right than wrong. My next project on the www.centraliowachess.comwebsite is to redesign it suing a new toolkit that will make the website adjust its display from a smartphone to a desktop browser while providing an easy to use interface. I’ve finished all the pieces except the self-sign up part and expect to be finished the next time I have a vacation.
Friday, August 14, 2015
21st Century NBA Basketball Prediction Program - An Unexpected Detour
Last month I wrote about the start I had made in recreating the 21st century version of my basketball prediction program. Having entered all the scores and betting lines for the 2014-2015 season, I fleshed out my data views to show season to date point differential averages for all games, all home games, and all road games as well as the last three to ten games for the same three categories. I then added the data fields to indicate whether a team was beginning or ending a series of back to back games, how many days off a team had, and whether a team was playing four games in five days.
I finished these tasks last week. I was going to start writing a program to test these variables and see how my predictions compared against the official betting lines. The more I thought about the program the more I realized I could write a SQL (Structured Query Language) stored procedure to run against my data. A stored procedure is nothing more than a program that works with data without any user interface considerations. My stored procedure takes parameters to determine the weighting of the different variables that determine my version of ‘power rankings’ to create my own betting line and compare my betting line in each game to the official betting line. My stored procedure ‘picks’ a team depending on how my line compares to the official betting line. If I have a team favored by more than the official line I pick the favorite and when I have the underdog winning or getting fewer points than the official line I pick the underdog. My betting line, the betting line difference, point spread winner, and my pick is appended to a fresh copy of the data for that season and returned from my stored procedure.
I then wrote a second stored procedure to analyze the results from my first stored procedure. I take the results and summarize it by the difference between my power rankings and the betting lines along with my betting record. In a perfect world there will be a correlation between the difference between the two betting lines and the winning percentage of my bets. There are 1,230 games in a season and my betting line is with three points of the official line over 65% of the time and within five points in more than 90% of the games. The bookmakers betting lines are usually pretty close to the actual game result and when my betting lines are normally close to the bookmakers I take that as a sign that my formulas are on the right track. When my lines are very different I hope it is because I’ve uncovered some bias on the public’s or bookmaker’s part and not found a flaw in my formula.
I changed my ‘analysis’ stored procedure to read the parameters from a table, call the data gathering stored procedure, and save the parameters, raw results, and summarized results in new table so I can look for any common patterns as to what games I’m missing or getting right and have the results handy.
I created 30 sets of parameters and fired up my procedures. Within a few minutes I had a renewed appreciation of the power of Structured Query Language and weeks of data for me to peruse. Looking at the results I saw that the worst percentages belonged to the tests that gave the preference to the most recent results and the best results contained a 50-50 mix of season to date and most recent games with a 40% preference given to the home game point differential for the home team and the away game differential when playing on the road.
Two of the result sets gave me a 63% and 64% winning percentage when my point spread differed from the betting line by more than five points and a 50% winning percentage when my point spread was within five points or less of the betting line. In the world of sports predictions 50% is losing big time because of the 10 percent penalty (or vigorish) on losing bets. It takes 11 winning bets to offset 10 losing bets which makes the betting break-even percentage 52.4%. I could expect a 50% success on basketball games by flipping a coin. Getting 63% on the subset of my picks where my point spread is 5 or more point greater than the established line is as likely as finding a pot of gold at the end of the rainbow.
The only disturbing feature of my 63% winning predictions was that I was at 50 percent or slightly below when my point spreads differed by 7 to 9 points. This was offset by the higher percentages when the difference was 5 to 7 points and a stellar 80%+ percentage when my point spread was greater than 9 points from the official line. I looked at the games in question and didn’t see anything obvious that would make me doubt the formula but the discrepancy still makes me wonder if I am just experiencing random luck in my predictions.
I expected to find a working formula sometime in September and have October and November to verify but here I am in the middle of August with not just a working formula but two spectacularly working formulas. Is this a stroke of good fortune or a promising start to a dead end? I can’t say is if the winning formulas are only good for the 2014-2015 season or if the success rate would carry on into other seasons. There is only one way to make this determination and that is to enter another season or two in the database and run the same test over again. I wasn't planning on entering data for different seasons but promise of having a super formula makes it worth the time investment. If I can get a formula that is consistent over a different seasons I’ll feel comfortable with using my program for the 2015-2016 NBA season that is still 10 weeks away.
I finished these tasks last week. I was going to start writing a program to test these variables and see how my predictions compared against the official betting lines. The more I thought about the program the more I realized I could write a SQL (Structured Query Language) stored procedure to run against my data. A stored procedure is nothing more than a program that works with data without any user interface considerations. My stored procedure takes parameters to determine the weighting of the different variables that determine my version of ‘power rankings’ to create my own betting line and compare my betting line in each game to the official betting line. My stored procedure ‘picks’ a team depending on how my line compares to the official betting line. If I have a team favored by more than the official line I pick the favorite and when I have the underdog winning or getting fewer points than the official line I pick the underdog. My betting line, the betting line difference, point spread winner, and my pick is appended to a fresh copy of the data for that season and returned from my stored procedure.
I then wrote a second stored procedure to analyze the results from my first stored procedure. I take the results and summarize it by the difference between my power rankings and the betting lines along with my betting record. In a perfect world there will be a correlation between the difference between the two betting lines and the winning percentage of my bets. There are 1,230 games in a season and my betting line is with three points of the official line over 65% of the time and within five points in more than 90% of the games. The bookmakers betting lines are usually pretty close to the actual game result and when my betting lines are normally close to the bookmakers I take that as a sign that my formulas are on the right track. When my lines are very different I hope it is because I’ve uncovered some bias on the public’s or bookmaker’s part and not found a flaw in my formula.
I changed my ‘analysis’ stored procedure to read the parameters from a table, call the data gathering stored procedure, and save the parameters, raw results, and summarized results in new table so I can look for any common patterns as to what games I’m missing or getting right and have the results handy.
I created 30 sets of parameters and fired up my procedures. Within a few minutes I had a renewed appreciation of the power of Structured Query Language and weeks of data for me to peruse. Looking at the results I saw that the worst percentages belonged to the tests that gave the preference to the most recent results and the best results contained a 50-50 mix of season to date and most recent games with a 40% preference given to the home game point differential for the home team and the away game differential when playing on the road.
Two of the result sets gave me a 63% and 64% winning percentage when my point spread differed from the betting line by more than five points and a 50% winning percentage when my point spread was within five points or less of the betting line. In the world of sports predictions 50% is losing big time because of the 10 percent penalty (or vigorish) on losing bets. It takes 11 winning bets to offset 10 losing bets which makes the betting break-even percentage 52.4%. I could expect a 50% success on basketball games by flipping a coin. Getting 63% on the subset of my picks where my point spread is 5 or more point greater than the established line is as likely as finding a pot of gold at the end of the rainbow.
The only disturbing feature of my 63% winning predictions was that I was at 50 percent or slightly below when my point spreads differed by 7 to 9 points. This was offset by the higher percentages when the difference was 5 to 7 points and a stellar 80%+ percentage when my point spread was greater than 9 points from the official line. I looked at the games in question and didn’t see anything obvious that would make me doubt the formula but the discrepancy still makes me wonder if I am just experiencing random luck in my predictions.
I expected to find a working formula sometime in September and have October and November to verify but here I am in the middle of August with not just a working formula but two spectacularly working formulas. Is this a stroke of good fortune or a promising start to a dead end? I can’t say is if the winning formulas are only good for the 2014-2015 season or if the success rate would carry on into other seasons. There is only one way to make this determination and that is to enter another season or two in the database and run the same test over again. I wasn't planning on entering data for different seasons but promise of having a super formula makes it worth the time investment. If I can get a formula that is consistent over a different seasons I’ll feel comfortable with using my program for the 2015-2016 NBA season that is still 10 weeks away.
Monday, July 27, 2015
21st Century NBA Basketball Prediction Program - Setting up the Data
Two weeks ago I wrote that I had finished creating a self-signup mechanism for my youth chess tournaments three weeks ahead of schedule and my next project was to re-create the basketball prediction program I wrote in 1987 using Dbase III. I still have my old database and source code but I don’t have a computer that can read the floppy disks they are stored on, a copy of any version of Dbase, or the inclination to even try to use any of these three decades old technologies. What I do have is knowledge of what I did 28 years ago, three more decades of experience writing software, computers that can do in a second what took 1980’s computers hours, and last but not least, the Internet.
My first step was to create the database to hold games scores and betting lines which was simple enough. I have fields for the season, date, the home team and their score, the away team and their score, the betting line, and two extra fields to note when the game was in a neutral site (in which case both teams could be considered away teams) or if the NBA franchises in New York or Los Angeles were playing each other (in which case both teams could be considered home teams). Since the 2015-2016 schedule won’t be released until next month, I intended to playtest using the 2014-2015 schedule. I quickly found the entire schedule and scores on basketball-reference.com which provided a convenient CSV (comma separated values) export that I was able to massage and plug into my data table in minutes.
Having saved hours of data entry duty thanks to the power of the internet, my next job was to get the betting lines for each of the 1,230 NBA games that were played last season. This was no easy task since gamblers are a forward looking bunch and past betting recommendations and lines are not generally saved. I couldn’t find them on any of the sites I used when I was making my basketball picks during the season. Just before I was ready to search through old newspapers and microfiche at the library I stumbled upon freeplays.com which has closing betting lines for NBA games starting with the 2002 season! There was no handy download feature like basketball-reference.com so I brought up each day of the 2014-2015 NBA season, entered the betting lines on my spreadsheet, and updated the database from the spreadsheet. Entering each day’s worth of games took between one and three minutes and there is no reason to think my data entry was 100% accurate. After almost seven hours spread out over the past week I have a database of the 2014-2015 NBA season complete with betting lines.
Thanks to freeplays.com I have the possibility of entering the past 15 years of NBA schedules and betting lines but the data entry would take me around 100 hours. If I have the need to get that information in my database I’ll write a program to scrape the data from the freeplays.com website. For now one season’s worth of data should be enough to test the prediction program that I haven’t written yet.
My program from 30 years ago assigned home and road power rankings to teams using a weighted average of point differentials from the season as a whole, the point differential of the last x number of games, the season's home or road (depending on current game) point differential and the point differential of the last x number home or road games. I then compared the teams’ rankings to get my point spread and compare it to the spread in the paper. There will be some games where my rankings differ greatly from the published betting line and many more that are very close to the line. My goal is to discover a formula that causes my prediction percentage to have a positive correlation to the difference between my projections and the betting line. I needed at least one month of data to have a large enough sample to create rankings. Running against even this small amount of calculations would take hours using the computers of the 1980’s.
Last century I wanted to add variables to account for back to back games, four games in five nights, days of rest, the last game of a long road trip, and the start of a home stand. I had the data and the knowhow but not the hours these variables would have added to the tests. The computers of 2015 can easily handle all these variables and more. I spent a few hours on Sunday afternoon adding views to my database to show me point differentials for home games, road games, and the season in total as well as selected increments of past games for trending purposes. Over the next week I’ll add the activity variables (back to back games, four games in five nights, etc...). Once that’s done I’ll work on the rough sketch of an application to run tests using different weightings of these variables. The ideal application will allow me to create a script of multiple scenarios that I can run before I go to bed and check on the results in the morning. In the late 1980's running tests on a few months of data took hours using the standard personal computers of the time. The processing time convinced me to use the first formula I found that gave me a positive correlation (and results better than the magic 52.4% break even mark). In the 21st century these same tests will take minutes if not seconds. This increase in speed gives me the luxury of being able to do more testing and at the same time puts a priority on designing my testing platform to take advantage of the opportunities provided by the increase in speed.
Once I have the variables and the testing application in place the last step is to create an application that will determine the actual picks. This should be a simple offshoot of the testing program. I’m amazed at how fast this project is coming together compared to my first effort 30 years ago. At the same time I’m not too surprised. Technology has made most things easier and creating a basketball prediction program is no exception.
My first step was to create the database to hold games scores and betting lines which was simple enough. I have fields for the season, date, the home team and their score, the away team and their score, the betting line, and two extra fields to note when the game was in a neutral site (in which case both teams could be considered away teams) or if the NBA franchises in New York or Los Angeles were playing each other (in which case both teams could be considered home teams). Since the 2015-2016 schedule won’t be released until next month, I intended to playtest using the 2014-2015 schedule. I quickly found the entire schedule and scores on basketball-reference.com which provided a convenient CSV (comma separated values) export that I was able to massage and plug into my data table in minutes.
Having saved hours of data entry duty thanks to the power of the internet, my next job was to get the betting lines for each of the 1,230 NBA games that were played last season. This was no easy task since gamblers are a forward looking bunch and past betting recommendations and lines are not generally saved. I couldn’t find them on any of the sites I used when I was making my basketball picks during the season. Just before I was ready to search through old newspapers and microfiche at the library I stumbled upon freeplays.com which has closing betting lines for NBA games starting with the 2002 season! There was no handy download feature like basketball-reference.com so I brought up each day of the 2014-2015 NBA season, entered the betting lines on my spreadsheet, and updated the database from the spreadsheet. Entering each day’s worth of games took between one and three minutes and there is no reason to think my data entry was 100% accurate. After almost seven hours spread out over the past week I have a database of the 2014-2015 NBA season complete with betting lines.
Thanks to freeplays.com I have the possibility of entering the past 15 years of NBA schedules and betting lines but the data entry would take me around 100 hours. If I have the need to get that information in my database I’ll write a program to scrape the data from the freeplays.com website. For now one season’s worth of data should be enough to test the prediction program that I haven’t written yet.
My program from 30 years ago assigned home and road power rankings to teams using a weighted average of point differentials from the season as a whole, the point differential of the last x number of games, the season's home or road (depending on current game) point differential and the point differential of the last x number home or road games. I then compared the teams’ rankings to get my point spread and compare it to the spread in the paper. There will be some games where my rankings differ greatly from the published betting line and many more that are very close to the line. My goal is to discover a formula that causes my prediction percentage to have a positive correlation to the difference between my projections and the betting line. I needed at least one month of data to have a large enough sample to create rankings. Running against even this small amount of calculations would take hours using the computers of the 1980’s.
Last century I wanted to add variables to account for back to back games, four games in five nights, days of rest, the last game of a long road trip, and the start of a home stand. I had the data and the knowhow but not the hours these variables would have added to the tests. The computers of 2015 can easily handle all these variables and more. I spent a few hours on Sunday afternoon adding views to my database to show me point differentials for home games, road games, and the season in total as well as selected increments of past games for trending purposes. Over the next week I’ll add the activity variables (back to back games, four games in five nights, etc...). Once that’s done I’ll work on the rough sketch of an application to run tests using different weightings of these variables. The ideal application will allow me to create a script of multiple scenarios that I can run before I go to bed and check on the results in the morning. In the late 1980's running tests on a few months of data took hours using the standard personal computers of the time. The processing time convinced me to use the first formula I found that gave me a positive correlation (and results better than the magic 52.4% break even mark). In the 21st century these same tests will take minutes if not seconds. This increase in speed gives me the luxury of being able to do more testing and at the same time puts a priority on designing my testing platform to take advantage of the opportunities provided by the increase in speed.
Once I have the variables and the testing application in place the last step is to create an application that will determine the actual picks. This should be a simple offshoot of the testing program. I’m amazed at how fast this project is coming together compared to my first effort 30 years ago. At the same time I’m not too surprised. Technology has made most things easier and creating a basketball prediction program is no exception.
Friday, July 17, 2015
Software Process
Two months ago I decided to modify my chess website CentralIowaChess.com to allow users to sign up for my fall tournaments and see who has signed up for the tournaments. I worked on this project a few hours every weekend. I thought the process of making these changes to an existing web site was interesting enough to write a post about and I also get to kill two birds with one stone since I needed to provide an instruction sheet for prospective users. Creating the sign up option is simple in and of itself. The part that required a lot of thought was trying to make the signup process as easy as possible.
I don’t charge more than $5 for any of my tournaments and saw no need to collect payment in advance but I wanted to validate the people who were signing up for my tournaments as opposed to popping up a text box for anyone to put any name into. I had a signup link for my email list at the bottom of each web page that fed into an email table. I modified my email list table into a user table and changed my email sign up link to a ‘Login’ link that I placed at the top of each web page.
When the user clicks the login link they can enter their email address and password, request a new password, or sign up for a user account. I thought about adding exotic features like challenge questions for a lost password or a username instead of the email address. After some reflection I came to the conclusion that I could add them later if the need arises. One scenario that could make me take this step would be if someone starts requesting new passwords for people by guessing their email accounts. I don’t think this will happen but it only takes one bad apple to spoil the barrel.
Once a user signs up or logs in, the login link is replaced by ‘Logout’ and ‘Edit Profile’ links. The ‘Edit Profile’ brings a user to an Edit Profile web page that looks similar to the ‘Signup’ page with the addition of a ‘Family Member’ list users can add, edit, or delete. It is a simple little function but it meets my purpose for connecting players to a user.
Not every tournament I have on my website will allow signups so my next step was to add a flag to my tournament table that lets the website know whether the tournament allows user entries and an additional table that assigns sections to each tournament. Then I had a number of changes to my tournament page. When a tournament has sections I display a link that allows any viewer to see who has signed up for the tournament and what sections they have signed up for. I didn’t want to reroute users to an entirely new web page so I show the participants in a pop up box that can be discarded in one click.
The final step was to enable a tournament sign up link. I only show the link when a user that has at least one family member is logged in, the tournament allows manual user entry, and the current date is before the tournament date. That last step sounds odd but if I’m having a tournament where I don’t have internet access I don’t want people signing up for a tournament online when I have no way of knowing about it. When the user clicks the link I do some SQL (Structured Query Language) to perform a ‘cross join’ between the tournament sections and the user’s family members and I have a nice popup with a check box for every possible combination of users and sections. To test my changes I created a test tournament, signed myself as a user on four separate accounts, added family members to each account, and started signing up for tournaments. I created an email module and sent the user an email whenever they save a tournament signup and sent myself emails whenever a user signed up, changed their profile, did anything with a family member, or signed up for a tournament. Not only will I know who signs up for a tournament but I will also be the first to know if anyone adds profanity laced family member names and signs them up for tournaments. Last week I added a ‘shutoff’ switch to all the users and family member records that would allow me to block anyone I deemed abusive from signing up for tournaments.

I ran tests from my computer using the production database. My tests were all successful and I promoted my changes to the production server that is hosted by GoDaddy over the July 4th weekend. I then repeated my tests and found that 10% of the emails would error out when using the GoDaddy email server.

The emails that errored out gave the very cryptic “Failure sending email” message with no further information. I changed the routine that sends emails to retry up to three times in case of failure. That fix worked out well enough but I realized that I had no way of knowing when an email errored out. That led me to my last change which was to log every email my website attempts to send into a database table and flag successful sends. For now I will check the table periodically and resend any emails that fail. If manually resending the emails turns out to be a too common occurrence I’ll write an automated program to resend failed emails or send duplicate emails in case I find emails that mysteriously get lost in the internet.
I expected to finish these changes by the end of July and I’ve finished three weeks early. My next project is to create a 21st century version of my basketball prediction program. I expect that to be an easier project than adding a tournament signup sheet because I will only have one user – myself.
I don’t charge more than $5 for any of my tournaments and saw no need to collect payment in advance but I wanted to validate the people who were signing up for my tournaments as opposed to popping up a text box for anyone to put any name into. I had a signup link for my email list at the bottom of each web page that fed into an email table. I modified my email list table into a user table and changed my email sign up link to a ‘Login’ link that I placed at the top of each web page.
When the user clicks the login link they can enter their email address and password, request a new password, or sign up for a user account. I thought about adding exotic features like challenge questions for a lost password or a username instead of the email address. After some reflection I came to the conclusion that I could add them later if the need arises. One scenario that could make me take this step would be if someone starts requesting new passwords for people by guessing their email accounts. I don’t think this will happen but it only takes one bad apple to spoil the barrel.
Once a user signs up or logs in, the login link is replaced by ‘Logout’ and ‘Edit Profile’ links. The ‘Edit Profile’ brings a user to an Edit Profile web page that looks similar to the ‘Signup’ page with the addition of a ‘Family Member’ list users can add, edit, or delete. It is a simple little function but it meets my purpose for connecting players to a user.
Not every tournament I have on my website will allow signups so my next step was to add a flag to my tournament table that lets the website know whether the tournament allows user entries and an additional table that assigns sections to each tournament. Then I had a number of changes to my tournament page. When a tournament has sections I display a link that allows any viewer to see who has signed up for the tournament and what sections they have signed up for. I didn’t want to reroute users to an entirely new web page so I show the participants in a pop up box that can be discarded in one click.
The final step was to enable a tournament sign up link. I only show the link when a user that has at least one family member is logged in, the tournament allows manual user entry, and the current date is before the tournament date. That last step sounds odd but if I’m having a tournament where I don’t have internet access I don’t want people signing up for a tournament online when I have no way of knowing about it. When the user clicks the link I do some SQL (Structured Query Language) to perform a ‘cross join’ between the tournament sections and the user’s family members and I have a nice popup with a check box for every possible combination of users and sections. To test my changes I created a test tournament, signed myself as a user on four separate accounts, added family members to each account, and started signing up for tournaments. I created an email module and sent the user an email whenever they save a tournament signup and sent myself emails whenever a user signed up, changed their profile, did anything with a family member, or signed up for a tournament. Not only will I know who signs up for a tournament but I will also be the first to know if anyone adds profanity laced family member names and signs them up for tournaments. Last week I added a ‘shutoff’ switch to all the users and family member records that would allow me to block anyone I deemed abusive from signing up for tournaments.

Tournaments that allow for user signup will have a 'Sign up for the tournament' link. Click on the link and a popup box will display each family member and each section. Check the appropriate box(es) to enter the tournament.

You can see who has signed up for a tournament (and verify your entry) by clicking the 'Tournament sign up list' link.
I expected to finish these changes by the end of July and I’ve finished three weeks early. My next project is to create a 21st century version of my basketball prediction program. I expect that to be an easier project than adding a tournament signup sheet because I will only have one user – myself.
Subscribe to:
Posts (Atom)






