Thursday, November 26, 2009

"Plane attack prevented by disarming Swiss Cheese Bomber"

It's a ridiculous story that happend to me yesterday. I intended to visit my mother who lives near Hamburg for the 1st advent, I bought a gift for her, as I live now in Switzerland, what is more obvious than bringing some Swiss presents so I bought a complete Swiss Fondue Set, including forks, heater, a big cheese-pot and some dishes and - of course - 1.5kg of Swiss Fondue Cheese (and also some flour for making fresh bread). All our suitcases where full (mine and that of my girlfriend) so we decided to carry the present in our hand luggage. Of course we had to pass security and we where already quite late at the airport. But at the security x-ray scanner we had two findings. One was the flour in my bag pack (scary, huh?) and the other was - you might already guess - the 1.5kg Swiss fondue cheese. Ok, you might think, it was found, considered harmless and that's all about it. But no way! The security officer told me, that this chunk of cheese is considered as liquid (!) and we where not allowed to take it on board. I thought they were kidding, but they weren't, they argued, that it contains wine - which is alcohol - and inflammable. Yes, of course, how could I forget, most of all fire accidents happen due to exploding wine bottles. They said, if I would have some time I could check it in as normal luggae (how normal is it to check in a separate chunk of cheese?). But anyway, we could not take it with us and had to leave it. My girlfriend wished them a nice fondue party and they told us they had to destroy it anyway. The fresh, new, sealed and unused chunk of cheese.
I mean, how stupid is this liquid policy? What's more obvious than carry some cheese when carrying a complete fondue set? Everyone saw it - even the security officers saw it, they looked pretty helpless explaining to us, why a chunk of cheese is a threat. Around 8mio swiss people knew that such a chunk of cheese causes if ever then most likely a bilious attack - but not a plane attack. This has nothing to do with common sense. This has even nothing to do with security or terror prevention. How could liquids in general and a chunk of cheese in special help hijacking a plane? I mean, if it's really a bomb, then the plane just explodes and that's it, you could not fly an exploding plane into a skyscraper, and it's way more easier to get a bomb into a train and blow an entire main station out of this world then getting a chunk of cheese on board of a plane. This is pure stupid, made by people that are not affected. This reminds me of former times, when the soviet central government dictated, what famers had to plant - regardless if farmers complained that the plants are not growing in that region (as I've read in the Occupation museum in Riga).
Stop stupidity and start thinking again!

Well, in the end, we arrived safe and sound in Hamburg thanks to the security authorities who disarmed the dangerous swiss-cheese bomber (me). Happy X-mas!

(and the weird end of the story is the fact, that I could easily take 80g of burning paste which was included in the heater-set onboard without noticing and which is much more inflammable than a chunk of cheese...)

Friday, November 20, 2009

Where is the cloud on a sunny day? or Who controls the weathermaker?

Google announced they Releasing the Chromium OS open source project. They focussed on speed, security and easy handling. The entire concept is, that application do not run on the local machine at all but on the cloud, all the data are on the cloud. So much for the theory. Actually I like the idea of access to all my data everywhere and independent from the device with which I access them, but when it comes to the reality I think we are yet pretty far away from "Everything-in-the-cloud". In my oppinion there are two major obstacles to overcome:
  1. Seamless and Pervasive access to the Internet. Considering the technical and financial side, this is not yet reality for most of the people. The prices are yet still to high for mobile services - especially when it comes to travelling abroad - unlike the US, Europe consists of lots of more or less small countries where you pay roaming fees - which are quite high when it comes to 24h-web-access. As example (from ordinary mobile telephony): I paid 8€ for a-15mins phone call abroad, and I was called! Looking at the technical side, UMTS has become widely available, though there are situation where you simply have no signal - in mountain regions or in the deep cellars of a customer's computing center. There you still rely on plain old network cables. When it comes to seamless, it's still a pain to switch different network providers or media. Switching from UMTS to WLAN to Cable is still a pain, having to reconnect to different services because of a new IP, lost sessions (MS RDP is my favorite...). And how do you access your data or applications when there are blue skies? When you rely on the accessibility of the Internet you could end up lost in the wilderness - and this is not an artifical problem, when I was in the Sequoia National Park this summer, we had no phone or internet access there but had to find a gas station. We were lucky in the end but consider you navigation system runs on Google! But I think, the technology will evolve and this obstacle evaporate over time. But the other obstacle require more than this.
  2. Privacy data protection and data security. When I would put all my data and applications that have been running on my local machine into the cloud I would expand my trust domain from my client device to the cloud (or the internet or provider). And this requires a lot of trust! I have control over my local machine, I can pull the plug and preventing access to it. Of course it is in my responsibility to protect and secure my system, but thats ok. But when it comes to the cloud, I have to trust the cloud provider. And when I look at the recent sensitive data infringements that happen in Spain where probably over 100k credit card data sets have been lost I don't want to think about what would happen if the rest of my data would be stolen from the cloud provider! At the moment we trust on the pure goodwill of a company like Google. Sure, their services are yet for free but what's the worth of my private data I put into their hands? I don't even have a formal contract between them! And even if there would be contract and I would pay for using the cloud - how could I be sure to trust the provider? Providers fail, like power, water or internet providers may fail from time to time, those things happen - but it's not just the lost of internet access, light or fresh water for a moment - it may be the loss of your privacy for a longer period than just a moment! A solution for this would be kind of a certification the cloud providers could get from a governmental agency like those for data privacy protection, something similar to those of a Certification Authority. There have to be regulations for systems that deal with private data such as for banks. Before there isn't such thing I can rely on I won't put my private stuff into the cloud (although I have to admit, that I already use gmail - but to be honest that's already more than I feel comfortable with).

Monday, October 19, 2009

Lotus Connections Communities: Enable "Suscribe to ..." as default and hide it

The customer I work for, wants that for all Forum entries a notification is sent as default and the user should not have the possibility to disable this. Though I don't think, this is a good idea but anyway, here is the description how to do this.


The following changes have then been applied to tick the notifications checkboxed by default and hide them in the Web UI:


  1. Edit
    Communities.ear/comm.web.war/WEB-INF/forum/views/topicThread.jsp

  2. Locate:
    <div id="contentArea" class="lotusLimit">
    <c:if test="${not topic.deleted}">
    <div id="forum" class="lotusForum">
    <div class="lotusMessage lotusHidden"></div>
    <c:if test='${canSubscribe}'>

  3. set the body content of the innermost tag (c:if) to
    <div class="lotusRight" style="display:none;"> 
    <input id="${subscribeCheckId}" type="checkbox" checked="checked"/>
    <label for="${subscribeCheckId}"><fmt:message key="label.forum.notify" /></label>
    </div>

  4. Edit
    Communities.ear/comm.web.war/javascript/build/dojo/communities.js

  5. Locate
    <td><input name=\"subscribe\" dojoAttachPoint=\"subscribeNode\" type=\"checkbox\" id=\"${id}_subscribe\" value=\"true\" ${checkedAttr} />

  6. Change to
    <td style="display:none"><input name=\"subscribe\" dojoAttachPoint=\"subscribeNode\" type=\"checkbox\" id=\"${id}_subscribe\" value=\"true\" checked=\"checked\" />


Important: the changes applied to both files are not recommended as they are no official and supported customization option for Lotus Connections!


At first the customer did this by themselves, but they did not hide (display:none) the elements, but removed the first one (in jsp) entirely from the file, without documenting which files have been changed and what was changed. DONT TRY THIS AT HOME!


Always:


  1. Create a backup of the files you change

  2. Document which file you change

  3. Document what you change

  4. Avoid modifying the HTML structure by REMOVING elements. Try to hide them instead, either by CSS-Stylesheet (best), style-element (ok) or javascript (last option)

Friday, September 18, 2009

Changing the Landing page after Login in Lotus Connections 2.5

As I described in an earlier post, how to modify the Homepage link of the navigation bar in order to display the "My page" instead of the update page, I describe in this post how to modify the Homepage redirection after logging in to Connections. We make use of the WASReqURL cookie that is set to remember the URL to a protected resource when there is no User session active. WAS redirects to the Login page and remembers the previously called URL in the WASReqURL. Via a small JavaScript on the login page, we modify this cookie to point to the My Page url. The login page is defined in dboard.war/auth/login.jsp. Add the following snippet to the head scripts of the file.


function setRedirectCookie(){
var cookieName = "WASReqURL";
var requestURL = getCookie(cookieName);
if(requestURL.substr(requestURL.length - 9) == "homepage/") {
  requestURL += "web/widgets";
}
setCookie(cookieName, requestURL, null, "/");
}


The getCookie() and setCookie() methods are copied from the example on w3schools. Note, that the setCookie() method uses a fourth parameter, which is the path that is simply appended after the expires parameter. The setRedirectCookie() method retrieves the WASReqURL and checks if it ends with "homepage/" - which is the Updates page. If thats the case, the "web/widgets" is appended, pointing to the My Page.

Thursday, September 17, 2009

Adding a multi-lingual link to Header or Footer in Lotus Connections 2.5

According to the InfoCenter, it is quite simple to add additional content such as links to the header of the footer. What the InfoCenter doesn't mention, how you could have the labels of these links multilangual. But fortunately, that's not very complicated.


For editing the header or footer itself, follow the instructions in the InfoCenter. But instead of writing the label of a link directly to the file, use a placeholder similar to the existing ones, like {{ label.header.mylink }}.


To add the label: for each component, locate the lc.util.web-2.5.jar file - should be in the WEB-INF/lib of the the web modules. This jar file contains the resource files. Open the file for edit (use a proper archive tool*) and search for the package/path com.ibm.lconn.core.web.ui.resources. That path contains the resource files. Edit the resource files for your language and add the label (i.e. label.header.mylink) and a value in the proper language. Important: add the label you are using at least to the resources.properties file, that is used as fallback if a label is not defined in the localized properties file.


*: If you have no tool to edit the files directly in the jar file, you could also rename the .jar file to a .zip file, extract it, edit the files, compress it again as .zip and rename it back to .jar

Changing the landing tab for a Lotus Connections 2.5 feature


We had a customer, that wanted that the Homepage feature's default tab should be the "My Page" tab not the Update tab as it is per default. The InfoCenter mentions, that you could add additional links to the navigation bar by editing the header.html. Another entry mentions, if you want to edit the application links themselves, you have to set the href attributes in the LotusConnections-config.xml. However, the latter SHOULD NOT be used, to modify the landing page because the href attribute refers to the application ROOT entry. For instance, if you change this for the homepage feature, the static widget resources which are searched relative to this root are not found. So use this setting only for pointing to a different server or a different context root.


So the first link was of more use, to edit the header.html directly. But, it only mentions to add additional links not to modify existing one. However, by using a simple JavaScript snippet, it is possible to alter the generated links after display. Simpy insert the following snippet into the header.html right after {{application links: li }}.


<script type="text/javascript">
function changeHomepageLink() {

var homePageLink = null;
var homePageLink = document.getElementById('lotusBannerHomepage');


if(homePageLink != null) {
var link = homePageLink.firstChild;
var hrefAttr = link .getAttribute('href');
var newHrefAttr = hrefAttr + '/web/widgets';
link .setAttribute('href', newHrefAttr);
}
}
changeHomepageLink();
</script>

Actually, we don't know if that is the official or correct way to do so, but it works. The "welcome" page is defined in the web.xml of the web application. Another way to change this would be to change the web.xml of the war file and redeploy it, though, this seemed a little too risky to us.


Tuesday, September 15, 2009

CSS stylesheets in Lotus Connections 2.5

From Lotus Connections 2.0 to 2.5 the handling of theme and styles has been changed. While LC20 used static stylesheets, LC25 uses a specialized servlet for that purpose. This servlet called JAWR bundles multiple files and sends them compressed to the client. The HTML that is styled by this JAWR servlet refer to a normal URL, in LC25 this URL points to something like "/bundle/css/gzip_something/coreBundle.css". The context of the URL - /bundle/css - is mapped to the JAWR servlet, and the id of the bundle - /coreBundle.css - may look like file and is resolved by the servlet.. That makes it difficult, to find the proper stylesheet in the filesystem - simply, because it does not exist.

Looking at a sinlge LC25 component (i.e. Communities), the configuration file for the JAWR servlet can be found in /WEB-INF/properties.
In the configuration file, a bundle with the name "core" and the id "/coreBundle.css" is defined. The /coreBundle.css is mapped to the files
  • /stylesheet/update_styles.css,
  • /stylesheet/update_community.css,
  • /nav/common/styles/base/core.css,
  • /nav/common/styles/defaultTheme/defaultTheme.css,
  • /javascript/build/dijit/themes/dijit.css,
  • /nav/common/styles/base/dojo.css,
  • /nav/common/styles/defaultTheme/dojoTheme.css,
  • /javascript/source/lconn/comm/typeahead/themes/lconn.typeahead.css,
  • /javascript/source/lconn/comm/typeahead/themes/lotusBlue/LotusBlue.css,
  • /nav/common/styles/base/connectionsCore.css,
  • /nav/common/styles/base/semanticTagStyles.css,
  • /nav/lconn/styles/sprite-lconn.css
These files are located relative to the root of the web archive comm.web.war.

For faster development, the JAWR servlet offers a debug mode. According to the JAWR documentation the debug mode is enable by setting the jawr.debug.on=true in the jawr.properties file. The setting is applied after restarting the application.
The debug mode has two advantages:
  1. changes to the css stylesheets in the filesystem are effective immediately
  2. stylesheets are not included as a single, one-lined compressed file but as a set of files pointing to every single stylesheet. In the html, each mapped stylesheet is included via a separate link-tag. That way, it is transparent, which css definition is set in which stylesheet. Second, the stylesheets are not reformatted meaning that the line-numbers of tools such as firebug point to the correct line of the included stylesheet.

Friday, September 11, 2009

Creating a singleton using Eclipse Code Templates

In this post I'd like to demonstrate the Eclipse Code Template feature for implementing a singleton pattern.
The Singleton is a creational pattern of the set of Gang-of-Four Java Design patterns. It uses a single static variable (the singleton), a private constructor to prevent public instantiation and a public static getter method to retrieve the instance. For lazy instantiation, the singleton instance is not preinitialized, instead, the static getter method checks if the instance is null and instantiates a new instance on its first call. Lazy instantiation (as used in the following example) is not uncommon, though it may cause race conditions in multithreaded environments.
The Code Template feature is an extension to the code-completion functionality that is accessible by pressing Ctrl+Space. When the user types in code, he may hit Ctrl+Space to auto-complete, what he was typing. Eclipse proposes a set of options for completion, i.e. a Type, method of that type etc.
The Code Template feature might be known from typing in "sysout", pressing Ctrl+Space and Eclipse completes this to "System.out.println("");".
To add a new code template,
  1. open to Window -> Preferences
  2. navigate to Java -> Editor -> Templates.
  3. click on "New..."
  4. set the name of the new template to "singleton" (this is what you type into the editor)
  5. as pattern enter
    /**
     * static Singleton instance
     */
    private static ${enclosing_type} instance;
    /**
     * Private constructor for singleton
     */
    private ${enclosing_type}(){
    }
    /**
     * Static getter method for retrieving the singleton instance
     */
    public static ${enclosing_type} getInstance(){
      if(instance == null) {
        instance = new ${enclosing_type}();
      }
      return instance;
    }

The variable ${enclosing_type} resolves to the Class you are editing. From now on, it is possible to create the entire singleton pattern by just typing "singleton" and hitting Ctrl+Space - saving lots of keystrokes!

Wednesday, August 19, 2009

Converting GPX tracks to Google's kml format

Earlier this year I bought a neat GPS tracker for recording hiking trips and geotag my photos. With the software provided I can export these tracks to the GPX format which is an XML format for describing waypoint, tracks and routes. But for displaying my tracks in Google Earth, I need the kml format, which is also an XML format. For the transformation I use the free tool GPSBabel and a small batch script for convenient conversion.


@echo off
setlocal
if "%2"=="" (set out="%~n1.kml") else (set out=%2)
echo gpsbabel -i gpx -f %1 -o kml -F %out%
gpsbabel -i gpx -f %1 -o kml -F %out%
endlocal


The script could easily modified for the backward conversion (kml to gpx)

Wednesday, July 22, 2009

Batch MP3 encoding with lame

I recently bought the new album from Chimaira and liked listen ot it on my iPod. Since I like the mp3 format, I did not want to import it with iTunes using the AAC format I used the open and free mp3 encoder Lame. I ripped the CD tracks using Winamp and configured it to export the tracks to the format "Artist - Album - TrackNumber - SongTitle".wav. After that, I can encode the wav's to mp3's. But encoding each wav file manually is quite time consuming, especially, when all id3 tag information had to be entered manually. So I wrote a little Windows batch file that encodes all the wav's in a batch and automatically sets the ID3 tags.

The source for the script is:

@echo off

if "%1"=="" (
echo Usage: %0 [files] {genre} {year}
goto :eof
)

rem %2=genre
rem %3=year
if "%2"=="" (set GENRE=) else (set GENRE=--tg "%2")
if "%3"=="" (set YEAR=) else (set YEAR=--ty "%3")

for /R %%f in (%1) do (
echo Converting "%%~nxf"

rem extract from format "Artist - Album - trackNo - Title"
for /F "tokens=1,2,3,4 delims=-" %%A in ("%%~nf") DO (
call :encode "%%~nxf" "%%A" "%%B" "%%C" "%%D" "%GENRE%" "%YEAR%"
)
echo.
)

goto :eof

:encode
SETLOCAL

rem strip quotes
set _artist=%~2
set _album=%~3
set _trackNo=%~4
set _title=%~5

rem trim spaces
set artist=%_artist:~0,-1%
set album=%_album:~1,-1%
set trackNo=%_trackNo:~1,-1%
set title=%_title:~1%

echo Artist: "%artist%"
echo Album: "%album%"
echo TrackNO: "%trackNo%"
echo Title: "%title%"
if NOT "%genre%"=="" echo Genre: "%genre:~6,-1%"
if NOT "%year%"=="" echo Year: "%year:~6,-1%"

lame.exe -h -V 6 "%~1" "%~n1.mp3" --add-id3v2 --tt "%title%" --ta "%artist%" --tl "%album%" --tn "%trackNo%" %genre% %year%
ENDLOCAL

goto :eof

:eof

With the help of the scripts I could easily encode the files of an entire directory using:

myScipt *.wav 137 2009

Note, that 137 refers to the Genre list of the lame encoder. Use "lame --genre-list" to print an alphabetically sorted ID3 genre list.


Friday, May 8, 2009

Single Sign On with Quickr 8.1 and SPNEGO

Yesterday I was at a customer that is using Lotus Quickr 8.1 (J2EE) and als uses an ISSW asset - the SPNEGO TAI for WebSphere Application Server 6.0 - for WebSphere Portal 6.0. This customer wanted to use the TAI for Quickr too, respectively the underlying Application Server version 6.0.2.17.

And after some troubleshooting and a fix for WAS we finally managed to achieve SPNEGO/Windows Single Sign On for Quickr 8.1!

The only real issue with the product (Quickr) itself was a bug in the redirection after the request had not been intercepted by any TAI where the user was redirected to an error page instead of the login page. This was no specific SPNEGO TAI issue but an issue with the Trust Association Interception in general in the Quickr 8.1 and 8.1.1 underlying App Server, version 6.0.2.17.

However there is a technote and a fix for that known issue if you ever stumble upon this error.

After that fix had been installed - which went pretty smooth - Single Sign On with SPNEGO worked properly. At least in the WebUI but unfortunately not with the connectors.

One of the issues was that with SPNEGO enabled it didn't matter which values we specified for the main UI as user/pwd in the first dialog that comes up when we added a place to the connectors. These values were sent to the server and failed. However, the SPNEGO credentials were also sent along as we were authenticated successfully. But there were other user/pwd dialog boxes that appeared in the usage of the connectors as well. These did not work correctly with SPNEGO enabled.
Currently the Java based connectors (ie ST, Notes 8 Standard, etc) do not work at all when SPNEGO is enabled.

As a workaround to disable SPNEGO for the Connectors we considered two options:
The first (that was tested and finally implemented) was simply to create an additional DNS entry for the same Quickr server and specified this entry in the Connector (ie. web.quickr.intranet.com for the browser and connector.quickr.intranet.com for the connector). The TAI is configured to intercept only requests to a particular URL respectively a host (ie. web.quickr.intranet.com). If a request is sent to a different hostname (ie connector.quickr.intranet.com), the request is not intercepted and thus no Single Sign On happens.

The second option we thought of but did not test yet was to configure the TAI that way, that it uses a filter to exclude the URL used by the Connector respectively only intercept requests for the protected URLs of the web ui, which are URLs that contain /lotus/myquickr. Using the HTTPFilter for the configured server and a filter string "request-url==/lotus/myquickr" should do the job, but as mentioned - we did not test this.

Luckily, Quickr 8.2 is coming soon with official SSO support for the Connectors and it will be backward compatible to Quickr 8.1.1.

Wednesday, February 25, 2009

Quickr UI hacking

This week I was in a workshop at a customer where we discussed among others how to customize Quickr for Portal. They had some special requirements regarding the UI about which I'd like to write here.

One of their requirements was, to have a sidebar menu on the left-hand side containing the place navigation in the upper part of the sidebar and the functional elements below the navigation. They took the current Quickr for Domino look&feel as an example. I don't exactly know how the Quickr for Domino works, but I know that the Quickr for Portal works differently. The main problem is, that the PDM portlet (Library) in Quickr J2EE contains the entire toolbox as a right-side menu (with the "Create" button on top of if). So I needed to find a way to rip it off the portlet and place it in the right side navigation. I did this using JavaScript and it was actually only a couple lines of code.

First of all, create a place that uses a theme policy that displays the sidebar. Create a page that contains the library portlet (the one with the right sidebar). Then open the Default.jsp of the theme and search for the expression that includes the sidebar.

<%@ include file="./sideNav.jspf" %>

Place the following html snippet below this sidebar include.

<div id="injection-point"> </div>

Its important, that it is not a standalone html tag.
Now go to the end of the file and add the following script before the closing body tag:

<script type="text/javascript">
document.getElementById("injection-point").appendChild(document.getElementById("sidebar").parentNode);
document.getElementById("sidebar").style.visibility = "visible";
</script>


You could see, that the visibility attribute of the sidebar is set to visible, this comes a long with a change in the styles.jsp where you'll have to add the following snippet
#sidebar {
visibility: hidden;
}

This prevents from showing the sidebar on the right side during page load and then jumping to the left side, when the rendering process is complete. The sidebar is simply not shown from the beginning. Now save the files and see what happens :)

