html-iconApache Wicket is a great web framework, its clear separation between logic and markup allows to focus on what's need to be done.
As we use Wicket at SRMvision, we needed to send mails with rather rich templates to our users. The first implementation we used was relying on Wicket to generate these templates using Html. We finally don't use it (our mailing tasks are done by a background job, thus we don't have access to our webapp), but I though the code used in our fast proof of concept could help someone else.

import org.apache.wicket.markup.MarkupType;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.Response;
import org.apache.wicket.response.StringResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * Simple panel allowing to use the templating engine 
 *    provided by Wicket to generate HTML.
 * Typical use would be to generate mail content.
 *
 * User of this class will need to subclass it 
 *    and create a panel as usual. 
 * Then a call to getHtml() will return the generated Html.
 *
 * @author cedric at gatay.fr
 */
public class HtmlTemplaterPanel extends Panel {
    private static final Logger LOGGER = 
        LoggerFactory.getLogger(HtmlTemplaterPanel.class);

    /**
     * Default constructor takes no wicket:id > 
     *   the panel will not be added to any component
     */
    public HtmlTemplaterPanel(){
        super("dummy");
    }

    /**
     * Call this whenever you want to get
     *   the Html for this component
     * @return Html or empty string
     */
    public String getHtml(){
        final Response origResponse = getRequestCycle().getResponse();
        try{
            final StringResponse stringResponse = new StringResponse();
            getRequestCycle().setResponse(stringResponse);
            renderAssociatedMarkup("panel", "");
            return stringResponse.toString();
        }catch(Exception e){
            LOGGER.error("Unable to build HTML for panel : {}",
                         e.getMessage());
        }finally{
            getRequestCycle().setResponse(origResponse);
        }
        return "";
    }

    @Override
    protected boolean getStatelessHint() {
        return true;
    }

    @Override
    public MarkupType getMarkupType() {
        return MarkupType.HTML_MARKUP_TYPE;
    }
}

If you want to generate a template using Apache Wicket, you only need to create a Panel and its associated markup which inherits this simple class. Then, when you want to get the Html for your component, call getHtml().
The only drawback of this is that you need a RequestCycle to generate the markup (you'll find out why reading the code).

Sorry english readers, this post about french ISP is only available in French

Marre de Free…

Depuis 2003 maintenant je suis client ADSL de Free. Là où j'ai toujours conseillé et trouvé que Free était un des acteurs du marché qui faisait bouger les choses, j'ai depuis changé d'avis.
La Freebox révolution est une belle machine, arrivée bien avant les machines des concurrents mais, comme Free l'avait fait avec la version précédente, le produit livré était bien loin des promesses tenues lors de la conférence de presse. Il aura fallu une bonne année avant que la box soit réellement stabilisée et n'ait plus ces bugs les plus gênants (volume non conservé, paramètres volatiles). En plus de cette technique consistant à considérer le client comme beta testeur, vient maintenant le problème du débit : celui ci n'a pas arrêté pas de se dégrader : la situation était telle que j'en venais à me connecter au VPN de ma société pour réussir un build Maven dans des temps raisonnables (80ko/s qui se transforment en 2Mo/s pour télécharger des dépendances). En supplément je suis abonné Canal Plus et l'accès à Canal Plus à la demande via la Freebox est devenu complètement erratique (problème étrange parce que depuis ma TV l'accès fonctionne bien mieux, Free est sûrement moins à blâmer dans ce cas).

L'élément déclenchant le changement chez moi a été le récent événement concernant les DNS menteurs de la Freebox effectuant un bloquage automatique et non configurable des publicités. Ce sujet a donné lieu à des centaines de commentaires sur Internet, et je me situe du côté de ceux qui ne sont pas opposé à l'intégration de la fonctionnalité, mais pas de cette façon : les utilisateurs lambda auront cette fonctionnalité activé par défaut et n'auront plus la possibilité de découvrir des opportunités grâce à la publicité. Et pour les utilisateurs avancés la non configurabilité du bloquage rend l'initiative complètement inutile.

Ayant la chance d'être desservi par le câble, le choix d'un nouveau fournisseur d'accès a été largement simplifié : Bouygues télécom et son offre BBox sensation ou Numericable. Vu les mauvais retours que j'ai pu avoir sur le boitier de chez Bouygues et le fait que le réseau utilisé est celui de Numericable je me suis tourné vers ce fournisseur.

Passage chez Numericable

J'ai passé ma commande le 7 janvier, le 11 janvier j'ai reçu LaBox en relai colis. Le branchement fait le soir même, rien ne marchait : j'avais le signal correctement synchronisé mais ni TV ni Internet.
Pour informations, la procédure d'inscription via le site http://signup.numericable.fr ne fonctionnait pas (impossible de reconnaitre le matériel).
Le lendemain, j'ai contacté le service client via le chat (très bonne expérience utilisateur ceci dit en passant) qui a fini d'activer ma ligne. Internet fonctionnait comme voulu mais j'avais toujours un problème avec le service TV, LaBox me gratifiait d'un message "droits expirés" dès l'allumage et en allant dans le menu de diagnostic le numéro de carte ne s'affichait même pas. La solution à ce problème était tout simplement de garder LaBox sur une des chaines qui fonctionnait (317 - D17 a fonctionné pour moi) pendant environ une heure. Une heure plus tard, toutes les chaines fonctionnaient comme prévu et la magie a fait que le numéro de carte est désormais visible dans la partie diagnostic de LaBox.

J'ai enfin une connexion fiable et rapide ainsi qu'un service TV de très bonne qualité. La seule fonctionnalité bonus de la Freebox qui va me manquer est le support AirPlay, l'iPad avec Spotify vers l'amplificateur home cinéma via AirPlay est une chose que j'utilise très souvent quand je reçois du monde. Je suis donc à la recherche d'une bonne alternative peu couteuse.

I own a Playstation3 since January 2009 after getting the famous RROD on two successives Xbox 360. The PS3 is a really a nice gaming device, but the guys at Sony have  another focusing on everything but their store experience to their end users.

Playstation3

When I left the Xbox 360 world, one of the best feature of it was its store, I could even access it from my web browser and launch downloads so that I can play my games when I got home. I seriously miss this feature on the PS3. But I found that Sony, I guess along with the big store rewrite they made a few weeks ago, now allows us to browse and buy easily from our browser : https://store.sonyentertainmentnetwork.com.

SEN Store I don't know yet if the download will be automagically launched when my Playstation 3 will automatically wake up to synchronise my Playstation+ account.
I'll update this post when I'll know !

It seems that the downloads don't get pushed automatically to the console nor are downloaded when the console is syncing. Come on Sony, you've come so close !

There is a famous quote about regular expressions, to which I don't really agree but I have to admit there is not much love for regexps around me.

Some people, when confronted with a problem, think "I know, I'll use regular expressions." Now they have two problems. Jamie Zawinski

I came across this little tool : Regexper allowing to easily understand a regular expression by providing its state machine diagram : Regexper example

I think it could be useful to put it in your bookmarks with Rejex to use it when you work with regular expressions.