Tuesday, December 21, 2010

Free Apple Development e-books

Apple is offering up the following free e-books in their iOS device book store.
  • iOS Human Interface Guidelines
  • Object Oriented Programming With Objective-C
  • Cocoa Fundamentals Guide
  • The Objective-C Programming Language
  • iOS Technology Overview
  • iOS Application Programming Guide
Source: http://www.macworld.com/article/156499/2010/12/apple_developer_ebooks.html?lsrc=nl_mwweek_h_cbstories

Sunday, December 19, 2010

WP7 physical keyboard use

If you are working on WP7 development, you will find that the emulator does not respond to the physical keyboard on your development system by default. That is because not all WP7 phones have keyboards, while others do. This link shows how to simulate the sliding keyboard and how the keys are mapped.

Thursday, November 18, 2010

New iOS Development Resources

Apple recently announced some new iOS development learning resources. Stanford University has published their Fall 2010 cs193p course through iTunes University. the Winter 2010 course was very good and I expect the Fall 2010 will be even better. Here is the link to the course on iTunes as well as the course lecture materials.

Stanford University (Fall 2010 cs193p)
iTunes videos: www
Course materials: www


Saturday, October 30, 2010

Windows Phone 7 Petzold book in PDF

The Petzold book is now available as a PDF, and the code is available as a ZIP:

http://www.charlespetzold.com/phone/index.html

Note: I downloaded the PDF and the source code, then discovered there are file names in the Chapter 5 example that are too long for Windows 7. I had to download the ZIP to my MBP, copy them to a USB drive, then rename them to copy to my Win 7 directory... Win 7 didn't throw any exceptions when they were in long name format on the USB drive, though.

Tuesday, October 19, 2010

Windows Phone 7 Petzold book

I had a look at the upcoming Charles Petzold book on WP7. I have always liked his approach to programming books, as he fills them with useful examples. Here's a link to an excerpted version of the new book:

http://www.charlespetzold.com/phone/index.html

One thing that becomes obvious very quickly: Microsoft designed the WP7 platform to be a gaming device as well as a phone. It appears that the topics covered are 50/50 Silverlight/XNA. I almost wonder why Microsoft didn't call their new phone software "xPhone".

Monday, September 20, 2010

Monotouch apps in the app store

I will have more to say about Monotouch in a future post, but the first thing to know is that there are Monotouch based apps in the Apple store. Here's a useful link that lists some of them:

http://monotouch.info/MonoTouch/Apps

Thursday, September 9, 2010

App Store Review Guidelines (Third-party tools allowed)

Today, Apple posted formal guidelines for mobile app review/approval. The best part is that they have relaxed restrictions for third-party development tools. Up until now, the review process has been fairly subjective and undocumented. The good news is that the process is now documented and available here (must login with developer account). The bad news is that it is still fairly vague and worded in such a way that if they decide they don't like your app, it won't get approved.

In light of the shortcomings of this documentation, this appears to be a great step in the right direction for Apple. If you listen carefully, you will probably hear developers rejoicing everywhere. Only time will tell how this will all play out. For now you can move forward using development tools like Flash cs5 and mono-touch to create iPhone apps.

Sunday, September 5, 2010

Tab Bar Custom Icons

If you need a custom icon for your app I recommend this site. Read carefully the license agreement. I spent quite a bit of time trying to use my own photos for custom tab bar items but the tab bar is looking for specific things in the image. You may want to take a look at these icons and then determine if you want to make your own or just use these.

Video Capture of iPhone Simulator

You will find this useful if you would like to demonstrate your iPhone applicaiton. This utility will generate a Quicktime movie of your running applicaiton. There are several different options you can use. Click here.

Here is my first sample using this application:

Saturday, August 28, 2010

The autorelease lightbulb

In my use of some CoreData objects I ran into a situation where I was getting an EXC_BAD_ACCESS crash. This error essentially means that you are accessing an object that has already been released. I tried a couple of different ways to find the error and finally pinned the code down to this:

Photo *photo = [NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext:[myFF managedObjectContext]];

photo.name = [key objectForKey:@"name"];

photo.path = [key objectForKey:@"path"];

photo.photoOwner = person;

[[myFF managedObjectContext] save:&error];


[photo release];


