Monday, November 24, 2008

Shameless Post

Today, I noticed that the book reached #213 on Amazon's overall rank. I never expected it to break 500 and was doubtful about 500. The fact that it's been hovering around 300 for a week, and now has come close to 200 is just got me feeling peachy.



Edit: We seem to have peaked at 147 and have now backed off a bit, but are still doing well.

Edit 2: Went back down to 139 tonight, and we've made Amazon's hot new arrival list. We've climbed ahead of Martha Stewart's book as well as I Can Haz Cheeseburger.




Sunday, November 23, 2008

Scratch That

Dave and I won't be appearing on iPhone Alley this week, we got bumped so they would have time to cover the the 2.2 release. I'll let you know if we get rescheduled.



Friday, November 21, 2008

A Novel Business Model

Here's a company that gives away their iPhone apps, but sells the underlying source code. Interesting approach, and I'm sure there is a market for good iPhone libraries and source code. The only shortcoming that I see is that there's no way to know how good the underlying code is. This company's apps undoubtedly look nice, but a pretty GUI is no guarantee of well-written code. The underlying code could be stellar, or it could be functional but disorganized and poorly written, and there's really no way to know without shelling out the cash. Unfortunately, the people who can benefit the most from code like this are the ones least able to distinguish between good and bad code.

That creates a bit of a catch-22 for the company. If they show people the code, it's hard to keep people from using it, but buying something sight unseen makes some people (like me) a little nervous. It's like buying a mystery bag, or playing the lottery, neither of which I would ever do.

If I were them, I'd probably try and get some testimonials from some respected developers - get a few people with some know-how to say "yeah, their code is good". I think it would make people more comfortable about shelling out cash to buy source code they can't look at first.

Note: I've heard from someone who has bought one of the source code projects, and the feedback was positive. This person said the code was "well organized" and "clean", though he hadn't had a chance to look at it in detail yet. That's definitely good news for the Tausendstern folks, and for their potential customers. I've decided to purchase the package and take a look for myself - I'll give a report here when I do.




iPhone Alley

Looks like Dave and I are going to make an appearance on the iPhone Alley Podcast next week. We're recording on Sunday night, so I would imagine the podcast will be available not more than a few days later. I'll post again with the URL when the podcast is actually available.

We've got a few more interviews being lined up, but if you've got a podcast, magazine, or blog with an iPhone-savvy audience, we've love to talk to you.

We're also trying to figure out about MacWorld. Dave and I were hoping to go there in some official capacity, being on a panel, or signing books, but that's starting to look unlikely. I will probably still be there, but just as an attendee, and I would love the opportunity to meet some new folks and re-connect with others while I'm out there.



Adding Photos to iPhone Library

Here's a tip I picked up from the iPhoneDevSDK forums courtesy of member hikinks.

The iPhone simulator comes with some sample images installed so that you can use and test the Image Picker and other functionality. The only problem is, if you clear the cache, or delete the ~/Library/Application Support/iPhone Simulator folder, you lose them.

You can put any photos you want in the library, however, to get them to show up, you need to put them in the right place and give them the correct names. Place your images in
~/Library/Application Support/iPhone Simulator/User/Media/DCIM/100APPLE

creating any folders that do not exist.

Now, rename the image files you want in your simulator's photo library using the following naming convention:

IMG_0000.JPG
IMG_0001.JPG
IMG_0002.JPG

Remember - unlike the Mac, the iPhone's file system is case sensitive, so make sure you use uppercase letters.

That will put them in the photo album. You do not see thumbnails though. To get thumbnails, you have to manually make re-sized copies of each image that are resized to 96x96 pixels. The thumbnail for a particular image should have the same name as the image it is a thumbnail for, but instead of a .JPG extension, it should have a .THM extension.


The Of Code and Men blog has a bash script that will functions for copying the files onto the simulator.

Edit: I've been told that there's an easier way - that you can simply drag an image onto the Simulator window when it's running and that will open the image in Mobile Safari and then let you add the image to the Simulator's Photo Library. I've found that to be half true - I can get the image from my computer to open in Mobile Safari in the Simulator, but the path from there to the Photo Library is not obvious to me if it exists.




iPhone SDK & OS 2.2 is Out

I'm a little slow on the ball this morning - usually the iPhone Dev Center is one of my first stops on my morning routine, but somehow didn't go there this morning. Was alerted to the fact that 2.2 is now the release version via a tweet. You should update your iPhone or iPod Touch via iTunes before installing the 2.2 SDK.

If my understanding is correct, that means 2.2 can now be openly discussed. Wonder how long it is until we start getting seeded 2.3 betas?

Edit: You should download the 2.2 SDK, THEN update your phone through iTunes, and then install the SDK. Once you update your phone, you will be unable to continue using it as a development device until you install the 2.2 SDK, and right now, throughput on the download isn't that great.




Thursday, November 20, 2008

Very Nice

Today, our book got a very nice plug from distorted-loop.com, with even a quote from my co-author. Big thanks to those folks for the kind words. If you're into music and technology, you should check them out.

Also, no a completely unrelated note, the holiday shopping season has arrived early this year. I know this because all the Google advertisements on the blogs I read have switched from iPhone and Mac related stuff to jewelry, perfume, and other such things.