The final result looks like this:




Using this technique of adding injection points to the theme and some javascript code that moves elements around, you could easily modify the entire look and feel. For a customization I did this week for a customer, I moved the Create button and the Action menu to the left bar, and the other sections to the right side (outside of the portlet area). I also modified the search box, which is completely generated by a JSP tag.

Friday, February 13, 2009

Pointing to a specific Activity using the Portal Bookmark portlet

Today we tried to create a landing page for a Portal with integrated Connections. The landing page should contain a link to give feedback. Since it is a PoC we'd like to use an Activity for collecting feedback to demonstrate the various usage possibilites for Lotus Connections. The link to the feedback activity should have been provided in the Bookmark portlet of WebSphere Portal. However, we encountered a minor issue for which we found a solution.

The problem was, that the URL to the Activity contained a comma character respectively the octet encoding of it (%2C). Although this format is conforming with URL RFC 1738 (paragraph 2.2.) the Bookmark portlet refused to accept this URL stating the URL was not valid.

However, we found a workaround for that. We created a Portal URL page pointing to the feedback activity and put this URL page underneath the Activities URL page in the portal page structure so that it remains invisble. We assigned a uniquename to this URL page pointing to the Feedback Activity and created a bookmark in the bookmark portlet that pointed to the Portal URL page for the Feedback Activity. Thats it. The uniquename is required, otherwise this URL page would not be selectable as portal internal page in the Bookmark portlet.

