Google Groups Captcha 404

December 8th, 2011

The other day I was reading a thread on google.groups and wanted to add the user to my Google+ circles as we work on a number of projects that are somewhat related. A search of his name came up with too many results to be helpful, so, I figured I would try searching by his email address.

I mistyped the first captcha:

Properly typed the second captcha:

and received a 404 page:

It is completely repeatable and I’ve tested it numerous times. You can of course go back to the original page, click the … and get a new captcha, but, make sure you solve it on the first try! Note that the topic is also set to “” on the 2nd captcha.

Now if only there was a place to report bugs on google.groups. A fifteen minute search of the sparse FAQ didn’t turn up anything.

Global Day of Coderetreat

December 4th, 2011

Yesterday I participated in the Global Day of Coderetreat. Coderetreat is an event inspired by Corey Haines who spent time traveling around the country teaching groups fundamentals of software development – asking for just enough money to make it to the next city, accommodations on someone’s couch, etc.

It is a one day, intensive. pairs programming exercise focused on Test Driven Development. CoderetreatMiami was organized by Tom Ordonez and Carlos Ordonez from Aeronautic Investments, Inc. and facilitated by Bryce Kerley and Michael Feathers.

After a brief intro, we were explained the rules for Conway’s Game of Life – basically, you have a matrix, and look through each live node. If the node has two or three neighbors, it lives, otherwise it dies. Then, you look at all of the dead nodes and if it has three living neighbors, it comes alive.

Then, we were told to choose a partner to pair with and start writing code. We chose python, wrote a quick library, some functions and did some test code to make sure our function was working as it should. We chose tuples stored in a list. After 40 minutes, we started working in unittesting when we were told that time was up, delete your code…

What? People were a little shocked. We just spent 45 minutes writing the code, delete it? Can’t save it, can’t work on it later, can’t save it to a repo, etc. Delete it.

rm -rf life/

After a few minute discussion, we’re told to pair up with another person – someone we haven’t paired with and do it again. This time I paired up with a Drupal/Javascript guy and we proceeded to write the game of life again. We didn’t get as far due to the fact that my Javascript coding isn’t as strong as my Python/Perl coding, but, we did have some tests written and had some functionality. Time’s up, delete your code. Again?!?

I then paired up with another person and we used Python. We changed our strategy a bit, decided to do a bounding box check for the alive portion to eliminate having to walk the large grid. Times up, delete your code.

We took a brief break followed by Michael Feathers showing us Test Driven Development in Ruby. Starting from an empty function with a test defined that showed him what his expected output should be. Run the test script, failure, fix this, test, failure, fix another bug, test, different results, still a failure, fix the code, test passed. Then we looked at a more detailed example of a (in his words) badly written Game of Life and he showed us a few iterations of the testing.

Time to pair up again and we’re off and running. Perl this time, however, additional condition, try to write it without IF statements. I’ve missed something because I can’t quite remember passing arrays of arrays and strings in Perl so I take a few minutes to write some test code to remember that @{$blah} gets me what I need and we’re off and running. Boolean and binary anding gets us pretty close to not needing ifs. We decide our test case code can have ifs, but not our game functions. Again, writing a test that has a few cells populated and writing the check_alive function, we get through that and start to write the check_dead routine and bam. Time’s up. Delete the code? Yes…

Another partner and this time it is PHP. While I am comfortable with PHP, we’re told, no two dimensional arrays. After some internal debate, we decide that using a transform on a one dimensional array is really just using a two dimensional array and we settle on some tricky column math and three loops to test the adjacent cells. After a bit of coding, we start writing some test functions to test check_alive, run into an Out of Bounds error because one of our test points is on the edge (a case which we talked about, but, didn’t code for), time’s up, delete the code.

On my last pairing, I am paired with someone I know. I’ve gotten the game working twice, he’s gotten it working once. He’s running a language called Processing which has a really simple IDE and ability to run the code, and, graphically display our matrix. Prior to this, all of our development has been testing code and looking at True/False tests or lists of strings to make sure they are equivalent, etc. We write our code really quickly but run into a problem with Processing’s storage of global arrays, so, we have to do a little trickery to swap arrays before the draw function. At the end of 45 minutes, we’re very close, it iterates once, goes to a blank screen, then displays the start screen again. We know it is something with the array copy (and Don ends up solving it later), 45 minutes is up… you can keep this code if you want to work on it.

Normally, they do one more session where you are paired up with your original partner to make a final attempt, but, we ran a little short on time. After a recap, we’re asked to stand up and give a brief Introduction, What we learned, What surprised us and What we’ll do differently in the future.

For me, I’ve often focused on unit tests well after the code has been written. While I don’t think I can easily change that on a number of projects, I think I will try some Test Driven Development for new code and some other projects.

All in all, it was a great experience. I met a lot of great people, learned some new coding techniques and learned a rather intriguing method of teaching. Pairs programming is good, but, for learning coding, iterating over the same problem six times in a rather intensive environment showed me other people’s thought processes in how they attacked the problem.

Many of the people looked at the problem in a much different way. One group used functional programming and maps, my first attempt used tuples and a list (and a second attempt as well which tried to solve the dead check by looking at the maximum bounding box rather than doing a complete traversal of the matrix). When we were asked to try it without if statements and in a one dimensional array, people’s thought processes changed as did the process when we couldn’t use a two dimensional array.