"Officially" released

I guess the book is now officially released. Although Amazon has been filling pre-orders for almost a week now, the official press release didn't go out until yesterday, whichi s about the time that Amazon changed from "Usually ships in 4-7 weeks" to "In Stock".

Our Amazon rank jumped below #500 overall today. It probably won't stay down there - this is a niche book after all - but it feels good to see it even get to visit down there, not to mention seeing it be the #1 book in three categories to boot. I know these numbers are transient, but it does the ego good.

The official Book Website is live now, as are support forums where you can ask questions, get help, and find errata.



Daring Fireball on Google's use of Private APIs

Here is an interesting posting, and nice bit of detective work on the part of John Gruber with some help from Robert Marini. I often agree with Mr. Gruber, but I especially agree with the sentiment of this posting, I do think the chances that the app just slipped through the approval process are greater than he seems to, though: I think it's very possible that the app just slipped through and wasn't actually given special consideration.

But if Google was given special consideration, then I completely agree that that sucks.

Edit: Here's another blog posting that expands on the theory. Thanks, Prasad!




Thursday, November 13, 2008

Book is Shipping

If you pre-ordered our iPhone book from Amazon, you should receive a shipment notification in the next day or two, if you haven't already. They still have two in stock after filling pre-orders.



Creating Transparent UIViews - a Rounded Rect View

I recently needed a view that had the shape of a rounded rectangle. Drawing a rounded rect using Core Graphics isn't particularly hard. As a matter of fact, the QuartzDemo sample code shows one way to do it. So, I dutifully created the view to draw a rounded rect. No matter what I did, however, it drew white all the way to the boundary of the view. My first version of the rounded rectangle view came out decidedly non-rounded.

The problem was that I was using the backgroundColor property inherited from UIView to identify what color to draw the rounded rectangle. But, and here's the point to remember today: if you need objects below yours to show through parts of your view without using alpha, the backgroundColor property MUST be set to [UIColor clearColor]. This is true even if you do not call drawRect on super.

The other thing you need to do is make sure that the opaqueproperty is set to NO. Ordinarily, opaque should be set to YES as an optimization, but that optimization isn't available to us if we want stuff to show through from below.

My second attempt at a rounded rectangle view was decidedly more rounded:

Because I knew that I would likely have need of a rounded rectangle view in the future, I wrote it generically. And, here it is, may it serve you well:

RoundedRectView.h
//
// RoundedRectView.h
//
// Created by Jeff LaMarche on 11/13/08.

#import <UIKit/UIKit.h>

#define kDefaultStrokeColor [UIColor whiteColor]
#define kDefaultRectColor [UIColor whiteColor]
#define kDefaultStrokeWidth 1.0
#define kDefaultCornerRadius 30.0

@interface RoundedRectView : UIView {
UIColor *strokeColor;
UIColor *rectColor;
CGFloat strokeWidth;
CGFloat cornerRadius;
}
@property (nonatomic, retain) UIColor *strokeColor;
@property (nonatomic, retain) UIColor *rectColor;
@property CGFloat strokeWidth;
@property CGFloat cornerRadius;
@end



RoundedRectView.m
//
// RoundedRectView.m
//
// Created by Jeff LaMarche on 11/13/08.

#import "RoundedRectView.h"

@implementation RoundedRectView
@synthesize strokeColor;
@synthesize rectColor;
@synthesize strokeWidth;
@synthesize cornerRadius;
- (id)initWithCoder:(NSCoder *)decoder
{
if (self = [super initWithCoder:decoder])
{
self.strokeColor = kDefaultStrokeColor;
self.backgroundColor = [UIColor clearColor];
self.strokeWidth = kDefaultStrokeWidth;
self.rectColor = kDefaultRectColor;
self.cornerRadius = kDefaultCornerRadius;
}
return self;
}
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
// Initialization code
self.opaque = NO;
self.strokeColor = kDefaultStrokeColor;
self.backgroundColor = [UIColor clearColor];
self.rectColor = kDefaultRectColor;
self.strokeWidth = kDefaultStrokeWidth;
self.cornerRadius = kDefaultCornerRadius;
}
return self;
}
- (void)setBackgroundColor:(UIColor *)newBGColor
{
// Ignore any attempt to set background color - backgroundColor must stay set to clearColor
// We could throw an exception here, but that would cause problems with IB, since backgroundColor
// is a palletized property, IB will attempt to set backgroundColor for any view that is loaded
// from a nib, so instead, we just quietly ignore this.
//
// Alternatively, we could put an NSLog statement here to tell the programmer to set rectColor...
}
- (void)setOpaque:(BOOL)newIsOpaque
{
// Ignore attempt to set opaque to YES.
}
- (void)drawRect:(CGRect)rect {

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, strokeWidth);
CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);
CGContextSetFillColorWithColor(context, self.rectColor.CGColor);

CGRect rrect = self.bounds;

CGFloat radius = cornerRadius;
CGFloat width = CGRectGetWidth(rrect);
CGFloat height = CGRectGetHeight(rrect);

// Make sure corner radius isn't larger than half the shorter side
if (radius > width/2.0)
radius = width/2.0;
if (radius > height/2.0)
radius = height/2.0;