By the way, I like the approach of collecting feedback using an Activity. The users can comment on existing feedback, agree, disagree. The feedback can be given in a structured way, like technical feedback, opinions, enhancement requests, and the users could even post files. The receivers of the feedback can give answers directly to the posts and users could easily subscribe to updates to stay informed about what's going on. And the best of all: it's usable out-of-the-box, we did not need to create a custom feedback form :)

Monday, January 12, 2009

Twitter for business ... or how to prevent your partner calling you during a speech

Several times colleagues are asking me, what the use of Twitter is or why they should do it as well. Well, what twitter is, is captured  pretty good in this video: Twitter in plain English. But that possibly does not capture their business case. But maybe this blog entry can give some more uses.

But how can twitter - or microblogging in general - can help employees doing a better job?

In my opinion the most practical use is: get quick and easy access to knowledge! Of course not all jobs require a broad use of knowledge, but for me, working in the Services and Consulting business, it does.
And here are several ways I benefit from Twitter.

1. Build up a follower network.
Build up a network of colleagues, all around the world, that work in the same or related topics that you are. Follow them, and ask them to follow you, too. That way, a broadcast is received by a wide number of peers who may be able to help you and who know you, too. Secondly, this colleague-net builds up a stronger community for itself.

2. Subscribe to search-feeds.
Use the search feature of Twitter and the ability to subscribe to the search filters. That way you get notified of people that tweet about a topic of your interest that you are not following. Maybe you are able to help them. In the other direction, you can post to the public community as well, if they subscribed to such a search feed you might get help from people you does not know, yet. A good example for such feed is the Lotus Connections search feed.

