The following tables are examples of how to record the performance stats into a spreadsheet. The hyphen represents a separation between sets. This is not required and can be omitted, but it does tend to help with data entry. It can also be helpful for extending this spreadsheet at a future date to drill down into individual set statistics.

Sample Stats Tabulation
Player Serve Attack Block Pass Dig Set
1 libero 333-3 321-223133 322323-02220
3 outside 201 24304-1244 041 322-0233 2330-1123
4 setter 32 4,10,7,11,12,6,10,9,11,12

Sample Calculations:
Player Serve Attack Block Pass Dig Set PER
1 libero 0.750 0.750 0.682 0.719
3 outside 0.250 0.667 0.417 0.750 0.625 0.608
4 setter 0.875 0.767 0.785
Team: 0.536 0.667 0.417 0.750 0.679 0.767 0.681

Sample Formulas:
Player Serve Attack Block Pass Dig Set PER
1 libero =CalcRating(I2) =CalcRating(J2) =CalcRating(K2) =CalcRating(L2, 1) =CalcRating(M2, 1) =CalcRating(N2, 2) =CalcPer(I2, 0, J2, 0, K2, 0, L2, 1, M2, 1, N2, 2)
3 outside =CalcRating(I3) =CalcRating(J3) =CalcRating(K3) =CalcRating(L3, 1) =CalcRating(M3, 1) =CalcRating(N3, 2) =CalcPer(I3, 0, J3, 0, K3, 0, L3, 1, M3, 1, N3, 2)
4 setter =CalcRating(I4) =CalcRating(J4) =CalcRating(K4) =CalcRating(L4, 1) =CalcRating(M4, 1) =CalcRating(N4, 2) =CalcPer(I4, 0, J4, 0, K4, 0, L4, 1, M4, 1, N4, 2)
Team: =CalcRating(I2:I4) =CalcRating(J2:J4) =CalcRating(K2:K4) =CalcRating(L2:L4, 1) =CalcRating(M2:M4, 1) =CalcRating(N2:N4, 2) =CalcPer(I2:I5, 0, J2:J5, 0, K2:K5, 0, L2:L5, 1, M2:M5, 1, N2:N5, 2)

Here is a Demo spreadsheet on Google Docs.

The following is the source code for the CalcRating() and CalcPer() functions used in the Google spreadsheet. You can add this code via the menu: Tools -> Script Editor

Google Apps Script
var maxRating = 4;

function _calcRating(data, ratings, skillType) {
  if (skillType == 2) {
    ratings = ratings.replace("-", ",");
    ratings = ratings.split(',');
  }

  for (var i=0, len=ratings.length; i<len; i++) {
    ch = ratings[i];
   
    // Ignore non-numeric values such as '-'
    if (ch != parseInt(ch)) {
      continue;
    }

    rat = parseInt(ch);

    // Convert to (0-4) point scale
    if (skillType == 1) {
      // There is no 2 in Pass and Dig
      if (rat == 2 || rat == 3) {
        rat++;
      }
    } else if (skillType == 2) {
      // (0-12) becomes (0-4)
      rat /= 3.0;
    }

    data.cnt++;
    data.tot += rat;
  }
 
  data.rating = (data.tot / data.cnt / maxRating);
 
  return data;
}

function _disp(data) {
  if (data.cnt == 0) {
    return ' ';
  }

  //return '.' + Math.round(data.rating * 1000) + ':' + data.cnt;
  return data.rating;
}

function CalcRating(range, skillType) {
  var data = {
     tot: 0
    ,cnt: 0
  };

  var ratings = '';
   // if this is a range list (J2:J13)
  if (typeof range[0] == "object") {
    // Build string of all ratings for this skill
    for (var i=0, len=range.length; i<len; i++) {
      ratings += range[i][0] + ',';
    }
  } else {
    // A single ratings cell (J2)
    ratings = range;
  }
  data = _calcRating(data, ratings, skillType);
 
  return _disp(data);
}

function CalcPer() {
  var data = {
     tot: 0
    ,cnt: 0
  };
 
  // Loop over argument list
  for (var i=0, len=CalcPer.arguments.length; i<len; i+=2) {
    range = CalcPer.arguments[i];
    skillType = CalcPer.arguments[i+1]

    var ratings = '';
    // if this is a range list (J2:J13)
    if (typeof range[0] == "object") {
      // Build string of all ratings for this skill
      for (var k=0, len2=range.length; k<len2; k++) {
        ratings += range[k][0] + ',';
      }
    } else {
      // A single ratings cell (J2)
      ratings = range;
    }

    data = _calcRating(data, ratings, skillType);
  }
 
  return _disp(data);
}