CGFloat minx = CGRectGetMinX(rrect);
CGFloat midx = CGRectGetMidX(rrect);
CGFloat maxx = CGRectGetMaxX(rrect);
CGFloat miny = CGRectGetMinY(rrect);
CGFloat midy = CGRectGetMidY(rrect);
CGFloat maxy = CGRectGetMaxY(rrect);
CGContextMoveToPoint(context, minx, midy);
CGContextAddArcToPoint(context, minx, miny, midx, miny, radius);
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, radius);
CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, radius);
CGContextAddArcToPoint(context, minx, maxy, minx, midy, radius);
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFillStroke);
}

- (void)dealloc {
[strokeColor release];
[rectColor release];
[super dealloc];
}

@end





A Note on Code Samples

For the record, any code that I post on this blog can be freely used for any purpose without restriction or limitation. You do not need to ask permission, nor do you need to attribute me.

I will make it clear in the posting if any code is released under other terms. I would only do that if I had to, because (for example) the code was based on existing code that used a viral license, or the code was written for a client that insists on a license in order to allow me to distribute it

But, if I don't clearly state that there are restrictions or limitations, assume there are none.



Wednesday, November 12, 2008

Testing Code Signing

Another hugely helpful blog posting from Craig Hockenberry about how to test your codesigned apps. I'd put this posting as a must-read for anyone compiling their apps for the App Store.



More Colors, More Compact

Whenever I have need of a new color in a project, I add new methods to my UIColor(MoreColors) category. I recently refactored it to be more compact and to require less typing to add a new color. I'm pulling the color names and definitions from Wikipedia.

Edit: I got tired of doing these piecemeal, so I decided to use awk to generate a category that includes all the colors that Wikipedia lists.

I'm normally not someone to skimp on vertical space, but compacting this just fell right, makes it more comprehensible. Consistency, after all, is the hobgoblin of little minds.

For those playing along at home, here is where it currently stands:

UIColor-MoreColors.h
//
// UIColor-MoreColors.h
//
// Created by Jeff LaMarche on 9/29/08.

#import <UIKit/UIKit.h>

