Today I needed to work with an alertview, so here are two steps for pressing them:

Given /^I press alert button (\d+)$/ do |index|
touch("view:'UIAlertButton'")[index]
end

Given /^I press alert button named "([^"]*)"$/ do |text|
touch("view:'UIAlertButton' label text:'#{text}'")
end

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

As promised, here are my reusable Calabash steps. Now, some of these are probably more inspirational than reusable (or ignorable, if you like ;-) ), but this is ALL the steps I use SO FAR apart from the standard steps. Like I said before, there are so many great steps already defined, so check them out. Anyway, here they are, all 134 lines:

Given /^I press the "([^\"]*)" tableviewcell button$/ do |cell|
touch("tableViewCell button marked:'" + cell + "'")
end

Given /^I press the "([^"]*)" label$/ do |label|
touch("view label text:'#{label}'")
end

Then /^I enter "([^\"]*)" in the "([^\"]*)" (?:text|input) field$/ do |text_to_type, field_name|
set_text("textField placeholder:'#{field_name}'", text_to_type)
sleep(STEP_PAUSE)
end

Given /^I press the "([^"]*)" segment$/ do |label|
touch("segmentedControl segment marked:'#{label}'")
end

Given /^I see the text "([^"]*)" to the right of the text "([^"]*)"$/ do |right, left|
leftRect = query("label {text LIKE '#{left}*'} parent view:'PdfThumbnailView'", :frame)[0]
screenshot_and_raise "Text \"#{left}\" could not be found" if(leftRect == nil)
leftX = Integer(leftRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
leftY = Integer(leftRect[/{(.*), (.*)}, {(.*), (.*)}/,2])

rightRect = query("label {text LIKE '#{right}*'} parent view:'PdfThumbnailView'", :frame)[0]
screenshot_and_raise "Text \"#{right}\" could not be found" if(rightRect == nil)
rightX = Integer(rightRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
rightY = Integer(rightRect[/{(.*), (.*)}, {(.*), (.*)}/,2])

screenshot_and_raise "The following texts should be on the same horizontal line: \"#{left}\" \"#{right}\"" if(leftY != rightY)
screenshot_and_raise "The text \"#{right}\" is not to the right of the text \"#{left}\"" if(leftX >= rightX)
end

Given /^I see the text "([^"]*)" beneath the text "([^"]*)"$/ do |bottom, top|
bottomRect = query("label {text LIKE '#{bottom}*'} parent view:'PdfThumbnailView'", :frame)[0]
screenshot_and_raise "Text \"#{bottom}\" could not be found" if(bottomRect == nil)
bottomX = Integer(bottomRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
bottomY = Integer(bottomRect[/{(.*), (.*)}, {(.*), (.*)}/,2])

topRect = query("label {text LIKE '#{top}*'} parent view:'PdfThumbnailView'", :frame)[0]
screenshot_and_raise "Text \"#{top}\" could not be found" if(topRect == nil)
topX = Integer(topRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
topY = Integer(topRect[/{(.*), (.*)}, {(.*), (.*)}/,2])

screenshot_and_raise "The following texts should be on the same vertical line: \"#{top}\" \"#{bottom}\"" if(topX != bottomX)
screenshot_and_raise "The text \"#{bottom}\" is not beneath the text \"#{top}\"" if(topY >= bottomY)
end

Given /^I don't see the "([^"]*)" button$/ do |expected_mark|
res = query "button", :accessibilityLabel
index = res.find_index {|s| s == expected_mark}
screenshot_and_raise "Index should be nil (was: #{index})" if (index != nil)
end

Given /^I scroll to "([^"]*)"$/ do |searchText|
res = query "TableView index:1 TableViewCell label", :text
row = res.find_index {|s| s == searchText}
scroll_to_row :tableView, row
sleep(STEP_PAUSE)
end

Given /^given I import "([^"]*)", "([^"]*)", "([^"]*)", "([^"]*)"$/ do |datasource, maindir, subdir, file|
touch("tableViewCell label text:'All files'")
sleep(STEP_PAUSE)
touch("tableViewCell label text:'#{datasource}'")
macro %Q|I wait until I don't see "Loading..."|
touch("tableViewCell label text:'#{maindir}'")
macro %Q|I wait until I don't see "Loading..."|
touch("tableViewCell label text:'#{subdir}'")
macro %Q|I wait until I don't see "Loading..."|
touch("tableViewCell label text:'#{file}'")
sleep(STEP_PAUSE)
touch("tableViewCell label text:'All files'")
sleep(STEP_PAUSE)
end

Given /^given I import "([^"]*)", "([^"]*)", "([^"]*)"$/ do |datasource, maindir, file|
touch("tableViewCell label text:'All files'")
sleep(STEP_PAUSE)
touch("tableViewCell label text:'#{datasource}'")
macro %Q|I wait until I don't see "Loading..."|
touch("tableViewCell label text:'#{maindir}'")
macro %Q|I wait until I don't see "Loading..."|
touch("tableViewCell label text:'#{file}'")
sleep(STEP_PAUSE)
touch("tableViewCell label text:'All files'")
sleep(STEP_PAUSE)
end

Given /^I remove all my documents$/ do
docs = query("view:'PdfThumbnailView'")
docs.each do |pdfView|
touch("button marked:'EditCards'")
sleep(STEP_PAUSE)
touch("view:'PdfThumbnailView' index:0 button marked:'card function delete'")
sleep(STEP_PAUSE)
touch("button marked:'Delete file'")
sleep(STEP_PAUSE)
touch("button marked:'EditCards'")
sleep(STEP_PAUSE)
end
end

Given /^I remove all my folders$/ do
if(query("label marked:'My folders'").count > 0)
titleRect = query("label marked:'My folders' parent view", :frame)[0]
titleX = Integer(titleRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
titleY = Integer(titleRect[/{(.*), (.*)}, {(.*), (.*)}/,2])

count = query("tableViewCell").count
i = 0
while i < count do
cellRect = query("view:'FolderTableViewCell' index:#{i} view", :frame)[0]
cellX = Integer(cellRect[/{(.*), (.*)}, {(.*), (.*)}/,1].split("{")[1])
cellY = Integer(cellRect[/{(.*), (.*)}, {(.*), (.*)}/,2])
if(cellX == titleX && cellY > titleY)
touch("view:'FolderTableViewCell' index:#{i} view")
sleep(STEP_PAUSE)
touch("view:'FolderTableViewCell' index:#{i} button")
sleep(STEP_PAUSE)
touch("segmentedControl segment marked:'Delete folder'")
sleep(STEP_PAUSE)

break
end
i = i + 1
end
end

macro %Q|I remove all my folders| if(query("label marked:'My folders'").count > 0)
end

Given /^I playback recording "([^"]*)" at label "([^"]*)"$/ do |movie, label|
playback movie, {:query => "label text:'#{label}'"}
end

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

As promised, here’s the link from automatic UI testing. And here’s the PDF.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Everyone else is doing it, so I figured I could play “bingo” as well. :-)

My predictions begin with “one more thing” on the iPad event: iOS 6 and AppleTV are tightly linked. Developers will get access to iOS 6 betas within two weeks from the announcement, with another event where they go through all the cool stuff. But the AppleTV will be updated with an A5X processor and third party applications installed via the AppStore, and will sport Siri and iCloud integration in a way that makes it easier to use than ever.

The iPad 3 will be announced with an A6 processor, which has enough RAM to power the retina display. The A6 will be more or less identical to the Tegra 3. The iPad will ship with iOS 5.1, and will, together with the iPhone, get iOS 6.1 support this summer, iOS 6.0 will be AppleTV only. The iPad will of course get Siri support.

The main newcomer on the software platform will be Microsoft, shipping a full Office line (excluding MS Access) for iOS, multiplatform for iPhone and iPad, and with a tight AppleTV integration for presentation. The presentation will also focus on Microsoft and Apple having a great relation through iCloud.

iCloud will begin acting like more Dropbox in that it will let you share documents better between iOS apps and Mac apps, bringing iWork and iLife on the mac better integration with their iOS counterparts. This increases need for space, but the iCloud free space will rise. The iLife and iWork updates won’t be mentioned, but will come as a software update quietly a day or two after the show.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

For a project I’m doing at work, that I hope will eventually be open source, I needed to have protobuf compiled for iOS. A colleague of mine showed me how it had been compiled on iOS 4, using these scripts, but with iOS 5 I ended up with binaries compiled for the arm architecture instead of the armv7 architecture.

Be aware that the iOS 5 SDK actually ships with a version of protobuf, but it’s a bit old, being version 2003001. And it only ships the binary, not the headers.

To compile protobuf, grab the latest source (which is 2.4.1 at the time of writing this) and run the following script (download script):

After running this, you should have a directory called /tmp/protobuf/arm that is compiled for your iPhone or iPad with the armv7 architecture. Copy that into your project and start using protobuf :-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Kære alle

Kalenderen viser tydeligt, at julen atter nærmer sig med raske skridt. Vi skriver i dag den 4. søndag i advent og der er nu mindre end en uge til juleaften. Julegaverne er da også indkøbt og juletræet er købt, sat på fod og pyntet, hvorefter Silver har pillet de kugler og julehjerter ned fra træet, som han kunne nå. Som et af billederne viser, er vores juletræ således mest pyntet fra toppen og ned til midt på træt. Men det ser nu også meget sjovt ud med en kat, som kommer rendende med et julehjerte i munden eller bruger en julekugle som bold ;)

Silver er også en flittig gæst på klaveret, når vi spiler julesalmer, ligesom han elsker at sidde i sofaen sammen med os og se julekalender på tv. ”Ludvig og julemanden” har faktisk vist sig at være en overraskende god julekalender, og et par enkelte nostalgiske kig på Nissebanden på Grønland er det da også blevet til…

Den første weekend i december stod også i julehyggens tegn, da Niklas og jeg var på en weekendtur til Lübeck, hvor vi selvfølgelig fik både smagt og købt en del hjem af det berømte Lübecker marcipan. Desuden erfarede vi, at tyskerne er rigtig glade for juledrikke med en del spiritus i, hvilket medførte, at vi måtte vente et par timer ekstra med at køre hjem fra Lübeck om søndagen, da stort set alle de drikkevarer vi fik fat i på julemarkedet om eftermiddagen havde en del alkoholprocenter…

Sidste weekend bød på julefrokost, tangoworkshop, juletræspyntning, familiebesøg og den næsten obligatoriske gåtur til dyreskoven for at fodre dådyrene og kronhjortene med æbler, gulerødder og rugbrød. Desuden gjorde Niklas en god gerning med julehjælp i JCI regi; det er altid godt at kunne hjælpe de familier, som har det hårdt med lidt julevarer her i december.

I denne weekend har vi for alvor påbegyndt julefejringen, da Christinas mor og far, Hanne og Kjeld, havde inviteret os til ”førjul” i deres hyggelige sommerhus på Sjælland sammen med Christinas storebror Rasmus, svigerinde Anne og niecerne Freja og Emma samt vores tilsammen 2 katte og 1 hund. Dejligt at være samlet igen, og fint at kunne sprede julefejringen over flere dage.

Selve juleaften og 1. juledag tilbringer vi sammen med Hanne og Kjeld i Hjerting sammen med vores to katte, Dumbo og Silver. Den 27. december kører vi om morgenen af sted til Norge for at fortsætte julefejringen med Niklas’ familie og venner, som vi også fejrer nytårsaften med inden vi atter sætter kurs mod Danmark den 2. januar.

Det bliver dejligt med en lang juleferie efter et travlt år, der har budt på mange spændende oplevelser både privat og arbejdsmæssigt. På hjemmefronten med huset og vores ferier til Nice, Sardinien, Korsika og Norge samt vores fritidsinteresser, hvor dans fylder meget. Arbejdsmæssigt har Niklas skriftet arbejde, og er nu i Århus et par gange om ugen, mens han i det nye år skal starte en Esbjerg afdeling op for IT-firmaet Trifork. For Christinas vedkommende har det i efteråret og i december stået på omorganisering i kulturafdelingen, og efter adskillige timers oprydning og flytning rundt på næsten alle personers arbejdspladser, bliver det spændende at se hvad det nye år bringer af nye samarbejdsrelationer og opgaver.

Ligeledes bliver det spændende om der kommer sne igen i år til jul eller om regnen og blæsten fortsætter? Om ikke andet kan vi vel håbe på en hvid nytårsfejren i Norge med gode skimuligheder :)

