End of Microsoft Office on my Mac

Last week after a colleague ask a client to send a Word document as a PDF, I asked him how he got away without Office on his computer and he said he used iWork. I tried this route several years ago, but had to install Office when I started by job 2 years ago to use some wacky templates. It dawned on me that I no longer had a reason to keep Office on my machine.

I purchased a copy of iWork ’09 (yeah, I realize that iWork ’11 will be out before I know it) and received it today. I deleted Office and install iWork. I use a text editor for composing things, but every once in awhile I need to use a word processor and a spreadsheet. iWork should fit the bill quite well for this.

On the off change that someone sends me an Office document I can’t read, I can ask for a PDF or try loading it into Google Docs. It feels so refreshing to get Office off my machine. I know that things have changed for Office 2011, but it seems like it just keeps getting more and more bloated. Freedom!

Review: Blade CX3

First off, I have to admit that I’m getting addicted to RC helicopters which if I don’t watch myself is going to get quite expensive! Now that I have that off my chest, I’ve now purchased my third helicopter, this time a Blade CX3. This helicopter is a huge step up in terms of size from my Blade mCX2.

When I first got the helicopter, I was a little afraid to fly it. The bigger the helicopter, the more it would cost to repair. I flied it around my office a little bit, but due to its size, it’s pretty hard to do much with it. However, I did get the hang of it (it’s quite loud) and decided to give it a whirl outside. Well, I was a bit overconfident and on my first flight outside, it ended up on the roof and I caught it as it came crashing down on me. Luckily I was able to repair the fuselage damage with some clear tape and it was as good as new.

I’ve been having a lot of fun with it and am excited to fly it outside. However, there has to be very, very little wind to do anything with it. The times I’ve flown it outside, the wind is just a little too strong so that when I try to go forward full speed, it goes no where. It is teaching me how to control it in adverse conditions which is kind of interesting.

One of the maneuvers  that I’ve pretty much perfected on the mCX2 is landings in a single spot. On the CX3, this is much harder because of the ground effect created by the blades; flying it low is kind of difficult due to this (the blades are pushing down a bit of air causing the helicopter to go up). This is something that I’m keep attempting.

The CX3 doesn’t use anything that is the same as my mCX2, so I’ve already started collecting spare parts in the event of a crash. I’ve also had to pick up an extra battery as the 6 minute flight time is a bit short when it takes 2 hours to recharge the battery.

Many of the points below are similar to what I wrote about the mCX2. The two helicopters are quite similar as beginner helicopters.

Pros

  • Not too hard to control.
  • Moderate size allows me to fly outside.
  • Replacement parts aren’t that expensive.
  • Comes with battery charger.
  • Heading hold gyro attempts to keep the nose facing in the direction of travel.
  • It’s quite fast when flying inside.

Cons

  • Size makes it a bit large to fly inside and do anything interesting (very small circles).
  • Only comes with 1 battery.
  • Long recharge time (2 hours).
  • Navigation lights are optional (they look cool on the mCX2).
  • It’s noisy. In the house, it’s hard to really hear anything when it’s flying.
  • Time consuming to disassemble. I added a heat sink to it and it took me about an hour to take it apart and install the heat sink. Maybe it was just me, but I had a problem removing one of the motors to get the heat sink in.

Summary

The CX3, like the mCX2, is a beginner helicopter. I kind of see it as a stepping stone from the mCX2 as it is larger and can fly outside. I’m glad that I got the mCX2 first as it let me learn to fly and maneuvers. I haven’t abandoned my mCX2, but I find the CX3 a bit more challenging and more exciting. If you’re interested in RC helicopters and don’t have much room to fly, the mCX2 is the way to go. If you have more room and want to fly outside, the CX3 is the better choice.