@interface UIColor(MoreColors)
+ (id)aliceBlue;
+ (id)alizarin;
+ (id)amaranth;
+ (id)amber;
+ (id)amethyst;
+ (id)apricot;
+ (id)aqua;
+ (id)aquamarine;
+ (id)armyGreen;
+ (id)asparagus;
+ (id)atomicTangerine;
+ (id)auburn;
+ (id)azure;
+ (id)azureWeb;
+ (id)babyBlue;
+ (id)beige;
+ (id)bistre;
+ (id)black;
+ (id)blue;
+ (id)pigmentBlue;
+ (id)rybBlue;
+ (id)blueGreen;
+ (id)blueViolet;
+ (id)bondiBlue;
+ (id)brass;
+ (id)brightGreen;
+ (id)brightPink;
+ (id)brightTurquoise;
+ (id)brilliantRose;
+ (id)britishRacingGreen;
+ (id)bronze;
+ (id)brown;
+ (id)buff;
+ (id)burgundy;
+ (id)burntOrange;
+ (id)burntSienna;
+ (id)burntUmber;
+ (id)camouflageGreen;
+ (id)caputMortuum;
+ (id)cardinal;
+ (id)carmine;
+ (id)carnationPink;
+ (id)carolinaBlue;
+ (id)carrotOrange;
+ (id)celadon;
+ (id)cerise;
+ (id)cerulean;
+ (id)ceruleanBlue;
+ (id)champagne;
+ (id)charcoal;
+ (id)chartreuse;
+ (id)chartreuseWeb;
+ (id)cherryBlossomPink;
+ (id)chestnut;
+ (id)chocolate;
+ (id)cinnabar;
+ (id)cinnamon;
+ (id)cobalt;
+ (id)columbiaBlue;
+ (id)copper;
+ (id)copperRose;
+ (id)coral;
+ (id)coralRed;
+ (id)corn;
+ (id)cornflowerBlue;
+ (id)cosmicLatte;
+ (id)cream;
+ (id)crimson;
+ (id)cyan;
+ (id)processCyan;
+ (id)darkBlue;
+ (id)darkBrown;
+ (id)darkCerulean;
+ (id)darkChestnut;
+ (id)darkCoral;
+ (id)darkGoldenrod;
+ (id)darkGreen;
+ (id)darkKhaki;
+ (id)darkPastelGreen;
+ (id)darkPink;
+ (id)darkScarlet;
+ (id)darkSalmon;
+ (id)darkSlateGray;
+ (id)darkSpringGreen;
+ (id)darkTan;
+ (id)darkTurquoise;
+ (id)darkViolet;
+ (id)deepCerise;
+ (id)deepChestnut;
+ (id)deepFuchsia;
+ (id)deepLilac;
+ (id)deepMagenta;
+ (id)deepPeach;
+ (id)deepPink;
+ (id)denim;
+ (id)dodgerBlue;
+ (id)ecru;
+ (id)egyptianBlue;
+ (id)electricBlue;
+ (id)electricGreen;
+ (id)electricIndigo;
+ (id)electricLime;
+ (id)electricPurple;
+ (id)emerald;
+ (id)eggplant;
+ (id)faluRed;
+ (id)fernGreen;
+ (id)firebrick;
+ (id)flax;
+ (id)forestGreen;
+ (id)frenchRose;
+ (id)fuchsia;
+ (id)fuchsiaPink;
+ (id)gamboge;
+ (id)metallicGold;
+ (id)goldWeb;
+ (id)goldenBrown;
+ (id)goldenYellow;
+ (id)goldenrod;
+ (id)greyAsparagus;
+ (id)green;
+ (id)greenWeb;
+ (id)pigmentGreen;
+ (id)rybGreen;
+ (id)greenYellow;
+ (id)grey;
+ (id)hanPurple;
+ (id)harlequin;
+ (id)heliotrope;
+ (id)hollywoodCerise;
+ (id)hotMagenta;
+ (id)hotPink;
+ (id)indigo;
+ (id)indigoWeb;
+ (id)internationalKleinBlue;
+ (id)internationalOrange;
+ (id)islamicGreen;
+ (id)ivory;
+ (id)jade;
+ (id)kellyGreen;
+ (id)khaki;
+ (id)lightKhaki;
+ (id)lavender;
+ (id)lavenderWeb;
+ (id)lavenderBlue;
+ (id)lavenderBlush;
+ (id)lavenderGrey;
+ (id)lavenderMagenta;
+ (id)lavenderPink;
+ (id)lavenderPurple;
+ (id)lavenderRose;
+ (id)lawnGreen;
+ (id)lemon;
+ (id)lemonChiffon;
+ (id)lightBlue;
+ (id)lightPink;
+ (id)lilac;
+ (id)lime;
+ (id)limeWeb;
+ (id)limeGreen;
+ (id)linen;
+ (id)magenta;
+ (id)magentaDye;
+ (id)processMagenta;
+ (id)magicMint;
+ (id)magnolia;
+ (id)malachite;
+ (id)maroonWeb;
+ (id)maroon;
+ (id)mayaBlue;
+ (id)mauve;
+ (id)mauveTaupe;
+ (id)mediumBlue;
+ (id)mediumCarmine;
+ (id)mediumLavenderMagenta;
+ (id)mediumPurple;
+ (id)mediumSpringGreen;
+ (id)midnightBlue;
+ (id)mintGreen;
+ (id)mistyRose;
+ (id)mossGreen;
+ (id)mountbattenPink;
+ (id)mustard;
+ (id)myrtle;
+ (id)navajoWhite;
+ (id)navyBlue;
+ (id)ochre;
+ (id)officeGreen;
+ (id)oldGold;
+ (id)oldLace;
+ (id)oldLavender;
+ (id)oldRose;
+ (id)olive;
+ (id)oliveDrab;
+ (id)olivine;
+ (id)orange;
+ (id)rybOrange;
+ (id)orangeWeb;
+ (id)orangePeel;
+ (id)orangeRed;
+ (id)orchid;
+ (id)paleBlue;
+ (id)paleBrown;
+ (id)paleCarmine;
+ (id)paleChestnut;
+ (id)paleCornflowerBlue;
+ (id)paleMagenta;
+ (id)palePink;
+ (id)paleRedViolet;
+ (id)papayaWhip;
+ (id)pastelGreen;
+ (id)pastelPink;
+ (id)peach;
+ (id)peachOrange;
+ (id)peachYellow;
+ (id)pear;
+ (id)periwinkle;
+ (id)persianBlue;
+ (id)persianGreen;
+ (id)persianIndigo;
+ (id)persianOrange;
+ (id)persianRed;
+ (id)persianPink;
+ (id)persianRose;
+ (id)persimmon;
+ (id)pineGreen;
+ (id)pink;
+ (id)pinkOrange;
+ (id)platinum;
+ (id)plum;
+ (id)powderBlue;
+ (id)puce;
+ (id)prussianBlue;
+ (id)psychedelicPurple;
+ (id)pumpkin;
+ (id)purpleWeb;
+ (id)purple;
+ (id)purpleTaupe;
+ (id)rawUmber;
+ (id)razzmatazz;
+ (id)red;
+ (id)pigmentRed;
+ (id)rybRed;
+ (id)redBiolet;
+ (id)richCarmine;
+ (id)robinEggBlue;
+ (id)rose;
+ (id)roseMadder;
+ (id)roseTaupe;
+ (id)royalBlue;
+ (id)royalPurple;
+ (id)ruby;
+ (id)russet;
+ (id)rust;
+ (id)safetyOrange;
+ (id)blazeOrange;
+ (id)saffron;
+ (id)salmon;
+ (id)sandyBrown;
+ (id)sangria;
+ (id)sapphire;
+ (id)scarlet;
+ (id)schoolBusYellow;
+ (id)seaGreen;
+ (id)seashell;
+ (id)selectiveYellow;
+ (id)sepia;
+ (id)shamrockGreen;
+ (id)shockingPink;
+ (id)silver;
+ (id)skyBlue;
+ (id)slateGrey;
+ (id)smalt;
+ (id)springBud;
+ (id)springGreen;
+ (id)steelBlue;
+ (id)tan;
+ (id)tangerine;
+ (id)tangerineYellow;
+ (id)taupe;
+ (id)teaGreen;
+ (id)teaRoseOrange;
+ (id)teaRose;
+ (id)teal;
+ (id)tawny;
+ (id)terraCotta;
+ (id)thistle;
+ (id)tomato;
+ (id)turquoise;
+ (id)tyrianPurple;
+ (id)ultramarine;
+ (id)unitedNationsBlue;
+ (id)vegasGold;
+ (id)vermilion;
+ (id)violet;
+ (id)violetWeb;
+ (id)rybViolet;
+ (id)viridian;
+ (id)wheat;
+ (id)white;
+ (id)wisteria;
+ (id)yellow;
+ (id)processYellow;
+ (id)rybYellow;
+ (id)yellowGreen;
+ (id)zinnwaldite;
@end



