Eye operation is almost a success!

I did not really write about this but last Friday I had my eyes operated on (LASIK) surgery. I was pretty much out of commission the entire weekend and I am able to look at a computer screen today so I guess I am back in action. A lot happened over the weekend and I don't want to go into too much detail about it but what I would like to do is write about the procedure as I find it more interesting now that I have been through it.

I was not a candidate for the “cutting” version of lasik where they make an incision and flap the cornea over because my cornea is too thin. So I had to have the scraping method. The recovery is 3-5 days and you have to wear a bandage clear contact lens – which I get out tomorrow. In short, the procedure was more than interesting. Seeing the scraping, laser and everything else was amazing but very annoying. It was pretty difficult to keep steady and look at the “red light”. The entire procedure took about 20 minutes and the laser took 46 seconds on my right eye and 41 seconds on the left eye. I am around a -5 prescription in both eyes – give or take a few points. I was able to pass the drivers test the next day (on Saturday). As my wife says, I am a bad patient and I know she put up with a lot of crap over the weekend. Especially on Monday where the left contact would not stay still – it was extremely irritating. I used the “special medicine” last night and I slept like a baby. This medicine basically numbs the entire eye and you don't feel anything. The problem is if you use it the eye stops healing so its not recommended. Today I feel great! I can see the computer and I can't wait to get the “bandages” off tomorrow.

So far everything is great. Stay tuned..

We will miss you Scott…

I just read this over at MBR blog.

I worked with Scott on Notes 6 and Notes 7, it is sad to see someone like Scott pass at such an early age. He put me in my place many times with regards to what users “Samantha” can understand and how software should look. I learned a lot from Scott.

Using a standalone NSF for a composite application with Eclipse features

I decided to post the second half of this article on this site because it is so much easier for me to work with my editor and images. (sorry)

The second half of the posting is about creating a single NSF that will house the CA definition and Eclipse update site. This will make distribution of the application very easy – deploying on a server or sending a single file around. The benefits of this model are there is only one file (the NSF) and it contains all of the Eclipse features within that file.

You first start by creating a new application from File | Application | New menu. Then you select “Eclipse Update Site (8)” as your starting template:

Now that you have the database you need to import your Eclipse features and plugins into the database. I usually export my stuff into an Eclipse update site and select the “Import Local Update Site” option from the view actions:

After that is complete, you should see the results in the Features and Plugins views:

Notice the feature name and versions? You will need to remember this stuff later.

Now open the Domino Designer and edit the application. You will see a new folder on the left named Composite Applications. Select that view and now you can create a blank composite application definition like so:

Notice you can export and import CA XML from other sources, like a file or stream saved from Portal.

Once that is done, modify the application properties and make this NSF launch as a composite application:

Now close Designer and go back to your Notes client. Open the NSF you just created. You should see a blank composite application. You will then select from the top menu Action | Edit Application:

This now puts you into the Composite Application Editor. This is where you can create pages and drag components from the palette onto the screen. The next step is to modify a components advanced properties to place the Feature information on the component. This tells the composite application infrastructure code to install these features when this application is accessed or upgrade them if a prior version is already installed.

Right click on a component and bring up its Component Properties:

Select the advanced properties button on the next screen to show the Advanced Properties Dialog box:

You might have to click on the that image to read it. The key here is the format of the entries for the provisioning code. The properties have four entries per feature that needs to be installed:

id.Feature_N – the feature name and you increment the N each time
match.Feature_N – the feature match rule, same as eclipse. Usually compatible
url.Feature_N – the URL to the feature. Notice the picture shows an NRPC URL using the Notes replica ID and then the site.xml
version.Feature_N – the version of the feature.

You can get the Replica ID of a database from the DB properties:

I know I kind of went quick and I did not really go into “creating the application” (ie. pages, layout, wiring, components, etc) but I wanted to get the underlying high level concepts across.

Tags: : : :

“You da man”

Larry – my pet African Grey parrot – sits in my office with me most days. Last Thursday every time I left the office and came in I said “you da man”. By Sunday he was pretty much saying it somewhat clear. I leave on Monday for Orlando and my wife Chris tells me he is starting to say it non stop. So in short, Larry now has a new phrase “you da man”. Every time he says it I just start laughing.

Portal Tech Conference Update

I am done presenting all of my sessions! The turn out was less than impressive however the customers that showed up had some great questions and ideas and really understand the technology much more this year.

The biggest responses were around the following areas:

* NSF based Update sites for deploying composite applications
* Integration with existing Notes based components – views, docs, etc.
* Off line support for portlets and data synchronization scenarios

Tags: : : :

Using the Model View Controller pattern when creating viewers

I realized after using the dashboard application I created for my team how nice it would be if it used a breadcrumb type of navigation to go between its pages. The cool thing about breadcrumb navigation is it only takes up one horizontal line on the screen – not a lot of real estate. Here is a screen shot of the widget:

The way a breadcrumb navigation works is each entry in the list is hot and if you click on one of the entries you will get a menu for all of its children and down. Here is a screen shot where the root page is selected – you basically get the navigation for the entire application in a single menu:

If you click on a middle entry you will only see from itself down in the hierarchy:

This is a pretty straightforward sample where I created a Widget, a View, and then a content provider and a label provider. The cool thing is, since I abstracted everything you could replace any piece to get a different behavior. Making a widget allows others to embed my widget into their views and then even use their own label and content providers but still relying on what the base widget provides. I decided to make my viewer extend from “org.eclipse.jface.viewers.ContentViewer” and enforce a content provider derived from “ITreeContentProvider” and a label provider derived from “ILabelProvider“.

The widget is where all of the UI is drawn. In the attached source the widget is the BreadCrumbNavViewer class. I used basic Labels for the UI, however I did use the SWidgets that are shipped with Notes and Expeditor so my navigator can have the look and feel of the client. I also probed the Theme, Color and Font registry to figure out what ones to use, you can see that in the source. The beauty of the Model-View-Controller pattern is the view part does not know anything about the objects it is presenting. You will notice the entire widget only works with Object's, nothing else.

The view is very basic, pretty much all of the code is below however, you can go and see all of the code for BreadCrumbNavigatorView. I made the view implement a SelectionListener interface where it gets called back with the original Object it passed in for the menus. This makes the abstraction complete – while the widget provides the menu, the view acts on the selection.

The content and label providers are where all of the implementation specific code is for handling the Topology Handler model. This means this breadcrumb widget can be used with any model – not just Topology. In composite applications the model is a hierarchy of pages and labels. The code you see in the providers is specific to it.

Lastly, if you want to have a custom navigator you need to set some application and page properties in order to get the behavior of the original navigator. First, you need to specify the “com.ibm.rcp.navigationModel=custom” and and the “com.ibm.rcp.useNavigator=true” in the Application advanced properties in CAE. This will make each perspective show in the same tab and not have a new tab open. These application page settings will by default display each page of your CA in the same tab. For any page (not the Application page) that you would like to have displayed in a separate tab, add “com.ibm.rcp.useNavigator=false” to that page's properties.

Full plugin and source can be downloaded here.

Code for BreadCrumbNavigatorView

	BreadCrumbNavViewer nav = null;

@Override
public void createPartControl(Composite arg0) {
nav = new BreadCrumbNavViewer(arg0, SWT.NONE, this);

nav.setContentProvider(new TopologyNavContentProvider());
nav.setLabelProvider(new TopologyNavLabelProvider());

TopologyHandler handler = TopologyHandlerFactory.getHandler( );
Navigation n = handler.getNavigation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getPerspective().getId());
nav.setInput(n);
}

@Override
public void setFocus() {
// TODO Auto-generated method stub

}

public void selectionChanged(Object obj) {
if (obj instanceof Page){
Page page = (Page )obj;
try {
PlatformUI.getWorkbench().showPerspective(
page.getPerspective(),
PlatformUI.getWorkbench().getActiveWorkbenchWindow());
} catch (WorkbenchException e) {
e.printStackTrace();
}
}
}

Tags: : : :