Essential Mac apps I install on new machines

Stole the idea from Simon, so here goes.

Name: 1Password
URL: https://agilebits.com/onepassword
Description: Basically a password safe, but it’s oh so much more. It’s a must have. saves logins, autofills logins, autofills profile information, random generation of passwords, etc etc etc. Just get it.

Name: Acorn
URL: http://flyingmeat.com/acorn/
Description: I love this app for simple image editing. It’s lightweight and powerful. Does all I need and the tutorials on the website are awesome.

Name: Adium
URL: http://www.adium.im
Description: I have a love / hate relationship with Adium. It’s hands down the best IM client for the Mac but I find it to be buggy and at times it sends me crazy. Messages not being sent, messages not being received, showing contacts as offline when they are online, showing me as offline to some people even though I appear online to others, etc etc. It’s silly niggly stuff but still annoying at times. Part of the problem may well be the IM networks but I also wonder if its just caused by bloat. The issues seem to sneak up on me and I find if I reset it every so often and start from scratch the issues go away… I just wish there was a stripped down version of Adium without the extras. Something that just does sending / receiving IM’s without themes, message styles, events, etc. Perhaps then it would work consistently? Perhaps its just me though.

Name: Alfred App
URL: http://www.alfredapp.com
Description: A quick launcher with oodles of features. Can launch apps, do web searches based on templates, calculations, quick lookup of definitions, clipboard history, etc etc etc. I actually use it a lot as well for its built in iTunes support. Has a free version that is very capable, its totally worth paying for the pro version though to get the extra awesome features.

Name: AppZapper
URL: http://appzapper.com/
Description: Very stable uninstaller. Picks up those pesky helper files and preference files that are left behind when you just manually delete and application. Doesn’t get updated much, but it works. Also makes an awesome zap! sound when it deletes an app.

Name: BBEdit
URL: http://www.barebones.com/df
Description: I was a TextMate fanboi but its lack of updates made me switch. It’s simple and stupidly powerful. I’m sure I don’t even use half of its features. It’s never let me down though as my text editor of choice.

Name: ChronoSync
URL: http://www.econtechnologies.com/pages/cs/chrono_overview.html
Description: It’s a crazy powerful backup tool. Has an abundance of features and you only pay for it once. All updates are free. It forms part of my backup system. I have a bunch of Chronosync documents that are scheduled to run at certain times to backup specific projects I’m currently working on. They get backed up to Dropbox and also my NAS. I was initially skeptical about using Chronosync but after reading the documentation and examples on the website I was converted. Totally worth the cost.

Name: Dropbox
URL: http://www.dropbox.com
Description: Definitely one of my most used apps. Syncs files between all your computers / devices. Drop a file in your drop box folder and its instantly sync’d to other machines. I use it for file sharing, photo sharing, backups, and storage of files I might need to access from anywhere. If all else fails it also lets you access the files from the web interface. It’s saved my bacon a number of times. It’s also awesome for syncing app settings. I have Alfred, BBEdit, 1Password all syncing their settings to it, which means all my machines have the same settings!

Name: Evernote
URL: http://evernote.com/
Description: Saves notes in the cloud. I basically have my life in it. Notes, photos, images. I take photos of receipts, tag them, then refer to it at tax time. I save travel plans to it, toggle the option to cache it locally then refer it to on my iPhone while travelling. I keep code snippets in it. I have notebooks in it for projects I am planning. I have notebooks with iphone app ideas where I make notes. I take photos of business cards and upload them. The OCR features means I can later on search and it finds text that was in the image. It’s awesome. I paid for the pro version, even though I don’t use anywhere near the monthly upload limit, simply because its such an awesome app.

Name: LaunchBar
URL: www.obdev.at/launchbar/
Description: It’s stupid, but I actually run two launcher apps. I was a long time LaunchBar user before Alfred came along and some habits die hard. I love the way LaunchBar does its information overlays. It works so much better than Alfreds use of Growl. I also find it easier to do pretty complex drag / drop operations with the keyboard using LaunchBar. I’m not entirely sure if Alfred can do the same or not, I’m just used to doing it in LaunchBar.

Name: MarsEdit
URL: http://www.red-sweater.com/marsedit/
Description: It’s a desktop blog client. Lets you post to all sorts of blogs without having to do it while manually logged into the website. Has drafts, which I use a lot, and other nice features. I use it to post to all my blogs.

Name: NodeToad
URL: http://www.sparkfield.com/products/nodetoad/
Description: Internet usage meter for Internode. I’ve used this for years and love it. Works great and doesn’t chew much memory. The developer is a nice guy as well. Very customisable in the way it displays usage and even has a built in radio player.

