Genius Bar exchanges are not returnable?

December 9, 2012

I just had some trouble returning an Apple TV to the Apple Store. The store manager was eventually able to make an exception to allow me to return it, and I’m very grateful for that! But I also learned something alarming: if you swap out a device for a replacement one at the Apple Store, the replacement isn’t returnable, even if it doesn’t work.

Here’s what happened. I bought an Apple TV from my local Apple Store a few weeks ago. All the online streaming services worked great, but I mainly wanted it for AirPlay, the service where I can share my Mac or iOS device screen to the TV. AirPlay was unreliable, so I made a Genius Bar appointment to get it looked at. I checked in using the Apple Store app on my iPhone, but it seems like the check-in didn’t work, so my appointment was missed. Because of that, the associate I spoke with (probably a manager) was trying to fit me in and give me a quick fix. She said they can’t service Apple TVs at the store, so she took another Apple TV out of the box, gave it to me, and took mine. My wife was with me and realized this was a strange thing for her to do, but neither of us thought to ask her anything about it. I assumed managers were able to be flexible and it would all be OK.

A few weeks later, after we’d had the opportunity to try AirPlay on the Apple TV a few more times, we had the same problems, so at this point we decided to return it. We asked one Apple Store employee about returning it, but he said that when you swap out a device, you get a “repair part” which is not returnable. This of course was very surprising to me: if I swap out a device because it’s not working, why would it then be unreturnable? He said this was stated on the paperwork I signed. (In fact, I had not been given any paperwork to sign, but I didn’t remember this right away.) I tried explaining to him that this seemed like very bad customer service, and in fact seemed like a trap to keep me from returning the device.

He eventually spoke with his manager (a different one than in the first visit), then she talked with us and said she would do what she could. As she looked for records, it became clear that the original manager who helped me hadn’t done the exchange properly. She was eventually able to refund our purchase, and I thanked her and told her I would thank her publicly online as well. But I also asked some follow-up questions for my sake and for the sake of sharing with others. (She asked me not to share her name, but said it was fine for me to share this information.)

Here’s what I learned: Whenever you are getting diagnostic or repair work done at the Genius Bar, or getting a replacement (a “repair part”), the associate should always give you paperwork to sign. If they don’t, you should ask the associate to give it to you, to make sure things are properly documented in case you need it later, as I did. Also, if you are swapping out devices for a “repair part,” the document you sign does say that it cannot be returned. The manager said that the employee should encourage you to read the agreement, and that it’s only a paragraph long. But she said the employee would not necessarily point out to you clearly that the repair part is not returnable. She said she advises me in the future to ask to return the device for a refund and to buy a new device—that way it is returnable. It still bothers me that this is Apple’s policy—intentional or not, it feels like trapping customers into being unable to return their device.

My wife pointed out that, since Macs and iOS devices are serviceable in the store, this problem probably would only come up with secondary devices like Apple TVs. Still, it’s good to know to be cautious about this “repair part” policy and anything you’re asked to sign at the Genius Bar. It sours my opinion of Apple a bit—it doesn’t fit with what I would consider good customer service, and I can’t think of a good reason for them not to point out the potential problem.


Should Churches Close on Christmas Sunday? Part 1

December 7, 2011

This is the first of a three-part series entitled Should Churches Close on Christmas Sunday?  
 
Part 1: Reasons Given  
Part 2: Biblical Evidence  
Part 3: Mission and Strategy  
Part 4: The Extrabiblical
 
 
When I realized that Christmas falls on a Sunday this year, I said to myself, “Here we go again…” The last time this happened was in 2005, and, when some churches decided not to hold Sunday services on Christmas day, it resulted in controversy. It was a personal issue for me: my church, North Point Community Church in Atlanta, did not hold services, and one of the most-quoted critics was a professor from a seminary associated with my undergrad college.  
 
This year, Lifeway reported that 91% of churches surveyed are holding Sunday services, and this has raised some opposition to the other 9%—even the ones that are holding multiple services on Saturday the 24th. There are strong opinions on both sides, and unfortunately there’s a lot of talking past each other going on. In a three part blog series starting with this one, I’d like to make the case that it is Biblically permissible, and at times beneficial, for churches to not hold services on Christmas Sunday, as well as to solicit further Biblical discussion.  
 
