First Rejection of My iPhone App :-(

I submitted my first iPhone app, called GV Places, to the Apple App Store on Monday, May 23. On Friday, May 27, around 9:00 in the morning, it entered the review process. About ten hours later I received the first rejection notice. The reason? I didn’t provide them a demo account to use for testing. I didn’t provide one, because of what my app does.

My app works with Google Voice, so you need a Google Voice account to use it. That’s not something I can just create willy-nilly and provide them for testing. Yes, I could create another account, but to really use it, you have to assign some phones to it, and to do that, Google Voice calls them to verify that they are yours. So I would need to use my own phone lines to set it up. I don’t think I should have to do that. I assumed that the tester would have his own Google Voice account to test with. Just like I would assume that if they test a Facebook app, they use their own Facebook accounts. I said as much in my response to them. I suppose we’ll see what they say.

It was sort of amusing that in the rejection email it said they weren’t able to test “all of the features” without a demo account. That’s funny because you can test any of the features without a Google Voice account.

O Sears, You Disappoint Me

I just got a cold call from Sears saying that the warranty on my refrigerator is about to expire, and asking me if I wanted to extend it for three more years. I listened to all the things this warranty covers, even though we haven’t had to use the warranty we already had. Then the price: $227.98 for three more years.

I would never make a decision about that much money on the spot, nor would I give out my credit card information to someone who calls out of the blue, claiming to be Sears. So I asked for a number I could call back, once I’ve considered the matter. She got a little cagey, but she gave me the number for customer service. Then she slipped this in, “But I can’t guarantee the price.”

I inquired as to what she meant, and she said, “Well, this is a discounted price, and I can’t guarantee that they will give you the same price.” Ah. I see. It’s the old, “Act now, or we’ll never offer you this price again!” tactic that so many sleazy companies use. My grandfather worked for Sears for 25 years, retiring in 1976. He would be appalled at this. I have to say, it’s very disappointing.

Only Three Days Until the “Rapture”…

In case you’ve been living under a rock and haven’t heard, the end of the world begins this Saturday, May 21 at or about 6:00 PM. According to Harold Camping, the resident genius cum prophet at WeCanKnow.com, May 21 is exactly 7,000 years after “Noah’s flood,” and is therefore the day that Christ will return.

According to this news report about a bunch of religious nutbags getting together to wear tacky t-shirts and wail and gnash their teeth about the end of the world, only 200 million Christians will be saved. The other nearly-7-billion people in the world will perish, with wailing and gnashing of teeth. Well, not immediately. The day will begin with “a worldwide earthquake, such as man has never seen,” with death and destruction the order of the day. Then those lucky 200 million will be rescued. The rest will suffer and die until October 21, when a “fireball” will destroy the Earth entirely, putting an end to all that annoying wailing and gnashing of teeth.

So, if you’d like to know what our days will be like after Saturday, be sure to pick up a copy of the pretty-much-unreadable Left Behind series which, I’m told, paints a detailed picture of post-rapture living. (Seriously, I tried to read Left Behind several years ago, because I had several friends say to me, “O! You must read it!” and “O! It’s so detailed!” and “O! It’s so horrifying!” I tried. Really, I did. I made it almost 100 pages into it before I was on the brink of spilling state secrets to the Communists. It was that bad. The characters were 1-dimensional, and I just didn’t give a damn what happened to any of them.)

So, mark your calendars for this Saturday. If you’re still around on Sunday, you’ll know you weren’t one of those who were really “saved.”

Courtesy, In the Midst of War

I’m reading a book called Tybee Island: The Long Branch of the South, by Robert A. Ciucevich, because my wife’s cousin and her husband have a house on Tybee, and we just got back from a lovely beach trip.  This morning I came across something that gave me a chuckle, and I thought I’d share it.

In April of 1862, the Confederate army was shoring up Fort Pulaski to keep the Savannah river open and to repel any river-borne assaults on Savannah. About a mile farther down the mouth of the river, known as Tybee Roads, lies Tybee Island. Here, the Union army was building batteries with which to assault Pulaski. They were also building batteries behind Pulaski, including the introduction of new, and mostly untested, “rifled guns.”

Early on April 10, 1862, the commander of the Union army at Tybee, General David Hunter, dispatched a letter to the commanding officer of Fort Pulaski, Charles Olmstead, demanding his immediate surrender. Here is the text of that letter. Notice how the decorum of the time required it to be so utterly polite.

To the Commanding Officer, Fort Pulaski:

Sir: I hereby demand of you the immediate surrender and restoration of Fort Pulaski to the authority and possession of the United States. This demand is made with a view to avoiding, if possible, the effusion of blood which must result from the bombardment and attack now in readiness to be opened. The number, caliber, and completeness of the batteries surrounding you leave no doubt as to what must result in case of your refusal, and as the defense, however obstinate, must succumb to the assailing force at my disposal, it is hoped that you may see fit to avert the useless waste of life. This communication will be carried to you under a flag of truce by Lieut. J. H. Wilson, United States Army, who is authorized to wait any period not exceeding thirty minutes from delivery for your answer.

I have the honor to be, Sir, very respectfully your most obedient servant,

David Hunter Maj-Gen. Com’g

There’s no record of how close to the thirty minute deadline Olmstead made Wilson wait, but here is Olmstead’s reply:

To Maj-Gen. David Hunter, Commanding on Tybee Island.

Sir: I have to acknowledge receipt of your communication of this date, demanding the unconditional surrender of Fort Pulaski. In reply, I can only say that I am here to defend the Fort, not to surrender it.

I have the honor to be, very respectfully, your obedient Servant,

Chas H. Olmstead, Col. 1st Vol. Regt. Of Georgia, Com’g Post

Shelling began at 8:10 AM. At 2:00 PM the following day, unable to withstand the devastating damage done by the “rifled guns,” Olmstead had no choice but to surrender the fort.

What I thought was particularly interesting about these letter is that while they were pointed and deadly serious, they were coated in 19th Century manners. Compare that to General Anthony McAuliffe‘s response in WWII, when a German commander demanded that US forces surrender the town of Bastogne: “NUTS!

Review: Still Waters Restaurant

My friends Tim and Meg told me about a new place in Grayson called Still Waters Restaurant which had, they said, “pretty good bar-b-que.” I decided I needed to check it out, so my wife, Tammy, and I went on Friday night.

For those in the Grayson area, it’s in what used to be the Grayson House restaurant. Parking is in the rear, and as we parked, I was delighted to see a smoker, with smoke billowing out of it. That is a very good sign when you go for BBQ. The smell of the smoke was wonderful, and that smell continued into the house, as we entered the front door.

The restaurant bills itself as “A Chic Bar-b-que Joint,” but I’m not really sure what they are going for with that. The decor is mostly “old house” with various for-sale paintings by, I assume, local artists hanging on the walls. This is not to say that the decor is unappealing; I happen to really like old houses. I just don’t see anything particularly “chic” about it.

The menu is split into two parts: Bar-b-que, and everything else. The non-bar-b-que menu has steaks, fried grouper, grilled salmon, chicken, shrimp and some pasta dishes. There is also an appetizer that sounds heavenly, though we didn’t try it this time. It’s called a “Butty Roll” and this is its description

Smoked Tender Pulled Pork Wrapped in a Tortilla, Deep Fried Golden Brown and served with our Special BBQ Sauce

Oh, yeah. That sounds delicious. Next time, I will have you.

We were there for Q, so we went to the second section of the menu. They have smoked beef brisket (my favorite), pulled pork (my wife’s favorite), ribs, chicken, smoked turkey and house-made sausages. I wish they had a sampler platter, or a “build your own” type of thing, because I would have loved to get some brisket, pork and sausages. Alas, they did not. Tammy got the pulled pork, and I got the brisket. Each comes with two sides; she got potato salad and Brunswick stew, and I got fries and BBQ beans. The price for hers was #13, and for mine was $15.

The food came out pretty quickly, and was absolutely delicious. The only complaints we had were the Brunswick stew had far too much sweet BBQ sauce in it, and was nearly inedible, and that the fries were obviously frozen instead of house-made. Everything else was wonderful. The beans were a perfect balance between BBQ sauce and beans. The brisket was tender and moist, and had the smoke deep into the meat. Tammy’s pulled pork was heavily smoked, juicy and delicious. She also said the potato salad was very good. They have two sauces to choose from; sweet and spicy. I only ate the spicy, but I thought it was a nice spicy sauce, with a bit of a kick, but not mouth-scorching. Tammy said the sweet sauce was good, too.

When they first brought our food out, we were both a bit disappointed at how much was on our plates. But after we finished, we both agreed that the portions were just right; it was the prices that were wrong. For $15, I got three strips of brisket (two of which had significant fat I had to cut off), a decent portion of fries, and a coffee cup (really) of beans. For what I got, I think somewhere in the $10 – $12 range would have been more appropriate. Tammy got a sandwich-sized portion of pork, a large-spoon portion of potato salad and a coffee cup of stew. This really was more of an $8 – $10 meal, instead of the $13 they are charging. Both also came with a piece of Texas toast that had been toasted on the smoker with the smoke flavor deep into it. I do wish they had put a bit of butter on them, because they were a bit dry. The clearly frozen fries also bothered me, given the prices. For that kind of money, I expect house-made fries. It’s not that hard to make them, and they make the meal that much better.

Their dessert menu includes cheesecake, Key lime pie, Oreo cheesecake and something that sounded so good, we just had to try it: Fried Pound Cake. Here’s the description from the menu

Our version of strawberry shortcake, sautéed in butter to golden brown, and served warm with ice cream and strawberry sauce topping

What came out on the plate was an entire segment from a bundt cake pan, probably 4″ x 3″ x 2″; it was a big piece of cake. There was a scoop of vanilla ice cream on the side, a few strawberries, and a drizzle of strawberry sauce on the cake. Was it good? To quote a friend of ours, it “was so good, you want to slap your momma!” And it was. The cake itself was moist and tasty, but where the butter had soaked into it was a little slice of heaven. It was $8, but I would say that was actually a fair price, given how big the piece was, and how unbelievably good it was. The vanilla ice cream was just standard, but it was fine. This dish alone is reason to eat here again.

We left full and happy, both agreeing that we would come back. I do hope they will adjust their prices down to more accurately reflect the portion sizes. For flavor, I’d give them 4.5 stars out of 5 (I take off a half for the stew). Price-wise, it’s more of a 3.

GVoice: An Open Source Objective-C Google Voice Library

05/12/2011 Note: I failed to mention that the library, as it currently stands, builds for iOS only. I’m sure it could be rejiggered to work with OSX, because I don’t think I used any iOS specific features. All the project files would need to be changed, and I’m not sure what’s involved with that.

I am please to announce my free and open source Objective-C library for working with Google Voice. It’s called GVoice and you can find it here. It’s BSD licensed, which means you can use it for anything you want, both commercial and free/opensource.

It’s quite easy to use, and this example should help:

[objc]
// USERNAME, PASSWORD, SOURCE and ACCOUNT_TYPE should be replaced with proper
// values.
self.voice = [[GVoice alloc] initWithUser: USERNAME password: PASSWORD source: SOURCE
accountType: ACCOUNT_TYPE];

// This causes some logging to happen.
self.voice.logToConsole = YES;

BOOL res = [self.voice login];

if (!res) {
// error handling
}

// Assuming you have a phone whose id is 23, this would cause Google Voice
// to route calls to it.
res = [self.voice enablePhone: 23]

if (!res) {
// error handling
}

// Send an SMS. Replace TEXT_PHONE_NUMBER with a proper 10-digit phone number
// capable of receiving SMS messages
res = [self.voice sendSmsText: @"Testing 1, 2, 3" toNumber: TEXT_PHONE_NUMBER];

if (!res) {
// error handling
}
[/objc]

On line 3, we create an instance of GVoice, passing in the email address and password from the user. The third field, source, is a field required by Google to identify where the connection is coming from. It’s free-form, but they suggest a reverse_domain_name-app-version approach, , something like com.joeygibson-GVTest-1.0, for example. The fourth parameter is what sort of account you’re trying to connect to, and there are two choices: GOOGLE and HOSTED. (This is an enum that also has a value of HOSTED_OR_GOOGLE, but I would suggest letting your user decide which account they have. It will save you problems later.)

Line 9 is where the actual login happens. If you get back a YES, all is well. If not, you can look at the GVoice object’s errorDescription property.

Line 17 demonstrates using one of the features of the library: enabling a phone. You pass the phone’s Id, which is obtained through another part of the API, and GV will then ring that number when a call comes in. You can also disable phones in the same fashion.

Line 25 shows how to send an SMS message from the GV account to the specified mobile phone.

There are many features that are fully formed, though some are still not as polished as I’d like. Two things still remain to be done: handling redirects and CAPTCHAs. After a certain number of failed logins, a URL will be returned that leads to a CAPTCHA image. To login after than you need to send a response to the CAPTCHA, but none of that is implemented in the library yet. Similarly, sometimes requests can be redirected by Google, but the library doesn’t handle those either. I’ve never seen either of these cases occur, but they could.

There is a full test suite included, which provides many more examples of how to use it. Before trying to compile it, you need to copy a file in the GVTests directory called GVCredentials-Sample.h to GVCredentials.h, replacing the dummy values with proper values. After that, you should be able to compile it and run the tests.

Full API documentation is available in the doc/ directory.

I wrote this library to use with my own iPhone app, which is currently in final testing before submission to the app store. I thought it would be useful for other people, so that’s why it’s free. If you’d like to use it, please do. If you’d like to improve it, let me know, and I can give you access to the repo.

It’s hosted on Bitbucket: https://bitbucket.org/joeygibson/gvoice.