Monthly Archives: December 2009

Ribbit App Delivers Voicemail Transcripts to Your iPhone [Downloads]

Ribbit Mobile, the voicemail and call-routing service that looks like a serious Google Voice rival, has launched an iPhone app to deliver voicemail transcripts with convenient call-back and SMS links, along with to-call list generation and other features.

Because Ribbit knows exactly why Google Voice was rejected from the App Store, it doesn't offer its own calling, SMS, or address book features in its iPhone app—just a convenient access point to the audio and text of your voicemail. If you want to call or SMS back somebody who left you a message, you're using the iPhone's native apps to do so. That doesn't help you hide your personal number and create a separate call-tracking list, like Google Voice does, but, given the notably better transcriptions, at least with a Business-Grade account, that’s not where Ribbit is looking to sell itself.

Ribbit Mobile is a free download for iPhones running at least the 3.1 firmware, and it requires a free Ribbit account.

Ribbit Mobile [iTunes (Direct link) via ReadWriteWeb]






Most Popular Repurposing Tricks of 2009 [Best Of 2009]

We're huge fans of repurposing here at Lifehacker—squeezing extra and usually clever uses out of every day objects. Here's a look back at out some of the most popular repurposing posts from 2009.

Rain Gutters as Cable Management Tools


We’re all about creative cable management here at Lifehacker, so we were instantly drawn to reader Seandavid010‘s rain-gutter cable management setup. Granted, you can find other cord-wrangling solutions, like the one Adam used when he made his cordless workspace, but the rain gutter approach yields impressive results. Sean was nice enough to send in his entire step-by-step, check out the full post to see it.

$5 IKEA Coat Hanger Offers Solid Cable Management


Weblog BitsOfMyMind shares a very simple idea that turns an inexpensive coat-hanger rack into a simple and streamlined cord management solution.

Back when Adam detailed how to go cordless in your workspace, he championed a $10 cable management add-on from IKEA. Many readers wrote in and said they couldn’t find the IKEA wire-manager he used, so this clever hack is a welcome addition to our cable-wrangling bag of tricks.

Open a Bottle of Wine with Your Shoe


Got a bottle of wine on hand but no corkscrew to get it open? You can argue all you want about whether or not the guy in this video really needs more wine, but you can’t argue with the results.

Make Cookies in 90 Seconds with Your Waffle Iron


Baking cookies in your oven is fine and all, but if you want to turn out some tasty cookies in a very short time, consider turning to your trusty waffle iron. Turns out you’re only 90 seconds away from crispy, chewy, cookie-goodness.

Create a Cat Haven from Ikea Shelves


The climbing trees at pet stores are ridiculously expensive and take up tons of floor space. Help your kitty jump to a royal view, Super-Mario-style, without cluttering your floor or wasting money.

Remove Splinters Using a Banana Peel


Bananas are a good source of potassium, but turns out the peels can do more than just store the fruit. Apartment Therapy outlines seven ways to put used peels to work, including removal of those inconvenient splinters. Photo by keepon.

Get More From Cheap Vodka Than a Hangover


Sooth headaches? Clean razors? Kill bees? Vodka is handy for all sorts of uses besides the traditional one. The clear and high-proof alcohol can be used for all manner of tricks. Photo by Carsten Lorentzen.

Coke Can Clean Your Toilet in a Pinch


When your toilet’s got rings and lime scale stains and you’ve got no cleaning gear on hand, grab a can of Coke out of the fridge.

Turn IKEA Cabinets Into a Cordless Desktop Stand


The new iMacs, and similar all-in-one LCD desktop systems, make for a mostly cordless computing experience. Using two pieces of IKEA furniture meant for laptops and modems, you can hide the remaining wires and up the elegance.

Disposable Mugger’s Wallet Gets You Off Scott Free or Gets You Beat Up


A mugger’s wallet is a disposable second wallet that you’re more than happy to give away to a mugger. It contains a few bucks, a non-essential ID, but not much else that would endanger your identity.

DIY Car Dash Camera Mount


Ever wished you had some high-speed chase footage after you finished tearing down the freeway after crooks? Of course you have! You need a quick, cheap DIY camera mount.

Remove Stubborn Batteries and Other Cool Magnet Tricks