Name: OmniFocus
URL: http://www.omnigroup.com/products/omnifocus/
Description: Basically a task manager but more. Helps you capture your thoughts and organise them into do-able items. I have the desktop, iPhone and iPad version and use them every day. I put shopping lists in it, projects with milestones, jobs to do around the house etc etc. The iPhone app is location aware, so I can mark items in my shopping list at a specific location. When I’m out doing stuff I can check the list for things I need to do nearby.

Name: Perian
URL: http://perian.org/
Description: All those weird movie files that won’t play in Quicktime? Perian makes them work. It’s a must have.

Name: QuickCursor
URL: http://www.hogbaysoftware.com/products/quickcursor
Description: This is a small utility that lets you edit any text in any editor your want. i.e. You are editing a form on a website and need to type something lengthy. Hit the key combo and your text editor opens. Type the text you want then save it and it automatically gets filled into the website where you were. It’s usable anywhere, even in other apps. I use it a lot when I want to format a markdown blog. I start the blog in MarsEdit then hit the key combination I have set and edit the blog in BBEdit. When I save the text gets copied back to the MarsEdit app automatically. Hard to explain because what it does is so simple. Totally awesome app though. I use it every day.

Name: Skitch
URL: http://skitch.com/
Description: Awesome screen capture application. Has a great UI and is fun to use. You can annotate the screenshots and upload them to all sorts if places quickly. Use it to annotate and you turn a boring screenshot into a fun piece of art.

Name: SourceTree
URL: http://www.sourcetreeapp.com/
Description: I hadn’t actually heard about this app until I switched to using BitBucket recently. Its a free GUI for source control. Supports GIT/SVN/Mercurial and has heaps of features. It used to be a paid app but is now totally free since Atlassian bought the company.

Name: SuperDuper!
URL: http://www.shirt-pocket.com/SuperDuper/
Description: I use this instead of Carbon Copy Cloner. I think my decision to use this came from emailing the developer a while back and getting a really nice reply from him. It’s used to do backups of your hard drive. You can make 1:1 clones, bootable backups, scheduled backups, smart updating etc etc. I have a pretty over the top backup system (really need to write a separate blog about that) but SuperDuper! is in charge of doing a daily smart backup and also a weekly full bootable backup of my iMac and Mac Mini server. I’ve tested the backups a number of times and they have never failed.

Name: TextExpander
URL: http://smilesoftware.com/TextExpander/
Description: Something else I use every day. You can store snippets in it and set a certain abbreviation. When you type that abbreviate TextExpander replaces it with the snippet you have assigned. I have all sorts of stuff in it from date formats, to common email text.

Name: Transmit
URL: http://panic.com/transmit/
Description: Hands down the best FTP/SFTP client for Mac. Has an awesome disk mode where the remote host is mounted as a drive on your system meaning you can interact with it as a local drive. Also has droplets to make quickly uploading files to regular servers simple. The Panic guys make great software.

Name: The Unarchiver
URL: http://wakaba.c3.cx/s/apps/unarchiver
Description: Replaces the built in OS X unarchiver and adds support for a bunch of other archive formats including Zip, Tar-GZip, Tar-BZip2, RAR, 7-zip, LhA, StuffIt and more. Very useful.

Name: Unison
URL: http://panic.com/unison/
Description: The best newsgroup client on the Mac.

Name: VLC
URL: http://www.videolan.org/
Description: I use it for playing multicast streams. There’s the odd weird file that won’t work with Perian which VLC handles just fine.

Name: VMWare Fusion
URL: http://www.vmware.com/products/fusion/overview.html
Description: Great app for your VM needs. Works great. I chose this over Parallels because I wasn’t a fan of the way Parallels added a bunch of extra devices to your system preferences (network, etc). VMWare also have the name and have been in the business for a while.

Name: VooDooPad
URL: http://flyingmeat.com/voodoopad/
Description: A note taking app and more. It’s basically your own personal wiki and lets you create pages, link pages, add text, add images, etc. I use it mainly for fleshing out iPhone app ideas. I create new document and add everything related to it to the voodoopad document. Similar apps, UI designs, features, links to resources, etc etc. I love it. It’s a simple app but works really well.

Name: XCode
URL: https://developer.apple.com/technologies/tools/
Description: I write iPhone apps and XCode is the place to do it. Can compile all sorts of source files. Totally integrated development environment for the mac / iphone / ipad.

Adding a UIImage above a TTLauncherView

I had a project recently where there needed to be an image at the top of the view with a TTLauncherView underneath it.

I struggled with this at first as I could see no mention of doing this in the Three20 documentation. In the end I had to actually create the UIImageView and add it manually to the view.

The first thing you have to do is declare a UIImageView in the header file.

@property(nonatomic, retain) UIImageView *logoImageView;

Then in the implementation file, synthesize the property.

