I wrote a number of articles in THE VIEW some time back on writing custom Sametime blackboxes (see the March/April and May/June 2008 issues). If you implemented the Sametime blackbox that read data from Lotus Connections (like it's done on bleedyellow.com) and you have upgraded (or are planning to upgrade) to Lotus Connections 2.0 this post is for you.
The database schema for Lotus Connections 2.0 has changed slightly in comparison with Lotus Connections 1.0.x so if you're using a custom Sametime blackbox to read data from Lotus Connections it needs to be changed. The only thing that needs to change is the SQL since the key column in the EMPINST.PHOTO table has been renamed from PROF_UID to PROF_KEY (hightlighted in the SQL below).
SELECT EMPL.PROF_UID UID, PROF_DISPLAY_NAME DSP_NAME, PROF_MAIL_LOWER EMAIL, PROF_MOBILE MOBILE, PROF_PAGER PAGER, PROF_TITLE TITLE, PROF_TIMEZONE TIMEZONE, PROF_TELEPHONE_NUMBER PHONE, PROF_BLOG_URL BLOG_URL, EMPL.PROF_DEPARTMENT_NUMBER DEPT_NO, DEPT.PROF_DEPARTMENT_TITLE DEPT_NAME, EMPL.PROF_ORGANIZATION_IDENTIFIER ORG_IDENT, ORG.PROF_ORGANIZATION_TITLE ORG_NAME, EMPL.PROF_ISO_COUNTRY_CODE CTRY_ISOCODE, CTRY.PROF_COUNTRY_DESC CTRY_NAME, P.PROF_IMAGE PHOTO_BYTES, P.PROF_FILE_TYPE PHOTO_MIMETYPE FROM EMPINST.EMPLOYEE EMPL LEFT OUTER JOIN EMPINST.PHOTO P ON EMPL.PROF_KEY=P.PROF_KEY LEFT OUTER JOIN EMPINST.DEPARTMENT DEPT ON EMPL.PROF_DEPARTMENT_NUMBER=DEPT.PROF_DEPARTMENT_CODE LEFT OUTER JOIN EMPINST.COUNTRY CTRY ON EMPL.PROF_ISO_COUNTRY_CODE=CTRY.PROF_ISO_COUNTRY_CODE LEFT OUTER JOIN EMPINST.ORGANIZATION ORG ON EMPL.PROF_ORGANIZATION_IDENTIFIER=ORG.PROF_ORGANIZATION_CODE WHERE EMPL.PROF_MAIL_LOWER=?
Previously I installed Lotus Connections 2.0 fixpack 1 and it took me a while to figure out the syntax so I blogged it. Now I just installed a fix and that too took some figuring out so here is the syntax.
I had to install the LO32615 fix from IBM Lotus (issues with the work location fields) and the syntax is as follows:
- Follow the steps in the post I link to above but don't invoke the updateLC.bat command
- Use this command: updateLC.bat -fix -install -installDir <Lotus Connections install dir> -fixDir <path to where the fix jar-file is stored on your system> -fixes <the name of the fix (here LO32615)> -wasUserId <WAS userid> -wasPassword <WAS password>
This weeks SnTT post is about Lotus Connections and how to more easily get access to and change the translation files for the UI of the Profiles feature.
Configuring which pieces of information are surfaced in the Profiles feature is pretty easy and well documented using the profiles-config.xml file. Changing the label text however is harder and not that easy to do. As it is documented it involves stopping profiles, locating a jar-file, extracting it using WinZip, changing a properties file, repackaging the jar-file, redeploying the jar-file and finally restarting profiles to see the change. This is well and good and acceptable if you only need to change the file once, but chances are that it's an iterative process and you need to do it multiple times. Wouldn't it be easier to simply stop profiles, change the file and restart profiles? Well read on to see how.
The labels for the fields (and all the other pieces of text for that matter) in Profiles are stored in property files in a jar-file in the Profiles application. Changing the property files for the appropriate language causes the text to change in the UI after a restart of the Profiles application. This is easy enough but require a lot of repeated steps every time since you have to unpack the jar-file, change the property file and repack the jar-file.
Since Profiles is just another Java web application we can move some of the classes and property files out of the jar-file (in the "lib"-directory) and into the "WEB-INF/classes"-directory. This means that we only have to repack the jar-file once and for all since the property files are now available from the "classes"-directory.
On your Websphere Application Server where the Profiles feature is installed (with Profiles stopped) do the following using a file explorer:
- Open the profile directory for the profile you're using
- Open the installedApps directory and the node directory underneath it (chances are that there's only one node directory)
- Open the Profiles.ear directory
- Open the peoplepages.war directory
- Open the WEB-INF directory
- Create a new directory called "classes", and inside this directory create a com/ibm/peoplepages/webui directory (a total of 4 directories)
- Open the lib directory and locate the peoplepages.web.jar file and make a backup copy of this file
- Now unzip the jar-file (maybe renaming it to a zip-file first), navigate through the directories to com/ibm/peoplepages/webui and move the resources folder to the "classes/com/ibm/peoplepages/webui"-directory you created above
- Navigate back to the extracted jar-file and zip the "com" and "META-INF" directories back up into peoplepages.web.jar and overwrite the peoplepages.web.jar file you located in step 7
Now when ever you need to change a label for a field simply locate the label or text you would like to change in the property files underneath WEB-INF/classes/com/ibm/peoplepages/webui/resources and restart Profiles.
Please note that the above probably isn't supported by IBM... :-)
So one of the things I have been wresteling with over the last couple of weeks is the Accounts API in Notes 8 / Expeditor. While very nice at the core it does leave something to be desired. Trying to interact with the Accounts API from a plugin running in Notes can and probably will result in an exception and the following messages being printed to the OSGi console if you happen to be looking there (which you really should). Look for an upcoming post for any easier approach... :-)
CLFMW0050E: Workbench is not ready to handle background thread request ! CLFMW0036E: Workbench is not ready for this operation
Suffice it to say that the lesson is that the Accounts API might be the same across Expeditor based clients but the implementation differs. For instance On Notes the accounts are stored in the local name and address book while it is stored in other formats in other Expeditor clients. This is all well and good but the fact that a Notes database is the backend store on Notes leaks through the API. The above messages are solved by running the code that access the Accounts API in a NotesJob. Really!? This is very poor design IMHO but something I think we have to live with.
Ahh the frustrations sometimes makes me want to scream...
<Application server (e.g. server1)>\Java and Process Management\Process Definition\Java Virtual Machine\Custom Properties java.security.auth.policy -> <path to communities.policy file>
"You take the red pill - you stay in Wonderland and I show you how deep the rabbit-hole goes."
I do not consider myself a total nut job but I invite you and encourage you to listen to this episode of the Daily Source Code podcast for your start to the awakening. If nothing else it's an eye opener... Taste the red pill.
So TwitNotes has been out for a while now and I have been discussing various aspects of the application with users. One of the issues that come up time and time again is proxy support. The proxies supported by TwitNotes v. 1.0.5 are the proxies supported by the Notes version you're using.
One of the issues I discovered is that the proxy configuration in location documents doesn't seem to work all the time. Sometimes the proxy configuration is only picked up from the "Network Connections" page under Preferences. Another observation is that only the "Manual proxy configuration" option seems to work.
Your miles may vary and please let me know if you have proxy issues.
Finally solved a problem I have been having with Microsoft Excel 2003 crashing on Windows Vista by disabling the Bluetooth add-in... Read more at forums.microsoft.com if you have the need...
So today is YellowDay and what does that mean? Hmm... I don't know yet but I'm gonna figure it out! :-)
Ahhh some of the fun stuff you see when running Notes 8.5 with the OSGi console showing... :-)
<DWSystem> null [<DWSystem> 11:11:46:590] partial 0.000 - cumulative 0.000 - instantiate controller [<DWSystem> 11:11:48:545] partial 1.955 - cumulative 1.955 - instantiate action dispatcher [<DWSystem> 11:11:48:870] partial 0.325 - cumulative 2.28 - instantiate ComputeAttrs [<DWSystem> 11:11:48:880] partial 0.010 - cumulative 2.290 - instantiate AttrMap [<DWSystem> 11:11:48:910] partial 0.030 - cumulative 2.32 - instantiate distance function [<DWSystem> 11:11:49:855] partial 0.945 - cumulative 3.265 - set incremental augmentor to null [<DWSystem> 11:11:49:965] partial 0.110 - cumulative 3.375 - instantiate executor [<DWSystem> 11:11:50:906] partial 0.941 - cumulative 4.316 - instantiate displayer [<DWSystem> 11:11:50:971] partial 0.065 - cumulative 4.381 - instantiate treewalker [<DWSystem> 11:11:50:976] partial 0.0050 - cumulative 4.386 - instantiate the widget manager [<DWSystem> 11:11:51:106] partial 0.130 - cumulative 4.516 - instantiate instrumentation services [<DWSystem> 11:11:52:021] partial 0.915 - cumulative 5.431 - instantiate the abstraction module [<DWSystem> 11:11:52:351] partial 0.330 - cumulative 5.761 - instantiate the logical name translator factory class name com.ibm.pw.DocWizard.ExpeditorWidgets.ExpWidgetFactory Create ExpWidgetFactory factory class name com.ibm.pw.DocWizard.SWTWidgets.SWTWidgetFactory [<DWSystem> 11:12:01:577] partial 9.226 - cumulative 14.987 - instantiated the widget factory [<DWSystem> 11:12:02:009] partial 0.432 - cumulative 15.419 - instantiate step instantiator [<DWSystem> 11:12:02:597] partial 0.588 - cumulative 16.007 - instantiated the session trace [<DWSystem> 11:12:03:272] partial 0.675 - cumulative 16.682 - instantiated control loop - done initializing DWSystem View initialization done CLOSING SYSTEM
Had to add a couple of Lotus Connections Websphere server processes as services under Windows today and found this nice blog post that describes how: Creating a Windows service for WebSphere AppServer
Show 'n Tell Thursday: Cross compiling sidebar plugins for Notes 8.0.x and Notes 8.5 (7 August 2008)
I haven't done a SnTT in months (actually the last one was back on 24 May 2007) so I guess it's about time. This week it's about cross compiling sidebar plugins for Notes 8.5 and Notes 8.0.2. Enjoy...
Since installing Notes 8.5 I have had a lot of trouble developing in Eclipse 3.4 for Notes 8.5 and having the plugins work in Notes 8.0.x as well. The problem showed itself as a NullPointerException when trying to load the plugin Activator and a "Viewpart is null" message in the Notes UI. Looking at the log trace showed a class incompatibility message ("bad major version at offset=6").
So far I have been screaming my lungs out, developing in Eclipse 3.4 and building the plugins in a virtual machine with Eclipse 3.2 as I couldn't get plugins to work otherwise. Now I finally found a solution that lets me develop in Eclipse 3.4 and having the plugins work in Notes 8.0.x and Notes 8.5.
The issue is that Eclipse 3.4 configured with Notes 8.5 as a target platform is using Java 6 and that Notes 8.0.x is using Java 5 which causes class format problems. The solution is to set the required execution environment in Eclipse 3.4 which will cause Eclipse to build correctly. Setting the required execution environment (J2SE-1.5) is done in the "Overview"-tab of the MANIFEST.MF editor as shown below.
Using the GUI is of cause just a shorthand for editing the manifest manually. As an alternative you can edit your META-INF/MANIFEST.MF file directly and add the following line:
Bundle-RequiredExecutionEnvironment: J2SE-1.5Please note that this is not the default value when creating new plugins in Eclipse 3.4 so you'll have to pay attention and make sure it's set correctly. This is of cause only necessary if your plugins need to work on Notes 8.0.x as well as Notes 8.5.
Thanks to Pierre Carlson from IBM for pointers on this.
If you are be sure to listen to Security Now! episode 155 ("How DNS works") to learn about the DNS exploits circulating the internet these days. Also you might want to test the DNS servers you use to see if they they are subject to the attack.
I know Comcast and some other major ISP's in the US and England are having problems since they haven't patched their DNS servers yet.
For quite some time I have been a strong proponent of using VMWare for customer development. I used to have 2 or 3 Notes clients in various versions installed on my laptop with a directory pointer per customer linked into my main data directory. A little over a year ago I switched to using VMWare Workstation instead for all development. This setup worked out great for me.
Some customers had their own VMWare images and some customers shared a VMWare image. This also worked out great. Once Notes 8 was released I moved my Notes 7.0.2 installation into a VMWare image with a directory pointer to my "external" Notes data directory. With "external" I mean outside the VMWare image OS. This works out great when running Notes 7.0.2 or earlier outside the VMWare image but once I upgraded to Notes 8 the problems started. I started experiencing database corruption issues of my mail database which I of cause access from both inside and outside VMWare.
After diagnosing these issues I came the conclusion that this kind of setup just isn't supported with Notes 8 part of the mix. Therefore I have split my shared Notes data directory into two parts; a customer part which is accessible from inside VMWare and a production part which is only accessible from Notes 8 outside VMWare. This has solved the database corruption issues.
While sharing directories linked in with directory pointers between running Notes instances has probably never been officially supported it used to work and now doesn't. I just thought I would share.
Afterwards I have changed my setup again and moved completely to VMWare for development. In the new setup I have one or two VMWare images per customer (one for Notes and one for Domino) on an external USB drive with the correct Notes/Domino versions installed. This works great and has really simplified development and testing for customers.
I just got a billing statement for my usage of the Amazon S3 storage service and it's amazing! Well not the actual statement but the contents of the statement. The statement shows that I have 5.36 USD due.I uploaded around 3,5 GB of data to my account but what I'm paying for is not the storage costs but the transfer costs. Bandwidth is more expensive than storage! Of the amount due is 0.54 USD for storage and 1.08 USD is tax. The rest is transfer and bandwidth.
For those interested I'm using Amazon S3 for backup of my laptop (and with the problems I have been having with my laptop disk lately I'm happy I'm backing up once a day). To make Amazon S3 look like a drive and to handle the actual (scheduled) backup I'm using Jungledisk which I can highly recommend.
Update: Just saw an article on developerWorks on Amazon S3.
Discovered a very nice site today that allows you to nicely visualize tag clouds from either a RSS/Atom feed or from the tags a user assigned to links on del.icio.us. The site is called wordle.net and the data is displayed using a Java applet. Very nice and animated.
Below is a sample from my RSS feed and using the Asparagus color scheme.