I can certainly understand how the first impression can seem bad. Churches should gather faithfully every Sunday, right? And especially on Christmas. Oftentimes, though, just hearing someone’s reasoning can shed a lot of light. In the case of North Point, as well as many other megachurches, the reason they give is that they want to allow attenders and volunteers time to spend time with their families. In particular, many volunteer teams serve every Sunday, making the need for a break even greater. (NP actually always takes the Sunday after Christmas off for the same reason, meaning that this year they are off for two Sundays in a row.) A related logistical issue is that larger churches can require hundreds of volunteers to hold a service, and that many volunteers may not even be in town, let alone available to help out. (As to the possibility of holding a service with fewer volunteers, I’ll address that in a future post.)  
 
A pastor’s kid friend of mine made another point that the pastors themselves probably agree with, but may be hesitant to say. She said, we want to have our dad to ourselves on Christmas. When she said this, it clicked for me: being a pastor is more than a job, but not less. Aren’t we indignant about other jobs that force a parent to work on Christmas day? Yet it’s tempting to turn around and demand that pastors need to work on Christmas. You may have heard stories about pastor’s kids who have turned away from the church because of the excessive demands it placed on their dad. These stories show that we as congregations will either help or hinder our pastors in being good fathers. Many pastors are overworked as it is: we should be looking for ways to make it better, not worse.  
 
This issue forces us to decide if we really believe what a lot of us say: that our family should be more important to us than our job or our organizational ministry. And this isn’t just a platitude: the Bible even says that one qualification of an elder (including pastors) is that they are able to raise their children well (1 Tim 3:4). If that’s the case, then it’s unbiblical for congregations to insist that their pastors make a sacrifice of their family for the sake of their church ministry. For all of the impact my pastor, Andy Stanley, has had, setting boundaries to protect his family life has always been important for him. Whatever your opinion may be of him, this is one point we can all learn from.  
 
For some readers, these practical reasons may be enough to convince you that not holding Christmas Sunday services is a valid option. For others, however, it’s not a matter of practicality but of obedience. They may say that to not gather for worship on any Sunday, or on Christmas Sunday in particular, means elevating secular traditions, materialism, and a convenience mindset above God. They may also say that pastoring requires sacrifice, and this is a small one to make. So the first question that has to be answered is, practical considerations aside, is it categorically wrong to not hold church services on any Sunday, or on Christmas in particular? I’ll address this question in part 2 of this series.


Getting Quake II GWT Working on the Mac–Updated

November 9, 2011

Last year I posted about a port of Quake II to HTML5, to run in the browser. I’ve been keeping up with the minor enhancements to the project since then, so I figured I’d update my instructions for how to get it running on your Mac. It turns out that it no longer runs in Safari, even in the WebKit Nightly–but it does run in public release Firefox and Chrome.

  1. Install MacPorts and then run
    sudo port install vorbis-tools
    sudo port install lame
    
  2. Install Mercurial version control client
  3. Install the Apache Antbuild tool
  4. Check out the code
    hg clone https://code.google.com/p/quake2-gwt-port/ quake2-gwt-port
    
  5. Build and run the server. It will take a while to build the first time, but will start up quickly from there on out.
    cd quake2-gwt-port
    ant run
    
  6. Start Firefox or Chrome and navigate to http://localhost:8080/GwtQuake.html. You should see a console.

If you have any problems, I can’t help you, so check the comments on these pages:


Essential iPad Apps–October 2011

October 11, 2011

