Text

Non-Blocking Long Running Tasks on iPhone

iPhone and iPad applications containing long running tasks - such as HTTP requests or data processing - that block the main thread are annoying and often appear sluggish.

The following snippet fixes this issue:

Text

Cocoa Copy Paste Menu

I spent some time earlier today playing with the UIMenuController offered in the iPhone SDK and realized two thing: sometimes Apple’s examples suck and having an environment that often gives no feedback is terrible.

In this case, I implemented a copy of an example that was supposed to present a semi-modal cut / copy / paste menu. It didn’t. After spending nearly an hour trying to realize why nothing was happening, I found I had missed copying a line. Anyways, for the record, here is the concise example of how to present a UIMenuController:

Text

Cocoa Extensions

Cocoa extensions provide a great way to modify existing classes with additional functionality. Here is a good example of extensions in action:

Accessing extensions is simple: just import the header file. In the case above, easily readable dates are now at the finger tips!

Text

A Few Reasons Cocoa Isn’t That Hot

Over the past half-year I have been developing software for the iPhone (and recently iPad). Although I feel that Cocoa is excellent overall, a few rough edges prevent it from being a truly great experience:

The Language

Objective-C is the language of choice for most Cocoa developers (Cocoa can be accessed through bridges by Ruby, Python and a handful of other tools). It provides a thin layer on-top of the C program language, adding support for dynamic typing and messaging.

Objective-C’s very fast execution speeds do not compensate for the amount of code required to perform trivial tasks (especially compared with Ruby or Python). Issues such as memory management and duplicate feature sets (NSString and string, NSArray and [], etc.) can leave developers wanting something better.

The Controls

Interface builder is one of the best GUI designers available. That said, the iPhone and iPad controls are not nearly as verbose as the Mac desktop application controls. The lack of support for grids, checkboxes, colour pickers, and even good looking buttons does not make any sense. It is obvious that Apple had to exclude tools that will not work on the mobile platform, but their over-zelous axing of features ultimately ended up increasing the workload for developers.

Although Cocoa offers great customization of controls, developers must revert to code to get certain core features working. A great example is creating form elements within a table (something done in thousands of applications, including the ‘Settings’ app). Developers will need to setup delegates, protocols, and data-structures for something that should be drag-and-drop. For static forms, this is wasteful and time consuming.

The Ecosystem

Having recently spent some time developing in Ruby on Rails, I feel confident stating that the Cocoa ecosystem is terrible. Although a few great libraries and extensions exist (Three20, BWToolkit and Pinch Media), the non-existence of a package manager (such as RubyGems) means that third-party software is few and far between.

Installation of almost anything introduces dependency headaches and is completely non-strandard. A look through the 10-20 step guides required for any framework will make some cringe and others cry.

Conclusion

Given Apple’s reputation, it is a wonder better options are not available for Mac and iPhone development. The benefits of releasing a 25 year old language on brand new mobile devices or not upgrading existing SDK’s with new languages (Microsoft has gone through at least four) are very limited. Further support for projects like MacRuby are required, and hopefully existing open community frameworks can be better integrated with Cocoa in the future.

Text

Snow Leopard Rails Development Environment

A good Ruby on Rails development environment needs a few things: SSL, image processing, text editor, version control, etc. These notes explain how I setup rails development environments for Mac OS X 10.6 (Snow Leopard).

Step 1. Updating Gems

Before doing anything, it is important to ensure that you are running on the latest gems. To do so:

sudo gem update --system
sudo gem update

Step 2. Enable Web Sharing

Enabling web sharing will startup Apache. To do so ensure System Preferences > Sharing > Web Sharing is selected.

Step 3. Configuring Passenger

Passenger allows for ruby applications (and more specifically rails applications) to be deployed to a Apache and Nginx. Since we just enabled Apache, we can now install it:

sudo gem install passenger
sudo passenger-install-apache2-module

This command will print instructions for finishing up the configuring of passenger. Follow them. You should then be able to run the following command as a test:

sudo apachectl configtest

If everything is good, it should print out “Syntax OK”.

Step 4. Enabling SSL

Apache does not have SSL enabled by default. To enable it uncomment ‘#Include /private/etc/apache2/extra/httpd-ssl.conf’ in ‘/etc/apache2/httpd.conf’. Next we need to generate our certificate:

cd /etc/apache2/
sudo openssl genrsa -out server.key 1024
sudo openssl req -new -x509 -key server.key -out server.crt
sudo chmod 600 server.key server.crt

Again run:

sudo apachectl configtest

And look for “Syntax OK”.

Step 5. Install Port and Image Magick

ImageMagick is required for image processing in some ruby gems (paperclip). To setup, first download and install the latest version of MacPorts from here. Then:

sudo port install ImageMagick

This command takes a long time to run (thirty minutes to an hour). Once it is finished, Apache needs to know about the new binaries. This is done by creating a new file ‘/etc/apache2/other/port.conf’ with contents:

SetEnv PATH /opt/local/bin:/opt/local/sbin:$PATH

Again test apache.

Step 6. Setting Up Hosts

We made it! Now to create our first application. First, we want to map the host name for our application to our development computers IP. The sample ‘/etc/hosts’ file shows the settings required for setting up ‘http://dev.ksylvest.com/’ and ‘http://dev.kwik.ly’:

Next, browse to the directory ‘/etc/apache2/users’ and open the current user’s configuration file (for me ‘/etc/apache2/users/kevin.conf’). Attached is a sample configuration file for the above two applications stored in ‘/Users/kevin/Sites/ksylvest.com’ and ‘/Sites/kevin/Sites/kwik.ly’ respectively:

Again run:

sudo apachectl configtest

If you don’t already have a rails application setup, you can create one in a few steps:

cd ~/Sites
rails ksylvest.com
cd ksylvest.com
rake db:create
rake db:migrate

Then restart the web server:

sudo apachectl restart

Open a browser and test the web application by browsing to the URL specified in the hosts file. The server should also respond to SSL connections after you accept the certificate.

Step 7. Tools

Developing rails on a Mac is great because of the large number of tools available. My favourites include: TextMate, Versions, Git, CSSEdit and Adobe CS4. Some online services exist to help with version control (see GitHub and BeanStalk) so don’t setup local repositories if you can help it! Finally, ruby has many great gems and plugins for simplifying complex tasks in rails: