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 | Hinterlasse 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 | Hinterlasse 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 | Hinterlasse 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 | Hinterlasse 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 | Hinterlasse 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 | Hinterlasse einen Kommentar

Gauchogate

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

Veröffentlicht unter Allgemein | Hinterlasse 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 | Hinterlasse einen Kommentar

Brasilien

Das war ja wohl nix: Mit 1:10 Tore in den letzten zwei Spielen und einer mehr als schlechten Vorstellung verabschiedet sich der WM Gastgeber vom Turnier. Und schon werden die ersten Stimmen laut, dass bei der WM 2018 in Russland alles besser werde.

Ein Detail darf dabei nicht vergessen werden: Den Gastgeberbonus gibt diesmal nicht, und Brasilien muss durch die Qualifikation. 18 Spiele, in denen Mannschaften warten, die man nicht unterschätzen sollte.

Es wird ein hartes Stück Arbeit, Tabula Rasa zu machen und die Weichen für einen Neustart zu stellen. Schon 2015 kommt die erste Probe aufs Exempel für das neue Team und den noch zu findenden Trainer: Die Copa America in Chile.

Veröffentlicht unter Allgemein | 2 Kommentare