The following is the source code for the CalcRating() and CalcPer() functions used in the Microsoft Excel version. You can add this module by pressing Alt-F11 to bring up the Microsoft Visual Basic Editor. Select Insert -> Module and paste in this code.

Microsoft Excel
Function xCalcRating(tot As Double, cnt As Integer, ratings As String, skillType As Integer)
    If Len(ratings) = 0 Then
        Exit Function
    End If
   
    Dim ratingsList() As String
    Dim rat As Double
   
    If skillType = 2 Then
        ratingsList = Split(ratings, ",")
    Else
        ReDim ratingsList(1 To Len(ratings))
        For i = 1 To Len(ratings)
            ratingsList(i) = Mid(ratings, i, 1)
        Next i
    End If
   
    For Each v In ratingsList
        If IsNumeric(v) Then
            rat = Val(v)
            If skillType = 1 Then
                If rat = 2 Or rat = 3 Then
                    rat = rat + 1
                End If
            End If
            If skillType = 2 Then
                rat = rat / 3
            End If
   
            cnt = cnt + 1
            tot = tot + rat
        End If
    Next
End Function

Function xDisp(tot As Double, cnt As Integer)
    If cnt = 0 Then
        xDisp = ""
        Exit Function
    End If

    'xDisp = Str(Math.Round(tot / cnt / 4 * 1000)) & ":" & cnt
    xDisp = tot / cnt / 4
End Function

Function CalcRating(range As range, Optional skillType As Integer)
    Dim ratings As String
    Dim tot As Double, cnt As Integer, rat As Integer
    Dim res As Variant

    tot = 0
    cnt = 0
   
    For i = 1 To range.Rows.Count
        ratings = range(i, 1)
        res = xCalcRating(tot, cnt, ratings, skillType)
    Next i
   
    CalcRating = xDisp(tot, cnt)
End Function

Function CalcPer(ParamArray arguments() As Variant)
    Dim tot As Double, cnt As Integer
    Dim res As Variant
    Dim ratings As String
   
    tot = 0
    cnt = 0
       
    For i = LBound(arguments) To UBound(arguments)
        ratings = ""
        For k = 1 To arguments(i).Rows.Count
            ratings = ratings & arguments(i)(k, 1) & ","
        Next k

        res = xCalcRating(tot, cnt, ratings, Val(arguments(i + 1)))

        i = i + 1
    Next i
   
    CalcPer = xDisp(tot, cnt)
End Function
 
Does your corporate IT security team block outbound smtp ports (25, 465, 587) but allow 993 traffic?

REALLY?


i take your email


Let us sidestep this silly “security” meme. I am using gmail here because I trust their ability to timely deliver email on a consistent basis. Side note: email is supposed to be easy you fool!

Do you have outbound port 22 SSH access to another server? If not, that is the topic of another post!

The following works on Mac and Linux boxen. A slight modification will be needed for that other OS.

First you need to add the following line to your /etc/hosts file:

#127.0.0.1 smtp.gmail.com

Now the good stuff. Add this to ~/bin/gmail_tunnel.sh and chmod +x ~/bin/gmail_tunnel.sh

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
    echo "You must run as root" >&2
    exit 1
fi