UIColor-MoreColors.m
//
// UIColor-MoreColors.m
//
// Created by Jeff LaMarche on 9/29/08.

#import "UIColor-MoreColors.h"

#define vendColor(r, g, b) static UIColor *ret; if (ret == nil) ret = [[UIColor colorWithRed:(CGFloat)r/255.0 green:(CGFloat)g/255.0 blue:(CGFloat)b/255.0 alpha:1.0] retain]; return ret

@implementation UIColor(MoreColors)
+ (id)aliceBlue {vendColor(240, 248, 255);}
+ (id)alizarin {vendColor(227, 38, 54);}
+ (id)amaranth {vendColor(229, 43, 80);}
+ (id)amber {vendColor(255, 191, 0);}
+ (id)amethyst {vendColor(153, 102, 204);}
+ (id)apricot {vendColor(251, 206, 177);}
+ (id)aqua {vendColor(0, 255, 255);}
+ (id)aquamarine {vendColor(127, 255, 212);}
+ (id)armyGreen {vendColor(75, 83, 32);}
+ (id)asparagus {vendColor(123, 160, 91);}
+ (id)atomicTangerine {vendColor(255, 153, 102);}
+ (id)auburn {vendColor(111, 53, 26);}
+ (id)azure {vendColor(0, 127, 255);}
+ (id)azureWeb {vendColor(240, 255, 255);}
+ (id)babyBlue {vendColor(224, 255, 255);}
+ (id)beige {vendColor(245, 245, 220);}
+ (id)bistre {vendColor(61, 43, 31);}
+ (id)black {vendColor(0, 0, 0);}
+ (id)blue {vendColor(0, 0, 255);}
+ (id)pigmentBlue {vendColor(51, 51, 153);}
+ (id)rybBlue {vendColor(2, 71, 254);}
+ (id)blueGreen {vendColor(0, 223, 223);}
+ (id)blueViolet {vendColor(138, 43, 226);}
+ (id)bondiBlue {vendColor(0, 149, 182);}
+ (id)brass {vendColor(181, 166, 66);}
+ (id)brightGreen {vendColor(102, 255, 0);}
+ (id)brightPink {vendColor(255, 0, 127);}
+ (id)brightTurquoise {vendColor(8, 232, 222);}
+ (id)brilliantRose {vendColor(255, 85, 163);}
+ (id)britishRacingGreen {vendColor(0, 66, 37);}
+ (id)bronze {vendColor(205, 127, 50);}
+ (id)brown {vendColor(150, 75, 0);}
+ (id)buff {vendColor(240, 220, 130);}
+ (id)burgundy {vendColor(128, 0, 32);}
+ (id)burntOrange {vendColor(204, 85, 0);}
+ (id)burntSienna {vendColor(233, 116, 81);}
+ (id)burntUmber {vendColor(138, 51, 36);}
+ (id)camouflageGreen {vendColor(120, 134, 107);}
+ (id)caputMortuum {vendColor(89, 39, 32);}
+ (id)cardinal {vendColor(196, 30, 58);}
+ (id)carmine {vendColor(150, 0, 24);}
+ (id)carnationPink {vendColor(255, 166, 201);}
+ (id)carolinaBlue {vendColor(156, 186, 227);}
+ (id)carrotOrange {vendColor(237, 145, 33);}
+ (id)celadon {vendColor(172, 225, 175);}
+ (id)cerise {vendColor(222, 49, 99);}
+ (id)cerulean {vendColor(0, 123, 167);}
+ (id)ceruleanBlue {vendColor(42, 82, 190);}
+ (id)champagne {vendColor(247, 231, 206);}
+ (id)charcoal {vendColor(70, 70, 70);}
+ (id)chartreuse {vendColor(223, 255, 0);}
+ (id)chartreuseWeb {vendColor(127, 255, 0);}
+ (id)cherryBlossomPink {vendColor(255, 183, 197);}
+ (id)chestnut {vendColor(205, 92, 92);}
+ (id)chocolate {vendColor(123, 63, 0);}
+ (id)cinnabar {vendColor(227, 66, 52);}
+ (id)cinnamon {vendColor(210, 105, 30);}
+ (id)cobalt {vendColor(0, 71, 171);}
+ (id)columbiaBlue {vendColor(155, 221, 255);}
+ (id)copper {vendColor(184, 115, 51);}
+ (id)copperRose {vendColor(153, 102, 102);}
+ (id)coral {vendColor(255, 127, 80);}
+ (id)coralRed {vendColor(255, 64, 64);}
+ (id)corn {vendColor(251, 236, 93);}
+ (id)cornflowerBlue {vendColor(100, 149, 237);}
+ (id)cosmicLatte {vendColor(255, 248, 231);}
+ (id)cream {vendColor(255, 253, 208);}
+ (id)crimson {vendColor(220, 20, 60);}
+ (id)cyan {vendColor(0, 255, 255);}
+ (id)processCyan {vendColor(0, 180, 247);}
+ (id)darkBlue {vendColor(0, 0, 139);}
+ (id)darkBrown {vendColor(101, 67, 33);}
+ (id)darkCerulean {vendColor(8, 69, 126);}
+ (id)darkChestnut {vendColor(152, 105, 96);}
+ (id)darkCoral {vendColor(205, 91, 69);}
+ (id)darkGoldenrod {vendColor(184, 134, 11);}
+ (id)darkGreen {vendColor(1, 50, 32);}
+ (id)darkKhaki {vendColor(189, 183, 107);}
+ (id)darkPastelGreen {vendColor(3, 192, 60);}
+ (id)darkPink {vendColor(231, 84, 128);}
+ (id)darkScarlet {vendColor(86, 3, 125);}
+ (id)darkSalmon {vendColor(233, 150, 122);}
+ (id)darkSlateGray {vendColor(47, 79, 79);}
+ (id)darkSpringGreen {vendColor(23, 114, 69);}
+ (id)darkTan {vendColor(145, 129, 81);}
+ (id)darkTurquoise {vendColor(0, 206, 209);}
+ (id)darkViolet {vendColor(148, 0, 211);}
+ (id)deepCerise {vendColor(218, 50, 135);}
+ (id)deepChestnut {vendColor(185, 78, 72);}
+ (id)deepFuchsia {vendColor(193, 84, 193);}
+ (id)deepLilac {vendColor(153, 85, 187);}
+ (id)deepMagenta {vendColor(204, 0, 204);}
+ (id)deepPeach {vendColor(255, 203, 164);}
+ (id)deepPink {vendColor(255, 20, 147);}
+ (id)denim {vendColor(21, 96, 189);}
+ (id)dodgerBlue {vendColor(30, 144, 255);}
+ (id)ecru {vendColor(194, 178, 128);}
+ (id)egyptianBlue {vendColor(16, 52, 166);}
+ (id)electricBlue {vendColor(125, 249, 255);}
+ (id)electricGreen {vendColor(0, 255, 0);}
+ (id)electricIndigo {vendColor(102, 0, 255);}
+ (id)electricLime {vendColor(204, 255, 0);}
+ (id)electricPurple {vendColor(191, 0, 255);}
+ (id)emerald {vendColor(80, 200, 120);}
+ (id)eggplant {vendColor(97, 64, 81);}
+ (id)faluRed {vendColor(128, 24, 24);}
+ (id)fernGreen {vendColor(79, 121, 66);}
+ (id)firebrick {vendColor(178, 34, 34);}
+ (id)flax {vendColor(238, 220, 130);}
+ (id)forestGreen {vendColor(34, 139, 34);}
+ (id)frenchRose {vendColor(246, 74, 138);}
+ (id)fuchsia {vendColor(255, 0, 255);}
+ (id)fuchsiaPink {vendColor(255, 119, 255);}
+ (id)gamboge {vendColor(228, 155, 15);}
+ (id)metallicGold {vendColor(212, 175, 55);}
+ (id)goldWeb {vendColor(255, 215, 0);}
+ (id)goldenBrown {vendColor(153, 101, 21);}
+ (id)goldenYellow {vendColor(255, 223, 0);}
+ (id)goldenrod {vendColor(218, 165, 32);}
+ (id)greyAsparagus {vendColor(70, 89, 69);}
+ (id)green {vendColor(0, 255, 0);}
+ (id)greenWeb {vendColor(0, 128, 0);}
+ (id)pigmentGreen {vendColor(0, 165, 80);}
+ (id)rybGreen {vendColor(102, 176, 50);}
+ (id)greenYellow {vendColor(173, 255, 47);}
+ (id)grey {vendColor(128, 128, 128);}
+ (id)hanPurple {vendColor(82, 24, 250);}
+ (id)harlequin {vendColor(63, 255, 0);}
+ (id)heliotrope {vendColor(223, 115, 255);}
+ (id)hollywoodCerise {vendColor(244, 0, 161);}
+ (id)hotMagenta {vendColor(255, 0, 204);}
+ (id)hotPink {vendColor(255, 105, 180);}
+ (id)indigo {vendColor(0, 65, 106);}
+ (id)indigoWeb {vendColor(75, 0, 130);}
+ (id)internationalKleinBlue {vendColor(0, 47, 167);}
+ (id)internationalOrange {vendColor(255, 79, 0);}
+ (id)islamicGreen {vendColor(0, 153, 0);}
+ (id)ivory {vendColor(255, 255, 240);}
+ (id)jade {vendColor(0, 168, 107);}
+ (id)kellyGreen {vendColor(76, 187, 23);}
+ (id)khaki {vendColor(195, 176, 145);}
+ (id)lightKhaki {vendColor(240, 230, 140);}
+ (id)lavender {vendColor(181, 126, 220);}
+ (id)lavenderWeb {vendColor(230, 230, 250);}
+ (id)lavenderBlue {vendColor(204, 204, 255);}
+ (id)lavenderBlush {vendColor(255, 240, 245);}
+ (id)lavenderGrey {vendColor(196, 195, 221);}
+ (id)lavenderMagenta {vendColor(238, 130, 238);}
+ (id)lavenderPink {vendColor(251, 174, 210);}
+ (id)lavenderPurple {vendColor(150, 120, 182);}
+ (id)lavenderRose {vendColor(251, 160, 227);}
+ (id)lawnGreen {vendColor(124, 252, 0);}
+ (id)lemon {vendColor(253, 233, 16);}
+ (id)lemonChiffon {vendColor(255, 250, 205);}
+ (id)lightBlue {vendColor(173, 216, 230);}
+ (id)lightPink {vendColor(255, 182, 193);}
+ (id)lilac {vendColor(200, 162, 200);}
+ (id)lime {vendColor(191, 255, 0);}
+ (id)limeWeb {vendColor(0, 255, 0);}
+ (id)limeGreen {vendColor(50, 205, 50);}
+ (id)linen {vendColor(250, 240, 230);}
+ (id)magenta {vendColor(255, 0, 255);}
+ (id)magentaDye {vendColor(202, 31, 23);}
+ (id)processMagenta {vendColor(255, 0, 144);}
+ (id)magicMint {vendColor(170, 240, 209);}
+ (id)magnolia {vendColor(248, 244, 255);}
+ (id)malachite {vendColor(11, 218, 81);}
+ (id)maroonWeb {vendColor(128, 0, 0);}
+ (id)maroon {vendColor(176, 48, 96);}
+ (id)mayaBlue {vendColor(115, 194, 251);}
+ (id)mauve {vendColor(224, 176, 255);}
+ (id)mauveTaupe {vendColor(145, 95, 109);}
+ (id)mediumBlue {vendColor(0, 0, 205);}
+ (id)mediumCarmine {vendColor(175, 64, 53);}
+ (id)mediumLavenderMagenta {vendColor(204, 153, 204);}
+ (id)mediumPurple {vendColor(147, 112, 219);}
+ (id)mediumSpringGreen {vendColor(0, 250, 154);}
+ (id)midnightBlue {vendColor(0, 51, 102);}
+ (id)mintGreen {vendColor(152, 255, 152);}
+ (id)mistyRose {vendColor(255, 228, 225);}
+ (id)mossGreen {vendColor(173, 223, 173);}
+ (id)mountbattenPink {vendColor(153, 122, 141);}
+ (id)mustard {vendColor(255, 219, 88);}
+ (id)myrtle {vendColor(33, 66, 30);}
+ (id)navajoWhite {vendColor(255, 222, 173);}
+ (id)navyBlue {vendColor(0, 0, 128);}
+ (id)ochre {vendColor(204, 119, 34);}
+ (id)officeGreen {vendColor(0, 128, 0);}
+ (id)oldGold {vendColor(207, 181, 59);}
+ (id)oldLace {vendColor(253, 245, 230);}
+ (id)oldLavender {vendColor(121, 104, 120);}
+ (id)oldRose {vendColor(192, 46, 76);}
+ (id)olive {vendColor(128, 128, 0);}
+ (id)oliveDrab {vendColor(107, 142, 35);}
+ (id)olivine {vendColor(154, 185, 115);}
+ (id)orange {vendColor(255, 127, 0);}
+ (id)rybOrange {vendColor(251, 153, 2);}
+ (id)orangeWeb {vendColor(255, 165, 0);}
+ (id)orangePeel {vendColor(255, 160, 0);}
+ (id)orangeRed {vendColor(255, 69, 0);}
+ (id)orchid {vendColor(218, 112, 214);}
+ (id)paleBlue {vendColor(175, 238, 238);}
+ (id)paleBrown {vendColor(152, 118, 84);}
+ (id)paleCarmine {vendColor(175, 64, 53);}
+ (id)paleChestnut {vendColor(221, 173, 175);}
+ (id)paleCornflowerBlue {vendColor(171, 205, 239);}
+ (id)paleMagenta {vendColor(249, 132, 229);}
+ (id)palePink {vendColor(250, 218, 221);}
+ (id)paleRedViolet {vendColor(219, 112, 147);}
+ (id)papayaWhip {vendColor(255, 239, 213);}
+ (id)pastelGreen {vendColor(119, 221, 119);}
+ (id)pastelPink {vendColor(255, 209, 220);}
+ (id)peach {vendColor(255, 229, 180);}
+ (id)peachOrange {vendColor(255, 204, 153);}
+ (id)peachYellow {vendColor(250, 223, 173);}
+ (id)pear {vendColor(209, 226, 49);}
+ (id)periwinkle {vendColor(204, 204, 255);}
+ (id)persianBlue {vendColor(28, 57, 187);}
+ (id)persianGreen {vendColor(0, 166, 147);}
+ (id)persianIndigo {vendColor(50, 18, 122);}
+ (id)persianOrange {vendColor(217, 144, 88);}
+ (id)persianRed {vendColor(204, 51, 51);}
+ (id)persianPink {vendColor(247, 127, 190);}
+ (id)persianRose {vendColor(254, 40, 162);}
+ (id)persimmon {vendColor(236, 88, 0);}
+ (id)pineGreen {vendColor(1, 121, 111);}
+ (id)pink {vendColor(255, 192, 203);}
+ (id)pinkOrange {vendColor(255, 153, 102);}
+ (id)platinum {vendColor(229, 228, 226);}
+ (id)plum {vendColor(204, 153, 204);}
+ (id)powderBlue {vendColor(176, 224, 230);}
+ (id)puce {vendColor(204, 136, 153);}
+ (id)prussianBlue {vendColor(0, 49, 83);}
+ (id)psychedelicPurple {vendColor(221, 0, 255);}
+ (id)pumpkin {vendColor(255, 117, 24);}
+ (id)purpleWeb {vendColor(128, 0, 128);}
+ (id)purple {vendColor(160, 92, 240);}
+ (id)purpleTaupe {vendColor(80, 64, 77);}
+ (id)rawUmber {vendColor(115, 74, 18);}
+ (id)razzmatazz {vendColor(227, 11, 92);}
+ (id)red {vendColor(255, 0, 0);}
+ (id)pigmentRed {vendColor(237, 28, 36);}
+ (id)rybRed {vendColor(254, 39, 18);}
+ (id)redBiolet {vendColor(199, 21, 133);}
+ (id)richCarmine {vendColor(215, 0, 64);}
+ (id)robinEggBlue {vendColor(0, 204, 204);}
+ (id)rose {vendColor(255, 0, 127);}
+ (id)roseMadder {vendColor(227, 38, 54);}
+ (id)roseTaupe {vendColor(144, 93, 93);}
+ (id)royalBlue {vendColor(65, 105, 225);}
+ (id)royalPurple {vendColor(107, 63, 160);}
+ (id)ruby {vendColor(224, 17, 95);}
+ (id)russet {vendColor(128, 70, 27);}
+ (id)rust {vendColor(183, 65, 14);}
+ (id)safetyOrange {vendColor(255, 102, 0);}
+ (id)blazeOrange {vendColor(255, 102, 0);}
+ (id)saffron {vendColor(244, 196, 48);}
+ (id)salmon {vendColor(255, 140, 105);}
+ (id)sandyBrown {vendColor(244, 164, 96);}
+ (id)sangria {vendColor(146, 0, 10);}
+ (id)sapphire {vendColor(8, 37, 103);}
+ (id)scarlet {vendColor(255, 36, 0);}
+ (id)schoolBusYellow {vendColor(255, 216, 0);}
+ (id)seaGreen {vendColor(46, 139, 87);}
+ (id)seashell {vendColor(255, 245, 238);}
+ (id)selectiveYellow {vendColor(255, 186, 0);}
+ (id)sepia {vendColor(112, 66, 20);}
+ (id)shamrockGreen {vendColor(0, 158, 96);}
+ (id)shockingPink {vendColor(252, 15, 192);}
+ (id)silver {vendColor(192, 192, 192);}
+ (id)skyBlue {vendColor(135, 206, 235);}
+ (id)slateGrey {vendColor(112, 128, 144);}
+ (id)smalt {vendColor(0, 51, 153);}
+ (id)springBud {vendColor(167, 252, 0);}
+ (id)springGreen {vendColor(0, 255, 127);}
+ (id)steelBlue {vendColor(70, 130, 180);}
+ (id)tan {vendColor(210, 180, 140);}
+ (id)tangerine {vendColor(242, 133, 0);}
+ (id)tangerineYellow {vendColor(255, 204, 0);}
+ (id)taupe {vendColor(72, 60, 50);}
+ (id)teaGreen {vendColor(208, 240, 192);}
+ (id)teaRoseOrange {vendColor(248, 131, 194);}
+ (id)teaRose {vendColor(244, 194, 194);}
+ (id)teal {vendColor(0, 128, 128);}
+ (id)tawny {vendColor(205, 87, 0);}
+ (id)terraCotta {vendColor(226, 114, 91);}
+ (id)thistle {vendColor(216, 191, 216);}
+ (id)tomato {vendColor(255, 99, 71);}
+ (id)turquoise {vendColor(48, 213, 200);}
+ (id)tyrianPurple {vendColor(102, 2, 60);}
+ (id)ultramarine {vendColor(18, 10, 143);}
+ (id)unitedNationsBlue {vendColor(91, 146, 229);}
+ (id)vegasGold {vendColor(197, 179, 88);}
+ (id)vermilion {vendColor(227, 66, 51);}
+ (id)violet {vendColor(139, 0, 255);}
+ (id)violetWeb {vendColor(238, 130, 238);}
+ (id)rybViolet {vendColor(2, 71, 54);}
+ (id)viridian {vendColor(64, 130, 109);}
+ (id)wheat {vendColor(245, 222, 179);}
+ (id)white {vendColor(255, 255, 255);}
+ (id)wisteria {vendColor(201, 160, 220);}
+ (id)yellow {vendColor(255, 255, 0);}
+ (id)processYellow {vendColor(255, 239, 0);}
+ (id)rybYellow {vendColor(254, 254, 51);}
+ (id)yellowGreen {vendColor(154, 205, 50);}
+ (id)zinnwaldite {vendColor(235, 194, 175);}
@end