Libellés

vendredi 15 avril 2011

Grails thumbnail : Reduire une image dans grails en gardant une bonne qualité

En java ce n'est pas forcement facile de trouver une librairie pour réduire des images en gardant une bonne qualité.

Heureusement il existe le projet Java Image Scaling qui a sa librairie sur maven.
http://code.google.com/p/java-image-scaling/


Maintenant voici comment intégrer Java Image Scaling dans grails : un jeu d'enfant :)

Ajouter la dépendance suivante dans grails-app/conf/BuildConfig.groovy


runtime 'com.mortennobel:java-image-scaling:0.8.5'


Dans votre controller ajoutez le bout de code suivant :


/**
* Return the content of screen shot
*/
def viewScreen = {
File img = new File("myImage.png")
response.contentType = 'image/png'
if(params.thumbnail){
BufferedImage inputImage = ImageIO.read(img);
BufferedImage rescaledImage = new MultiStepRescaleOp(DimensionConstrain.createMaxDimension(355,500)).filter(inputImage, null);
def outputStream = new ByteArrayOutputStream()
ImageIO.write(rescaledImage, "png", outputStream);
response.outputStream << outputStream.toByteArray()
}else{
response.outputStream << img.bytes
}
}

jeudi 14 avril 2011

Firefox4 (Iceweasel4) sur Debian Squeeze

La méthode est simple il suffit de saisir les commandes suivantes sous root :


echo "deb http://mozilla.debian.net/ squeeze-backports iceweasel-4.0" > /etc/apt/sources.list.d/firefox.list

apt-get update

apt-get install iceweasel

Selenium JUnit4 et Maven

Voici un exemple de test Junit qui démarre un Serveur Selenium puis execute un ensemble de tests.

Je prefère ce type de configuration, plutôt que d'écrire 50 lignes de XML dans maven afin de lancer un serveur selenium : http://blog.xebia.fr/2011/02/18/automatiser-les-tests-selenium-avec-maven/

import com.thoughtworks.selenium.DefaultSelenium;
import org.junit.*;
import org.openqa.selenium.server.SeleniumServer;

import static org.junit.Assert.*;


public class DemoTest {

private static SeleniumServer server;
private DefaultSelenium selenium;

@BeforeClass
public static void startSeleniumServer() throws Exception {
System.out.println("START Selenium Server");
server = new SeleniumServer();
server.start();
}

@Before
public void fixture() {
selenium = new DefaultSelenium("localhost", 4444, "*firefox" , "http://google.fr/");
selenium.start();
}

@Test
public void testWhatYouWant() throws Exception {
...
}

@Test
public void testWhatYouWant2() throws Exception {
...
}

@After
public void tearDown() throws Exception {
selenium.stop();
}

@AfterClass
public static void stopSeleniumServer() throws Exception {
server.stop();
}
}



Voici mes dépendances maven :


<dependencies>
<dependency>
<groupid>junit</groupid>
<artifactid>junit</artifactid>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupid>org.seleniumhq.selenium</groupid>
<artifactid>selenium-server</artifactid>
<version>2.0b3</version>
</dependency>
<dependency>
<groupid>org.seleniumhq.selenium</groupid>
<artifactid>selenium-remote-control</artifactid>
<version>2.0b3</version>
</dependency>
</dependencies>

jeudi 24 mars 2011

Script SQL en Groovy

Voici un exemple de script Groovy se connectant sur une base de donnée MySQL avec Groovy Grape :


import org.springframework.jdbc.datasource.SimpleDriverDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import javax.sql.DataSource;

@GrabConfig(systemClassLoader=true)
@Grab(group='mysql', module='mysql-connector-java', version='5.1.6')
@Grab(group='org.springframework', module='spring-jdbc', version='3.0.5.RELEASE')


DataSource dataSource = new SimpleDriverDataSource(
Class.forName("com.mysql.jdbc.Driver").newInstance(),
"jdbc:mysql://localhost:3306/myDatabase",
"login",
"password");

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
println jdbcTemplate.queryForList( """SELECT 1;""" )


C'est très pratique pour debugguer les erreurs du type :

Caught: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 0 ms ago.
at test.run(test.groovy:19)

jeudi 10 mars 2011

Parcellite copier-coller : synchroniser la selection avec le presse papier

Dans linux il existe deux espaces pour faire des copier coller :
  - la selection du curseur pour copier et clique du miileu (ou Shift Inser) pour coller
  - et le presse papier : Ctrl + C pour copier et Ctrl + V pour coller

