Author Archive

# Half a Release

Originally, we had planned to finalize and release our “Summer 2010” releases today.  We were almost there, but there were a few minor issues and regressions that had crept up during our last rounds of testing that we wanted to get in but for various reasons (mainly the vacation season, and two important contributors being off this and the next week) could not get in at this time.

For that reason, we have decided to postpone RTM by 2 weeks, in order to get those issues addressed, once everyone is back from vacation and settled in. Our ne wplan is to have the “Summer 2010″ release finalized and available to customers and trial users on Friday August 13.

The times before RTM are always a few busy weeks, and i’ve spent a lot of time this past week preparing change logs, writing the “what’s new” page, and i can tell you, we have an exciting release with a lot of very cool new features for you, so it should be well worth the extra wait.

Jim is currently working on a screen casts about some of them that we will hopefully be able to share with you as a teaser, early next week, as part of some bigger changes to our website that we have also been working on alongside the new releases.

You said Half?

That’s right. As you probably know by now, our core products, RemObjects SDK and Data Abstract are available on three platforms now. All the issues we were waiting for were isolated to the editions for Delphi and .NET (which, in general, have a of co-dependencies), but the team felt we were ready to ship the editions for Xcode. I know that many of you have been anxiously waiting for us to ship the official iOS 4 support, and so we decided to RTM Data Abstract for Xcode and RemObjects SDK for Xcode, today.

The products are available for download now, both as full versions for licensed users, as well as as trials at remobjects.com/trials. Next to other tweaks and improvements, the most exciting new feature in this release is completely transparent support for Background Task Completion in iOS 4. If your code uses asynchronous RO or DA calls (and you really should be using asynchronous calls, especially in Cocoa and Cocoa Touch apps), your calls will now complete in the background, when users quit your app – without any changes or code needed from you.

Also, Help.

We also shipped the first version of out new standalone “Offline Help” installer, which integrates a local snapshot of our wiki for F1 help in Delphi and Visual Studio. The wiki has been growing so tremendously, that we felt we had to separate offline help from the regular product installers and bundle it in a separate installer SKU, that (a) users can decide to download as they need (most users, we find, use the live online wiki) and, more importantly, (b) we can update out of band and independent of product releases, as the wiki gets updated.

You can download the installer now at remobjects.com/offlinehelp, or find more information on the IDE integration at http://wiki.remobjects.com/wiki/Wiki_Integration_into_Visual_Studio or http://wiki.remobjects.com/wiki/Wiki_Integration_into_Delphi, respectively. (For Xcode, we still ship the integrated live wiki – which is much cooler – but an offline version can also be obtained at http://wiki.remobjects.com/wiki/Wiki_Integration_into_Xcode).

 

That’s it, for now. I apologize for the slight delay with the .NET and Delphi products, but i hope you will find it worth the wait (also, if your subscription is up to date, you can always grab the latest beta we just posted today.

yours,
marc

by marc hoffman, July 31st, 2010

# Handling UIDeviceOrientationFaceUp & UIDeviceOrientationFaceDown

If your iPad (or iPhone) application uses UIDeviceOrientationDidChangeNotification to detect device rotation, there might be a couple cases you forget to think about. If your device is lying down flat (or upside down), there is still an implied “felt” orientation, based on how the iPad was last held before it went flat. How will iOS let you know about this? Here is what i found out when writing Dwarfland Photos:

After you sign up for UIDeviceOrientationDidChangeNotification, if your device is flat, you will receive 3 notifications. The first one will be with a value if UIDeviceOrientationFaceUp (or UIDeviceOrientationFaceDown), matching the actual current physical location of the device. Right afterwards, you get another notification, and this one will specify one of UIDeviceOrientationPortraitUIDeviceOrientationPortraitUpsideDown,  UIDeviceOrientationLandscapeLeft,  or UIDeviceOrientationLandscapeRight – depending on what the UI was showing before your app started (and indicating how the user will think of the device as being rotated). This is followed right up with a third notification that brings you back to either UIDeviceOrientationFaceUp or UIDeviceOrientationFaceDown.

Essentially, the device is pretending the user really quickly shook it back to an upright position, and back down.

The best way to handle this that i found in my app was to never ever use the actual reported orientation do fo any drawing or calculation, but instead cache the last “felt” orientation, within an handler as follows:

- (void)orientationChanged:(NSNotification *)notification
{
  UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
  if (orientation == UIDeviceOrientationPortrait ||
      orientation == UIDeviceOrientationPortraitUpsideDown ||
      orientation == UIDeviceOrientationLandscapeLeft ||
      orientation == UIDeviceOrientationLandscapeRight)
  {
    if (!currentOrientation)
    {
      currentOrientation = orientation;
      [self prepareScreen];
    }
    currentOrientation = orientation;
  }
  [[UIApplication sharedApplication] setStatusBarOrientation:currentOrientation animated:YES];
}

All my code will use currentOrientation, so it will always have a proper orientation value. Also any screen initialization that depends on having a proper orientation (in Dwarfland Photos that is the initial drawing of the startup logo, once Default.png disappears)  i do in prepareScreen, which is not called until i obtained the proper “felt” rotation.

by marc hoffman, June 29th, 2010

# Introducing Dwarfland Photos for iPad

 

Photos-in-iPad-600.jpg

 

Last Saturday i wrote and submitted my first, personal app for the iPad. I had been long looking for a great idea, and the previous evening, while seeing my flickr-based screen saver play on the TV screen, i decided to create an app that shows off some of my photos on the iPad. I started experimenting that night, and did the  real implementation the following morning.

While implementing the app did provide a few challenges (for example, it uses a unique way to react to screen rotation – when you turn your iPad around, the current image will not turn, and the image you are viewing will stay on screen exactly as it is. However, the orientation of the next image that is about to come on screen will adjust to the new device orientation), the result is a very a very simple (i ended up with less than 200 lines of written code), yet – i hope – beautiful application.

There’s no UI. no controls. Just pictures.

Once the application was finished and working, the real work began, and most of the time was spent selecting the right set of 90+ images from my photo library, all of which are included in the app in high 2048*x resolution, to look stunning on the iPad’s display.

Late last night, “Dwarfland Photos” was approved (after being “in review” for a ridiculously short amount of time), just in time to make Steve Job’s promise of “within 7 days”, and it is available on the App Store, now — i hope the one or other of you, dear readers, will decide to get a copy.

As time permits, i am planning to extend the application, in the future. For one, future updates will include new (and in many cases exclusive to the app) images. I will also play with the option for the app to automatically look for and download new images in the background, as they become available, as well as maybe to provide a few (hidden by default) controls to favorite and revisit images, or possible select images as wallpaper for your iPad lock or home screen.

Enjoy!

 

Photos-AppIcon-128.png

by marc hoffman, June 26th, 2010

# Improvements to RemObjects SDK and Data Abstract for iOS 4

 

iOS-4

Yesterday, Apple shipped iOS 4, the latest version of its operating system for iPhone and iPod touch. As you’ve undoubtedly read abut elsewhere in detail, iOS 4 brings with it many improvements for developers, mostly (as far as it affects us) in regards to multi-tasking and background operation.

We’ve been busy updating our “for OS X” products to take advantage of some of these new features in iOS 4, and there’s two areas in particular that i would like to highlight.

Background Tasks

As you probably know, iOS 4 adds support for multitasking of third party applications, but does it in a restricted fashion that ensures background applications do not negatively affect battery life or performance. Regular applications will be completely suspended when the user switches away from them, and get no time to execute – no iOS 4 multitasking is no opportunity to keep working and talking to your servers in the background, as you please.

However, iOS 4 provides a handful of opportunities for apps to keep running in the background. Most of these (VoIP, Audio Playback and Navigation) do not really affect our libraries, but there is one that does: Background Task Completion.

Background tasks basically allow your app to say “hey, i’m kinda in the middle of something, do you mind”, and let iOS give your app a chance to finish what it’s doing. Normally, this is a manual action your code has to take to request this, but RemObjects SDK encapsulates this for you: every asynchronous request (you are using asynchronous requests, right? if not, you really should) you make will automatically participate in iOS’s background task completion system, so of the user does happen to quit your app, RO will try and keep your request running until it completes (yours app will still be suspended, once it does, but you can pick up with the result of your call, once the user switches back).

Now, keep in mind that background task completion is no guarantee. The OS might still go ahead and suspend your app completely, if your request is taking too long (were you uploading a 30MB video in one large chunk, maybe?). Or your app might even be killed completely, if memory runs low. But in most scenarios, background task completion will let your request succeed, even though the app was terminated.

If iOS does happen to suspend your app ahead of time, you will of course get proper failures for your request, once your app wakes back up. If you have code in place to handle connection failure gracefully (for example in case of signal loss) now, you should be well covered.

There’s nothing you need to do in your code (except build against the iOS4 version of RemObjects SDK) to take advantage of this. the iOS4 version of RO will also gracefully fall back to not mess with background task completion if it finds that it’s running on an older iPhone OS, in case your app supports multi-targetting with iPad (3.2) or iPhones running 3.x.

Blocks and Grand Central Dispatch

Not strictly a new feature of iOS 4, Blocks and GCD were initially introduced in Mac OS X 10.6 (Snow Leopard) and now made it into iOS as well. We’ve enhanced RemObjects SDK and data Abstract thruout, to take advantage of bCGS where possible, and to provide overloaded methods that work with blocks.

For example in addition to using any of the existing beginGetDataTable* methods on DA’s Remote Data Adapter that will call back your delegate, we now have versions where you can pass a block, to be called once the request as completed, and your table has been downloads. e.g.

[rda beginGetDataTable:@"Customers" withBlock:^(DADataTable *customers){
  for (DADataTableRow *row in customers)
    NSlog(@"Name: ", [row valueForKey:@"Name"]);
}];

This helps keep request and response code in one place, and makes asynchronous remote calls a lot easier in general.

On RemObjects SDK level, RODL-generated code for your services will also get extra overloads that allow calling your own methods with a block to receive the response.

Deployment Changes

Most of the changes described here will be in the next beta builds for Data Abstract and RemObjects SDK, which should be available for customers later today. They will ship as “final” version with our July release.

We’re also making some changes to our binary deployment, alongside this.

We have switched our build machine to the new iPhone SDK 4, so we’re now building and shipping iPhone OS 3.2 (iPad) and iOS 4 (iPhone & iPod touch) binaries only; the 3.2 binary does nor use any 3.2-specific APis, so you will be safe using that for 3.x projects (and even the 4.0 binary will downgrade gracefully for older deployment targets), but if you do need binary versions built for specific older versions of iPhone OS, you can always build from source. The binaries we do ship are now in the Bin/iOS folder; you might need to adjust your projects’ Library Search Path setting

We have also changed the default build target of our Mac OS X libraries to 10.6 (Snow Leopard) and the framework binaries we ship are built for that and include full support for GCD and Blocks. Of course you can still rebuild the framework from source, if you need to deploy to 10.5 (Leopard), and don’t use GCD.

 

Ok, so that is a quick summary of what’s coming of in RODA/OSX for iOS 4 with the July release. If you are doing iOS 4 development (or even if not yet), please give the beta (available later today) a try, and let us know what you think!

yours
marc

by marc hoffman, June 22nd, 2010

# Pioneer Tree

 

Big-Ass Tree

Giant Redwood on the Pioneer Tree Trail in Samuel P Taylor State Park, California. Infrared. Taken while out photo shooting with Michael Swindell of Embarcadero Technologies north of San Francisco, this afternoon.

by marc hoffman, June 7th, 2010

# Find the Golden Gate Bridge

 

Golden Gate Bridge. No, Really.

by marc hoffman, June 6th, 2010

# San Francisco, Airborne

I had the good luck of having a complete isle-window block of seats to myself on the flight into San Francisco, today, so i took the opportunity to take some pictures in flight. Lot’s of good stuff, but these two stuck out as favorites on first review in Lightroom, so i thought i’d share them:

DSC_9756.jpg

The coastal line north of San Francisco. This should be some of the area where Michael Swindell and i were photo shooting last summer. For instance, i believe the small set of islands 2/3rds from the right are the ones with the lighthouse shown here.

DSC_9795.jpg

The Golden Gate Bridge, covered in a bank of fog.

DSC_9802.jpg

And finally, downtown San Francisco, with the Bay Bridge and Treasure Island at the top.

by marc hoffman, June 5th, 2010

# Release Timeline for 2010

With the major release of Delphi Prism out of the way now, it probably is time to talk a bit about our remaining timeline for releases this year. I realize we haven’t updated our official ROadmap since the beginning of the year, and hopefully, this post will make up for that until we get a chance to do that.

The last release of ROFX, our suite of library products including RemObjects SDK, Data Abstract, and more, was in early March and the teams have been busy since, working on good stuff on all fronts.

Because we have several “big” features in the works for the next releases, we have decided to vary slightly from our usual quarterly release cycle this year by “merging” the May and August releases into one single release that will hit sometime in July, instead. This will give us slightly longer development cycles, both for this next release, and also for the (regular, as scheduled) November release later this year. This in turn allows us to tackle more big features in a single go.

Among the new features you will see this Summer (most of which we have already talked about or hinted at) are modelling support via Relativity Server and a full-blown Server Explorer and Schema Modeler for the Mac (in DA/OSX), new Server and Client side business rules scripting in both DA/.NET and Relativity, and a brand new New Project wizard system in DA/.NET that will make it way easier to start new projects, or add a new client project to an existing solution. And these are just the big ones.

For the Winter release (in November), we’ll expand the scripting support to the other two platforms (Client and Server for Delphi/Windows, and  Client for Mac OS X), and also bring you a new Schema Modeler for Windows. The current Scheme Modeler has gotten long in the tooth and we’ve been meaning to thoroughly revamp it, for a long time. The new SM will be driven by some of the experiences we collected implementing the Mac version, but also by years of working with the current Schema Modeler and learning its limitations and issues. We’ll also bring the new template system to Delphi, as well.

Betas

Starting a couple weeks from now (probably once I’m back from WWDC), we’ll start up a more regular beta cycle again, with (mostly) weekly beta builds of RO/DA for all three platforms, all the way thru to the July release, and beyond. Many of the new features (especially DASM/Mac, and the Scripting) will be fully functional by then, and we’ll be looking forward to your feedback.

Remember that beta access is available for all customers with an active subscription. Simply point your browser to beta.remobjects.com, which will take you to the beta section on our new portal site. After logging in, you will see a list of all the products you have with an active beta program, and a list of their beta downloads (if any – we don’t always have a current beta, especially not shortly after a “release” release). The usual caveats for using beta builds of course apply.

by marc hoffman, June 2nd, 2010

# Delphi Prism 2011 has RTMed

Last night, we ran the RTM build of the latest Delphi Prism release.

Delphi Prism 4.0.23.741 is the result of over a year of work from the team here at RemObjects, and marks the probably single biggest release we ever have done, since ‘Chrome 1.0″ shipped back in the spring of 2005.

The Road to a New Project System

The funny part is that the biggest new feature is one that most users will not notice, or take for granted – and that is  a complete rewrite of the core IDE integration engine. You see, back when we first shipped the product, Visual Studio .NET 2003 was the latest version of Visual Studio, and the way to integrate with that was cold, hard C++. We didn’t like it, but we had no choice. We tried to implement large parts of our IDE smarts (code model and code completion, these sorts of things) in managed code, but the crucial parts that talked to Visual Studio, the parts that were the most difficult, were done in C++

With Visual Studio 2005 and later 2008, Microsoft introduced the option to create full project systems in managed code, but for one reason or another, we never made the switch. The thing was working, after all. and we had better things to do with our time, like adding new features.

With Visual Studio 2010 looming ahead, and with integration into MonoDevelop also starting to look like more of a possibility, we finally made the plunge last year, after the Spring 2009 release was out the door, and started serious work on the new project system. We did a lot of refactoring, to separate VS-specific code from generic code, with the goal to be able to share as much code as possible between IDEs, and have as little IE specific code for Visual Studio or MonoDevelop, as we could get away with.

This all progressed great, but as the August 2010 release date was approaching, we realized there was way too much work ahead of us, too many Ts to cross and Is to be dotted for us to deliver a quality release based on the new code, so we rowed back, and in a branch of our VSN repository combined the old “May 2009″ IDE code base with the latest compiler, to ship the August release, “Delphi Prism 2010″. At the same time, work went on in the main trunk, on the new project system, which we are now shipping, half a year later after having waited for MonoDevelop 2.2.2 and Visual Studio 2010 to finalize.

So, the big feature for this release, as far as we are concerned, is that you don;t really see a difference between this release and the last, but that Delphi Prism is seamlessly integrated into two brand new IDEs: Visual Studio 2010 and MonoDevelop.

Visual Studio 2010

Along with Visual Studio comes of course a host of new features – i’m tempted to say ‘for free” when of course many of these have been a lot of work under the hood, for us. There’s support for the new Silverlight 4, better WPF support and – most importantly, the new .NET 4.0 runtime, which allowed us a lot of new and advanced compiler features, from Dynamic Types over Tuples and Big Integers to obscure (but cool) things such as generic co- and contra-variance.

There’s also things that truly do come for free with the new IDE, such as new new WPF based code editor (which is very nice to use and due to WPF’s smooth (and dare i say Mac-like) font rendering very easy on the eyes. There’s also the new Visual Studio debugger, which as been vastly improved in many areas, not the last of which the debugging of multi-threaded programs. The list goes on – just search for what’s new in VS2010, and the vast vast majority of what you’ll find will apply to the new Delphi Prism.

Of course Delphi Prism 2011 will install into an existing version of VS2010, or come with and install its own copy of the Visual Studio 2010 Shell, if you don’t own VS2010 yourself. (Delphi Prism 2011 will also still install with Visual Studio 2008, if present, but it won’t bring it’s own copy. If you need both VS2008 and VS2010 on a fresh install, you can install the August 2009 release, and then upgrade to the new version, to get both Shells)

MonoDevelop

But wait; Visual Studio is not where it ends. Delphi Prism 2011 also supports MonoDevelop 2.2, on both Windows and Mac OS X. When you run the Delphi 2011 installer, it will automatically detect MonoDevelop (if present) and offer to register with it, or offer to freshly install MonoDevelop 2.2.2 for you, if you don;t have it yet.

So you can choose to use either VS, MD or both IDEs, depending on your preference.

For the Mac, we have a separate distribution of MonoDevelop.app that includes Delphi Prism; this will be a .zip file on your ISO or DVD that you can simply unzip on your mac and copy to the Applications folder.

On both Windows and the Mac, Delphi Prism integration into MD will give you the full development experience that MD has to offer. This includes the Gtk# visual designer on Windows (the MonoDevelop guys don’t yet support that on the Mac, i’m afraid), integration with MonoTouch (if you own a copy) on the Mac, and so on.

Of course MonoDevelop as an IDE is still very young, so compared to Visual Studio there is still a lot of catching up that needs to be done, both on the IDE itself, and on the more advanced IDE features that Delphi Prism supports. Our goal for this release was to provide a basic set of functionality that allows you to start working and be productive in MD. Over time, we’ll work on feature parity with VS, bringing more of the advanced features (such as “Paste C# as Oxygene“, or the Oxfuscator integration) over.

We’ll also be working on adding support for Linux as third MonoDevelop platform to Delphi Prism.

What Else?

Of course there’s a lot more to Delphi Prism 2011 than “just” two brand new IDEs. I finalized the official change log for this release a couple days back, and amazed to see that we have close to 400 bug fixes and minor improvements thru-out the product (and that does NOT even include any fixes and enhancements that happened witjhin the product cycle [such as, any "fix" related to VS2010 or MD support, which never shipped before]. that’s just fixes and improvements over the previous August 2009 release.

There’s also roughly 30 major new features (such as for example new Expression types, MacPack Integration, a cross-platform helper library for Mono) and 30 less major but noteworthy  enhancements (such as enhanced functionality in Cirrus, compiler optimizations, framework multi-targetting or support for T4 template files).

What’s Next?

The next release of Delphi Prism is already looming ahead, this fall alongside the new RAD Studio. Because  the current release was such a major milestone (and is shipping such a vastly new codebase, for the core IDE integration), we’re planning for that next release to be a pure maintenance and bug-fix release only. To start with, our team here at RemObjects will take a week or two off to recover from the rush of getting such a major release out the door.

After that, we’re planing to get back to a regular cycle. We want to release weekly new beta releases (as we have done over most of the course of this past beta cycle), combined with monthly “stable” releases that focus on  fixes and improvements in various areas of the product. The idea is that (if you join the beta program – and remember, every Delphi Prism customer is welcome to join, and we’d welcome your feedback),  you have the choice of frequent latest builds, or regular “production level” builds, as we move from the current release towards the August 2010 one.

When can You Get it?

As mentioned at the beginning, the RTM build was signed off to the team at Embarcadero yesterday. The team in Scott’s Valle will go thru some final QA cycles and prepare for the distribution to customers. If all goes well, i’m told the new release should be in the hands of people within about a week, both as new public trial, and as free update to all customers with Software Assurance (you do have Software Assurance, right!?).

Even if i were to just link to the direct download, for this release you will need a new serial number, which you should receive from Embarcadero in time.

 

Thanx for reading, and i hope you’ll enjoy Delphi Prism 2011 as much (if not more ;) as we have enjoyed creating it. Let us know what you think, either here, via email, or on the ongoing beta program.

by marc hoffman, May 23rd, 2010

# WWDC

Apple finally announced their annually World Wide Developer Conference, WWDC, today, after much anticipation and delay. Of course I bought my ticket right away, and am looking forward to the conference already.

I’m also looking forward to meeting any of our customers and/or readers of this blog – if you are going, drop me a message here, via email or twitter, and we can meet up!

See you in San Francisco!

Sent from my iPad

by marc hoffman, April 28th, 2010