XPages: Running Google’s Chrome V8 Javascript Engine

After answering a question on Stackoverflow.com about the Prototype problematic in the XPages SSJS engine, I thought of running another Javascript engine on top of Domino.

While you can use the JavaScripting API JSR223, I choosed the jav8 project for a test how this can be realized. So I downloaded the Windows binaries to get the required DLL and imported it into a new database. I also imported the source files of the lu.fler.script package to recompile all required classes.

Then, I registered the factory service by creating a javax.script.ScriptEngineFactory file in the /META-INF/services folder and added the line lu.flier.script.V8ScriptEngineFactory.

The package explorer looked like this:

To prevent collisions, I commented out some names in the V8ScriptEngineFactory class:

For a simple test, I decided to invoke the engine manually when clicking on a button on a XPage. To do this, I created a simple ActionListener in Java which loads the JavaScript Engine and evals a simple “ var i = 1+1″. The Javascript variable is then accessed and printed out to the server console.

package ch.hasselba.xpages.jav8;

import javax.faces.event.AbortProcessingException;
import javax.faces.event.ActionEvent;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class JAV8Test implements javax.faces.event.ActionListener {

    static ScriptEngineManager factory = new ScriptEngineManager();
    static ScriptEngine engine = factory.getEngineByName("jav8");

    public void processAction(ActionEvent actionEvent)
            throws AbortProcessingException {
        try {
            System.out.println( engine.getClass().getCanonicalName() );
            engine.eval("var i=1+1;");
            System.out.println( "i = " + engine.get("i") );
        } catch (ScriptException ex) {
            ex.printStackTrace();
        }
    }
}

The XPage to test the ActionListener is rather simple too:

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

    <xp:button
        value="Click Me!"
        id="buttonClickMe">
        <xp:eventHandler
            event="onclick"
            submit="true"
            refreshMode="complete">
            <xp:this.actionListeners>
                <xp:actionListener type="ch.hasselba.xpages.jav8.JAV8Test" />
            </xp:this.actionListeners>
        </xp:eventHandler>
    </xp:button>
    
</xp:view>

When the button is clicked, the V8 engine works as it should:

But now comes a hard problems: It works only once! After doing this, my test server crashes completly. During playing with it, I was able to run it as it should, but I have no idea anymore how I did it. I think it is the DLL and static classes, but I am currently to busy to investigate the problem further. The @Override notations added to the methods (which must removed before the code can be compiled) do not override exitisting ones (I checked the bundled javax.script JAR of the binary package), this does not seem to be the problem. Maybe someone else has an idea?

Veröffentlicht unter Allgemein, ServerSide JavaScript, XPages | Verschlagwortet mit , , , , , | Schreib einen Kommentar

MongoDB for Java Developers

Today I received the confirmation for successfully completing the „MongoDB for Java Developers“ course:

Here is the link to verify the certificate.

Veröffentlicht unter MongoDB | Verschlagwortet mit | Schreib einen Kommentar

XPages: Execute Events with HTTP Get

To execute an event on the server, you normally have to send a POST request, because actions will be executed in the Invoke Application phase of the JSF lifecycle. A GET request will only process the Restore View and the Render Response phase, that why you can not execute an event with a GET request.

But with the help of a PhaseListener, the execution can be done earlier in the Restore View phase:

package ch.hasselba.xpages.util;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import com.ibm.xsp.component.xp.XspEventHandler;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import com.ibm.xsp.util.FacesUtil;

public class ExecuteOnServerPhaseListener implements PhaseListener {

    private static final long serialVersionUID = 1L;

    public void beforePhase(PhaseEvent event) {}

    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