Uanset om vi får tilført julestemning via sne eller ej, ønsker vi jer alle sammen en rigtig glædelig jul samt et godt og lykkebringende nytår.

På gensyn i det nye år!

Kærlig hilsen

Niklas og Christina

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

From time to time I get the same problem: the application switcher (command-tab) stops responding. It usually takes closing a lot of programs or restarting to get it working again. Today, I seem to have found the gangster: Screen Sharing. When I closed it, application switching started working again. It must have taken over the control over a couple of keys too many.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

ubd wanted to connect to windows.net, so I looked it up, and it belongs to Ubiquity.framework, that is a part of the iCloud integration. Hmm…

The man-page says this: “ubd is the ubiquity server process. It is primarily used for “Mobile Documents. There are no configuration options to ubd, and users should not run ubd manually.”

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Quick plug: my wife, Christina, just started her first blog, about our cat: Silver. Visit Silverkat and follow her blogging journey and our cat :-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Tomorrow I begin work at Trifork! :-) There I’ll be doing iOS development, so before I begin I thought I’d like to share a bit about how I do my development now.

First of all, I use GitHub and Beanstalk for source control, depending on what client the work is for (for my own projects, I use GitHub). Mercurial is nice, but git and svn just work with XCode, so I stick to that.

Since I have source control, I can have continuous delivery. For that I use Jenkins. Jenkins is not good enough. It’s not great. It’s not beautiful. It’s not intelligent, easy, friendly, intuitive, or all those other nice words. But it works! I use the Clang Scan-Build, Github OAuth, Github, Pre SCM BuildStep, Redmine, SICCI, SSH Slaves and Xcode integration plugins, even though I’d get most things done by just adding a shell script. That gives me a build per commit, which is nice and reliable and brings the pain forward. Jay pain! ;-)

