Posts Tagged: ‘xpages’

Freies E-book: Development Tips and Best Practices for XPages

25. September 2015 Posted by Bernd Hort

socialbizUG_logo.jpg

Die SocialBiz User Group hat mehrere Texte zum Thema XPages in einem Free E-book: Development Tips and Best Practices for XPages zusammengestellt.

Nun ratet einmal, wessen Präsentation von der IBM ConnectED 2015 Teil dieser Zusammenstellung ist?

IBM ConnectED 2015: BP 108 - Be Open - Use Web Services and REST in XPages Applications


Testing XPages (2): BrowserMob Proxy

17. September 2015 Posted by Sven Hasselbach

When testing XPages or other web applications, you may want to have more control about the requests and responses during the JUnit testing. For example, if you want to test if a specific HTTP header exists in the response, or if it is required to add some HTTP headers to the request. But you cannot doe this out of the box with Selenium. Instead, you have to add a proxy to the Firefox controller, which then gives you a handle to the HTTP data and allows you to control the flow.

An good solution for this is BrowserMob Proxy, which can be used by adding the required dependency to your Maven pom.xml:

<dependency>
    <groupId>net.lightbody.bmp</groupId>
    <artifactId>browsermob-proxy</artifactId>
    <version>2.0.0</version>
</dependency>

[This is version 2.0.0, the latest stable version]

The proxy runs locally on the specified port as soon the JUnit test starts and ends automatically after finishing the tests.  In order to accomplish this, the setUp method has to be modified:

// start the proxy (listens on port 4444)
server = new ProxyServer(4444);
server.start();

// get the Selenium proxy object
Proxy proxy = server.seleniumProxy();

// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);

Now, the proxy setting must be added to the Firefox driver:

driver = new FirefoxDriver(capabilities);

In the test class, three global variables must be defined; these are giving you access to the proxy server and latest the request and response during testing:

private ProxyServer server;
private BrowserMobHttpResponse httpResponse;
private BrowserMobHttpRequest httpRequest;

With the help of a ResponseInterceptor, the httpResponse property is always filled with the latest response. To initialize it, an anonymous class in the setUp method has to be created:

// add a response interceptor
ResponseInterceptor interceptor = new ResponseInterceptor() {
    public void process(BrowserMobHttpResponse response, Har har) {
          httpResponse = response;
    }
};

// add the interceptor to the server
server.addResponseInterceptor(interceptor);

For the RequestInterceptor it is the same procedure:

// add a request interceptor
RequestInterceptor requestInterceptor = new RequestInterceptor() {
    public void process(BrowserMobHttpRequest request, Har har) {
       httpRequest = request;
    }
};

server.addRequestInterceptor(requestInterceptor);

Now, it is possible to use it in a JUnit test:

@Test
public void testDemo() throws Exception {
 
    // add a request header
    server.addHeader("X-FOO", "BAR");
 
    // load the page
    reloadPage();

    // TEST RESPONSE STATUS
    HttpResponse httpRawResponse = httpResponse.getRawResponse();
    assertTrue("HTTP/1.1 200 OK".equals(httpRawResponse.getStatusLine()
       .toString()));
 
    // TEST SERVER HEADER
    assertTrue( "Lotus-Domino".equals( httpResponse.getHeader("Server")) );
 
}

The Browsermob-proxy has a lot of additional features: You can modify the allowed speed for up- and downstreams, use basic authentication, upload files, etc.

Testing XPages

16. September 2015 Posted by Sven Hasselbach

When testing XPages with Selenium, you can easily pre-generate the JUnit test code with the browser plugin. But when you then change the structure of the XPage (f.e. by moving the components from an XPage to a custom control), all the IDs of the JUnit test will not work anymore.

That’s why it is better to use CSS selectors to access the generated fields:

driver.findElements(By.cssSelector("input[id*='idOfTheComponent']"));

With the selector „id*=’idOfTheComponent'“ you can access the elements by their component id, idependently of their full generated client id.

Here is an example with a small XPage with a radio group and a listbox:

 