As if the sheer magnetism aspect of magnets wasn’t magical enough, weblog Evil Mad Scientist Laboratories points out 17 very cool tricks that put your magnets to great use. For starters, a strong magnet can be the perfect tool to remove batteries from the grips of a stubborn spring.

Use Vicks VapoRub To Cure Toenail Fungus


We’ve heard that Vicks VapoRub can cure toenail fungus before (it’s also helpful when you’ve got a cold!), but the New York Times recently put it to the test. The results: The thyme in VapoRub can in fact do the job.

Repair a Broken Ethernet Plug with Zip Ties


We’ve all been there at some point: You’ve got a perfectly functional Ethernet cord that somewhere along the line had its tab broken off. Don’t buy a new one or re-terminate the cord. Fix it with zip ties.

Open Beer Bottles with Bic Lighters


If you lack for a piece of paper, a ring, or just don’t want to risk bursting another bottle, Wired explains the time-honored tradition of popping the top with a Bic-type lighter.

Outlet-Hanging Charge Station For Your Small Gadgets


If a full-sized charging station is overkill for your single cellphone or iPod, try this smaller gadget cradle that mounts neatly on a wall outlet. Craft blog Zakka Life put together a simple tutorial for making a cradle that's perfect for single, regularly-charged items—the kinds of things you dump out of your pockets upon returning home.


Best Repurposing Trick of 2009?(answers)

Have a favorite post from 2009 that highlights a clever use or novel way to repurpose an everyday object? Let’s hear about it in the comments.






Introduction to MapKit in iPhone OS 3.0

Introduction

Hello everyone. Welcome to another screencast. Today we will be looking into the MapKit, a new API’s made available by Apple in the iPhone OS 3.0 release. The MapKit allows simple access to the map seen in the maps application. Using GoogleMaps as its engine the map kit allows for a developer to make their own custom map interface to fit their own application. Today we will be reviewing the MapView as well as the Map Annotations that can be used to highlight points of interest in a map. We will create our own custom map app, along with custom annotations. Let’s dive in.

Skill Level Intermediate

This tutorial is one for people familiar with general Objective C development and introductory experience to the iPhone SDK. Knowledge of general Interface Builder usage and DataSource and Delegate methods are required.

Screencast

I film myself coding out the entire sample project for each post. I personally think going through the Screencast is the best way to learn. But feel free to look through the slides and text if that suites you better.

Introduction to Map Kit on iPhone OS 3.0 from Collin Ruffenach on Vimeo.

Source

iCodeBlogMap Source

Tutorial

Introduction to MapKit on iPhone OS 3.001

Introduction to MapKit on iPhone OS 3.002

Introduction to MapKit on iPhone OS 3.003

Introduction to MapKit on iPhone OS 3.004

Introduction to MapKit on iPhone OS 3.005

Introduction to MapKit on iPhone OS 3.006

Introduction to MapKit on iPhone OS 3.007

Introduction to MapKit on iPhone OS 3.008

Introduction to MapKit on iPhone OS 3.009

Introduction to MapKit on iPhone OS 3.010

Introduction to MapKit on iPhone OS 3.011

Introduction to MapKit on iPhone OS 3.012

Introduction to MapKit on iPhone OS 3.013

Introduction to MapKit on iPhone OS 3.014

Introduction to MapKit on iPhone OS 3.015

Introduction to MapKit on iPhone OS 3.016

Introduction to MapKit on iPhone OS 3.017

Introduction to MapKit on iPhone OS 3.018

Introduction to MapKit on iPhone OS 3.019

Introduction to MapKit on iPhone OS 3.020

Introduction to MapKit on iPhone OS 3.021

Introduction to MapKit on iPhone OS 3.022

iCodeBlogMapViewController.h

#import "iCodeBlogAnnotation.h"
#import "iCodeBlogAnnotationView.h"
 
@interface iCodeMapViewController : UIViewController
{
	IBOutlet UITableView *tableview;
	IBOutlet MKMapView *mapView;
	IBOutlet UIImageView *shadowImage;
}
 
@property (nonatomic, retain) IBOutlet UITableView *tableview;
@property (nonatomic, retain) IBOutlet MKMapView *mapView;
@property (nonatomic, retain) IBOutlet UIImageView *shadowImage;
 
-(void)loadOurAnnotations;
 