I’m having a great time with my helicopters and am getting pretty good at flying.

    Objective-C/Cocoa Tips

    [Updated 7 November 2010.]

    I’ve been writing Objective-C and Cocoa code for almost 8 years, but it feels like a lot longer. There is good reason for that and it’s that during that time I haven’t just worked on projects during the day, I worked on projects at night, so the 8 years is more like 10-12 years of writing code. During that time, I’ve written a ton of code and come up with a lot of tips to help me. Each developer has his/her own style, so I’m sure that some people will take objection to some of what I say. However, a number of projects I’ve worked on could really have used this information to be more solid.

    Without further ado:

    1. When you start a project, set the Organization in the project so that all new files created have the correct copyright. Pretty much every project I’ve worked on has most of the files stamped with the wrong copyright.
    2. Never use [self autorelease] or [self release]. These make code very hard to trace and WILL lead to a crash when another developer comes along and releases an object thinking there is a memory leak. Code should be restructured so that whoever instantiated the object releases it. In addition, CLANG will flag objects that aren’t released as a potential memory leak and having to sift through the CLANG messages every time analyze is done.
    3. Follow Apple’s guidelines on method naming. Methods that return an object that must be released by the caller must begin with “alloc” or “new” or contain “copy” in it. (create also seems to be in there as well). Methods that return an autoreleased object must NOT start with “alloc” or “new” or contain “copy” in it. These are important so that CLANG can analyze your code and not flag things that require you to have to go through each issue and trace the code.
    4. Never subclass core objects such as NSString, NSArray, NSSet, etc. If you need additional functionality either use a category or make a new class that has the object as part of it.
    5. If an object is added to an array, an NSOperationQueue, etc., make sure the object is released or autoreleased.
    6. Don’t use [NSObject new]; use [[NSObject alloc] init]; This is simply for readability. While they are equivalent, every time I see an alloc/init, I know I have to do a release or autorelease. “new” isn’t as widely used and someone could accidentally do self.object = [NSObject new] which would cause a memory leak if the object property is retained.
    7. Use assign properties for objects in limited cases such as XMLNodes or delegates. In most cases properties should be retained or copied.
    8. Don’t do a lot in the init methods. Also, be careful of using self.xxxx in an init method as there can be side effects in the assignment if you are using KVO or have your own setter. (The side effects part comes right from a WWDC presentation.)
    9. For properties that are retained, don’t do self.xxx = [[NSObject alloc] init]. This is a memory leak. You can add autorelease to the end or do the assignment in a few steps, i.e.
      	NSObject *obj = [[NSObject alloc ] init];
      	self.xxx = obj;
      	[obj release];

      If you don’t want KVO, you can eliminate using self. However, make sure you release the object before assigning it.

    10. Only use threading if you absolutely must and use NSOperations as much as possible. Threading is tricky and I’ve only seen a few places where it has been done right.
    11. Never make different build products using scripts, define values, and configurations. Use build targets. If you don’t, your project file will change all the time and people will keep checking in a slightly modified project file.
    12. Don’t put unnecessary things in the .pch file, create a Defines.h for that. Use the .pch file for including other files, one of which can be Defines.h. Put the Defines.h at the top of the project to make it easier accessible.
    13. Don’t name every file in the project with the same prefix. If you are sharing code with other projects, then making those have the same prefix, that is fine, but if you have 100 files that start with SG, it becomes quite annoying.
    14. Don’t sprinkle UNIX like code everywhere and don’t use UNIX calls when Cocoa calls are available.
    15. If you use CoreData, first read as much as you can about CoreData. Second, explicitly set the managedObjectModel and don’t let the OS do it for you. The OS will merge all the managed object models in your bundle and create 1 model. This is problematic when you have to do migrations.
    16. If using CoreData, use the XML data store until you are comfortable with the data model. Verify the metadata in the XML before you switch to sqlite.
    17. Networking code is hard. Make sure you don’t use synchronous calls even in threads as you can’t handle cancels. Use NSOperations for the calls. Debugging the code is even harder than writing, so don’t over complicate it.
    18. Don’t do version numbering in Info.plist files as you have to update 3-5 items each time you change the version number. See my post on an easy way to do this.
    19. Don’t use NSAssert everywhere. Do actual error checking and handle conditions where necessary. While NSAsserts are usually compiled out for release builds, NSAsserts just annoy me to no end and basically serve no purpose to me.
    20. Make sure builds compile with no warnings. Don’t ship code with build warnings unless there is some type of compiler issue preventing this from happening.
    21. Don’t turn on unnecessary flags in Xcode; making warnings into errors makes it hard to test code. If you abide by the item above, you don’t need to make warnings into errors.
    22. Before checking in files, always do a diff from your changes to what’s in source control. Don’t check in files just because you change 4 spaces into a tab. This also helps review the code and make sure you didn’t leave in test code.
    23. Never store a value using NSNotFound. Seems pretty obvious to me. Apple says:

      Prior to Mac OS X v10.5, NSNotFound was defined as 0x7fffffff. For 32-bit systems, this was effectively the same as NSIntegerMax. To support 64-bit environments, NSNotFound is now formally defined as NSIntegerMax. This means, however, that the value is different in 32-bit and 64-bit environments. You should therefore not save the value directly in files or archives.

    24. Never release an NSOperationQueue from within an NSOperation. That’s like pulling the rug out from under you while you’re standing on it!
    25. Be careful with type casting.
      NSUInteger value = (NSUInteger) -1;

      could have very strange consequences. Likewise, doing:

      NSUInteger value = (NSUInteger) NSNotFound;

      May not do what you want it to do and the results could be different on 32 and 64 bit machines.

    These are just some tips that I’ve learned/developed over the years. I write a lot of code and have been involved in a number of projects that need TLC. Feel free to comment if you have more tips or want to debate anything I have written; these aren’t the be all, end all to writing code, but they do help me write code that will stand the test of time (I recently got involved in a project that has code I wrote over 6 years ago that is still in use!)

     

    How to make an outdoor fountain

    For years, my wife has wanted a fountain outside as she likes the sound of the water falling. I’ve bought her table top ones and even a cheap plastic one we had in our living room. The biggest problem was the pump was a bit loud and the water sound didn’t cover it. This weekend, my wife decided that she wanted an outdoor fountain. This became our (my) weekend project. In this post, I’ll outline the procedure I used to make the fountain. I, of course, take no responsibility for your significant other bugging you to make a fountain or for any injuries (mental or physical) sustained by undertaking this project.

    fountain.jpg

     

    Materials needed

    • Terra cotta pots
    • Glazed bowls
    • Pond/fountain pump (300 GPH or higher depending on height of the fountain)
    • GFCI outlet
    • Weatherproof outdoor outlet cover
    • Fountain nozzle kit
    • Hose from pump to nozzle
    • Plumbers putty
    • Round file

    Tools needed

    • Screwdriver (needed for GFCI installation)
    • Needle nose pliers (needed for GFCI installation)
    • Level that is long enough to span your largest bowl
    • Dremel
    • Dremel Grinding Stone
    • Patience

    Procedure

    1. Ensure that you really want to undertake this. Spending $200 on a decent fountain may be worth your time and money. Building your own takes time and isn’t necessarily cheap.
    2. Make sure that Home Depot (or other home improvement store) is less than 20 minutes away. If not, stop here as you will need to make repeated trips. It only took me 5 trips.
    3. Have significant other do the research and figure out what he/she wants.
    4. Allocate a full weekend for this project. A three day weekend is best as those trips back and forth to Home Depot take a lot of time.
    5. Make sure that there is a GFCI protected outlet near where you want the fountain to go. If not, install outlet. (This was actually my last step as I realized that the outlet wasn’t GFCI protected.)
    6. Install weatherproof outdoor outlet cover. This should be pretty easy, but for me, I had to cut out some siding to make it fit.
    7. Buy terra cotta pots and bowls. See picture to the right for what we chose. It took a significant amount of time for my wife to decide on what she wanted. Originally she wanted a resin whiskey barrel as the base and then didn’t know what she wanted and then we went to the Canyon Pottery which has a huge selection of pots and bowls.
    8. Determine where the fountain will be. You don’t want to move it after you start.
    9. Place largest terra cotta pot on the bottom upside down. Level it (very important).
    10. Plug hole in largest bowl. Use plumbers putty and whatever other means necessary.
    11. Place largest bowl on top and level it.
    12. Use Dremel to carve a notch in the second largest terra cotta pot so that the pump cord can go through it. Also, use the Dremel to put maybe 8-12 holes in the top rim of the pot. These holes let water get to the pump. The pump MUST be completely submersed in water in order to function.
    13. Attach short piece of hose from pump to an extension pipe  that comes with the nozzle kit.
    14. Place pump in largest bowl.
    15. Place second largest terra cotta pot in the largest bowl and feed the extension pipe up through the hole in the pot.
    16. Level terra cotta pot. Note that if you can’t level it, you may have to use the Dremel to grind down one edge of the pot.
    17. Place second largest bowl on top and thread the pipe through. You may have to use the round file to make the hole a little larger to make the pipe fit.
    18. Use plumbers putty to seal around the pipe that comes up through the bowl.
    19. Attach second piece of pipe that comes with nozzle kit to the pipe that is coming up.
    20. Level bowl.
    21. Place third largest terra cotta upside down in bowl and make sure the pipe comes up through it.
    22. Level pot.
    23. Place top bowl on the pot and thread the pipe through it. You may have to use the round file to make it fit.
    24. Level bowl.
    25. Use plumbers putty to seal around the pipe.
    26. Put the nozzle on top of the pipe.
    27. Fill all the bowls with water.
    28. Cross your finders.
    29. Plug in the fountain.
    30. Enjoy!

     

    Review: Blade mCX2

    After getting a Syma S107 RC helicopter, I was quickly hooked on RC helicopters. I went to the local hobby shop, Discount Hobby Warehouse, and took a look at the Blade mCX2. When I mentioned to the guy at the shop that I had a cheap $30 helicopter, he said that the goal of the cheap ones is to not crash while the goal of the more expensive ones is to fly. I definitely could agree to the part about not crashing. I bought it and when I got home, I charged the battery and was off and running. I was easily able to fly it around for a few minutes until the battery died (I get about 6 – 6 1/2 minutes per charge). I’ve picked up a few more batteries and have been spending at least 20-30 minutes a day. I’m definitely a fan.

    Everything I’ve been reading indicates that the coaxial helicopters (CX) are easy to fly and are beginner helicopters, so I think I picked the right one. The mCX2 is easy to fly inside (it is far too small to fly outside as the wind will knock it around). The entry price is reasonable (for a hobby), but the cost will quickly add up, so be prepared. I’ve already bought a few more batteries, a four port charger with AC adapter, and due to a crash, some spare parts.

    Speaking of crashes, while the helicopter is easy to handle, if you want to start to get fancy, it’s quite maneuverable, so much so that it isn’t that hard to crash. I made the helicopter yaw a bit too much and then over corrected which lead to the crash. The crash cost me about $15 in parts to repair. Even though the parts are quite small, repairing it, isn’t that hard. It comes with a small phillips screwdriver and combined with a pair of locking forceps  that I got at an Army/Navy Surplus store, repairs just take a little time and not much skill.

    The mCX2 uses parts that are shared with other helicopters made by Blade, such as the mSR and mCX Tandem Rescue, so if you get one and want to upgrade, you already have some pieces.

    Pros

    • Compact size allows you to fly in the house.
    • Easy to control.
    • Captivating (I’m really hooked).
    • Challenging. While easy to control, I’m teaching myself how to land it in a small area which is proving to be easier said than done.
    • Easy to repair.
    • Individual parts aren’t that expensive.
    • Relatively durable. It handles small crashes well.

    Cons

    • Price. Some may say that the price is a little high. I think the entry price isn’t bad, but it starts adding up quickly.
    • Only comes with 1 battery.
    • Short flight time. Due to the small size of the helicopter, it has to have a small battery, so this is understandable.
    • Only comes with a 1 port charger. Charging 1 battery at a time means you have to wait 30-40 minutes for it to charge between flights.
    • Charger runs on 4 AA batteries; AC adapter is optional. The manual says that the AA batteries will charge the battery 15-20 times. Since I started with 2 batteries, and I flew it as often as possible in the first few days, that the batteries only lasted 3-4 days. This cost savings is not very green and is extremely annoying. I went ahead and got a 4 port charger with an AC adapter and now I can run through 4 batteries and then charge them all up.
    • It’s addictive.

    Summary

    For some reason, I’ve always been fascinated with things that fly. So, when I tried my first helicopter a few weeks ago, I quickly realized that I may have found a hobby (up until now, I really haven’t had a hobby as an adult). The mCX2 is a great entry level helicopter and provides hours of fun. If you think that the cost of the helicopter is the end of spending money on it, I wouldn’t get it. The costs will start adding up quite quickly. I mentioned this helicopter to a friend (he already had a few other helicopters) and he bought it based on me talking about it. He seems quite pleased with it as well (his dogs aren’t pleased with it, however).

    This helicopter is not a toy, so heed the age level on the box (14 and up). I’m not sure it is appropriate for a 14 year old, however.

    I’m very happy with my purchase and can definitely recommend it to anyone that has ever been interested in RC helicopters.

    Review: ezDesktop – VNC client for iPad/iPhone

    I’ve been using a Mac Mini as my DVR/media center for about a year now and there are times when I have to pull out my laptop to control it despite having a Harmony Remote configured for it. If we want to watch shows on USA Networks, TNT, etc. in a web browser, I can’t control that with a remote (at least not until Google TV or the like comes out).

    The other day I really didn’t want to use my laptop to control the Mac Mini, so I looked at VNC clients for the iPad. I found 2 that had free (trial) versions. Mocha VNC and ezDesktop. Mocha VNC Lite didn’t impress me. I turned on the VNC server on my Mac Mini, setup a password, and easily connected to it with ezDesktop. I played around with it, managed to navigate fairly easily with the iPad and did some web browsing. By the time I had done all this, my free session was up and I decided that it was worth the $6.99 to purchase the VNC module via the in-app purchasing.

    I’ve been using it for a few days now and it works pretty well. The hardest part is moving windows and making the dock show (I have it set to hide on the Mac Mini). The keyboard that it displays has extra keys for command, control, etc. and screen refresh is quite good. It’s been nice to be able to control the TV right from the iPad and has given me a view into the future of using an iPad as a remote control for the TV.

    They have another product that helps get to your computer when you’re away, but I didn’t need that, so I stuck to the cheapest version.

    Pros

    • Easy to setup.
    • Decent frame rate.
    • Using it to move the mouse works well.
    • Extra keys for the keyboard are available.

    Cons

    • Dragging windows is a bit difficult.
    • Moving the mouse to the screen edge to show the dock doesn’t always work.
    • Some part of the app (setup and help) could use a little polish.

    Summary

    If you have a need for a VNC client on the iPad (I haven’t tried it on the iPhone, yet), the free trial should give you plenty of time to evaluate it. When I have my laptop and I’m watching TV, it is only sort of relaxing; if I have my iPad, due to limited ability to do things on it, I find I am a bit more relaxed. So, ezDesktop is definitely working well for me as it allows me to sit in front of the TV and control all aspects of my Mac Mini without having my laptop. It’s worth the $6.99 for the app; the other VNC clients out there way have more bells and whistles, but ezDesktop seems to be a good fit for me.

    Review: iDealizer Pro

    After I started using River of News to read RSS feeds on my iPad, I wanted to grab more and more feeds as it was so easy to read the feeds. This, of course, causes information overload. One of the sites I found is called Deal of the Day Tracker which has RSS feeds for daily sales on stuff (like Woot!, eBay, etc.). (I didn’t know that so many sites had one day deals and it’s hard for me to resist looking to see if there is the off chance that something will catch my eye.) The problem with the feeds is that there are well over 100 deals a day and scrolling through them with River of News was a bit painful (see my review where I commented that the loading was an issue).

    So how was I going to handle my desire to get a good deal while still using River of News? I discovered an app called iDealyzer. For $2.99, I decided to give it a try as the free version gave me a taste of how useful it could be. So while I haven’t used it to buy anything, yet, it has quenched my thirst to see daily deals. The free version doesn’t let you prune the list of deals, so that’s why I spent the big bucks on the Pro version. Is the app a winner? It is quirky and crashes every now and again. Its utility is definitely questionable. If I buy something, I guess it will be worth it, but so far, it’s just a curiosity.

    Pros

    • Ability to customize which deals to display.
    • Push notifications for deals (I don’t use this).

    Cons

    • Could use some stability improvements.
    • Images are a bit slow to load.
    • Settings to configure which deals are on/off is awkward.
    • Some of the buttons look ugly.
    • Limited selection of deals. (Deal of the Day Tracker shows a lot more.)

    Summary

    I can’t really recommend this app. If you are completely addicted to daily deals, then this might be for you. Download the free version and check it out. I’ll keep this on my devices and am periodically checking it, but I could live without it.

    Review: River of News (Google Reader app for iPad)

    The other day I was listening to MacBreak Weekly and during their “Picks” Leo Laporte recommended River of News, a Google Reader app for the iPad. About a year ago, I wrote that I was done with RSS readers that had to synchronize with Google Reader and was satisfied with the web interface. However, I decided to take a look at River of News. It was only $2.99, so buying it didn’t break the bank.

    When I first started it up, I was amazed at how well it worked. After playing with it for awhile, I started wanting to read my RSS feeds on it instead of on the desktop; now that’s saying a lot! I’m not sure how it is talking to Google Reader, but it didn’t seem that there was a “sync” process to mark feeds read/unread and the flagged of articles worked flawlessly. It makes reading my feeds (OK, maybe information overload) a pleasure.

    The only issue I have with the app is that it’s a bit slow when you scroll down and it has to retrieve a few more articles. While I realize that the trigger for fetching new articles is when the user hits the end of the page while scrolling, it would be nice if the developer changed it so that when you were done with a few articles, it would go fetch the next batch in the background so that there is no waiting.

    Pros

    • Inexpensive
    • Easy to use interface
    • Integrates well with Google Reader

    Cons

    • A little slow at loading new articles

    Summary

    If you read RSS feeds, this is currently my reader of choice. It’s a no brainer to spend the $2.99 on this, even just to see how it works. Now if the developer addressed (fixed is highly subjective), the slow loading, I’d be in reader heaven.

    Review: Charles Proxy – Useful development tool; ugly interface

    During the testing of one of my projects, our QA folks mentioned a tool called Charles Proxy that they used to throttle the connection speed down to 3G speed as some issues can only be reproduced on slow connections. I pretty much ignored the product as I wasn’t assigned any bugs related to this. A few weeks later, I was assigned a bug dealing with 3G. As I really didn’t want to try to reproduce the issue on a device over 3G (the iPhone simulator makes it easy to reproduce issues, but as Apple points out, there is nothing like testing on a real device), I downloaded Charles Proxy and gave it a whirl. Unfortunately the limitations in the demo quickly required me to cough up the $50. As much as I was reluctant to cough up the money for an app that doesn’t look like a Mac app, it has already paid for itself.

    Throttling down the connection speed seems to be one of the small features of Charles Proxy. It is a full tool for analyzing web traffic. When developing iPhone applications that talk to web services (which is pretty much everything these days), being able to look at the packets, headers, responses, XML results, and JSON results. In addition, it gives timing results for the requests so that I can see where slowdowns exist.

    I’ve used it to determine that a client’s server was slow (they reported poor performance), that a different client’s web server wasn’t doing compression on text/plain files, and to see where I made incorrect requests to the server.

    The major downside of the software is that the interface doesn’t look like a Mac app. As I’ve written before, I really dislike apps on the Mac that don’t look like Mac apps. Cross platform apps just aren’t my cup of tea.

     

    Pros

    • Extremely useful for iPhone app development involving web services.
    • Lots of information about web requests; requests, responses, headers, etc.
    • Easy setup; it auto-configures the Mac proxy settings when it starts and changes it back when it quits.
    • Ability to throttle down the connection speed.
    • Lots of settings.

    Cons

    • Ugly Mac interface.
    • A bit costly. (Maybe not for a developer tool.)

    Summary

    If you’re developing iPhone (or even Mac apps) that involve web services, Charles Proxy is an absolute necessity. If you ignore the ugly interface (I’m not talking about the layout, just the interface elements don’t look very Mac like), the app works well and gets the job done. It could be prettier, but the tool is extremely useful.

    Review: PixelSkin HD Case for iPhone 4

    Today I received the PixelSkin HD case for my iPhone 4 through the Apple case program. I had been using a $0.99 case I purchased off eBay and was relatively happen with it. It’s really hard to review a case as it does so little, so I’ll mostly compare it to the $0.99 cases I bought off eBay.

    First off, this is a hard plastic case (the one I was using was rubberized). This makes the phone feel more solid and it has a slight lip that may prevent the phone from being scratched if I put it face down on a surface. Second, the case is pretty tight fighting and doesn’t add much bulk to the phone. Next, the fancy pattern on the back definitely helps with gripping it as the plastic as a little slippery. Finally, the case is rigid enough that the small piece of plastic on the bottom connecting the sides near the dock connector doesn’t feel flimsy.

    When I started looking for cases, I thought that since all the cases are made in China anyway, what was the difference between one off eBay direct from China and a name brand. Well, there are plenty of differences and the PixelSkin HD case feels like a solid case. If I didn’t get the case for free, however, I wouldn’t have known there was a difference (not that $20 is a lot of money to spend on a case, but cheaper seemed better).

    Pros

    • Solid feel
    • Pattern on back makes it easier to grip
    • May offer some protection to the iPhone

    Cons

    • On/off button feels hard to press

    Summary

    If you didn’t already receive your free iPhone 4 case from Apple, this could be a good case. I’d goto the Apple Store and give it a try. Cases are very personal and some like this type of plastic while others like rubbery cases. Some people just are too upscale for plastic cases and go for leather or some other material; in that case, this is definitely not for you.