Jon ERP Reed of http://jonerp.com has written a brief for Panayana on “Agile Development – What Does it Mean to SAP Users?”.

It is available at http://www.erpexecutive.com/2010/04/agile-development-for-sap-managers/ and it cites some of the interviews I’ve done at SAP Teched and at http://enterprisegeeks.com

The brief is to the point and concise.


My BluetoothOnMotion Android application is now almost ready to be published to the Android Market. For now, it can be downloaded from http://code.google.com/p/android-bluetooth-on-motion/ where you also can find the source code.

The app is geared towards users who use bluetooth to connect to their car’s hands-free, but doesn’t want to have bluetooth enabled all the time. The app fulfills this goal by monitoring the speed of which the mobile phone is moving. The monitoring will use very few resources, as it subscribes to network location events that are only published when a significant movement of the phone has been detected.

When you turn off the ignition of the the car, android will lose the connection with the handsfree after a few seconds. BluetoothOnMotion will detect this and subsequently turn off bluetooth. There is also an early beta feature that allows it to log the location when bluetooth was turned off, thereby allowing you to locate where you parked your car later. (but due to the margin of error when using normal network based location, it might not be very useful)

If you are travelling at speed using another form of transport than your car, the BluetoothOnMotion application will detect that no bluetooth device was connect after it was triggered due to motion, and will turn bluetooth off. If your phone is in airplane mode, it will not trigger any changes in bluetooth settings.

The app can also use GPS measurement if it is enabled, but this will use additional resources such as battery.

The app allows you to configure several of the parameters, as can be seen in the screen below. It will run as a background service either manully started from the configuration screen or automatically when the phone boots.


On March 17 I held my presentation on Google Wave and the Enterprise for the SAP User Group in Norway (AdFahrer SBN).  About 30 persons were present and the presentation was done in Norwegian.

The actual presentation can be viewed at http://bit.ly/EnterpriseWave .

The video should be seen above, if not visit http://www.vimeo.com/10590119 .

Other videos from the same meeting can be viewed at the SBN site http://www.adfahrer.com/SIG/100317Stavanger.html


A few weeks ago I did a podcast with the eggheads at EnterpriseGeeks.com.  Being a big fan of the show and having met them a few times, it was good to catchup with the guys over Skype.

The Podcast is available at http://enterprisegeeks.com/blog/2010/03/23/enterprise-geeks-podcast-agile-development/

The main point I’m trying to get forward is the relentless focus on identifying and then reducing waste in Agile methodologies.

As a bonus I am adding some of the notes we had in front of the podcast (we at least touched some of them)

  • What is Agile
  • Be Agile, do Scrum/Kanban
  • Scrum
    • Roles
    • Product backlog
      • Focus on business value
    • Rythm and short iterations
      • Sprint planning
      • Daily standups
      • Backlog grooming
      • Sprint demo
      • Sprint retrospective
    • Self-organising teams
    • Ownership
    • Team
      • Protect it
      • Co-located or not
  • Agile within the Enterprise
    • How to change the traditional project management (PMBOK) way of thinking
    • Redoing your documented processes
    • How to comply with governance and other requirements
    • Peace of mind for traditional management
    • Hybrid model of agile may be answer
    • Matt Harding suggests RUP as a good alternative http://en.wikipedia.org/wiki/IBM_Rational_Unified_Process
  • Agile with SAP
    • Twan @tbroeks session on SAP Agile project expirences  from #sapinsidetrack Bonnhttp://vimeo.com/9998551
    • Automated testing with ABAPUnit
    • Why isn’t SAP teaching customers to be agile??
    • Why isn’t SAP providing their own internal unit test to customers how are implementing modifications?

The first version of SAP Note Viewer for android is now released.

To download, search for SAP in the market application or scan the QR code below.

There is also a blog entry published at SAP Community Network related to this.


After working with Google Wave since the developer preview phase, I’ve had some thoughts on how it fits within large companies. A lot of these thoughts comes from discussions with fellow SAP Mentors. The key point is that it allows the business context from existing business system to be added to processes where collaboration and communication is required.

These thoughts are summarized in my presentation “Why and How the Enterprise Should harness the power of Google Wave” available under creative commons license at slideshare.net

I’ve presented this at:

And it looks like I also will present it at:

  • Bouvet customers in Bergen
  • Internally for Microsoft Norway
  • Bouvet customers in Stockholm Sweden
  • Bouvet customers in Malmø Sweden

Recently I switched to an android-based phone, Nexus One, and I couldn’t be more pleased with it.

In order to test out the Android Development API , started creating a few apps.

The first one is SAP Note viewer which provides more easily access to SAP support documents.
It requires that you have what is called an SAP Service User (S-user).

It provides the following functionality:

  • View note based on note number
  • Store a reference to favorite notes
  • Store SAP Service Username and password so you do not have to login

The project, sources and .apk binary is available at http://code.google.com/p/android-sap-note-viewer/ .

Screenshot

It has one major problem and that is related to the fact that the built-in browser doesn’t automatically provide scrollbars to <div> elements with lot of content.
Unfortunately, the HTML code SAP uses for the notes could have been better and therefore all the content of the SAP Note is not visible to the user.