Mais si on se trouve sur un portable avec l'impossibilité de faire un clique du milieu pour coller la selection et l'impossibilité de faire un Ctrl + C pour copier on se retrouve bien coincé.

Le cas typique est celui de coller dans un navigateur web un selection faite sous xterm . Xterm ne permet pas de copier dans le presse papier, et google-chrome comme firefox ne colle pas le contenu de la selection lors d'un Shift - Inser.

La solution existe. Il suffit d'utiliser parcellite :

apt-get install parcellite


Ensuite il suffit simplement de configurer parcellite :

$ cat .config/parcellite/parcelliterc

[rc]
use_copy=true
use_primary=true
synchronize=true
save_history=true
history_limit=25
hyperlinks_only=false
confirm_clear=false
single_line=true
reverse_history=false
item_length=50
ellipsize=2
history_key=H
actions_key=A
menu_key=P




Puis de le lancer en tache de fond

parcellite &

Debian : Nodm pour lancer X avec autologin

Avec une Debian Squeeze, si l'on souhaite lancer une session X au démarrage sans saisir de mot de passe, soit on utilise un display manager (gdm, kdm, lxdm, ...) soit un utilise nodm.

Nodm ne demande rien, il demarre juste xinit au démarrage sous un utilisateur particilier.

Pour installer nodm :

apt-get install nodm


Et pour l'activer il faut éditer le fichier :

cat /etc/default/nodm


# nodm configuration

# Set NODM_ENABLED to something different than 'false' to enable nodm
NODM_ENABLED=true

# User to autologin for
NODM_USER=romain

# xinit program
NODM_XINIT=/usr/bin/xinit

# First vt to try when looking for free VTs
NODM_FIRST_VT=7

# X session
NODM_XSESSION=/etc/X11/Xsession

# Options for the X server
NODM_X_OPTIONS='vt7 -nolisten tcp'

# If an X session will run for less than this time in seconds, nodm will wait an
# increasing bit of time before restarting the session.
NODM_MIN_SESSION_TIME=60



Maintenant afin de lancer un window manager (par exemple wmfs), il faut editer le fichier : ~/.xsession

$ cat .xsession

#!/bin/sh
wmfs

lundi 7 mars 2011

Selenium Perl et Debian (ou Ubuntu)

Selenium IDE : http://seleniumhq.org/projects/ide/ permet de créer des scripts selenium et de les exporter sous différents langage : Java, C#, Groovy, Python, Ruby et Perl pour les sysadmins


Ce qui nous intéresse ici c'est d'utiliser perl!


Tout d'abord il faut installer les paquets suivant :

apt-get install perl libtest-exception-perl libtest-www-selenium-perl


Ensuite il faut créer un script selenium sous Selenium IDE et l'exporter au format Perl.

Voici un script selenium bidon exporté en Perl :

use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;

my $sel = Test::WWW::Selenium->new( host => "localhost",
port => 4444,
browser => "*chrome",
browser_url => "http://fr.yahoo.com/" );

$sel->open_ok("/");
$sel->click_ok("link=Jacques Chirac aux portes du tribunal pour un procès?");
$sel->wait_for_page_to_load_ok("30000");
$sel->click_ok("link=Villepin souhaite que Chirac soit jugé, s'oppose à un report");
$sel->wait_for_page_to_load_ok("30000");


Maintenant si on lance le script perl on obtient l'erreur suivante :

Error requesting http://localhost:4444/selenium-server/driver/?cmd=getNewBrowserSession&1=*chrome&2=http%3A%2F%2Ffr.yahoo.com%2F:
500 Can't connect to localhost:4444 (connect: Connexion refusée)
# Looks like your test died before it could output anything.
zsh: exit 255 perl perl.pl

Ce qui signifie qu'il n'y a pas de serveur selenium de lancé.


Pour lancer un serveur selenium, il y a plusieurs méthodes :

1 - On télécharge le jar de selenium-server et on le lancer en java

firefox http://seleniumhq.org/download/
java -jar selenium-server.jar


2 - Sinon, on exécute le script groovy suivant (Il s'occupe de télécharger et lancer Selenium Server)

import com.thoughtworks.selenium.*
import org.openqa.selenium.server.*

@Grab(group='org.seleniumhq.selenium.server', module='selenium-server', version='1.0.1')

def server = new SeleniumServer()
server.main(new String[0])
println("Started")