The problem lies in the reference counting on the photo object. It turns out that insertNewObjectForEntityForName will return an autoreleased object per the documentation.

Return Value

A new, autoreleased, fully configured instance of the class for the entity named entityName.


Because I am releasing the photo object also it causes the aforementioned error.

Lesson learned: read the documentation!


Sunday, August 15, 2010

Useful XCode editor tip

It's always useful to have editor tips and tricks available. Here is a link to many for the XCode editor.

Sunday, August 8, 2010

Working with Core Data

You may have already noticed that transitioning from using your own Person and Photo classes to using the suggested NSManagedObject versions is not completely intuitive. In the first part of the Paparazzi assignment, I created my own Person and Photo classes to make managing the data a little easier; only to find out in part #2 that they would have you create Person and Photo objects that inherit from NSManagedObject. It sounds straight forward enough, right? Not so fast there Code Ninja. It is a little more complicated if you actually intend to use core data and have your new classes map to entities in a local database.

After struggling for a bit and enlisting the help of my peers, I was able to successfully port my Paparazzi part #1 over to a core data project and map new classes to my newly created database entities. In the next few paragraphs, I will explain the basics of how I accomplished this in an effort to ease the pain for anyone who has yet undertake this portion of the assignment.


NOTE: I do not recommend trying to adapt your existing project. Primarily because there are several hooks, default files and provided implementation by creating a core data project to start with. Otherwise, you will spend quite a bit of time trying to get your current project retrofitted. It will be far easier to create a new core data project and just copy over any existing code, xibs and AppDelegate logic you already have into to your new project.

Let's get started!
First, Create a new iPhone OS Windows-based Application. Make sure the "Use Core Data for storage is checked." Once you choose the suggested options, a project name and save your new project, you will notice a file unique to core data projects. Within your project hierarchy, under the Resources folder, you will have a "[ProjectName].xcdatamodelId" item. Expanding that item will reveal an "[ProjectName].xcdatamodel" file that will be the basis for your new Person and Photo classes.

Next, make sure you have the "[ProjectName].xcdatamodel" file selected (ensure it is not the parent file with a similar name). The should display a data model file with Entities, Properties and eventually a diagram once you establish some entities. This is where we will create our Person and Photo entities. Xcode will then create classes and map them to these database entities (very similar to any OR mapper you may have used in the past.

Create a Person entity by choosing the [+] icon beneath the Entity view. Once you have done this, you will notice a dialog to the right will appear for you to name the entity and set a few other properties. From the Property view, choose the [+] icon and create properties for "name", and photo. "name" will be an attribute of type NSString and "photos" will be a one-to-may relationship that you will eventually point to the Photo entity.

Create a Photo entity following the same steps as above. Add an NSString attribute for "name" and "path". Add a one-to-one relationship called "user" and choose a destination of Person. Now go back to your Person entity and have the one-to-many relationship "photos" destination point to the Photo entity.

We are almost done!
Now that we have our entities, attributes and relationships, it is time to generate the classes that will inherit from NSManagedObject. With one of your entities selected in the diagram, go to the Xcode menu and choose "File > New File". In the dialog, you will notice an option that is usually not there. This item is "Managed Object Class." This item us under the Mac OS X section. With this item selected, choose "Next". From the next screen, accept the defaults as appropriate and choose "Next". This last screen is the most important. Make sure that all the entities you want classes generated for are selected. By default, validation methods are not generated - which is fine for the Paparazzi assignment and you can change it later. Choose "Finish".

The newly created classes will automatically import "CoreData" and will inherit from "NSManagedObject". If you look at each class you will see they are mostly normal classes. What is really different is how you instantiate (alloc, init) them. For the most part you will always do this through a class called "NSEntityDescription" using a method called "insertNewObjectForEntityForName" or other depending on if you are creating or accessing.

That's it!
From here you should probably make sure you are up to speed on the Paparazzi assignment. There are some classes like FlikrFetcher they want you to use as a singleton to create your objects to insert in the database. Covering that would involve some more discussion and I will save that for a later date. If you found this entry helpful and need more info on instantiating these items and adding them to the database, send me an email or add a comment and I will do my best to get back to you directly or add another entry.

Thursday, July 29, 2010

Improving your UI and all the control options



Apple has provided a great app called UICatalog that is a demo of all the different controls. This is a standard XCode project you can use to not only see the various controls but also see the code that customizes many of these controls. You can find UICatalog here.

You are also allowed to use what you find in the images folder of this project for your own applications.









I took the blue and white buttons and created a simple project and used the button images they provided.

I am using whiteButton.png and blueButton.png which look like this:

whiteButton.png

blueButton.png


Here is the before (the second button has white text):
Here is the after:

You can also use this for the normal and pressed button states using the same techniques.

Here is the code (IBOutlets for button1 and button2) from the ViewController.

- (void)viewDidLoad {

UIImage *buttonImageNormal = [UIImage imageNamed:@"whiteButton.png"];

UIImage *strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];

[button1 setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];

buttonImageNormal = [UIImage imageNamed:@"blueButton.png"];

strechableButtonImageNormal = [buttonImageNormal stretchableImageWithLeftCapWidth:12 topCapHeight:0];

[button2 setBackgroundImage:strechableButtonImageNormal forState:UIControlStateNormal];

[super viewDidLoad];

}