3. Use hashtags.
By the use of hashtags - keywords with a leading # - you could mark your post or keywords in it to indicate, the post contains some information of a certain category. More information about hashtags can be found on hashtags.org. The effect is similar to the search feed, though the search feed may produce more "false hits".

4. Retweet
ReTweet (RT) is a resend of your post by another user to his followers. By this, information - if its valuable enough - reaches even the farthest wrinkle of the community. If you have something important to say about a certain topic and you share your knowledge in a blog, you could announce a new post via Twitter. Not only that you do some advertising for you and your blog and by this build up your reputation in a certain topic, but also that the information - if its really valuable - spreads around the community via retweet (RT).

But there is one final thing you take into consideration: give your personal Twitter network time to evolve, to grow, to strengthen the valuable connections. You also have to put some initial energy into it, build up your network, convince your reluctant colleagues to use it, too. Show them how to use the tools. In the beginning, they don't even have to contribute, in the beginning it might be sufficent, to just build the connections and it is sufficient when only a minority contributes, the rest will follow soon.

Twitter is really easy, even non-technical-adept people can use it, on their phone, on their desktop, via browser, via instant messaging. So even your wife or husband can use it! And you can let them know, what you are doing, that you hold a speech or a presentation, and if they just read your post, they maybe won't call you in inappropriate situations any longer ;)