Another friend of mine just got an iPad, so I figured it was time to update my list of essential iPad apps. If you have an others to recommend, leave a comment and I might try it out and add it to the list!

  • AppShopper [FREE]–lets you put apps on a wish list and alerts you when they go on sale. Great way to save money. It’s also the easiest way to e-mail or tweet links to apps.
  • Flipboard [FREE]–presents your Facebook, Twitter, and Google Reader content like a magazine, making it very fun to browse and read.
  • iBooks [FREE]–the best-looking and most fun to use ebook reader out there.
  • YouVersion [FREE]–has more free downloadable Bible translations than any other app, with every reading plan imaginable. Allows you to share notes publicly and follow others.
  • DropBox [FREE]–the easiest free way to sync documents between multiple computers and mobile devices. Syncs a designated folder automatically, so it’s literally zero steps to transfer files.
  • The Weather Channel for iPad [FREE]–the most extensive weather app.
  • Wikipanion [FREE]–iPad app for browsing Wikipedia and other MediaWiki wikis. If you use a Wikia wiki for video games or TV shows, it’s a must-have.
  • Facebook [FREE]–just released yesterday as of this writing. Smoother and more reliable than third-party Facebook clients.
  • Twitter [FREE]–again, more reliable than third-party Twitter clients, and has a nice column view.
  • Pandora [FREE]–listen to free personalized streaming music
  • Flixster [FREE]–my favorite app for movie showtimes and tickets
  • Helsing’s Fire Lite [FREE]–my favorite puzzle game on the iPad, with a very innovative light dynamic. The lite version only has iPhone graphics, but there is an HD paid version.
  • GoodReader [$4.99]–if you only buy one iPad app, buy this one. Full file system, viewing of PDF, image, and Office documents, access to FTP and DropBox servers. Essential for file management.
  • TypeLink [FREE or $5/yr]–obligatory plug for my app. Take notes and organize them using hyperlinks. Access your data on any device or on the web. Free for a basic account, $5/yr for an unlimited account.

Adding an Attribute to a Core Data Entity in Xcode 4

July 31, 2011

I wanted to add an attribute to one of the objects I manage using Core Data in my iPhone app. Because it’s a simple change, I wanted to use what Apple calls Lightweight Migration–automatically migrating the data when you make a simple change like adding a field.

I had to assemble the steps from a few different places to get it to work, partially because blog posts I found were for Xcode 3, and not even all the Apple docs have been updated for Xcode 4. Here’s the full set of steps that worked for me. For example purposes, I’m assuming your app is called YourApp, and the Core Data model is called YourData.

  1. Don’t make changes to the data model yet!
  2. Run your app in the simulator to make sure it has data set up under the current version of the entity.
  3. Select the YourData.xcdatamodel file and choose Editor > Add Model Version… The default numbering scheme (“YourData 2″) is probably fine.
  4. Select the new YourData 2.xcdatamodel file, select the entity, and add the new attribute. Make sure the right pane is visible (third button above “View” on the toolbar) and the third option within that pane is selected. Either set the attribute to be optional, or set it to have a default value–you have to choose one or the other for Lightweight Migration to work.
  5. Regenerate your model classes by selecting the entity, choosing File > New > New File…, then NSManagedObject subclass. Note: I first created my classes under Xcode 3, and at that time it put the .h and .m files inside of the actual YourData.xcdatamodel file (which is really a directory on the filesystem). Xcode 4 didn’t seem to give me this option, but that’s fine–to me, it makes more sense to store them with the other classes anyway. If you do put your new .h and .m files in a new location, be sure to delete the old ones.
  6. Select the YourData.xcdatamodeld file, go to the right panel, first option, and look for Versioned Data Model > Current Version. Set this to the newer version.
  7. In YourAppAppDelegate.m, find the persistentStoreCoordinator method, or wherever you call addPersistentStoreWithType:… You will probably be passing it nil for options:. Instead, pass this:


    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

  8. Update your app to use the new attribute/property in your entity. You might want to make only small changes at first, in case something goes wrong with your auto migration.
  9. Run your app and test it.

I wrote these steps out after I finished, so please leave a comment to let me know if I missed something and you run into other trouble.


Is iOS 5 Beta Live?

June 6, 2011

Currently, Apple’s iOS Developer page is down, while the iOS 5 Beta is being posted. Here’s a quick Perl script that checks every 5 seconds to see if the page is back yet:


#!/usr/bin/perl
use LWP::Simple;
$url = "http://developer.apple.com/devcenter/ios/index.action";
$size = length(get($url));
while( $size == length(get($url)) ) {
print "Not ready! time = " . time . "\n";
sleep 5;
}
print "Ready!\n";

UPDATE: or you can just pull up this web page.


Delegates, Protocols, and Optional Methods

June 5, 2011

In my iOS app, I have a lot of places where I show a modal view, and that view needs to have access to the view that opened it. To implement this connection, I’m using the concept of “delegates,” where one object has another object that it can call methods on. I created a protocol called ModalDelegate that defined the methods that these modals could call on their parent views. However, the way I implemented this caused a lot of compiler warnings. I just now figured out how to fix these, but the answers were difficult for me to find, so I figured I’d post them here.