Thursday, July 22, 2010

Using TFS with Xcode

After some searching, it seems our options for integrating Xcode with TFS are pretty limited. Currently Xcode does not provide an API or plugin model to support SCM using anything other than CVS or Subversion. Although it seems straightforward to set up a subversion server and connect to it with Xcode, it would of course be ideal for us to integrate with our established TFS environment. The top recommendations for what we are trying to do are Teamprise (standalone UI) and SvnBridge. SvnBridge seems to be our best bet, acting as a layer on top of TFS to make it appear to be a subversion server to Xcode. Although it may not be the ideal solution, it could meet our basic needs.

Thursday, June 17, 2010

Human Interface Guidelines and other UI info

Apple's Human Interface Guidelines (HIG) provide a great foundation for anyone not extremely savvy with UI development; and good reference for those who are savvy. They provide basic examples for many types of scenarios involving the use of audio, video, button interaction, alerts and many others.

Apple provides explanations of what they intend the different UI components to be used for and why certain components work better than others when designing for a mobile device instead of a full desktop.

Apple pushes highly polished, intuitive user experiences with most tasks being no more complex than they have to be. This same theme is present in their HIG documentation. The idea they are trying to convey is about fluid and consistent experiences. The good news is they have already figured this out; we just have to become familiar with it.

Here are a few links to some useful UI information and additional tools:

Human Interface Guidelines: www, pdf
iPhone and iPad stencils: www
iPhone UI element for Photoshop: www
iPad UI elements for photoshop: www

Sunday, June 13, 2010

Imitation is the sincerest form of flattery!

By that standard, I believe Apple is about to be very flattered. Apple just sold iPad #2,000,000 recently. By any measure, this is an extraordinary success and demonstrates considerable market demand for such a device. Here’s a quote from one user which offers some insight:

“The iPad makes using a computer less of a commitment and that has important implications for the way I compute.


Coming from a VC, too… Nice. But I digress.

The above, plus other reasons the esteemed readers of this blog can certainly provide make a compelling case for us to study the iP* ecosystem of products Apple has produced from a development perspective. I took some time this weekend to try some iPhone programming, using the simulator provided with the SDK. (It also supports the iPad.) Like most people, I rummaged through the Apple SDK documentation looking for a place to start. I also looked on the web for blogs like this that might offer some basics. There are number of sites that discuss Cocoa, but I didn’t find any that really offered a comprehensive tutorial. This is also complicated by the fact that that XCode, and especially IB have evolved. As usual, this led to me to look at the latest dev books that are available. I bought a book on Objective-C recently:

Programming Objective-C 2.0.

With a language reference in hand I looked for one that is focused on iP* development with a good discussion of XCode and IB. After reading the reviews for many books, I finally decided to buy:

Beginning iPhone 3 Development.

(Sidebar: Technical books are generally available in Kindle format. Given how perishable tech books are, I decided to download the Kindle reader instead of buying the physical book. It’s also a bit less expensive, and of course you get it instantly. The Mac version of the reader is still Beta, but it worked well.)

So far I am happy with the “Beginning iPhone 3” book. It’s a “learn by example” book, which I like for bootstrapping my ability to develop in a new environment. Does it explain everything the way I would like? No, but no single tech book is ever perfect, except for “Oh! Pascal”. Petzold’s “Programming Windows 3.0” was close to perfection, too. Now someone hand me my Geritol…