Sunday, January 11, 2009

My personal world tour 2009, don't miss a show!

Last week I've made up mind about my vacation days this year. It required some planning to get the most out of the weekends with public holidays and the vacation days I have this year, but I think I made the best out of it. So here are my plans.

The whole "travel season" starts in April when the winter - hopefully - has found its end and its getting warmer again. Right in the beginning of April, I'll fly to Dublin. I've never been to Ireland before and this city is on my list of places I'd like to visit. I think I'll hang a little around there in the first weekend of April before I'll have a roadtrip over the isle over the week that follows. In the end of the week I'll return back to Dublin from where I take another flight right over to London where I'll spent the Eastern weekend before returning back to Zurich. Last year I already planned to travel to Irland for a week so I combine the trip with two city trips I planned anyway for the year.

Next trip will be a weekend trip to Prague on the first weekend of May. It will be a three-days-visit, where I'll fly to Prague on thursday evening and return back to Zurich on Monday in early morning. The good thing about this trip is, it doesn't cost my one of my precious vacation days since Friday, 1st May is a public holiday.

Already a week later, I found a really cheap flight to Hamburg (only 28€ !!!) where my mother lives. This week I'll work remotely the whole week and also I am able to attend her birthday celebration the weekend after that. I also planned to spent a couple of days in Stockholm this year. I've never been to Scandinavia before and I chose to start with Sweden and Stockholm. Originally I planned to fly directly from Hamburg to Stockholm, but I found a cheap flight over Riga with a 7h-stop right there. So I decided to make 2 flights instead and spent whole two days in Riga before jumping over to Stockholm for another two days. This will be on the Ascenion Day and the successing weekend, and I just need to use a single vacation day for the friday which is a bridging day. On the next monday I'll return back to Zurich in early moring for work as usual.