A simple XPage to test (SimpleDemo.xsp)

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:radioGroup
        id="radioGroupSimpleDemo"
        defaultValue="1">
        <xp:selectItem itemLabel="1" itemValue="1" />
        <xp:selectItem itemLabel="2" itemValue="2" />
    </xp:radioGroup>


    <xp:listBox id="listBoxSimpleDemo" multiple="true">
        <xp:selectItem itemLabel="1" itemValue="1" />
        <xp:selectItem itemLabel="2" itemValue="2" />
        <xp:selectItem itemLabel="3" itemValue="3" />
    </xp:listBox>
 
</xp:view>

 The JUnit Test

package ch.hasselba.xpages.test.seleniumdemo;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.List;
import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class SimpleDemo {

	private WebDriver driver;
	private String baseUrl = "http://127.0.0.1/WebTestDemo.nsf/SimpleDemo.xsp";
	private StringBuffer verificationErrors = new StringBuffer();

	@Before
	public void setUp() throws Exception {
		driver = new FirefoxDriver();
		driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
	}

	@After
	public void tearDown() throws Exception {
		driver.quit();
		String verificationErrorString = verificationErrors.toString();
		if (!"".equals(verificationErrorString)) {
			fail(verificationErrorString);
		}
	}

	@Test
	public void testDemo() throws Exception {
		reloadPage();
		List elemRadio = driver.findElements(By
				.cssSelector("input[id*='radioGroupSimpleDemo']"));
		assertTrue(elemRadio.get(0).isSelected());
		assertFalse(elemRadio.get(1).isSelected());

		Select select = new Select(driver.findElement(By
				.cssSelector("select[id*='listBoxSimpleDemo']")));
		List listSelect = select.getOptions();
		for (WebElement listElem : listSelect) {
			assertFalse(listElem.isSelected());
			assertTrue(listElem.isEnabled());
		}

	}

	public void reloadPage() {
		driver.get(baseUrl);
	}
}

The Maven pom.xml file

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
    http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>ch.hasselba.xpages.test</groupId>
    <artifactId>seleniumdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>seleniumdemo</name>
    <url>http://hasselba.ch</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>2.46.0</version>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
        </dependency>
        <dependency>
            <groupId>pl.pragmatists</groupId>
            <artifactId>JUnitParams</artifactId>
            <version>1.0.4</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

XPages: A ClientSide State

13. September 2015 Posted by Sven Hasselbach

I have created a ClientSide State for XPages, which allows horizontal scaling of XPages applications with a single click.

After installing the OSGi Plugin on the servers and the DDE, you can activate it with a single click:

2015-09-13 20_41_02-XPage Properties Editor - ClientStateDemo - IBM Domino Designer

Then, the State of the XPages application is stored on client side (in the field „$$clientstate„), and not on the server anymore. The State is AES-128 encrypted and uses some random bytes for a higher security.

2015-09-13 20_52_11-Quelltext von_ http___localhost_ClientStateDemo.nsf_Test.xsp

You can find the code on GitHub.

P.S.

Parts of the code are shamelessly stolen from Jesse.

OpenNTF XPages Extension Library und Domino 9.0.1 FP3 / FP4

26. August 2015 Posted by Bernd Hort

Auf der Download Seite für die OpenNTF XPages Extension Library befindet sich ein kleiner Hinweis bei den letzten beiden Releases 901v00_12.20150311-1316 and 901v00_13.20150611-0803:

“Please be aware of technote SWG21696682 as it affects the installation of the Extension Library if the UpdateSite.nsf method is used.”

Mit diesem Hinweis gemeint ist, dass wenn Sie eine UpdateSite.nsf auf einem Domino 9.0.1 Server mit FP3 oder FP4 verwenden, um eine Extension Library zu installieren, Sie in Schwierigkeiten sind.

Bei beiden Fix Packs verhindert eine Änderung in den Sicherheitseinstellungen für die Verwendung des Befehls java.classforName in der JVM das eine Extension Library geladen wird. Auf der Serverkonsole gibt es keine Fehlermeldung oder sonsts einen Hinweis. Die Extension Library steht einfach nicht zur Verfügung.

Für das FP4 ist die Lösung sehr einfach: Installieren Sie den JVM Patch SR16FP7 so wie in der IBM technote “Interim Fixes & JVM patches for 9.0.1.x versions of IBM Notes, Domino, iNotes & Notes Browser Plug-in” beschrieben ist.