Of course, having this infrastructure in place begs for tests. Now I think tests for iPhone applications suck. Bigtime! The reason is that I hate deployment cycles. It takes time, and that time I’d rather use writing code, thinking about the application, solving real problems for my customer, preferably before he knows about them. If not that, I’d rather drink coffee, do chores in my home, or clean my pipes, rather than waiting for build cycles. It’s just an enormous waste of time. And tests for iOS drain time, as there’s no such thing as a unit test for iOS. Everything is an integration test or a user acceptability test. You always fire up the entire application before running any test.

So now I have that rant done, it’s great that I can leave my tests to Jenkins. It will perform them, and the output will get converted to what looks like a JUnit test so that it can get picked up by Jenkins’ tooling and be presented nicely. Jay! :-)

Then we get to deployment. My clients communicate with me. A lot! This should be different like so, I changed my mind about this, I’ve found a bug if you do like this and that. It’s great! I love my users for this! It creates such a momentum! So how awful wouldn’t it be if I said “I’ll collect everything and give you a beta in three weeks”? Continuous delivery isn’t just delivery to me, it is to the users as well. For this I use HockeyApp. They’re a great bunch and really responsive, and while they just don’t support iOS 5 well enough yet, there is so much good there. My app gets auto-deployed up there and my client sees the new release, hits install and boom! Now he’s running the latest build! :-) Crash reports get sorted by build numbers, and the guys at HockeyApp have told me they’re working at making the crash reports even more awesome! Jay! :-)