@synthesize logoImageView;

Now we modify the loadView method to add the code needed to create and insert the logoImageView.

Allocate and initialise the logoImageView.

self.logoImageView = [[UIImageView alloc] initWithFrame:CGRectMake(65, 0, 190, 108)];

I’ve used hard coded values to define the location and size of the UIImageView. I got these values by just drawing up a simple diagram and working it out based on the iPhones screen size.

Diagram of where UIImageView will be placed<br />

It would be much better to derive these values based on the views bounds.

Once the size / position of the UIImageView is done we go ahead and set the actual image file that we want displayed in the logoImageView

self.logoImageView.image = [UIImage imageNamed:@"logo_small.png"];

Now we need to modify the size of the Three20 launcherView so that it fits on the view properly now that we have a UIImageView being placed above it. We do this by modifying the line of code that creates the TTLauncherView.

launcherView = [[TTLauncherView alloc] initWithFrame:CGRectMake(0, 120, 320, 352)];

Previously we were setting the frame for the TTLauncherView to be the bounds of the view. Now we have to actually specify a manual frame size and position. I worked out these values from the diagram as well. Again, it would be better to derive these values based on the views bounds.

Once that is done, we just have to add the UIImageView to the view. Near the bottom of the loadView method is the code for adding the launcherView to the view

[self.view addSubview:launcherView];
[launcherView release];

Right before these lines, add some code to insert the UIImageView onto the view.

[self.view addSubview:logoImageView];
[logoImageView release];

Now you should be able to run your app and see the UIImageView above the TTLauncherView. I found on my first try that the TTLauncherItem buttons were being cut off because my logo was too big. I simply made the image smaller and recalculated the size / location to place the views.

Three20 has methods to modify the size of the TTLauncherItems, but I didn’t want to complicate things.

There’s a bunch of ways to make this better, but it works.

Using TTLauncherView

After my little rant about Three20 in a previous post I figured I should at least try to make things better for other people.

One of the first things I struggled with was getting the TTLauncherView working. I had followed the steps on the Three20 website to add the necessary files to the project but I wasn’t sure how I then got the TTLauncherView displaying on the screen.

So, to hopefully help someone else… here goes.

Start off in your AppDelegate.m file. It should have been created automatically for you when you created your project in XCode. First thing you need to do is actually include the Three20 header file.

#import "Three20/Three20.h"

I’m sure you could probably just import the TTLauncherView header file but I figured I’d just make it easier on myself and include the main Three20.h file.

After that, you need to setup the TTNavigator and the relevant view controller mappings. All this stuff needs to be done in the

-(void)applicationDidFinishLaunching:(UIApplication *)application

method.

Create the TTNavigator instance

TTNavigator *navigator = [TTNavigator navigator];

Set the navigator persistence mode

navigator.persistenceMode = TTNavigatorPersistenceModeNone;

My understanding of this is that Three20 actually keeps a record of where you are in the navigation while the app is running. This means when you close the app and reopen it, Three20 can start off from where you left it. In this case I am telling Three20 to not do that and instead the app will just start up as normal.

The next step is to setup the TTURLMap. Three20 has this neat feature where you can refer to view controllers using a URL. This actually makes working with view controllers a lot simpler, at least once you get the hang of it. NOTE: This also means you are pretty much locked into using Three20 once you start using TTURLs. If you get part way and decide you no longer want to use Three20 you are going to have to re-write everything.

Get a pointer to the navigators URL map.

TTURLMap *map = navigator.URLMap;

Use that pointer to setup all your URL mappings

[map from:@"*" toViewController:[TTWebController class]];
[map from:@"tt://launcher" toSharedViewController:[LauncherViewController class]];
[map from:@"tt://first" toViewController:[FirstViewController class]];
[map from:@"tt://second" toViewController:[SecondViewController class]];
[map from:@"tt://third" toViewController:[ThirdViewController class]];
etc
etc

After doing this you can then use the URL tt://launcher in your code to refer to your LauncherViewController (or whatever you have called it). I’ll give an example of this in a second.

Each of the ViewControllers referenced in the mapping code are standard UIViewController classes. You can actually map the URLs to any class.

After that you can actually get the launcher view controller to displaying using

[navigator openURLAction:[TTURLAction actionWithURLPath:@"tt://launcher"]];

One line of code instead of the usual 3 or 4 thats regularly needed to push a view controller onto the navigation stack. You can see there how using the URL makes things a lot easier. It took me a while to get my head around this.

So when my app starts, it will run the applicationDidFinishLaunching method and setup the mappings and then get Three20 to launch the tt://launcher URL, which is mapped to the LauncherViewController class.

Now, on to the LauncherViewController file.

My LauncherViewController is a subclass of TTViewController. I believe it has to be in order to crate the launcher view.

