A few weeks ago I discovered a new site called Swipe the Linen where people can submit an image of their iPhone home screen, along with a short write up of the apps they use. The image if my home screen that I took just three days after getting my iPhone was published today.
Film of an Eagle Owl flying directly at the camera. Seeing those talons open just before the raptor latches onto the bait gives me pause.
(via: @simplebits)
After reading Continuous Deployment for iOS Apps I decided to setup a Jenkins continuous integration server of my own, and to configure it to build my tiny little iOS projects. Rather than use a script to trigger the build I used the XCode plugin for Jenkins to manage the build. In addition to the Xcode plugin I’m using the Git plugin so I can build from Github.
Here are the steps I took to get this working.
##Install Jenkins
Homebrew is my preferred package installation tool and since there is a Jenkins formula for brew I used it to install the server.
$ brew install jenkins
##Start Jenkins
$ java -jar /usr/local/Cellar/jenkins/1.447/lib/jenkins.jar
##Add plugins
By default Jenkins is configured to run at localhost:8080. Open Jenkins in your browser and click on the Manage Jenkins link on the Jenkins dashboard. On the Manage Jenkins page that is returned click on the Manage Plugins link. On the Plugins Manager page, select the Available tab. Scroll down the list and select the Git and Xcode plugins. Click Install without Restart. Once Jenkins restarts you are ready to proceed.
##Specify Location of Xcode
With the release of Xcode 4.3 Apple has changed the location of Xcode. Previously it was in /Developer. Now it appears as an application in /Applications. I ran the xcode-select command to specify the new location of the executables.
$ sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer
You can verify your configuration (if you are using Xcode 4.3) like so:
$ xcode-select -print-path && xcodebuild -version
/Applications/Xcode.app/Contents/Developer
Xcode 4.3
Build version 4E109
$
##Create a new Jenkins project
I created a “freestyle” project for my build and named the build after my project. Under the Source Code Management section I selected Git, and I filled in the path using my Github repository URL. This is the same URL you would use when cloning the project from the command line.
Under Build Triggers I added two conditions. I set a periodic build to occur once a day, at 12:05 pm. Build periodically uses crontab style notation, so the configuration looks like
05 12 * * *
I also selected Build when a change is pushed to Github. Giving the nature of my development process (evenings and weekends) this is probably the more reasonable long term choice.
I selected Xcode for the add build step drop down. This entry is available after adding the XCode plugin. I checked the Clean before build? option, and left all other options alone. My first builds failed as I don’t have a paid Apple Developer membership and the signing certificate that comes with that membership. By default the Xcode plugin tries to build your application for a device, and that requires a signing certificate. By adding the following path to the SDK setting I was able to specify the Simulator SDK for my build.
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/
With the Simulator SDK specified by build succeeds.
##Future Benefits
Having a CI server setup and running for the student level exercises I am currently completing might seem like overkill. But I like the level of maturity having this process in place brings. At a glance now I can see which projects are building and which are broken. Once I have more developed applications that make use of unit testing, having a CI server and process in place will really start to pay off.
A wonderful space for kids. We need one of these (or more) in the United States.
Here’s a great quote that I just ran across in this wonderful rant about Rails. The quote is by why the lucky stiff.
when you don’t create things, you become defined by your tastes rather than ability. your tastes only narrow & exclude people. so create.
“418: I’m a teapot”
(via: @kennethreitz)
Ever since the 9-11 attack this country has been dead set on making itself afraid of religious theocracies. And yet we are in grave danger of becoming one ourselves. Fundamentalism is fundamentalism, regardless of the religion underneath.
I’ve been using Google Chrome as my primary browser for quite some time now. I especially like that the address bar is also the search box. Dozens if not hundreds of times a day I Cmd-Tab to Chrome, Cmd-T to open a new tab, and type in a search term to look something up. Not having to move the insertion point to a separate search field is fabulous.
I’ve slowly added new extension to Chrome to improve its usefulness to me. Here is the current set I’m using.
##Web Developer
Web Developer is the official port of the Firefox Web Developer extension. I don’t use it much, but there are times that it is invaluable.
##1Password
1Password is my password manager of choice. The extension allows me to access secure sites with a simple shortcut.
##Clip to Evernote
The Evernote extension allows me to capture URLs, clip portions of, or entire web pages. I used to clutter my bookmarks with things I didn’t want to lose track of, and now all that stuff goes into Evernote.
##Xmarks Synchronizer
I’m relatively new to using Xmarks. I was using Chrome’s internal synchronization feature but increasingly the syncs weren’t happening so I switched. The added bonus is synchronization across browsers, so Safari on my Mac is up-to-date and, through iCloud, my iPad and iPhone as well.
##Tabs Counter
Other than being nerdy, Tabs Counter is useless. Still, it is nice to know how many tabs are open at any one time.
##Ghostery
The newest of my extensions, Ghostery shows the tracking services embedded in the current page.
{{ “B000FA65KY” | amazon_mediumleft_image }}
Nelson DeMille has long been one of my favorite authors, and Up Country is one of my favorite books by him. The author served in Vietnam and you get the very strong impression that parts of the central character’s journey through Vietnam and the memories of the war there are really Nelson DeMille’s journey and memories. The story itself is very good, but the verisimilitude added by the author’s own experience makes it a very powerful book.
I am looking forward to a third Paul Brenner book in the future.
On March 1, all your data belong to Google.