So how do I follow up on these things? I have to admit, I’m a cheapskate, so I use Redmine. I would use Basecamp, and I hope to be using it, it’s so awesome, but so far it’s not been worth the extra cost. The day it is, I’ll run and buy it quickly. My problem with Basecamp and Redmine? I just haven’t seen how I’d integrate it with my scrum sprints. Yet. I’m sure they both can, and I hope to learn from people that are wiser than me in this regard.

Finally, after a deployment to the appstore, I use Flurry to keep track of where my users are at, both in version of the app (why don’t they upgrade! This new version is awesome! I need to tell them more about it!) and the OS (really? They’re still on iOS 4?? iOS 5 has been out a month now! Oh well, not everyone is like me). Also, I’ve rolled my own crash reporting that, should I have failed horribly, the users can get in touch with me or the client, with a detailed log of what went wrong.

So, that’s my work setup this far, and I’m quite happy with it. It still needs better scrum integration. It’s still too many pieces that don’t talk sensibly together. But it’s getting better knit together, and I’m looking forward to seeing how Trifork does it, how I can improve based on what they have to teach, and how I can improve the way they’re doing it. It’s going to be great! Those guys are brilliant, and I love working with brilliant people.

Finally, if you’re in the Esbjerg area, working with iOS, get in touch with me. If you’d love to start working with iOS, get in touch with me! There’s an NSCoder Night coming up soon, biweekly I hope. :-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

I’m such a sucker: now I’ve bought the Steve Jobs biography for Kindle, to be delivered tomorrow. I hope the book is great. I borrowed my last book of the kind to someone, but I don’t know who. ;-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

It’s great seeing that Play 2.0 is on its way. Play is my favorite Scala playground, but it’s always felt like a second class citizen there. With 2.0, it’s a first class Citizen, and they’ve even thrown Akka into the mix. So, as with anything I’m especially interested in, I’ve signed up to submit two bugreports.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Ok, everyone, let’s all calm down. There’s been so many blog posts and podcast debates all over the net about what’s wrong with Dart. The only problem with Dart, the way I see it, is that Google is too good at marketing: too much hype before we got to see the product.

The way I see Dart, it’s another language for doing client-side web application programming. Luckily, it’s not another Flash or Silverlight with its plethora of languages. It would like to be a part of the browser, but for now it contends itself to being a language that compiles down to JavaScript. That puts it together with CoffeeScript and Objective-J, to name but a few. See a long list here. As you can see from the list, this is nothing new.