In the LauncherViewController.m file we setup the Launcher View in the loadView method

First we allocate and initialise the launcherView using the views bounds. This means the launcher view will take up the whole screen.

launcherView = [[TTLauncherView alloc] initWithFrame:self.view.bounds];

Then we set the background color of the launcher view.

launcherView.backgroundColor = [UIColor whiteColor];

Then we set the number of columns we want

launcherView.columnCount = 1;

In this example I’m only having one column with 3 items. You can adjust this value at anytime and Three20 will automatically reposition the icons in your launcherView to fit.

The next part involves setting up the actual items that will be displayed in the launcherView. You do this by setting the pages property of the launcherView instance.

launcherView.pages = [NSArray arrayWithObjects:
                        [NSArray arrayWithObjects:
                      [self launcherItemWithTitle:@"First" image:@"bundle://firsticon.png" URL:@"tt://first"],
                      [self launcherItemWithTitle:@"Second" image:@"bundle://secondicon.png" URL:@"tt://second"],
                       [self launcherItemWithTitle:@"Third" image:@"bundle://thirdicon.png" URL:@"tt://third"],
                       nil], nil];

This creates our pages structure. It’s an array of arrays where the inner array represents the icons on the page and the outer array represents the page. So you could define a structure that has any number of pages and on each page you have a number of icons.

Next thing we have to do is set the launcherViews delegate. In this case I’m setting the LauncherViewController as the delegate.

launcherView.delegate = self;

Once that’s done, we can add the launcherView to the LauncherViewControllers view.

[self.view addSubview:launcherView];

Then release the launcherView instance

[launcherView release];

When creating the pages above, I used a separate method to make things less cluttered. The launcherItemWithTitle method looks as follows:

-(TTLauncherItem *)launcherItemWithTitle:(NSString *)pTitle image:(NSString *)image URL:(NSString *)url
{
    TTLauncherItem *launcherItem = [[TTLauncherItem alloc] initWithTitle:pTitle image:image URL:url canDelete:YES];
    return [launcherItem autorelease];
}

All this is doing is taking the items passed in an creating a TTLauncherItem from them.

With this done, all thats left to do is to implement the necessary delegate methods.

- (void)launcherView:(TTLauncherView*)launcher didSelectItem:(TTLauncherItem*)item
{
    [[TTNavigator navigator] openURLAction:[TTURLAction actionWithURLPath:item.URL]];
}

This method is called when an item is selected from the launcherView. It’s quite simple really. Using the mappings we created earlier we simply tell the TTNavigator instance to open the URL. We create the URLAction required using the URL we set when creating each TTLauncherItem.

What this means is that when an item is tapped in the launcherView we want it to load the relevant View Controller. This will push the relevant view controller onto the navigation stack and it will be displayed.

I think that pretty much covers a basic LauncherView implementation. It’s not really that hard once you understand the way Three20 handles navigation.

It’s a lot to get your head around especially if you are starting out in iOS development. Stick with it though.

10 years

It only just dawned on me that I’ve been blogging for 10 years this year. Damn.
My archives go back to 2002, so much has changed over that time.

I really should go back read some of my old posts. I’m not sure how much of it is worth reading though.

My thoughts after using Three20 for an iOS project

I’ve recently completed an iOS project where I decided to use Three20 to implement a launcher style view.
I’d read about a lot of apps that use Three20 and thought it would be a good framework to get the hang of. Little did I know the struggle that I would have.

The first thing I had trouble with was finding good documentation. There seems to be a lot of example around the web on all sorts of Three20 stuff but none of it is really catered for beginners. I struggle for a long time just trying to get it installed and working properly. I could’t even find a simple up and running tutorial.

The second thing I had trouble with was getting community help. I subscribed to the Three20 mailing list and also joined the irc channel. Numerous times I posted asking for help on the mailing list only to have it go unanswered. My attempts to start conversations and ask for help on IRC also failed. I even sat in the channel for a number of days, every so often saying hi or hello, but no-one replied.

In the end I gave up on the mailing list and also IRC.

I stumbled my way through the app development process all the while feeling like I was being held back by Three20 rather than being empowered. It got to the stage where I felt locked into using Three20 due to my use of it URL navigation scheme. I did try to find an easy way to remove Three20 from my app but that also was a struggle that I gave up on and just battled on.

In a way it did make me learn it better, but overall I’ve hated the experience and its actually turned me off ever using another complex framework again.

In the future I’ll be sticking with simple frameworks that do a very specific thing. For everything else I’ll use the native iOS API’s and manually build what I need. At least the I know I’ll have more luck with finding help if I need it.

Perhaps once my skills get better, using Three20 (or Nimbus) will be a easier. I highly recommend beginners steer clear of it though.