Most of us seem to have Macbook Pros or Minis. I have an iMac and a MBP. I tried using VNC to connect from my triple head Windows system to the iMac for development purposes, but that didn’t work very well. Apple offers remote management software, but it’s expensive. I bought the MBP to replace my Dell laptop when travelling, which allows me to develop for the iP* products and Windows, since I loaded Parallels. (The Dell will now become a VM host.) The MBP will allow me to use iLife, which is the most compelling reason to own a Mac from my perspective as a user.

If you are like me, you like to have a lot of screen space. This is especially true when using XCode and IB. (The return of the MDI interface! Holy VB 3, Batman!) I thought about buying a KVM, but once you go digital the price goes up and I didn’t want to have another widget on my desk if I could avoid it. My 24” monitor has two inputs: VGA and DVI. It allows me to switch sources, so I have the PC and the MBP connected to it. I also bought a Magic Mouse, since I really like the gestures the touchpad offers on the MBP.

If you own a Magic Mouse, you can improve the way it works (since Apple has yet to get a mouse right) by downloading this:

MagicPrefs

On another note, working with the Mac so much recently has reminded me of why I dislike the Mac UI compared to Windows or Unix window managers. It is truly a PITA when you work with lots of active windows. The main frustration is with the “One Ring To Bind Them” menubar, which always represents the active app. I much prefer the Windows and Unix way of associating the menu with the app window itself. Compared to the Windows 7 task bar, the Mac is a pain even with Expose and Spaces. Of course this may seem irrelevant, since it sounds like a personal preference. I mention it because it demonstrates some of Job’s insight, however. As we all know, the iPhone and iPad pre-iOS4 are essentially single-taskers. Many have thought this a serious flaw, but I think Job’s insight is that a substantial majority of users only work in one app at a time anyway. As developers, we must keep this in mind, since our typical manner of working with many windows represents a minority of users.

A corollary to the above can be found in iAd. Job’s point about the current state of advertising that requires users to leave the app strikes me as being insightful, too. Allowing the user to stay within the app while interacting with the ad certainly has merit. Context sensitive advertising should have an edge over the random variety, but there are exceptions. When I was in the online music business, I noticed that some promotions would always get significant click-through. American Express used to run ads that featured a free MP3 download if you clicked on their ad. People would click on the AmEx ad like tigers on Obsession. But in general, tying ads to the context, and this by all means includes the visual context, is an important consideration.

Note to self: don’t wear Calvin Klein products when visiting the Wild Animal Park…

If you are developing a consumer app, I think it would extremely worthwhile to consider integrated ad placement in the app – a UI requirement that is relatively new and worthy of discussion.

Friday, June 11, 2010

WWDC 2010 Wrapup

So it's Friday and I learned a lot. A few highlights from these last few days:

  • iAd looks to be pretty awesome for people who have popular apps but beware the Apple licensing agreements.
  • Iterative software development is not dead - Apple seems to have that dialed in pretty well.
  • The User Experience is much more than art - it encompasses how the user feels about the application when they run it.
  • Learn MVC if you want to develop for Apple - and really do it
  • Build apps as universal apps that will work on iOS. You have to do true, Apple-stlye, MVC to pull that off
It's been a whirlwind and I am strategizing how to get back here next year when I know more.


Wednesday, June 9, 2010

WWDC 2010 - Day 2

This conference is packed. I would estimate of the 5200 official attendees over half are here for the first time and are new developers. In a session the speaker asked how many were doing iPhone development but had never shipped an app and it was the majority of the attendees (including me). I started out day 2 going to a session on game design. They were showing a really cool Diablo like game for the iPhone/iPad that was awesome. The pointed out the graphics power of these devices and it was evident from the demos. They also used the standard UI Kit for many of the controls that you would use in the game (menus etc) and skinned the controls to fit the theme. They made the point over and over again that games had to be responsive and run at 30 fps. The next session was my first experience with the passion and expertise of user interface design. I came away from this session having a much greater appreciation for the work that has to go into an app to really make it special from a UI perspective. I also am still wondering if that is ever really possible with information system UIs? Apple also pointed out that they iterate a lot on their products and they keep iterating until noone can find any shortcomings or issues. There are lessons to be learned there, however, being able to do this for a commercial product is much different (I think) than for a contract information system. Next session was about ScrollView which they started out by saying that last year they covered the basics so this year was going to be the advanced session. I've noticed a real inconsistency in the sessions with the numbering and descriptions. SOme 100 level sessions are way advanced and some 500 level sessions are way too general. I'd like to see a beginner track given the amount of people here that are beginners. The session in the afternoon was on managing mobile devices which showed that in iOS4 they will be allowing web based (intranet) deployment of applications. This is able to be done now through either the app store or by USB directly connecting the device. All of these options are still going to require the Apple developer provisioning. A key take away from this session were thoughts about secure IT issues that many companies may not be considering - the iPhone is a very powerful computer with a lot of data on it and should be treated as such. I went to an iPad development session which again was an advanced deep dive into some of the new iOS4 features.

Great conference - my head was hurting last night from all the information, which is a good thing. They need a bigger venue next year - there are long lines for everything!

Monday, June 7, 2010

WWDC Day 1

I arrived in San Francisco and registered at WWDC at about noon. I missed all the excitement (the keynote) with Steve Jobs not being able to connect during his demo but I can tell you that when several thousand people each with a MacBook, iPhone or iPad all try and connect in that room it is slow. In any case the big news is the next generation iPhone and iOS 4.0 (now called that as iTouch, iPhone and iPad all share the same OS) will be out later this month. I have heard the OS will be a free upgrade.

I attended the Developer Tools State of the Union and the big news from that session is that XCode 4.0 is coming out. I am supposed to be able to download it from the WWDC portal but I am sure 5000 of my friends will be trying to do that as well. I have never seen so many MacBook Pros and the iPad is all over the place. I wish I had the iPad along but I am still packing the Dell Latitude and a MacBook Pro and an iPhone and another device would have put me over the top in the geek factor. XCode 4.0 will have everything in one window. The demos show it acting a lot more like Visual Studio with some neat features I'd like to see in Visual Studio. Tomorrow will be a jammed day so I will update all of you then.

I also figured out how to deploy to my phone. This does require an Apple Developer ID and the $99 payment to generate the info from Apple to allow deployment to the phone. Read more here. It worked fine - now I have my own iPhone flashlight app.

Friday, June 4, 2010

Standford Assignments

iTunes U is missing some of the course work. To get the actual assignments that are referenced in these classes go to...


There are Assignment PDF's you can download. I'm fairly sure they are Winter 2010 Lecture Assignments.

Thursday, June 3, 2010

Go to class.....

There are some great free online iPhone Development CS courses in iTunesU. The most polished I have seen so far is the Standford course for Winter 2010 found here: http://deimos3.apple.com/WebObjects/Core.woa/Feed/itunes.stanford.edu.3124430053.03124430055

UC Davis Extension also has a series that you will find here: http://deimos3.apple.com/WebObjects/Core.woa/Feed/ucdavis-public.3002137116.03002137129

Let me know which other ones you have found that are good.

Wednesday, May 26, 2010

Apple got me – and you too…

I went to Microsoft TechEd in 2001 right before 9/11. It was a great conference and the shinning star was Visual Studio 2002 and .Net 1.0 Beta 2. The sessions on ASP.Net and VB.Net signaled a clear sea change from how Microsoft had been doing business. No longer was the language important – it was the framework. We were finally free to create apps with the ease of VB but do the programming in C#. For near 10 years many of us have ridden the huge .Net wave.

There is another wave coming – in fact we are on it now. Like a surfer you have to decide if you are going to ride this one or not. The problem with this wave is it is huge – much bigger than the Internet wave in 1995 and much, much bigger than the .Net wave of 2001/2002. This wave is labeled the ‘commoditization of computing’ or the ‘computer as an appliance’ and Apple gets it. Apple is now the most highly valued public technology company. Apple has released several devices recently which may seem useless to technical savvy users. The iPad is an example of this.

As I talked with several developers and IT support people they really don’t see the point of a device like the iPad. The point is that devices like the iPad are not trying to be a device that does everything (like a laptop or tablet computer). It also is not trying to only do one thing like the Kindle. It is trying to do most of what most people do with computers today which is surf the web, email, shop online, view content (ebooks, movies, TV) and social network. The iPad is perfect for that and that is why Apple is selling 200,000 of them each week. It isn’t about a device a techie wants, it’s about a device the non-technical consumer wants.