While there is always more than one way to solve a problem, seeing the different ways people approached the same problem, even after a number of iterations was intriguing.

Pictures from CoderetreatMiami.

Quite a fun event, highly recommended if you get the chance to attend one.

Python coding standards for imports

December 2nd, 2011

Recently I’ve been refactoring a lot of code and I’m seeing a few trends that I find easier to read.

With imports, I prefer putting each import on its own line. It takes up more screenspace, but, when looking at a commit diff, I can see what was added or removed much more easily than a string changed in the middle (though, more of the diff tools are showing inline differences).

However, what I started to do recently was do imports like:

from module import blah, \
                   blah2, \
                   blah3

I keep them in alphabetical order, but, I find that reading through that removes the ‘wall of text’ effect.

Original imports:

from module import blah
from module import blah2
from module import blah3

I find that the new method I’m using allows me to more easily see that two imports came from the same module.

Another possibility as mentioned by Chris McDonough is:

from module import (blah,
                    blah2,
                    blah3)

Two WordPress Plugins – cd34-social and cd34-header

November 23rd, 2011

I’ve uploaded two plugins that were written for this site.

The first one is cd34-social which uses Async Javascript to load the Google+, Twitter and Facebook social media buttons. Unlike most of the other plugins, this does use Async Javascript so the buttons will appear last, after the rest of the page has loaded. Since it is loaded Async, your page loading speed should be slightly improved.

The second plugin adds the OpenGraph meta tags for Facebook and the link rel/publisher tags for Google+. There is a settings dialog that allows you to set three fields that are user customized.

cd34-social: http://code.google.com/p/cd34-social/downloads/list or, through the WordPress.org plugin directory: cd34-social.

cd34-header: http://code.google.com/p/cd34-header/downloads/list or, through the WordPress.org plugin directory: cd34-header.

AT&T Local Phone Service woes

November 17th, 2011

Earlier last week I received a call that had a lot of static. Last Saturday morning I received a few phone calls in the morning, but, later calls started coming through to my mobile phone – busy/ring no-answer forwarding from the house line to my mobile.

That afternoon, I placed a Trouble Ticket with AT&T using their online system. Today, still no dialtone, line is dead at the Network Interface Jack. Attempted to check status yesterday, couldn’t figure out how, reopened a ticket, but, in Chrome, got to last step, told me that session timed out and I needed to reenter. Decided to try again this morning. Again, last step, Session timed out, reenter. Tried in Safari, Session timed out, reenter. The ‘reenter’ link points to a 404.

Called the phone number listed, went through their automated process, it told me there was no problem on the line and it must be my equipment. Went out to the box outside, unplugged the line at the Network Interface Jack again, tested again, left it unplugged. Called in again, it tells me that there is no problem, I must have a phone off the hook, would I like to schedule an $85 service call since I don’t have inside wire maintenance?

Hit 0 for about 2 minutes, kept getting tossed back to the troubleshooting instructions. Called back in, didn’t enter any prompts, got transferred to a person, he said they had no record of last Saturday’s ticket, but, online tickets often get lost. Saw that I entered one through the automated system, said that it would cost $85 to have someone come out. I said, I have the phone line unplugged at the Network Interface Jack, the problem is outside the house.

He said:

“Well, if that isn’t plugged in, you aren’t going to get a dialtone. Would you like us to schedule a call for $85?”

I thought using the automated system would be quicker. I tried to use their IVR system and it told me it wasn’t a fault on their side. I realize not everyone has 20+ years of telecom/datacom experience, but, I have to wonder if the pressure is to get the person to accept it as a billable call then to later sell inside wire maintenance as a way to defray the $85, i.e. sign up for the $4.95/month plan and we won’t bill you the $85, knowing that you’ll be a client for more than 17 months.

The first UX problem is dealing with their Web site. It is not easy to find how to place a trouble ticket for people that know what they need. It does have a lot of helpful information that you need to go through – all troubleshooting that I had already bypassed by checking the Network Interface Jack first. But, finding the link to actually place a ticket takes you to a page where you have to again tell it what type of service, put in the phone number, run through a number of screens where you’re able to enter 160 characters of text to describe the problem, then, if the process is successful I guess it creates a ticket. It is obvious while I was doing it that it did try to reset the line as the line-use indicator did blink a few times right after I entered the number.

But, what takes the cake is the IVR system. There was no way to schedule a ticket without accepting the $85 charge. It did run me through the same tests the online system prescribed, but, you couldn’t proceed without accepting the liability. Additionally, I could not give the phone number I was reporting as the trouble number. Even though the line had a hard fault, calls are transferred to my mobile automatically – allowing me to keep a single phone number to give out for people to contact me. I debated giving my Google Voice number, but, wanted to see how the system worked. The person I spoke to never asked for a contact number.

All in all, I think the customer service experience here from a web usability standpoint needs to be looked at. I tried two modern browsers, and did attempt to use Firefox while writing this and each one ends up with the same problem. I’d bet if I had Internet Explorer it would work.

Remember… customer metrics. Know what pages should be getting hit, know what your expected volumes are. And when you see abnormally low numbers, investigate.

Entries (RSS) and Comments (RSS).
Cluster host: li