Up to this point I've booked most of the flights (7 of 9) and spent "only" 800 Swiss Francs for this, which is quite cheap considering the distances I cover - around 7000km! ... But that is also the reason for planning such a long time in advance - the flights on the public holidays-days are in high demand and get expepensive pretty early.

For the Pentecost weekend I have no plans so far, but maybe I'll spent the weekend in Amsterdam. I've been there once before but I liked it quite a bit there and would really like to go there once again, but thats not a fixed plan so far. Other options for this weekend would be Rome or Athens, I'll see.

Quite a big trip is planned for the end of June which is the longest vacation planned for the year. I'll visit a former colleage of mine from the Boeblingen lab who moved to Stanford in late 2007. Another colleague from the lab will most likely accompany me on this trip. Its planned to stay 2 whole weeks over there. This will be my very first time being far away from Europe (though I've been to Turkey, which belongs to Asia, but it was quite close to Europe) and I'm quite excited to see America respectively the USA :)

In the end of July, I will head north again up to a small village north of Hamburg for the Wacken Open Air which is the world's largest Heavy Metal Open Air festival, and its it's 20th anniversary, and I can tell, I am rather excited to go there, its my second "Wacken".

Up to this point, I'll have been to five cities I've never been to before: Dublin, London, Prague, Riga and Stockholm. Visited another continent (North-America), and by this I will have increased my personal number of countries I've visited by 6 (Ireland, England, Czech Republic, Latvia, Sweden and USA and will have spent most of my vacation days, leaving only more days.

And these two I will use to visit again a friend who lives in Vienna, where we also plan to take over to Bratislava, which is just around 50km away from Vienna, which will increase my cities-and-countries-Ive-been again by one. This trip is panned for late August or early September.