http://www.pcmag.com/article2/0,2817,2364545,00.asp

Friday, May 21, 2010

iPad and iPad SDK

I recently started working with an iPad. My initial impression is it is pretty cool. It is targeted squarely at the consumer market though. This isn't a device you are going to use to do development on or a lot of typing (more on typing in a bit). It is a device you are going to love to lay on the couch, read and answer emails, surf the net and watch TV on. The display is very, very nice. The overall user experience is much better than the iPhone simply because everything is larger. I do have the same concern that many do that it is a bit hard to hold and I always worry about dropping it. It also is heavier than I expected. Fingerprints are also an issue but easily taken care of. I found typing to be very easy on the iPad but I am not a touch typist. When I handed it to my wife she struggled with typing because she is. The kids grabbed it when I got home last night and I didn't get it back until early this morning - they loved it.

Next step for me was to begin doing iPad development. To do this you need to have the latest SDK installed at least SDK 3.2. I had an older version installed so I was a bit worried about how XCode and the SDK would update (you will likely need to install both). I downloaded XCode with the SDK 3.2. It is about a 2GB download so be prepared for a long download. Once it downloaded I ran the installer and it detected what I already had installed and installed the new versions of XCode and the SDK with no problem. I fired up XCode and selected iPad as the target under iPhone apps and built a blank screen iPad app. When I ran it the iPad emulator started up just like the iPhone emulator does. The iPad emulator works great just like the iPhone emulator.

Monday, May 17, 2010

Keeping Track of Updates

I use Google Reader to keep track of technical blogs. If you would like to keep track of this blog and its comments I've included a few links. There is more specific information bellow.

You can follow the blog via RSS with these links...
If you want to follow the comments made to the blog...

Full site feed:
  • Atom 1.0: http://blogname.blogspot.com/feeds/posts/default
  • RSS 2.0: http://blogname.blogspot.com/feeds/posts/default?alt=rss

Comments-only feed:

  • Atom 1.0: http://blogname.blogspot.com/feeds/comments/default
  • RSS 2.0: http://blogname.blogspot.com/feeds/comments/default?alt=rss

Label-specific site feed:

  • Atom 1.0: http://blogname.blogspot.com/feeds/comments/default/-/labelname
  • RSS 2.0: http://blogname.blogspot.com/feeds/comments/default?alt=rss/-/labelname

Individual post comment feed:

  • Atom 1.0: http://blogname.blogspot.com/feeds/postId/comments/default
  • RSS 2.0: http://blogname.blogspot.com/feeds/postId/comments/default?alt=rss

Friday, May 14, 2010

Getting Started with iPhone Development (for Windows Developers)

Everyone wants to write an iPhone app!

Many developers are used to using some great tools out there to put together applications quickly. iPhone development isn't easy but it certainly isn't impossible. Apple provides a good set of tools for free and like Linux tools that are free you get what you pay for. If you are used to Visual Studio or tools like Delphi it may seem like you are taking a step backward but remember that most of that feeling is because you are facing a steep learning curve. I suspect over time we will see even better tools. The tools that Apple provides are professional level but they aren't Visual Studio :-)

I will now describe a minimal environment you will need to get started with iPhone development.


  1. MacMini - you will find this the easiest entry point. Unlike Windows systems you don't have to have the biggest hard drive and the most memory to have a good development environment. Remember the MacMini won't have a keyboard or mouse but a PC keyboard and mouse will work fine (you don't have to buy the Apple keyboard and mouse). It will have built in ethernet, built in wireless and a good graphics card (with VGA/DVI out).

  2. Apple Developer ID - this is your entry point to the Apple developer community and your access to the free development tools.

  3. Once you have your MacMini set up and your Apple Developer ID head to the Apple Developer site and go to the iPhone developer site and view the getting started docs and videos. There are some good ones over there. This will walk you through installing XCode (think Vidual Studio kind of) and the iPhone SDK.


I recommend using Safari - many of the Apple web pages have an annoying habit of not rendering nicely in other browsers so pick up a copy of Safari (it's free).