After a few different attempts at tricking the browser to do scrolling (see this post at stackoverflow.com), I have decided that I need to rewrite the application.
(need to download and modify the HTML code)


A co-worker of mine visited Berlin this weekend and came back with these pictures which indicate a drive-by shooting at the SAP offices. Looks like the Oracle mafia has done a drastic change in tactics and are no longer content with bad mouthing SAP.

It is interesting to see that the SAP office appears to have bulletproof glass.

Update: Turns out the Microsoft Sharepoint 2007 conference was in Berlin at the same time. Coincident?


This blog will provide some code which allows you to determine multiple clicks in Java. The current version is using System.in as input (and thereby requires the user to press enter), but could easily be extend to work in a Swing setting (use KeyListener class).

The base code was developed as part of an internal “Java festival” at my company Bouvet. The assignment this time was to develop the behaviour for a tank, which would battle against other people’s tanks. We were allowed one key for input, which originally was intended to be used for strategy changing, but instead we used this one key to control the entire tank. By pressing once on the enter key, it would turn 90 degree clockwise, by pressing twice, it would turn 90 degrees anti-clockwise, by pressing three times, it would fire, and by pressing four times it would release a mine.

The provided solution consist of four class:

  • IMultipleClickHandler: Interface to be implemented by the class which wants to receive a call when the click is performed (not each individual, only the last one)
  • Engine: Class which sets up the MultipleClickThread and receives the event when it is performed
  • MultipleClickThread: The core of the solution. Reads from System.in and creates a MultipleClickTimeoutThread with details of how many clicks have been performed so far. If a new click is received before the timeout, it aborts the current thread and creates a new one
  • MultipleClickTimeoutThread: A simple thread which sleeps for certain time period, and if it has not been aborted in the meantime, it sends an event to the provided IMultipleClickHandler

Code:

package org.elsewhat.multipleclick;

public interface IMultipleClickHandler {
	/**
	 * Method called when the provided number of clicks have occured
	 * 
	 * @param nrOfClicks 
	 */
	public void clickOccured(int nrOfClicks);
}

package org.elsewhat.multipleclick;

public class Engine implements IMultipleClickHandler {

	public static void main(String[] args) {
		Engine eng= new Engine();
	}

	public Engine(){
		System.out.println("MultipleClick handler by Dagfinn Parnas. Please click enter multiple times for input");
		MultipleClickThread clickThread= new MultipleClickThread(this);
		clickThread.start();
	}

	public void run(){

		//do other Threadstuff

	}

	/**
	 * Method called when the provided number of clicks have occured
	 * in the MultipleClickThread
	 * 
	 * @param nrOfClicks 
	 */
	public void clickOccured(int nrOfClicks) {
		System.out.println("Engine received a "+ nrOfClicks + "-click");

	}
}

package org.elsewhat.multipleclick;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class MultipleClickThread extends Thread {
	private IMultipleClickHandler handler;
	public MultipleClickThread(IMultipleClickHandler handler){
		this.handler=handler;
	}

	/* How long should we allow between clicks */
	private long msMaxBetweenClicks = 300;

	public void run() {
		MultipleClickTimeoutThread clickTimeoutThread=null;
		// read from System.in
		BufferedReader input = new BufferedReader(new InputStreamReader(
				System.in));
		long msLastClick = 0;
		int nrClicks = 0;
		char character=0;
		// run forever till canceled by creator
		while (true) {

			//read from the input
			try {
				character =(char) input.read();
			}catch (IOException e) {
				e.printStackTrace();
			}
			// here we only process enter, i.e. CR (13) characters
			if (character == 13) {
				// if we have a click within the timeout period of the last
				// click
				if (System.currentTimeMillis() - msLastClick < msMaxBetweenClicks) {
					// abort old thread if it is not null
					if(clickTimeoutThread!=null){
						clickTimeoutThread.abort();
						clickTimeoutThread = null;
					}
				} else {
					nrClicks = 0;
				}
				nrClicks++;
				// System.out.println("Pressed once");
				clickTimeoutThread = new MultipleClickTimeoutThread(handler,msMaxBetweenClicks, nrClicks);
				clickTimeoutThread.start();
				msLastClick = System.currentTimeMillis();
			}
		}
	}

}

package org.elsewhat.multipleclick;

public class MultipleClickTimeoutThread extends Thread  {
	private long waitms;
	private boolean aborted=false;
	private IMultipleClickHandler handler;
	private int nrOfClicks;

	public MultipleClickTimeoutThread(IMultipleClickHandler handler, long waitms, int nrOfClicks){
		this.handler=handler;
		this.waitms=waitms;
		this.nrOfClicks=nrOfClicks;

	}

	public void abort(){
		aborted=true;
	}

	public void run() {
		try {
			sleep(waitms);
		} catch (Throwable t){

		}
		//if we're not aborted, then no extra clicks occured. Therefore, call handler
		if (!aborted){
			handler.clickOccured(nrOfClicks);
		}
	}
}

Here is me with the worlds biggest hawaii/aloha shirt



Follow

Get every new post delivered to your Inbox.