After all these trips, the cold time of year will begin a again, which I consider totally as best time for working.

And to close this post, I'd like to experiment a little bit, how "real" the Web 2.0 community can get. All the city trips mentioned above, I planned to do alone - so far. But I'd like to invite you, to acompany my along the way. If you live in or near one of those cities and like to meet me in person, drinking a beer or a glas of wine with me, guide me through the city, give me recommendations for places I shouldn't miss, offer me accomodation - feel free to contact me! Don't be reluctant, I'm keen to meet new and interessting people, IBMr or no IBMr that doesn't matter, and I'm quite open mindend and uncomplicated :)
For contacting you could use several channels, via comments on this blog, email me, send me a message on Twitter or in Facebook.

Friday, January 9, 2009

Integrating Lotus Quickr into Connections

This week we configured the integration of Lotus Quickr into Lotus Connections Activities and Communities. We experienced some minor problems of which I like to write here, so you don't step into them, too. First of all, the configuration is quite straight forward and looks more complicated on first glance, than it actually is, so don't be afraid of it.

Activities
How Activities need to be configured, is described in the Infocenter, here. However, we had the problem, that we were not able to connect to the Quickr server that we configured. The reason of that was, that we used a self-signed certificate for the HTTP server, since it was only a proof of concept installation. But first, some words, how the Activities integration works.
For querying the Quickr server for places, Activities uses a REST service of Quickr and since Activities is mainly based on AJAX, the REST request is sent via JavaScript. For security reasons, the JavaScript script can't access the quickr sever directly, since it runs on a different server that the connections server. So the request is delegated to a proxy running on the connections server and the proxy forwards the request to the Quickr server.
However, to send the REST request from the proxy to the Quickr server, the proxy servlet needs to establish an HTTP connection, and since we used SSL for that, the connections was established over HTTPS. The trouble we had was, that the proxy did not trust the self-signed certificate of the Quickr HTTP server, so we needed to import that self signed certificate into the trust store of the WebSphere Application server (described here) the proxy was running on. That was all.

Communities
Different from Activities, the integration of Quickr into Communities requires some more steps. Therefor you need to download the Lotus Connections Connector for Lotus Quickr, and follow the installation instructions. That was straightforward, but it did not work with our setup, unfortunately.
To explain a little bit the setup we used, Connections and Quickr were both running on seperate servers, both with a collocated HTTP Server that performs the forwarding from the standard http ports 80 and 443 to the ports  Quickr is running on in the AppServer, which are for instance 10038 for http. So we configured during the installation of the Connector to use the default ports, 80 and 443 for ssl. What worked in Activities, did not work in Communities.
When we created a new community and checked the both new Quickr integration checkboxes, we experienced an exception, telling us (in the logs) that an URL like this one http://quickr.demolab.com/myqcs/rest/places/feed was not found. The reason for this was, that the Connector searched at the wrong port. For this particular URL the HTTP did no port forwarding, we still need to find out, why not. But anyway, after changing the http port following the instructions in the InfoCenter to port 10038, the integration worked perfectly... and btw. is pretty cool :)

Tuesday, January 6, 2009

Creating PNG images of Diagrams in RSA 7.5.1 fails due to "negative width"

I just upgraded from Rational Software Architect 7.5 to 7.5.1 and now tried to export my old digrams from 7.5 to PNG which failed with an error message saying "negative width". Looking into the log file revealed, that the tool was unable to instantiate a Line (actually a BasicStroke) object. So I simply assigned a new line width to all lines in the diagram.

Therefor I selected "Select all connectors" and switched to the Appearence-Tab in the Properties view and selected a width in the line-width drop down menu.

After that, I was able again to export my old diagrams to PNG :)

Sunday, January 4, 2009

No good intentions for 2009, but goals!

After the recap of the last year, its time to look forward into 2009. As written in the last post, the Plan A is settle down more or less as soon as I found the right place, the right people (especially one ;), its the right time ... well, if everything feels right. But this Plan A is not only hard to "specify" but also hard to influence. And until Plan A takes places, I need a Plan B to spent my time and possibly positively influence the outcome of Plan A. So Plan B will be my guidance through the time, something I can specify, follow on and measure progress ... well, this sounds like a project :)

This was more or less the thoughts I had yesterday when I wanted to put down my good intentions for 2009. Well, good intentions like "stop smoking" (which I don't do anyway) or "do more sports" are not only fuzzy but also hard to remember in the end of the year - or pretty much sooner. So I tried a differnt approach: inspired by the Management by Objectives style of our company, I defined a couple of goals I'd like to achieve in 2009. I also tried to define milestones and measurement scales for most of goals. And in order to track the progress of these goals, I set up timeframes for every individual goal.... well, this sounds even more like a project :)