The only problem with Dart is that everyone had their hopes up for the perfect language that would contain all their pet features. And of course, the set of preferred combinations is probably as big as the number of developers in the world.

What I find to be one of the strong points of Dart is that it uses the actor model as its concurrency model. I remember it well from my days at uni, thinking it was a model leading to waaay to much overhead. Surely, the Smalltalk guys must be mad! But as time has given us more power, I’ve come to believe that this is a great model, which has lead me to Scala and Akka. Although GCD is very powerful, I find myself looking into using actors in my language of choice, Objective-C, all the time.

So where does Dart go from here? Well, that depends on what kind of backing it has from Google. Google hasn’t been very clear on how well the Dart support is grounded in the organization. But if it gains a good community of libraries and evolves a good community, it could become the preferred way of writing Android apps, letting developers re-use code for their web-app and mobile app. If not, it could become shelved like Go.

Personally, on this front I’ll brush up my ancient JavaScript skills and look more at SproutCore the next couple of weeks, probably along with CoffeeScript. Then in a month or two, if there is any momentum going for Dart, I’ll probably write something where I can exploit Darts actor model and see if we become good friends. 2011 will be interesting still. :-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Yes, the 4S is a great video camera. The 5D still has the edge, but also the bulk. This device is going to be great. :-)

iPhone 4S / Canon 5d MKII Side by Side Comparison from Robino Films on Vimeo.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

I’m working with Xcode & Jenkins, and as part of that I’ve filed https://issues.jenkins-ci.org/browse/JENKINS-11370 for pre-scm-buildstep

The clang-scanbuild-plugin fails on install, so for that I’ve added https://issues.jenkins-ci.org/browse/JENKINS-11372

 

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

My inlaws’ computer hard drive died the other day, so I offered to help them buy a new Windows computer at the local shop. The specs were easy: Windows, Core i5, 4GB RAM and ~500GB drive.

Going in, I expected lots of extra sell-ins. And there were. What I found to be a very funny options, was to have them de-install all the extra crap-ware that comes pre-installed on the system. That’s funny! They get probably a few bucks from the software guys to have that pre-installed, and then they get a few bucks from the customer to de-install the software. That must be a great deal for them ;-)

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

To quote Jan Eggum: “Kor e alle heltane” (where are all our heroes, for you non-norwegians). Dennis Ritchie passed away today. That is Richie as in &R in K&R C, or The Book. Without Dennis, I’d probably not known my good friend Dag-Erling. I’d probably be writing Pascal. I’d probably given up on computing after having led the DemOS project in assembler and Pascal. Dag-Erling would not have been a FreeBSD committer. I would not have written my thesis about the FreeBSD project. There would be no Mac OS X, or iPhone. At least not the way we know it. There would be no /dev.

It was a sad moment when Steve died, and although Dennis was allowed to live many more years, it is too soon to see another giant in our industry go away. I am deeply thankful for what he has given our community, and for what he has given me, and most of the people I know in our industry.

There have been many obituaries, but the one I liked the best is written by Poul-Henning Kamp at Version2 (in Danish).

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

It is curious how the economy is described bad all over the place, yet the tech sector is growing and growing. The mobile phone app business is exploding, and Google today announced a 33% jump in revenue to $9.72 billion. This disconnect has been going on for a while, and doesn’t seem to have much of an end. Tech just isn’t stopping to watch governments that overspend struggle or bankers who made arrogant bets sweat.

So I make my “arrogant” bet: keep working hard to innovate in tech. The mobile revolution today is like the early days of the web. And this is even before the rest of my house is connected and all my life becomes GPS tagged. We have an amazing decade in front of us. Let’s keep doing great work, with attention to detail and love for our customers and craft, hopefully without any investors starting new bubbles, and let’s make great things happen.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Looking through the page source for iCloud.com I couldn’t but help how much SC was all over the place. That rang a bell. Apple has been helping out the SproutCore project before, so could it be that iCloud is based on Sprout Core? I bet it is :-) Time to put in that work to learn SproutCore that I had planned on doing a few months ago.

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
 

Dear Steve,
you have shown us that we don’t understand what we think we understand, and must redo what we think is done, in order to go forward. You’ve tought us not to accept mediocracy, not from ourselves and not from the world around us. Strive for passionate perfection, every day, with love. Love for what we do and those that surround us.

Rest in Peace

Share and Enjoy:
  • Print
  • del.icio.us
  • Facebook
  • LinkedIn
  • StumbleUpon
  • Tumblr
  • Twitter
© 2012 Niklas Saers' blog Suffusion theme by Sayontan Sinha