@end

Introduction to MapKit on iPhone OS 3.023

iCodeBlogAnnoation.h

typedef enum {
	iCodeBlogAnnotationTypeApple = 0,
	iCodeBlogAnnotationTypeEDU = 1,
	iCodeBlogAnnotationTypeTaco = 2
} iCodeMapAnnotationType;
 
@interface iCodeBlogAnnotation : NSObject
{
	CLLocationCoordinate2D coordinate;
	NSString *title;
	NSString *subtitle;
	iCodeMapAnnotationType annotationType;
}
 
@property (nonatomic) CLLocationCoordinate2D coordinate;
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *subtitle;
@property (nonatomic) iCodeMapAnnotationType annotationType;
 
@end

Introduction to MapKit on iPhone OS 3.024

Introduction to MapKit on iPhone OS 3.025

Introduction to MapKit on iPhone OS 3.026

iCodeBlogAnnoation.m

@implementation iCodeBlogAnnotation
 
@synthesize coordinate;
@synthesize title;
@synthesize subtitle;
@synthesize annotationType;
 
-init
{
	return self;
}
 
-initWithCoordinate:(CLLocationCoordinate2D)inCoord
{
	coordinate = inCoord;
	return self;
}
 
@end

Introduction to MapKit on iPhone OS 3.027

iCodeBlogAnnoationView.h

@interface iCodeBlogAnnotationView : MKAnnotationView
{
	UIImageView *imageView;
}
 
@property (nonatomic, retain) UIImageView *imageView;
 
@end

Introduction to MapKit on iPhone OS 3.028

Introduction to MapKit on iPhone OS 3.029

Introduction to MapKit on iPhone OS 3.030

Images to Use

AppleMarker

SchoolMarker

TacosMarker



iCodeBlogAnnoationView.m

#import "iCodeBlogAnnotationView.h"
 
@implementation iCodeBlogAnnotationView
 
@synthesize imageView;
 
#define kHeight 40
#define kWidth  37
#define kBorder 2
 
- (id)initWithAnnotation:(id )annotation reuseIdentifier:(NSString *)reuseIdentifier
{
	iCodeBlogAnnotation* myAnnotation = (iCodeBlogAnnotation*)annotation;
 
	if([myAnnotation annotationType] == iCodeBlogAnnotationTypeApple)
	{
		self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
		self.frame = CGRectMake(0, 0, kWidth, kHeight);
		self.backgroundColor = [UIColor clearColor];
 
		imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"AppleMarker.png"]];
		imageView.frame = CGRectMake(kBorder, kBorder, kWidth - 2 * kBorder, kWidth - 2 * kBorder);
		[self addSubview:imageView];
	}
 
	else if([myAnnotation annotationType] == iCodeBlogAnnotationTypeEDU)
	{
		self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
		self.frame = CGRectMake(0, 0, kWidth, kHeight);
		self.backgroundColor = [UIColor clearColor];
 
		imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SchoolMarker.png"]];
		imageView.frame = CGRectMake(kBorder, kBorder, kWidth - 2 * kBorder, kWidth - 2 * kBorder);
		[self addSubview:imageView];
	}
 
	else if([myAnnotation annotationType] == iCodeBlogAnnotationTypeTaco)
	{
		self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
		self.frame = CGRectMake(0, 0, kWidth, kHeight);
		self.backgroundColor = [UIColor clearColor];
 
		imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"TacosMarker.png"]];
		imageView.frame = CGRectMake(kBorder, kBorder, kWidth - 2 * kBorder, kWidth - 2 * kBorder);
		[self addSubview:imageView];
	}
 
	[imageView setContentMode:UIViewContentModeScaleAspectFill];
 
	return self;
}
 
@end

Introduction to MapKit on iPhone OS 3.031

Introduction to MapKit on iPhone OS 3.032

iCodeBlogMapViewController.m

-(void)loadOurAnnotations
{
	CLLocationCoordinate2D workingCoordinate;
 
	workingCoordinate.latitude = 40.763856;
	workingCoordinate.longitude = -73.973034;
	iCodeBlogAnnotation *appleStore1 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[appleStore1 setTitle:@"Apple Store 5th Ave."];
	[appleStore1 setSubtitle:@"Apple's Flagship Store"];
	[appleStore1 setAnnotationType:iCodeBlogAnnotationTypeApple];
 
	[mapView addAnnotation:appleStore1];
 
	workingCoordinate.latitude = 51.514298;
	workingCoordinate.longitude = -0.141949;
	iCodeBlogAnnotation *appleStore2 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[appleStore2 setTitle:@"Apple Store St. Regent"];
	[appleStore2 setSubtitle:@"London England"];
	[appleStore2 setAnnotationType:iCodeBlogAnnotationTypeApple];
 
	[mapView addAnnotation:appleStore2];
 
	workingCoordinate.latitude = 35.672284;
	workingCoordinate.longitude = 139.765702;
	iCodeBlogAnnotation *appleStore3 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[appleStore3 setTitle:@"Apple Store Giza"];
	[appleStore3 setSubtitle:@"Tokyo, Japan"];
	[appleStore3 setAnnotationType:iCodeBlogAnnotationTypeApple];
 
	[mapView addAnnotation:appleStore3];
 
	workingCoordinate.latitude = 37.331741;
	workingCoordinate.longitude = -122.030564;
	iCodeBlogAnnotation *appleStore4 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[appleStore4 setTitle:@"Apple Headquarters"];
	[appleStore4 setSubtitle:@"The Mothership"];
	[appleStore4 setAnnotationType:iCodeBlogAnnotationTypeApple];
 
	[mapView addAnnotation:appleStore4];
 
	workingCoordinate.latitude = 41.894518;
	workingCoordinate.longitude = -87.624005;
	iCodeBlogAnnotation *appleStore5 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[appleStore5 setTitle:@"Apple Store Michigan Ave."];
	[appleStore5 setSubtitle:@"Chicago, IL"];
	[appleStore5 setAnnotationType:iCodeBlogAnnotationTypeApple];
 
	[mapView addAnnotation:appleStore5];
 
	workingCoordinate.latitude = 32.264977;
	workingCoordinate.longitude = -110.944011;
	iCodeBlogAnnotation *tacoShop1 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[tacoShop1 setTitle:@"Nico's Taco Shop"];
	[tacoShop1 setSubtitle:@"Tucson, AZ"];
	[tacoShop1 setAnnotationType:iCodeBlogAnnotationTypeTaco];
 
	[mapView addAnnotation:tacoShop1];
 
	workingCoordinate.latitude = 32.743242;
	workingCoordinate.longitude = -117.181451;
	iCodeBlogAnnotation *tacoShop2 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[tacoShop2 setTitle:@"Lucha Libre Gourmet"];
	[tacoShop2 setSubtitle:@"San Diego, CA"];
	[tacoShop2 setAnnotationType:iCodeBlogAnnotationTypeTaco];
 
	[mapView addAnnotation:tacoShop2];
 
	workingCoordinate.latitude = 32.594987;
	workingCoordinate.longitude = -117.060936;
	iCodeBlogAnnotation *tacoShop3 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[tacoShop3 setTitle:@"El Ranchero Taco Shop"];
	[tacoShop3 setSubtitle:@"Rocky Pointe, Mexico"];
	[tacoShop3 setAnnotationType:iCodeBlogAnnotationTypeTaco];
 
	[mapView addAnnotation:tacoShop3];
 
	workingCoordinate.latitude = -34.594859;
	workingCoordinate.longitude = -58.384336;
	iCodeBlogAnnotation *tacoShop4 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[tacoShop4 setTitle:@"Taco Tequila Sangria S.A."];
	[tacoShop4 setSubtitle:@"Buneos Aires, Argentina"];
	[tacoShop4 setAnnotationType:iCodeBlogAnnotationTypeTaco];
 
	[mapView addAnnotation:tacoShop4];
 
	workingCoordinate.latitude = 38.240550;
	workingCoordinate.longitude = -0.526509;
	iCodeBlogAnnotation *tacoShop5 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[tacoShop5 setTitle:@"Albertsma Taco"];
	[tacoShop5 setSubtitle:@"Gran Alacant, Spain"];
	[tacoShop5 setAnnotationType:iCodeBlogAnnotationTypeTaco];
 
	[mapView addAnnotation:tacoShop5];
 
	workingCoordinate.latitude = 33.419490;
	workingCoordinate.longitude = -111.930563;
	iCodeBlogAnnotation *school1 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[school1 setTitle:@"Arizona State University"];
	[school1 setSubtitle:@"Go Sun Devils"];
	[school1 setAnnotationType:iCodeBlogAnnotationTypeEDU];
 
	[mapView addAnnotation:school1];
 
	workingCoordinate.latitude = 35.087537;
	workingCoordinate.longitude = -106.618184;
	iCodeBlogAnnotation *school2 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[school2 setTitle:@"University of New Mexico"];
	[school2 setSubtitle:@"Go Lobos"];
	[school2 setAnnotationType:iCodeBlogAnnotationTypeEDU];
 
	[mapView addAnnotation:school2];
 
	workingCoordinate.latitude = 40.730838;
	workingCoordinate.longitude = -73.997498;
	iCodeBlogAnnotation *school3 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[school3 setTitle:@"New York University"];
	[school3 setSubtitle:@"New York, NY"];
	[school3 setAnnotationType:iCodeBlogAnnotationTypeEDU];
 
	[mapView addAnnotation:school3];
 
	workingCoordinate.latitude = 51.753523;
	workingCoordinate.longitude = -1.253171;
	iCodeBlogAnnotation *school4 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[school4 setTitle:@"Oxford University"];
	[school4 setSubtitle:@"Oxford, England"];
	[school4 setAnnotationType:iCodeBlogAnnotationTypeEDU];
 
	[mapView addAnnotation:school4];
 
	workingCoordinate.latitude = 22.131982;
	workingCoordinate.longitude = 82.142302;
	iCodeBlogAnnotation *school5 = [[iCodeBlogAnnotation alloc] initWithCoordinate:workingCoordinate];
	[school5 setTitle:@"India Institute of Technology"];
	[school5 setSubtitle:@"Delhi, India"];
	[school5 setAnnotationType:iCodeBlogAnnotationTypeEDU];
 
	[mapView addAnnotation:school5];
}