So I put down all my goals, with timeframes, notes on measurements, priority etc in a structured form and created a project plan for this - how nerdy! (as I've already mentioned yesterday on twitter/facebook). Btw. for project planning I use the free and open GanttProject, which totally matches my needs.

Did I inspire you, to do it the same way? Well I can give you some examples of how I define my goals. Of course I don't want to put down every goal here, because some are very private, things I either want to achieve just for me or I like to surprise others with.

Ok, how did I structure my goals?
At first, I categorized them into the five main categories: Health, Job&Career, Soul&Wellness, Brain, Money.
In those categories I put down everything I'd like to achieve, like "loose weight: 8kg", Thats the overall target, I defined 3 milestones for this, 3kg until end of February, 3kg until end of May and 2 more until end of year. I prioritized these steps, putting the top priority onto the first two milestones, the last is more or less optional. Another goal that is easily measurable is the "start the day with 100 pushups", at the moment I do 70-80 every day.
Spread accross the five categories I defined 7 high-priority goals. These are the goals I put most of my energy in. And several normal-priority goals, followed by some low-priority goals which are nice-to-haves. Over the year, I put down notes on each goal and keep track of the progress. I don't expect to achieve 100% of all of my goals, but I'll do what I can to achieve the 7 top goals and most of the normal goals, so lets see how this will work out :)

So here are 6 of my 7 top goals
  • Loose at least 6kg down to 82kg, or better 8kg down to 80kg
  • Drink less alcohol (at most on 2 days/month, with no more than 5 Beers/day, only exception is the Wacken festival :)
  • Accomplish the IT Specialist Certification Level 1
  • Certify for Lotus Connection Admin
  • Improve my French skills by working through the self-learning material I have, or better: perform the B1 telc certification 
  • Save a certain amount of money (I won't tell you how much ;)
Some other goals are
  • Do sports regularly (3 days/week and 4hrs/week)
  • Some travel targets for vacation (USA, some weekend city trips in Europe)
  • Improve my Russian skills (and possibly certify, same as for French, but French is more important)
  • Learn Italian (at least a bit)
  • Read several books (planned 5 until end of September)
Thats quite some stuff to work on, but the year has yet begun!
Lets go!

2008 a recap

Although 2008 already ended, its never to late to look back a little and recapitulate.

For me personally, for my family and for some of my friends, the last year was full of movement, literally inf figuratively.
Starting with my person, I moved twice the year. First time end of Feb from the outskirts of Stuttgart into Stuttgart, second time end of June from Stuttgart to Zurich, the first move was planned, the second wasn't.

The year 2007 ended not that good for me, especially because I was not very satisfied with developer job in the Boeblingen lab I worked in. I was close to quitting (actually I had already a written contract from another company) but I gave the company another chance, talked with several colleages and managers and decided to join a services team in the lab. I wanted out to the "front", to the customers, travel a little around etc.

When 2008 started, it seemed, that the job change would have been only be a matter of time then and I therefor planned to moved to a smaller flat to be prepared for more travelling in the service job, reduce my monthly costs an my houshold. So far, everything went on as planned.

Not two weeks after the move - it was Tuesday 3/11 - my former manager in the lab told me, I can't join the Lab Services Team for up to a year. The reasons have been purely political. He didn't told me that directly, but it was obvious. That was the straw that broke the camel's back. I saw no other option but leaving the lab, I searched in our internal job market and - as luck would have it - found a couple of interessting Service jobs, one at IBM Germany in Stuttgart and two at IBM Switzerland - that was the same day at evening. These job offerings helped to made my mind leaving the lab. Next day I prepared the application documents and slept a night over the decision. On Thursday 3/13 (the birthday of my father who died 7 years ago) I sent out the applications. On friday I received the first respones from the Swiss managers. Wow! That was quick! To this point, I've waited half a year for anything to happen in my old job and now my whole perspectives and options changed in only 4 days! I was totally surprised that anything could also happen quickly in this company. In the end, I had 4 positive answers from 5 applications and decided to go to Zurich and join the ISSL team in July. This was the best decision I made last year and one that had a tremendous impact on my life so far and also improved the image I had of IBM enormously. Well the rest of the year I spent in getting warm in the new job, visited lots of friend around Germany, visited lots of concerts, traveled a lot and gained ground in Zurich.

But beside of me, there was also movements in my family. My brother finally decided to leave the University and gave up his ungrateful fight to do a doctor's degree and joined another company, but stayed in Leipzig. And also my mother (56) did a great and brave step. She finally also quit her job and moved away from the town I was born to a city north of Hamburg to her partner and also started a new job. Considering her age and her situation she totally earned my deepest respect for this step. And same as for me - she didn't regret it so far.

So all these movements left me somewhat rooted out. I have no parent's home anymore, I have no family as it used to be, only individuals like my brother, my mother or my aunt, no grandparents anymore - the last grandmas also died last year. And no "own" family so far.

I admit, this all feels strange somehow and makes me sometimes feel like I am a floating particle drifting through space and time hoping to bounce somewhere and sometime and just stick, without knowing where and when that would be. At the moment, I feel no boundaries, no limits, I am full of energy and its just like pushing forward in any direction, its like running blind in a direction to find the next wall :) hoping to find a new orientation landmark, some ground I am willing to put new roots in. Well, the new roots stuff, this is my Plan A. But unfortunately, this is something I can't influence directly, it is something I will know when time comes, when it just feels right.

For the time until that point, I need a plan B, something I can influence and something that will increase the probability of fulfulling Plan A earlier :) So that's the major direction for 2009: follow Plan B ;)

2009, here I come!