First, it was my understanding that using id as a variable type was the standard Objective-C way to keep a reference to an object that can be of any class–the equivalent of the Java class Object, but more widespread in use. However, when I stored my delegate as an id, then tried to call a method on it, I received a warning that that method might not be defined. I could have cast the id to the appropriate type, but that seemed like it shouldn’t be necessary.

So, instead, I changed the type of the variable from id to ModalDelegate, the name of the protocol I created. This seemed intuitive to me from the way Java interfaces are used, and the compiler didn’t reject that variable naming. However, I got a similar warning: that method might not be defined. When I looked into it, I discovered that wasn’t the right syntax to use for a protocol at all. The right type for the variable was id <ModalDelegate>–in other words, an object of any type, but one that conforms to the ModalDelegate protocol. Also, instead of referring to @class ModalDelegate; in my header file, I needed to refer to @protocol ModalDelegate;.

The one remaining warning I was getting after this was that my classes weren’t implementing all the methods on the ModalDelegate protocol. The reason for this was that different views needed to have different methods called on them, and I didn’t want to have a separate delegate definition for each. So there were lots of methods in ModalDelegate, and each class that conformed to the protocol only implemented some of them. Of course, this isn’t how protocols are meant to work, but I didn’t see an alternative. But finally I found it: optional methods on protocols. I just add an @optional above all the methods that I want to be optional, and then the warnings went away. For my protocol, I actually wanted all the methods to be optional.

I don’t think this is a violation of the concept of the protocol, precisely because it removes all the warnings I had above. My modal view can call methods on its delegate without compiler warnings, because it knows it should have an id and that it may have a method of the appropriate type. The alternative would be to simply have an id and accept the warnings, or else use performSelector:withObject:, but those seem like overkill for the situation I’m in. The other alternative would be to implement each of the protocol methods and leave some of them as empty implementations. But all of these seem like overkill for my situation. With a protocol with optional methods, I’ve clearly defined for the compiler what I’m doing, and its lack of warnings assures me that I don’t have any typos.


My iOS Bookmarklets

May 17, 2011

Bookmarklets are links you can add to your browser toolbar that perform different functions based on the page you’re currently on. They’re the only option for extending the functionality of Safari on iOS.

I’ve added my favorites to a page with instructions linked below. (WordPress for iPad breaks bookmarklets, it seems.)

My iOS Bookmarklets


Set Up a Subversion Server For Free in Zero Steps

April 14, 2011

Want a Subversion server? Your options usually boil down to:

  1. Pay for an expensive hosted solution.
  2. Use an unreliable or crippled free hosted solution.
  3. Wait for your IT department to set one up for you.
  4. Slog through setting one up yourself.

Maybe setting up a Subversion server is easy if you’re a Linux expert, but, if you’re anything like me, there are a million things that can go wrong in the configs, and no online guide gets all the instructions right.

Well, as of now there’s a better solution. I’m posting a virtual machine image that has a working Subversion installation, tied to Apache. Download it, start it, and you’ve got a Subversion server!

It’s a VirtualBox image running Fedora 14. It includes a README file with instructions on how to start and access svn, and add new users. Download it here:

SubversionVM.zip

Unfortunately, I can’t provide any support for this image (I just cobbled it together myself). But I hope it’s helpful!


Duplicating a VirtualBox Hard Disk on Mac Host

November 5, 2010

I’m running VirtualBox on a Mac OS X host, and I had one .VDI hard disk file that I needed to duplicate into three and use them all at the same time. When I tried to load them all into different VMs inside VirtualBox, I got an error that a hard disk with that UUID was already in use.

Turns out that you can’t just duplicate the hard disk file–you need to use a command called VBoxManage to do it. But it took me a while to find out how to run that command on a Mac.

Here’s what you need to do in a console window:


/Applications/VirtualBox.app/Contents/MacOS/VBoxManage clonevdi path/to/yourold.vdi path/to/vditocreate.vdi

It will probably take a while, and it will only update the progress indicator every 10% or so, so have some patience and you should be set. Once the duplicate is made, just create a new VM in VirtualBox, and choose your new .VDI file.


Follow

Get every new post delivered to your Inbox.

Join 523 other followers