clear
cat <<'EOF'
                                         ,,    ,,  
  .g8"""bgd                              db  `7MM  
.dP'     `M                                    MM  
dM'       ` `7MMpMMMb.pMMMb.   ,6"Yb.  `7MM    MM  
MM            MM    MM    MM  8)   MM    MM    MM  
MM.    `7MMF' MM    MM    MM   ,pm9MM    MM    MM  
`Mb.     MM   MM    MM    MM  8M   MM    MM    MM  
  `"bmmmdPY .JMML  JMML  JMML.`Moo9^Yo..JMML..JMML.

EOF


echo "Enabling hosts hack..."
sed -ie 's/^\#127\.0\.0\.1 smtp\.gmail\.com/127\.0\.0\.1 smtp\.gmail\.com/' /etc/hosts

echo "Enabling tunnel..."
ssh -c arcfour -L 25:smtp.gmail.com:25 \
 -L 465:smtp.gmail.com:465 \
 -L 587:smtp.gmail.com:587 external-server -N

echo "Removing hosts hack..."
sed -ie 's/^127\.0\.0\.1 smtp\.gmail\.com/\#127\.0\.0\.1 smtp\.gmail\.com/' /etc/hosts

More from the “Really?” series to come…

 

ViPER

The system we use at Concordia University Texas is based closely on Jim Coleman’s research and the computer system created by Rod Schall. We rate passing and digs on a (0-3) point scale to make the objective recording much easier. During pass and dig calculations the stats are adjusted to the (0-4) point scale by changing the 3′s to 4′s and the 2′s to 3′s… thus removing all 2′s. This is done to balance all skills on a 4 point scale and to enable the composite PER statistic to be valid. This is our rating system:

Serve, Attack,
and Block
Pass & Dig
Ace, kill, or stuff block40
Return or free ball31
1 or 2 hitters (limited offense)22
3 hitters (multiple offense)13
Error – loss of point0-

You may notice that a statistical measurement for setting is missing in our system. The measurement of this skill has been studied extensively with various methods available, all of which are very difficult to efficiently assess. The two things valued most about a setter is their ability to turn a bad pass into a great set, and to make the best decisions on who to set based on who is terminating the ball. What is most important is the ability for the setter to generate points.

Alexis Lebedew with the Australian Institute of Sport writes a paper titled A Reconceptualisation of Traditional Volleyball Statistics to Provide a Coaching Tool for Setting. He describes a method to grade setting on a (0-12) point scale that takes into consideration the quality of the pass and the result of the attack. This system can be used on top of any rating system used for passing and attacks. This is our adapted rating matrix for setting:

Attack Pass Set Rate
Excellent 4 1 12
4 2 11
4 3 10
Good 3 1 9
3 2 8
3 3 7
Average 2 1 6
2 2 5
2 3 4
Poor 1 1 3
1 2 2
1 3 1
Attack Error 0 1 0
0 2 0
0 3 0
Error - - 0

Now we have an objective rating system for all 6 skills. We refer to this system as ViPER which stands for Volleyball Player Efficiency Rating. Now comes the task of recording the ratings. This can be done live during a match on a simple spreadsheet or after by watching a video recording. Taking stats live during a match can pose to be a difficult problem if you try to record too many skills at a time; breaking the assignments up into groups make it easier to record. One person can take pass and dig stats while another person records serve, attack, and blocks. Setting is a combination of attack and pass, so some form of communication will have to take place to record those values. A single person will have a problem recording both pass/dig and attacks…that is unless you are Russ Rose.

The following are two example charts used for tabulation. You can create these in a spreadsheet application or draw them on notebook paper. Remember to leave enough room to keep stats for up to five sets. This can easily be done by allowing for two rows of written stats per player. Just remember after every set to put in a dash in every column to distinguish between them. Subdividing them is not absolutely necessary, but it helps in recording the values into the final spreadsheet for calculation.

Sample Charts for Tabulation
Player Serve Attack Block
    
    
    
    
Player Pass Dig Set
    
    
    
    

In Part 3 I will explain our methods for calculating Player Efficiency Ratings for each of the 6 volleyball skills. On top of the six rating percentages, you will have a composite PER rating for each player that will generalize their contributions to the team. You can compare this value to the team PER rating to determine who is helping and hurting your team’s performance.

 

Statistics: a formal science that applies numerical data to a group of individuals or experiments. Volleyball, like many other sports, has a severe disconnect between media stats and the actual performance level of the players in the game. As coaches we must find a way to bridge this gap if we want to effectively measure our players skills and help them stay focused to achieve their goals. Box scores alone will not give you the empirical information you need to measure the output from your players.

Jim Coleman is credited with the invention of the modern volleyball statistics system. His final contribution “Scouting Opponents and Evaluating Team Performance” in The Volleyball Coaching Bible describes in detail his system of measuring the performance of individual volleyball skills. His methods have been proven to work by coaches at all levels. Case in point, Penn State who has won the last three (’07 – ’09) NCAA Division I championships. How did they do it? Talent and a coach (Russ Rose) who lives by statistics.

Russ Rose attended George Williams College in Downers Grove, IL, with the intentions of becoming a basketball coach. He took two courses, Volleyball I taught by Jim Coleman and Volleyball II taught by Terry Liskveych, and proceeded to play three years on the men’s volleyball team who won the NAIA national championship in 1974. Rose became immersed with volleyball writing his master’s thesis at Nebraska on volleyball statistics. Now he spends his time on the bench charting performance ratings for his players during a match. He focuses mainly on his teams primary contacts and transition plays while his assistants chart the opponents. He may also have someone chart points by rotation with another person working the Data Volley computer statistics program. With these rigorous statistical methods he knows everything about his players.

Rod Schall learned these statistics methods from Jim Coleman early in his career and began development on the first computer program to chart live statistics. After writing an article on “Volleyball Statistics” in 1976 he was contacted by Doug Beal to chart live stats for the USA men’s national team using this program. Sportistics is still used today by schools at various levels. Rod Schall received the 2010 USA Volleyball Medallion of Merit for his contributions.

The system of rating the performance of players in various skills works by assigning a numerical value to the result of a particular skill. The scale most known by volleyball coaches and players is the one for passing which assigns a 3 to mean three hitters available, 2 for two hitters, 1 for one hitter, and 0 for an ace or missed pass. For these statistics to be valid there must be a direct correlation between the skill rating and the probability of scoring a point. The difference in probability of scoring a point when one or two attackers are available is statistically insignificant. With this in mind, Sportistics uses a (0-4) point scale to rate passing with a 3 representing either one or two hitters available:

Pass (Sportistics)
0= when the opponent scores a point on serving.
1= when the pass is only good enough to return a free ball.
2(There is no 2)
3= when there is a limited attack advantage.
4= ideal for multiple attack advantage.

The sportistics comprehensive system apples a similar (0-4) scale to all six volleyball skills including serve, pass, set, attack, block, and dig. Since all skills are based on the same rating scale, a composite value can be computed based on all six skills that generalizes a players overall contribution to the team. A sort of PER (Player Efficiency Rating) which is used in basketball that combines a player’s contributions into one number with Michael Jordan at the top of the list.

What is missing is an easy method to record and calculate Volleyball Player Efficiency Ratings. In this three part series I will describe the methods we use at Concordia University Texas to record skill based performance statistics and a simple spreadsheet you can use for your calculations.

 

This is an introduction into a basic Comet setup with Nginx and jQuery. You will have to recompile Nginx with NGiNX_HTTP_Push_Module to enable the HTTP Push/Comet functionality. “NHPM” is based on the Basic HTTP Push Relay Protocol and turns Nginx into a very efficient Comet server. This simple recipe will enable you to create live asynchronous web applications utilizing long polling without the complexity of the Bayeux protocol.

First you will need to recompile Nginx with NHPM. If you run into dependency problems please review the Nginx Install Options.

Compiling Nginx with Nginx_HTTP_Push_Module:
NGINX_PUSH_NAME=nginx_http_push_module-0.692
NGINX_NAME=nginx-0.7.67

cd /usr/local/src/archive
wget http://pushmodule.slact.net/downloads/$NGINX_PUSH_NAME.tar.gz
wget http://nginx.org/download/$NGINX_NAME.tar.gz
cd ..
tar zxvf archive/$NGINX_PUSH_NAME.tar.gz
tar zxvf archive/$NGINX_NAME.tar.gz
cd $NGINX_NAME
./configure --prefix=/usr/local/$NGINX_NAME \
--add-module=/usr/local/src/$NGINX_PUSH_NAME
make
sudo make install

Next we will configure a virtual host in Nginx to enable our publisher and subscriber on a single channel called “cheetah”. This configuration allows the queue to hold up to 10 items, and those items will timeout after 5 seconds.

Configuration: (/usr/local/nginx-0.7.67/conf/nginx.conf)
server {
    listen  81;
    server_name cheetah.example.com;

    root /var/www/cheetah.example.com;

    location /cheetah {
        push_channel_group pushmodule_cheetah;
        location /cheetah/pub {
            set $push_channel_id cheetah;
            push_publisher;
            push_message_timeout 5s;        # Give the clients time
            push_message_buffer_length 10;  # to catch up
        }
        location /cheetah/sub {
            set $push_channel_id cheetah;
            push_subscriber;
            send_timeout 3600;
        }
    }
}
Start nginx:
sudo /usr/local/nginx-0.7.67/sbin/nginx

Here is the code for the subscriber that will listen for incoming messages and simply display them. Notice the the use of “If-None-Match” and “If-Modified-Since”. These headers are used to traverse the messages in the queue. The ETAG header is used to uniquely identify messages with the same modification time.

Listen.html: (/var/www/cheetah.example.com/listen.html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Listen</title>
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
        /* <![CDATA[ */
   google.load("jquery", "1.4.2");

   function listen(last_modified, etag) {
       $.ajax({
           'beforeSend': function(xhr) {
               xhr.setRequestHeader("If-None-Match", etag);
               xhr.setRequestHeader("If-Modified-Since", last_modified);
           },
           url: '/cheetah/sub',
           dataType: 'text',
           type: 'get',
           cache: 'false',
           success: function(data, textStatus, xhr) {
               etag = xhr.getResponseHeader('Etag');
               last_modified = xhr.getResponseHeader('Last-Modified');

               div = $('<div class="msg">').text(data);
               info = $('<div class="info">').text('Last-Modified: ' + last_modified + ' | Etag: ' + etag);

               $('#data').prepend(div);
               $('#data').prepend(info);

               /* Start the next long poll. */
               listen(last_modified, etag);
           },
           error: function(xhr, textStatus, errorThrown) {
               $('#data').prepend(textStatus + ' | ' + errorThrown);
           }
       });
   };

   google.setOnLoadCallback(function() {
       /* Start the first long poll. */
       /* setTimeout is required to let the browser know
          the page is finished loading. */

       setTimeout(function() {
           listen('Thu, 1 Jan 1970 00:00:00 GMT', '0');
       }, 500);
   });
        /* ]]> */
        </script>
        <style type="text/css">
            #data {
                margin: .5em;
            }

            #data .info {
                font-weight: bold;
                font-size: 14px;
            }

            #data .msg {
                white-space: pre;
                font-family: courier;
                font-size: 14px;
                margin-bottom: .5em;
                margin-left: .5em;
            }
        </style>
    </head>
    <body>
        <div id="data"></div>
    </body>
</html>

This is the publisher that will put messages into the queue.

Send.html: (/var/www/cheetah.example.com/send.html)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>Send</title>
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
        /* <![CDATA[ */
    google.load("jquery", "1.4.2");

    function showResult(status, response) {
        $('#result').html('<strong>status:</strong> ' + status +
        '<br /><strong>response:</strong><br />' + response);
    };
 
    google.setOnLoadCallback(function() {
        $('#pub').submit(function() {
            message = $('#message').val();
       
            /* Do not send empty message */
            if (message == '') {
                return false;
            }
       
            $.ajax({
                url: '/cheetah/pub',
                data: message,
                dataType: 'text',
                type: 'post',
                success: function(responseText, textStatus, xhr) {
                    showResult(textStatus, responseText);
                },
                error: function(xhr, textStatus, errorThrown) {
                    showResult(textStatus, errorThrown);
                }
            });
            return false;
        });
    });
        /* ]]> */
        </script>

    </head>
    <body>
        <form id="pub" method="post" action="/cheetah/pub">
            <input type="text" class="message" name="message" id="message" />
            <input class="submit" type="submit" value="send" />
        </form>
        <div id="result"></div></div>
    </body>
</html>
Example Screenshots:

(http://cheetah.example.com:81/send.html) Comet Send Screenshot (http://cheetah.example.com:81/listen.html) Comet Listen Screenshot

Other Methods:

PHP Publish
$ch = curl_init('http://cheetah.example.com:81/cheetah/pub');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "Hello World!");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch);
curl_close($ch);
Bash Publish
curl -d 'Hello World' http://cheetah.example.com:81/cheetah/pub

Update:

Here is a working example:
http://cheetah.jamieisaacs.com

 

How long does it take to backup/restore a MySQL database?

This is a common question I used to ask myself at least once a month. It would always be crunch time, and a database table needed to be copied to another server. This is an easy task when the table only has 100 rows… but of course the one in question is 12GB on disk. How do we measure this? How long will this take?

Again I use pipe viewer to answer this. Lets go over a basic example working with a full database including all the tables. The raw InnoDB and MyISAM data files consume 1.3GB. We will assume the most basic mysqldump command ignoring triggers and routines. The task at hand is to perform a backup, and to reload from this backup all while giving good estimates on the time required.

First, we need the initial backup size. This means we have to perform a full backup without knowing how long it will take.

$ time mysqldump -h dbserver database > db.sql
 
real    0m21.370s
user    0m13.107s
sys     0m5.603s

[user@server ~]$ ls -lh db.sql
-rw-rw-r-- 1 user user 882M Jan 17 14:35 db.sql

Already we can see this backup took 21 seconds and uses 882MB. The problem is that we did not know anything while the backup was taking place. Now that we know the backup size we can use this value in pipe viewer.

Here is the example again using pipe viewer to estimate the backup size…

[user@server ~]$ mysqldump -h dbserver database | pv -s 882M > db.sql
 881MB 0:00:19 [45.3MB/s] [=========================> ] 99%

Notice this does not reach 100%. Lets fix this by using the actual byte size..

[user@server ~]$ ls -l db.sql
-rw-rw-r-- 1 user user 924259742 Jan 17 15:31 db.sql
[user@server ~]$ mysqldump -h dbserver database | pv -s 924259742 > db.sql
 881MB 0:00:17 [  49MB/s] [=================================>] 100%

Score! If we know the end size of a backup, we can estimate how long it will take. In this case it took 17 seconds.

Now lets restore from this backup. This time I will show you an example of the progress bar early in the process showing a percentage complete and an estimated time to completion of 4 minutes and 12 seconds to go.

[user@server ~]$ pv db.sql | mysql -h dbserver database2
 136MB 0:00:46 [2.85MB/s] [===>                        ] 15% ETA 0:04:12
 881MB 0:06:12 [2.37MB/s] [===========================>] 100%

Notice that we do not need to put in the size of the backup to get an accurate estimate. Here pipe viewer works like the cat utility to send the contents to stdout and into the mysql command to execute the statements. We always knew that reloading a MySQL database is slower due to calculating indexes and other I/O nonsense. Now we can start a copy or restore and know the progress and an estimated time to completion. Finally!

 

How fast is your network?

So you have that new gigabit switch and think you are going to achieve 1 Gbps? We all know that you are not going to get 100% throughput due to limitations I will not go into. There could also be a 10/100 patch panel involved that is not rated for gigabit… but, I digress. I use pipe viewer and netcat to answer this question. To start you will need to install both of these programs and open an available port on the server firewall. I used tcp port 2222 in this example. First, this command will wait for the client to connect.

[user@server ~]$ nc -l 2222 > /dev/null

Next, this command will tell you the speed in MB/s after a couple of seconds.

[user@client ~]$ pv /dev/zero | nc server 2222
 <strong>1.09GB 0:00:10 [ 113MB/s] [     <=>        ]</strong>

Now we do some math and get this value (I like to use google for this):

113 (megabytes / second) = 904 Mbps

Roughly 90% throughput on a gigabit switch isn’t too shabby! I did some more testing and have seen variances from 480 Mbps (60 MB/s) up to 912 Mbps (114 MB/s).

So the question still remains…  How fast is your network?

 

Here is some footage of the AVP tournament in Houston. Ticket prices were $20 per day, and due to the rain late Saturday we got in free on Sunday. I’m positive if they would have priced tickets at $10 per day, the turnout would have been greater. The product tents had t-shirts and other items priced at $20 – $25 each, and I watched as tons of people walked in and out of that area without purchasing anything. Other than the overpriced nonsense, the venue at the Westside Tennis Center was great! I really hope they decide to come to Austin, TX next year.

I got Hans Stolfus getting a nice dome shot off Dalhausser, and Casey Jennings decided to kick the ball into my camera in their match. During the semifinal match, Jake Gibb tried to rip down the net and got a yellow card twice. Be sure to watch these in 720p by clicking on the YouTube HD button!


#3 Mayer/Nygaard vs. #6 Fuerbringer/Jennings

Final: 21-19, 21-17 (0:53)


#1 Dalhausser/Rogers vs. #8 Medel/Stolfus

Clips:


#6 Akers/Turner vs. #9 Mason/More

Final: 21-15, 21-17 (0:44)


#4 Hyden/Scott vs. #2 Gibb/Rosenthal

Final: 21-14, 21-18 (0:46)


AVP Houston 09: #2 Kessy/Ross vs. #1 Branagh/Youngs

Final: 21-17, 18-21, 15-12 (1:15)

© 2011 Coach J Suffusion theme by Sayontan Sinha