    public void afterPhase(PhaseEvent event) {
        
        FacesContextExImpl = FacesContextExImpl.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();
        String url = ec.getRequestPathInfo();
        String[] pathes = url.split( "/" );
        
        try{
            if( pathes.length > 2 ){
                if( "executeOnServer".equals( pathes[pathes.length -2 ] ) ){
                    String[] fullId = pathes[ pathes.length - 1 ].split(":");
                    String actionId = fullId[ fullId.length - 1 ];
                    XspEventHandler eventHandler = (XspEventHandler)
                        FacesUtil.findComponentWithFullId( fc.getViewRoot(), actionId );
                    if( eventHandler != null ){
                        eventHandler.getAction().invoke( fc, null );
                        fc.responseComplete();
                    }
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }

}

To activate the PhaseListener, it has to be enabled in the faces-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
   <lifecycle>
      <phase-listener>ch.hasselba.xpages.util.ExecuteOnServerPhaseListener</phase-listener>
   </lifecycle>
</faces-config>

The following Javascript snippet extends the XSP object and adds the new function executeOnServerGet to it. The parameter is the if of the event to invoke.

XSP.executeOnServerGet = function( eventId ){
    var viewId = dojo.query('[name="$$viewid"]')[0].value;
    var url = document.forms[0].action;
    url += "/executeOnServer/" + eventId;
    url += "?$$viewid=" + viewId;
    url += "&$$ajaxid=@none";
    dojo.xhrGet({url: url});
}

When calling the function, it sends a GET request and adds the current view id to the request. With the parameter $$ajaxId set to @none, the XPages Engine is forced to send no HTML code back to the client.

And here is an example XPage:

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

    <xp:eventHandler id="helloworld" event="helloworld" submit="false">
        <xp:this.action>
            <![CDATA[#{javascript:
               print("hello world " + java.lang.System.currentTimeMillis() );
            }]]>
        </xp:this.action>
    </xp:eventHandler>


    <xp:scriptBlock id="scriptBlock1">
        <xp:this.value><![CDATA[
            dojo.addOnLoad( function(){
                XSP.executeOnServerGet = function( eventId ){
                      var viewId = dojo.query('[name="$$viewid"]')[0].value;
                    var url = document.forms[0].action;
                    url += "/executeOnServer/" + eventId;
                    url += "?$$viewid=" + viewId;
                    url += "&$$ajaxid=@none";
                    dojo.xhrGet({url: url});
                  }
            });
        ]]></xp:this.value>
    </xp:scriptBlock>
    
    <xp:button value="Execute" id="button1">
        <xp:eventHandler event="onclick" submit="false">
            <xp:this.script>
                <![CDATA[XSP.executeOnServerGet( "#{id:helloworld}" );]]>
            </xp:this.script>
        </xp:eventHandler>
    </xp:button>
</xp:view>

When clicking the button, the following URL is opened in the background:

http://example.com/db.nsf/EventGet.xsp/executeOnServer/view:_id1:helloworld?$$viewid=!dwjldz64w0!&$$ajaxid=@none

A GET request was sent to the server:If you look on the server console, you will see that the Action was invoked:

Veröffentlicht unter Dojo Toolkit, Java, Java Script, JSF, Performance, XPages, XSP | Verschlagwortet mit , , , , , , , , , , | 2 Kommentare

Apple: Ganz großes Kino!

image

Veröffentlicht unter Allgemein | Schreib einen Kommentar

To Dump Or Not To Dump

Die Firma GULP bietet ein neues „Feature“:

Stundensätze der anderen Bewerber auf ein Projekt werden in 10-Euro Schritten gut sichtbar auf der Online-Bewerbungsseite angezeigt. Eine interessante Neuerung, denn letztlich fördert es den Wettbewerb, die Angebote der Anderen noch ein wenig zu unterbieten. Dumping at it’s best.

Wenn ich mir allerdings den obigen Screenshot eines Projektes anschaue, sehe ich ein Angebot für 30€ oder weniger. Da frage ich mich schon, was dieser Quatsch eigentlich soll. Ist so etwas ernst gemeint? Und auch bei den „Unter 60€“-Kandidaten frage ich mich ernsthaft, wie deren Kalkulation aussieht?

Steuern? Rücklagen? Altersvorsorge? Wirtschaftliches Risiko?

Scheint keine Rolle bei diesen Zahlen zu spielen. Auch Themen wie Fortbildung, Urlaubszeiten, Krankheitsausfälle und die „nicht berechenbaren Aufwendungen“ (wie z.B. die Buchhaltung, Akquisephasen usw.) sind hier wohl kaum in den Kalkulationen enthalten. Und dann noch die Befürchtung, als „Scheinselbstständig“ eingestuft zu werden. Das alles für solche Dumping-Preise?

Aktuell liegt der Schnitt bei deutlich über 70€/Stunde für IT Freiberufler, alles andere ist doch totaler Quatsch: Geht euch ne Festanstellung suchen und macht den Markt nicht kaputt! Die Vermittler-Branche lacht sich ins Fäustchen und berechnet für Eure Arbeit mindestens 50% mehr. Für nichts und wieder nichts.

Und die Firmen erhalten billige Arbeitskräfte (gegenüber den teuren Festangestellten, die meistens mit deutlich über 100€/Stunde in Konzernen kalkuliert werden).

Im Lotus / Domino / IBM Notes – Markt ist es hart geworden: Von oben drücken die Firmen, deren Margen schmelzen, und von unten kommen die Dumping-Angebote überqualifizierter Freiberufler. Und dazwischen tummeln sich die Vermittler, die sich die Taschen füllen. Na denn, Prost Mahlzeit!

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Identifying Back Doors, Attack Points, and Surveillance Mechanisms in iOS Devices

Eine sehr interessante Präsentation von Jonathan Zdziarski: Identifying Back Doors, Attack Points, and Surveillance Mechanisms in iOS Devices

Overall, the otherwise great security of iOS has been
compromised… by Apple… by design.

Kommt mir irgendwie bekannt vor

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Ein bischen mehr Privatspähre

Nach dem Post von Julian Buss habe ich seinen Hinweis auf die Suchmaschine startpage.com angenommen, und letze Woche die Umstellung vollzogen.

Seit dem fehlt mir überraschenderweise nichts! Die Suchergebnisse stimmen, die Geschwindigkeit auch, und ich bemerke die Umstellung nur an dem anderen Seitenlayout.

Anfangs war es etwas nervig, dass die Suchergebnisse allesamt per POST übertragen werden, und dadurch die Browser-Historie leidet, aber nachdem ich mal die Konfiguration angepasst hatte, lief alles wie „immer“. Einzig bei der Sucherweiterung für Firefox habe ich Hand anlegen müssen, damit auch diese Suche per GET funktioniert. Um das hinzubekommen, habe ich die search.json mittels einem Texteditor angepasst.

Die Datei unter Windows zu finden im Verzeichnis

<USERDATA>\AppData\Roaming\Mozilla\Firefox\Profiles\<PROFIL ID>

unter Linux im Ordner

~\.mozilla\profiles\<PROFIL ID>

Der folgende Part…

[{"template":"https://startpage.com/do/search","rels":[],
"method":"POST","params":[{"name":"query","value":"{searchTerms}"},
{"name":"cat","value":"web"},{"name":"pl","value":"ff"},
{"name":"language","value":"deutsch"}]}]

muss durch diesen ersetzt werden (Änderungen hervorgehoben), dann läuft auch diese Suche wie gewünscht:

[{"template":"https://startpage.com/do/search","rels":[],
"method":"GET","params":[{"name":"q","value":"{searchTerms}"},
{"name":"cat","value":"web"},{"name":"pl","value":"ff"},
{"name":"language","value":"deutsch"}]}]

Ich nutze natürlich weiterhin Google-Dienste, nicht zuletzt auch wegen den eingesetzen Smartphones, aber es ist ein kleiner Schritt in die richtige Richtung.

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Ich, der Extremist (3)

Node Nr. 2 ist jetzt auch am laufen. Die nächste Node wird eine Exit-Node, doch nach den Auswüchsen der letzten Zeit werde ich diese wohl 100% Anonym betreiben.

(Es dauert übrigens immer ein paar Tage, bis die „Endgeschwindigkeit“ erreicht wird. Erst muss die Node als „Stable“ eingestuft werden.)

Wenn jemand interesse verspürt, ebenfalls eine Node zu betreiben, kann sich gerne bei mir melden, ich helfe gerne bei den unterschiedlichen Szenarien. Node Nr. 2 läuft zum Beispiel auf einem Raspberry Pi, aber auch eine Fritzbox kann für stromsparend im Eigenheim als Basis dienen. Als Bandbreite benötigt man gerade einmal 20 KB/s, denn das wichtigste im TOR Netzwerk ist nicht die Geschwindigkeit, sondern die Zahl der verfügbaren Nodes: Je mehr davon, desto „unkontrollierbarer“ ist das ganze Netz.

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Gauchogate

Die Übersetzung des kleinen Liedchens findet sich hier: http://www.wm2014-in-brasilien.de/argentinien-invasion/7198/

Veröffentlicht unter Allgemein | Schreib einen Kommentar

Stürmerfoul

Es ist für mich durchaus nachvollziehbar, dass die Niederlage im WM-Finale die Argentinier geschockt hat, und nun jede erdenkliche Fehlentscheidung des Schiedsrichters als Begründung für das Scheitern herhalten muss. Auch kann ich es gut verstehen, dass man sich als unterlegene Mannschaft betrogen fühlt um den verdienten Erfolg, der dem eigenen Team durch eine krasse Fehlentscheidungen verwehrt wurde, wie z.B. der nicht gegebene Elfmeter im Spiel Argentinien – Iran.

Doch eines muss man festhalten:

Egal wie gut oder schlecht die Leistung des Schiedsrichtergespanns auch war, die Entscheidung auf Stürmerfoul in der Szene Neuer vs. Higuaín war absolut korrekt. Ich weiß, dass ist schwer zu verstehen und noch schwerer zu akzeptieren. Doch weder die Argentinische Mannschaft hat sich während des Spiels mit der Szene länger aufgehalten, noch äusserete sich Maradonna im Nachhinein dazu. Und der übt ja sonst Kritik an allem und jedem.

Falls das alles nicht hilft: Dann war es halt die Faust Gottes. So ist es halt manchmal beim Fussball…

Veröffentlicht unter Allgemein | Schreib einen Kommentar