Nach der Installation des JVM Patch SR16FP7 werden Sie auch wieder die geliebte Meldung auf der Konsole sehen: “...NSF Based plugins are being installed in the OSGi runtime...”


The XPages EL Directory

8. Juli 2015 Posted by Sven Hasselbach

I am currently working on an overview of available objects and properties for XPages Expression Language. A first incomplete and horrible designed version can be found here.

 

XPages: SSJS, EL and Bindings

2. Juli 2015 Posted by Sven Hasselbach

Because of reasons you should already know I avoid the use of SSJS in my XPages applications, but there are still some parts which can be easy realized in SSJS, but with EL only with a lot of effort. One of this things is accessing properties of a component which has only a getter or a setter – this will not work when using a binding.

Let’s look for example at repeat control which is bound to the variable repeat. It can be easily accessed everywhere in SSJS, EL or Java, and it is much faster then searching the component in the tree. Here it is accessed in a label:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">

    <xp:label
        value="#{repeat.rowCount}"
        id="labelCount">
    </xp:label>
    
    <xp:repeat
        id="repeatDemo"
        rows="30"
        binding="#{repeat}">
        <xp:this.value><![CDATA[#{javascript:[1,2,3,4,5]}]]></xp:this.value>
    </xp:repeat>
    
</xp:view>

But this will lead into an error, because the XspDataIterator component has only a getter method for the rowCount property, not a corresponding setter.

2015-07-01 23_11_16-Runtime Error

When changing the code to a SSJS method call, it works without any problems:

    <xp:label
        value="#{javascript:repeat.getRowCount()}"
        id="labelCount">
    </xp:label>

The reason for this behaviour can be found deep down in the underlying JSF classes: The BeanInfoManager ignores all methods without a “valid” getter/setter methods pair during the inspection of a class, and doesn’t add it to the available properties for the PropertyResover. The rows property for example has a pair of those methods, that’s why this works without any problem:

<xp:label
    value="#{repeat.rows}"
    id="labelCount">
</xp:label>

 

Neues Standardverhalten in XPages: Whitelist für Datenquellen

22. Juni 2015 Posted by Thomas Ladehoff

IBM Domino Designer
Seit Domino 9.0.1 FixPack 4 gibt es eine Neuerung bei XPages-Datenquellen, womit jetzt nicht mehr beliebige Servernamen über den URL übergeben werden können.


Bis zu diesem Update war es möglich über den URL Parameter "databaseName" einen anderen Server und Datenbank an eine XPage zu übergeben. Die Parameter werden von der Datenquelle auf der XPage verwendet, sofern nicht die Option ignoreRequestParams="true" für die Datenquelle gesetzt ist.


Mit dem neuen Update werden andere Server, als der aktuelle, standardmäßig nicht mehr zugelassen. Eine Beispieladresse wie die folgende führt dann zu dem Fehler "The databaseName URL parameter value is not one of the allowed database names.":

http ://servername.example.com/discussion.nsf/allDocuments.xsp?search=agenda&databaseName=otherserver!!discussion_data.nsf


Über eine neue Option in der xsp.properties Datei der XPages-Anwendung (bzw. des Servers) können die erlaubten Server und Datenbanken konfiguriert werden:


xsp.data.domino.param.databaseName.whitelist=<currentServer>!!<anyApplication>, otherServer!!app.nsf, otherServer!!app2.nsf


Darüber hinaus gibt zwei weitere neue Optionen für xsp.properties Datei:
  • xsp.data.domino.ignoreRequestParams = false
    Bei setzen auf "true" werden anwendungsweit auf XPages die übergebenen Parameter ignoriert.
  • xsp.data.domino.param.databaseName.usage= whitelist | apply | ignore | error
    Separates steuern des "databaseName"-Parameters. "whitelist" ist das Standardverhalten seit Domino 9.0.1 FixPack 4, davor war es "apply" (uneingeschränkt anwenden), bei "ignore" oder "error" wird der Parameter generell ignoriert bzw. führt zu einem Fehler. Empfehlenswerte Einstellung ist hier "ignore", sofern man diesen Parameter nicht wirklich benötigt.


Quelle und weitere Informationen: Link

XPages: An optimized JavaScript Resource Renderer

21. Juni 2015 Posted by Sven Hasselbach

Ferry Kranenburg created a nice hack to solve the AMD loader problem with XPages and Dojo, and because of the missing ability to add a resource to the bottom of an XPage by a property, I have created a new JavaScriptRenderer which allows to control where a CSJS script will be rendered.

The renderer has multiple options:

  • NORMAL – handles the CSJS resource as always
  • ASYNC – loads the script in an asynchronous way (with an own script tag)
  • NOAMD – adds the no amd scripts around the resource
  • NORMAL_BOTTOM – adds the script at the bottom of the <body> tag
  • ASYNC_BOTTOM – async, but at the end of the generated HTML page
  • NOAMD_BOTTOM – at the end, with the surrounding no amd scripts

To use the normal mode, you don’t have to change you resource definition. If you want to use the other modes, you have to change the content type of the resource with one of the entries in the list above. This for example would add a script block to the end of the page, including the non amd script blocks around it:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.resources>
        <xp:script clientSide="true" type="NOAMD_BOTTOM">
            <xp:this.contents><![CDATA[alert("Hello World!");]]></xp:this.contents>
        </xp:script>
    </xp:this.resources>
</xp:view>

2015-06-21 11_04_09

Here is the code for the resource renderer:

package ch.hasselba.xpages;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

import com.ibm.xsp.component.UIViewRootEx;
import com.ibm.xsp.renderkit.html_basic.ScriptResourceRenderer;
import com.ibm.xsp.resource.Resource;
import com.ibm.xsp.resource.ScriptResource;
import com.ibm.xsp.util.JSUtil;

public class OptimizedScriptResourceRenderer extends ScriptResourceRenderer {
    private static final String TYPE = "type";
    private static final String SCRIPT = "script";
    private static final String CSJSTYPE = "text/javascript";
    private boolean isBottom = false;
    
    private static enum Mode {
        NORMAL, ASYNC, NOAMD, ASYNC_BOTTOM, NOAMD_BOTTOM, NORMAL_BOTTOM
    }

    public void encodeResourceAtBottom(FacesContext fc,
            UIComponent uiComponent, Resource resource) throws IOException {
        isBottom = true;
        encodeResource(fc, uiComponent, resource);
        isBottom = false;
    }

    @Override
    public void encodeResource(FacesContext fc, UIComponent uiComponent,
            Resource resource) throws IOException {

        ScriptResource scriptResource = (ScriptResource) resource;
        ResponseWriter rw = fc.getResponseWriter();
        String type = scriptResource.getType();
        String charset = scriptResource.getCharset();
        String src = scriptResource.getSrc();

        Mode mode = Mode.NORMAL;
        try{
            mode = Mode.valueOf( type );
        }catch(Exception e){};

        if (mode == Mode.NORMAL || mode == Mode.NORMAL_BOTTOM ) {
            normalBottomJSRenderer( fc, uiComponent, scriptResource, (mode == Mode.NORMAL_BOTTOM), type );
        } else {
            if (mode == Mode.ASYNC || mode == Mode.ASYNC_BOTTOM) {
                asyncJSRenderer(fc, uiComponent, scriptResource, (mode == Mode.ASYNC_BOTTOM), rw, type,
                        charset, src );
            }else if (mode == Mode.NOAMD || mode == Mode.NOAMD_BOTTOM ) {
                noAMDJSRenderer(fc, uiComponent, scriptResource, (mode == Mode.NOAMD_BOTTOM) , rw, 
                        type, charset, src);
            }

        }

    }

    private void normalBottomJSRenderer(FacesContext fc,UIComponent uiComponent,
            ScriptResource scriptResource, final boolean addToBottom, final String type ) throws IOException {
        
        if( addToBottom && !isBottom )
            return;
        scriptResource.setType(null);
        super.encodeResource(fc, uiComponent, scriptResource);
        scriptResource.setType(type);
        
    }
    private void asyncJSRenderer(FacesContext fc,
            UIComponent uiComponent, ScriptResource scriptResource, 
             final boolean addToBottom, ResponseWriter rw, final String type, final String charset,
            final String src) throws IOException {
        
        if( addToBottom && !isBottom )
            return;
        
        Map<String, String> attrs = null;
        String key = null;
        String value = null;
        String id = "";

        if (scriptResource.getContents() == null) {
            attrs = scriptResource.getAttributes();
            if (!attrs.isEmpty()) {
                StringBuilder strBuilder = new StringBuilder(124);
                for (Iterator<String> it = attrs.keySet().iterator(); it
                        .hasNext();) {
                    key = it.next();
                    value = attrs.get(key);
                    strBuilder.append(key).append('(').append(value)
                            .append(')');
                }
                id = strBuilder.toString();
            }

            // check if already added
            UIViewRootEx view = (UIViewRootEx) fc.getViewRoot();

            String resId = "resource_" + ScriptResource.class.getName() + src
                    + '|' + type + '|' + charset + id;
            if (view.hasEncodeProperty(resId)) {
                return;
            }
            view.putEncodeProperty(resId, Boolean.TRUE);

        }
        if (!scriptResource.isClientSide()) {
            return;
        }

        rw.startElement(SCRIPT, uiComponent);
        JSUtil.writeln(rw);
        rw.write("var s = document.createElement('" + SCRIPT + "');");
        JSUtil.writeln(rw);
        rw.write("s.src = '" + src + "';");
        JSUtil.writeln(rw);
        rw.write("s.async = true;");
        JSUtil.writeln(rw);
        rw.write("document.getElementsByTagName('head')[0].appendChild(s);");
        JSUtil.writeln(rw);
        rw.endElement(SCRIPT);
        JSUtil.writeln(rw);
    }

    
    private void noAMDJSRenderer(FacesContext fc,
             UIComponent uiComponent,ScriptResource scriptResource,
            final boolean addToBottom, ResponseWriter rw, final String type, final String charset,
            final String src ) throws IOException {
        
        if( addToBottom && !isBottom )
            return;

        // write the "disable AMD" script
        rw.startElement(SCRIPT, uiComponent);
        rw.writeAttribute(TYPE, CSJSTYPE, TYPE);
        rw.writeText(
                        "'function'==typeof define&&define.amd&&'dojotoolkit.org'==define.amd.vendor&&(define._amd=define.amd,delete define.amd);",
                        null);
        rw.endElement(SCRIPT);
        JSUtil.writeln(rw);

        // write the normal CSJS
        scriptResource.setType(null);
        super.encodeResource(fc, uiComponent, scriptResource);
        scriptResource.setType(type);
        // write the "reenable AMD" script
        rw.startElement(SCRIPT, uiComponent);
        rw.writeAttribute(TYPE, CSJSTYPE, TYPE);
        rw
                .writeText(
                        "'function'==typeof define&&define._amd&&(define.amd=define._amd,delete define._amd);",
                        null);
        rw.endElement(SCRIPT);
        JSUtil.writeln(rw);

    }
}

The ViewRenderer must also be modified, otherwise it is not possible to add the resources at the bottom of the <body> tag:

package ch.hasselba.xpages;

import java.io.IOException;
import java.util.List;

import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.render.Renderer;

import com.ibm.xsp.component.UIViewRootEx;
import com.ibm.xsp.render.ResourceRenderer;
import com.ibm.xsp.renderkit.html_basic.ViewRootRendererEx2;
import com.ibm.xsp.resource.Resource;
import com.ibm.xsp.resource.ScriptResource;
import com.ibm.xsp.util.FacesUtil;

public class ViewRootRendererEx3 extends ViewRootRendererEx2 {

    protected void encodeHtmlEnd(UIViewRootEx uiRoot, ResponseWriter rw)
            throws IOException {
        FacesContext fc = FacesContext.getCurrentInstance();

        List<Resource> resources = uiRoot.getResources();
        for (Resource r : resources) {
            if (r instanceof ScriptResource) {
                ScriptResource scriptRes = (ScriptResource) r;
                if (scriptRes.isRendered()) {
                    Renderer renderer = FacesUtil.getRenderer(fc, scriptRes.getFamily(), scriptRes.getRendererType());
                    ResourceRenderer resRenderer = (ResourceRenderer) FacesUtil.getRendererAs(renderer, ResourceRenderer.class);
                    if( resRenderer instanceof OptimizedScriptResourceRenderer ){
                        ((OptimizedScriptResourceRenderer) resRenderer).encodeResourceAtBottom(fc, uiRoot, r);
                    }
                }
            }
        }

        rw.endElement("body");
        writeln(rw);
        rw.endElement("html");
    }

}

To activate the new renderes, you have to add them to the faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
  <render-kit>
    <renderer>
      <component-family>com.ibm.xsp.resource.Resource</component-family>
      <renderer-type>com.ibm.xsp.resource.Script</renderer-type>
      <renderer-class>ch.hasselba.xpages.OptimizedScriptResourceRenderer</renderer-class>
    </renderer>
    <renderer>
      <component-family>javax.faces.ViewRoot</component-family>
      <renderer-type>com.ibm.xsp.ViewRootEx</renderer-type>
      <renderer-class>ch.hasselba.xpages.ViewRootRendererEx3</renderer-class>
    </renderer>
  </render-kit>
</faces-config>

Needless to say that this works in Themes too.

xsp.application.context.proxy

17. Juni 2015 Posted by Sven Hasselbach

Just a reminder for myself: To use a CDN for XPage resources, you can add a leading slash to the xsp.application.context.proxy property.

xsp.application.context.proxy=/cdn.hasselba.ch

2015-06-17 10_52_08-view-source

 

Fragen über Fragen! Aber Müller weiß die Antworten…

22. Mai 2015 Posted by Katrin Benteler

"Müller arbeitet jetzt anders" hieß der Titel der Infoveranstaltung, zu der ITWU zusammen mit drei anderen IT-Partnern aus Paderborn und der IBM für den vergangenen Dienstag nach Paderborn eingeladen hatten. Dieser Einladung sind knapp 60 Teilnehmer gefolgt, die sich über "Neue Wege der Zusammenarbeit" informieren lassen wollten.

Zuerst wurde aber vom Paderborner Bürgermeister Michael Dreier die Frage beantwortet: Was macht Paderborn eigentlich zum herausragenden IT-Standort?

  • Ein gutes Netzwerk der ansässigen IT-Firmen (wie die Veranstaltung selbst schon bewies)
  • Die historisch gewachsene IT-Kultur, belegt durch das Heinz-Nixdorf-Museum und -Forum
  • Der innovativer Universitätsstandort, der kontinuierlich für qualifizierten Nachwuchs sorgt

 

 


Der Moderator Dr. Oliver Tissot, der für wohltuende Auflockerung zwischen den Vorträgen sorgt, suchte hingegen vergeblich nach Antworten auf die Fragen:

  • Wer ist eigentlich Herr Müller? und
  • Wie viele Ohren haben jetzt die Hasen?


Den wirklich wichtigen Fragen stellten sich dann endlich die beiden IBM-Referenten und die 4 Partner:

  • Wie kann Müller mit IBM Verse sein Mailfile intelligent verwalten? (IBM)
  • Wie hilft IBM Connections Müller dabei, effektiver mit anderen zusammenzuarbeiten? (IBM)
  • Wie gelingt Müller mit Hilfe von Webanwendungen der Brückenschlag zwischen IT-Welten? (ITWU)
  • Wie bekommt Müller mit einem BPM-System oder Case Management seine Prozesse in den Griff? (Mettenmeier)
  • Woher weiß Müller, welche Prozesse er bereits mit IBM Connections ablösen kann? (acceptIT)
  • Wie macht Müller aus IBM Websphere Portal und IBM connections ein Social Portal? (agentbase)

 

 

In den Pausen konnten die Teilnehmer dann weitere Fragen an den Ständen der Partner und der IBM loswerden.

Wenn ihr diese Fragen auch beantwortet  haben möchtet, ruft uns einfach an (05251 288160) oder schickt uns eine E-Mail an info@itwu.de.

Da das Interesse doch sehr groß war, bekommt ihr höchstwahrscheinlich im September auch noch eine Gelegenheit, euch die Antworten auf diese Fragen von der IBM und den 4 Partnern persönlich abzuholen. Es ist bereits eine Folgeveranstaltung in Düsseldorf in Planung, über die wir euch natürlich gerne auf der Veranstaltungshomepage Mueller-arbeitet-jetzt-anders.de auf dem Laufenden halten.

 

IBM Verse macht E-Mail fit f?r die Zukunft der Arbeit - mittels Cloud, Social, Analytics und Top-Design. Die Inbox wird zum intelligenten Assistenten f?r die Organisation und Priorisierung von Aufgaben und Gesch?ftskontakten - Dr. Peter Sch?tt, IBM Deutschland GmbH   Echtzeit-Collaboration, Analytics und Content Management auf jedem Ger?t - so vertieft IBM Connections die Zusammenarbeit. Live Demo und Ausblick auf Connections Next - Benedikt M?ller, IBM Deutschland   Einf?hrung in die Rapid Application Development Technologie "Domino XPages" anhand ausgew?hlter Kundenszenarien - Carl Goos, IT works unlimited   Worflow-L?sungen im Praxiseinsatz, Gesch?ftsprozessmanagement - von hochautomatisiert bis wissensorientiert, Neue M?glichkeiten durch Open-Source-Technologie - Daniel J?ger, Mettenmeier   Eine Infrastruktur-Analyse zeigt in der Regel deutlich, dass es in der Unternehmens-IT viele Anwendungsf?lle gibt, die eigentlich schon lange nach einer Abl?sung oder Erweiterung durch IBM Connections schreiben - Stefan Lage, acceptIT   Vorstellung eines umfassenden Praxisbeispiels, wie ein IBM WebSphere Portal durch die Anbindung von IBM Connections zu einem Social Portal ausgebaut werden kann - Marius Neumann, agentbase  

 


 

XPages: Create Code39 Barcodes

19. Mai 2015 Posted by Heiko Voigt

Hi Folks, a couple of weeks back a customers asked me how to do Barcodes in XPages as they needed them in their application to be printed to a document scanning system. After looking into the applic ...

XPages: Create Code39 Barcodes

19. Mai 2015 Posted by Heiko Voigt

Hi Folks, a couple of weeks back a customers asked me how to do Barcodes in XPages as they needed them in their application to be printed to a document scanning system. After looking into the applic ...

Webinar an Christi-Himmelfahrt: App.Next – The Future of Domino Application Development

15. Mai 2015 Posted by Stephan Schramm

Eigentlich sollte es ein Feiertag sein, aber Teamstudio, TLCC und IBM hatten etwas anderes geplant. Es war mal wieder Zeit für das monatliche Webinar. Dieses Mal mit dem schönen Titel: App.Next - The Future of Domino Application Development.

Und es hat sich gelohnt. Schaut mal ab 15:27 was für Pläne es für die NSF gibt. Das Auslagern der View Indexes wäre nun wirklich eine sehr feine Sache. Im Q&A am Ende der Präsentation wird dazu sogar noch erklärt, dass die View Indexes auf einen eigenen Controller Channel könnten. Meine Performance Träume werden vielleicht irgendwann noch wahr. Aber weitere Vorteile liegen auf der Hand: innerhalb der NSF wird Platz frei (erinnert an DAOS), man kann viel mehr Views erstellen, ohne sich Gedanken um die arme NSF machen zu müssen und unnötige View Indexes müssen nicht mehr gesichert werden.

Das weitere Webinar verlief wie erwartet. Es wurden viele Features für XPages vorgestellt. Dabei sollte man sicherlich die Dokumenten-Verschlüsselung innerhalb von XPages hervorheben. Aber natürlich sind Responsive Designs und Relational Data Support und vieles mehr auch nicht langweilig.

Wer gerne etwas weiter in die Zukunft denkt, sollte ab 51:07 Domino on Bluemix schauen. Praktisch wird es ab 1:04:10 mit einer Demonstration von XPages auf Bluemix. Auf jeden Fall Dank an die Präsentatoren des Webinars am Feiertag: Pete Janzen, Martin Donnelly und Brian Gleeson ;)

XPages: Interactive Maps using OpentStreetMap and Leaflet.js

4. Mai 2015 Posted by Heiko Voigt

Hi there, it's been a while since my last coding post but over the past rainy weekend, I had a bit of time on my hands to build an XPages App that shows marker data coming from a Domino Database as ...