Introduction to MapKit on iPhone OS 3.033

iCodeblogMapViewController.m

- (iCodeBlogAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation
{
	iCodeBlogAnnotationView *annotationView = nil;
 
	// determine the type of annotation, and produce the correct type of annotation view for it.
	iCodeBlogAnnotation* myAnnotation = (iCodeBlogAnnotation *)annotation;
 
	if(myAnnotation.annotationType == iCodeBlogAnnotationTypeApple)
	{
		NSString* identifier = @"Apple";
		iCodeBlogAnnotationView *newAnnotationView = (iCodeBlogAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
 
		if(nil == newAnnotationView)
		{
			newAnnotationView = [[[iCodeBlogAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease];
		}
 
		annotationView = newAnnotationView;
	}
	else if(myAnnotation.annotationType == iCodeBlogAnnotationTypeEDU)
	{
		NSString* identifier = @"School";
 
		iCodeBlogAnnotationView *newAnnotationView = (iCodeBlogAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
 
		if(nil == newAnnotationView)
		{
			newAnnotationView = [[[iCodeBlogAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease];
		}
 
		annotationView = newAnnotationView;
	}
	else if(myAnnotation.annotationType == iCodeBlogAnnotationTypeTaco)
	{
		NSString* identifier = @"Taco";
 
		iCodeBlogAnnotationView *newAnnotationView = (iCodeBlogAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];
 
		if(nil == newAnnotationView)
		{
			newAnnotationView = [[[iCodeBlogAnnotationView alloc] initWithAnnotation:myAnnotation reuseIdentifier:identifier] autorelease];
		}
 
		annotationView = newAnnotationView;
	}
 
	[annotationView setEnabled:YES];
	[annotationView setCanShowCallout:YES];
 
	return annotationView;
}

Introduction to MapKit on iPhone OS 3.034

Introduction to MapKit on iPhone OS 3.035

iCodeBlogMapViewController.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 3;
}

Introduction to MapKit on iPhone OS 3.036

iCodeBlogMapViewController.m

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
	if(section == iCodeBlogAnnotationTypeApple)
	{
		return @"Apple Markers";
	}
 
	else if(section == iCodeBlogAnnotationTypeEDU)
	{
		return @"Schools";
	}
 
	else if(section == iCodeBlogAnnotationTypeTaco)
	{
		return @"Taco Shops";
	}
 
	return nil;
}

Introduction to MapKit on iPhone OS 3.037

iCodeBlogMapViewController.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
	return 5;
}

Introduction to MapKit on iPhone OS 3.038

Introduction to MapKit on iPhone OS 3.039

iCodeBlogMapViewController.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 
	if (cell == nil)
	{
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
 
	NSMutableArray *annotations = [[NSMutableArray alloc] init];
 
	if(indexPath.section == 0)
	{
		for(iCodeBlogAnnotation *annotation in [mapView annotations])
		{
			if([annotation annotationType] == iCodeBlogAnnotationTypeApple)
			{
				[annotations addObject:annotation];
			}
		}
 
		cell.textLabel.text = [[annotations objectAtIndex:indexPath.row] title];
	}
 
	else if(indexPath.section == 1)
	{
		for(iCodeBlogAnnotation *annotation in [mapView annotations])
		{
			if([annotation annotationType] == iCodeBlogAnnotationTypeEDU)
			{
				[annotations addObject:annotation];
			}
		}
 
		cell.textLabel.text = [[annotations objectAtIndex:indexPath.row] title];
	}
 
	else if(indexPath.section == 2)
	{
		for(iCodeBlogAnnotation *annotation in [mapView annotations])
		{
			if([annotation annotationType] == iCodeBlogAnnotationTypeTaco)
			{
				[annotations addObject:annotation];
			}
		}
 
		cell.textLabel.text = [[annotations objectAtIndex:indexPath.row] title];
	}
 
    return cell;
}

Introduction to MapKit on iPhone OS 3.040

Introduction to MapKit on iPhone OS 3.041

iCodeBlogMapViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
	for(iCodeBlogAnnotation *annotation in [mapView annotations])
	{
		if([[[[tableView cellForRowAtIndexPath:indexPath] textLabel] text] isEqualToString:[annotation title]])
		{
			[mapView setRegion:MKCoordinateRegionMake([annotation coordinate], MKCoordinateSpanMake(.01, .01)) animated:YES];
		}
	}
}

Autocomplete Extension Makes Chrome Save Nearly Any Password [Downloads]

Chrome: Some web sites, like personal banking portals, rightfully ask your browser not to remember your password. Others are just weirdly against convenience. The Autocomplete = On extension for Google Chrome forces sites to let you make the auto-password call.

We’ve previously featured a handy Password Saver bookmarklet, which also works with Chrome, as a solution to converting certain web forms away from their password saving protections. If you’d rather not have to hit the button and manually prompt your browser to let you go ahead and save your flipping Flickr password, or discretely remember actually secure sites, Autocomplete = On is a nice little install-and-forget solution for Chrome.

The major concern should be Chrome’s lack of a Master Password feature, a la Firefox’s essential security tool. Anyone with access to Chrome would have access to your auto-password sites, so consider implementing other measures, like stronger system user passwords and encrypted browser data, before getting too familiar with keeping everything inside Chrome.

Autocomplete = On is a free download, and works in Google Chrome builds that accept extensions (Dev version on Windows, beta on Linux).

Autocomplete = on [Google Chrome Extensions via Tombuntu]






Nerrot Is the Simplest, Least Spammy Torrent Site You’ll Ever Use [BitTorrent]

If you’re a BitTorrent lover but aren’t too keen on all the pop-ups, racy ads, and clutter that’s everywhere on most torrent sites, new BitTorrent site Nerrot is the cleanest, most bare-bones torrent site we’ve ever seen.

Just head to the homepage (this is also the only page on the site), type in the most accurate search you can come up with, and submit your search. Nerrot searches for the closest match with the highest ratio of seeders/the healthiest swarm, then automatically downloads what it determines to be the best torrent file for your search.

Nerrot is refreshing in its simplicity, but the fact remains that for a lot of torrents, it’s still going to be worth your time to read through comments and check different versions yourself before downloading. For those times you don’t really care, Nerrot is like the Google “I’m feeling lucky” search of BitTorrent sites.






Printable Household Planner Keeps Your Home Running Smoothly [Printables]

With busy lives, it’s easy to let chores around the house slip through the cracks. Corral the details into this customized planner to help you track everything from daily chores to when you need to change the furnace filter.

Organization guru Donna Young created dozens of planner template pages in two sizes that let you create a household planner system that works for you. All the templates are free to download as PDF files that can be opened with any standard PDF reader.

Planner categories are broken down by calendar style and use. For instance, you might want to grab a two-page block calendar to keep track of monthly chores, and then skip over to the Kitchen category to snag a shopping list or weekly menu. Also be sure to check out the yearly housework reminder sheet, project planning pages, and the chore chart that’s good for adults or kids (why let them off the hook?).

Once you decide what size you want your planner to be—full- or half-size— just print them out and pop them in a binder. You can use the forms just as they are, or convert them to DOC format for further editing. Most of the templates are blank so you'll need to fill in the blanks yourself. If you need some ideas for what needs to get done around the house on a daily, weekly, and monthly basis, we’ve got you covered.






Google DNS Helper Offers No-Commitment Google DNS Try-Outs [Downloads]

Windows: Want to give Google Public DNS a go to see if it really speeds up your web browsing, but don’t want to muck with your router and network? Google DNS Helper offers single-computer tryouts of the search firm’s servers.

We’ve previously detailed how you can try out numerous public DNS servers on a machine to see which servers do the fastest job of converting names to IP addresses. In the U.S., at least, Google doesn’t usually win in the numbers alone, but you might want to see for yourself if there’s an effect noticeable to the human eye.

A coder going by the name of Prasannah has released a tiny, no-install-needed Windows app that switches just the computer it’s running on over to Google Public DNS, and backs up your DNS configuration before it does so. Browse around, see if web sites pop up any speedier, and when you’re ready to switch back, just hit the other button.

Speed, of course, isn’t everything, which is why we still consider OpenDNS a speedy, but also safe, DNS solution. Still, if you want to try out Google’s (surprisingly) ad-free, optimized DNS experience, this app is the way to go. Google DNS Helper is a free download for Windows systems only.






Disktective Helps You Visualize Hard Drive Usage [Download]

Windows: If you’re on the hunt for which folder and files are chewing up the most hard drive space, Disktective is a free and portable app that makes short work of it.

Disktective scans any drive or folder you point it at and returns a list of the folder and files sizes container therein and a pie chart displaying the portion of the disk or folder in use by the folder or files in question. Once you scan you can drill down through any sub-folders and the chart will automatically update to reflect the ratio in the new folder.

If you want to visualize your data as a radial map, check out previously reviewed OverDisk, and definitely check out our guide to managing your diskspace with the popular WinDirStat and JDiskReport. Diskective is free, portable, and Windows only.






More Scrollbars

I’ve written about scrollbars in Google Wave, OPEN LOOK and Picasa. Here are some more.

Google’s Real-Time Search

The people at Google seem to love doing custom scrollbars. Rémy Rakic points out that real-time search features another one:

Google Real-Time Search Scrollbar

This one behaves quite like a regular scrollbar, but is actually implemented in HTML and JavaScript.

Blender

Peter Gassner notes that Blender 2.5 enhances scrollbars in an interesting way. Users can use the scrollbars to zoom the visible part of the view by dragging the dots at the end of the scrollbars:

Blender's Scrollbars

Christopher Fahey tells me that some music apps feature similar «zooming» scrollbars. Chris Clark offers this example, found in Apple’s Soundtrack Pro:

Soundtrack Pro

Aperture, Evernote

Ben Sargent writes that Aperture has a small «auto-scroll» widget on its scrollbar:

Aperture's Scrollbar

Clicking on this widget scrolls the view without requiring the user to move the mouse, similar to Picasa’s scrollbar. zx ads that Evernote on Windows features a similar split scrollbar with a «regular» part and an «auto-scroll» part.

If you require a short url to link to this article, please use ignco.de/232

Update Your Google Account Password Recovery Options

Now that you’re auditing your online account security, log into your Google account(s) and visit the Account Recovery Options page. Here you can update your secret question and answer, your secondary email address, and even associate your mobile phone number with your account so you can get a password recovery code via text message. (Just a tip: don’t set your Google Voice number as the phone number or automatically forward mail from your secondary email accounts to your Gmail account–if you do, in the event that you lose your password, the recovery process won’t work.)

WP Like Button Plugin by Free WordPress Templates