Libellés

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")

Plugin flash dans un profile firefox

Voici comment installer flash dans un profile firefox particulier :

1 - Creez un nouveau profile (Dans l'exemple ce sera ici : ~/Desktop/profile )

firefox -ProfileManager

2 -Telechargez flash (Archive .tar.gz) et décompressez là

http://www.adobe.com/fr/products/flashplayer/

3 - Dans votre profile créer le répertoire plugins

mkdir ~/Desktop/profile/plugins/

4 - Copier le plugin flash dans ce nouveau répertoire

cp ~/Downloads/libflashplayer.so ~/Desktop/profile/plugins/

5 - Lancer firefox avec ce profile :

firefox -profile ~/Desktop/profile


Si ceci ne marche pas chez vous, c'est que la version de flash n'est pas compatible avec votre distribution.

LoadPlugin: failed to initialize shared library libXt.so [libXt.so: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou répertoire de ce type]
LoadPlugin: failed to initialize shared library /home/romain/Desktop/profile/plugins/libflashplayer.so [/home/romain/Desktop/profile/plugins/libflashplayer.so: wrong ELF class: ELFCLASS32]


Il ne vous reste plus qu'a rechercher le bon libflashplayer.so et de le mettre dans le repertoire plugins de votre nouveau profile.

mardi 1 mars 2011

Sed 'match parenthesis' : ajouter une chaîne de caractère à en endroit précis

Sed permet de remplacer des chaines de caractères via une expression régulière.

Récemment je devais transformer cette commande SQL

INSERT INTO my_table VALUES (1,'blabal bla'),(2,'bloblo blo'),(3,'blibli bli')"

Par celle ci :

INSERT INTO my_table VALUES (1,'0','blabal bla'),(2,'0','bloblo blo'),(3,'0','blibli bli')


Pour y arriver j'ai utilisé sed, en mode rechercher remplacer sed "s/string-to-replace/new-string/g"

Mais en réalité je n'ai pas de besoin de remplacer une chaîne de caractère mais simplement d'insérer la chaîne suivante ",'0'" à un endroit précis.

Pour cela j'utilise les 'match parenthesis' (je ne sais pas si ça s'appelle vraiment comme ça).

Voici un exemple :

echo "tata, titi, tutu" | sed "s/,\(\w*\)/,'string inserted',\1/g"
tata,'string inserted', titi,'string inserted', tutu

A l'intérieur des parenthèses \( \) (Attention il faut les précédé d'un antislash) je choisi un chaîne particulière.
Ensuite dans la deuxième partie de mon sed je peut injecter cette chaine via \1.


Finalement voici ma commande :

sed "s/(\(\w*\),/(\1,'0',/g" myFile.sql


Et voici le test pour reproduire le cas chez soi:

echo "INSERT INTO my_table VALUES (1,'blabal bla'),(2,'bloblo blo'),(3,'blibli bli')" | sed "s/(\(\w*\),/(\1,'0',/g"
INSERT INTO my_table VALUES (1,'0','blabal bla'),(2,'0','bloblo blo'),(3,'0','blibli bli')

MySQL : créer une database et un user avec mot de passe

Je ne me souviens jamais de la commande qu'il faut tapper sous MySQL pour créer un nouvel utilisateur avec mot de passe et l'associer à une nouvelle database.


CREATE DATABASE mydatabase;
CREATE USER 'romain'@'localhost' IDENTIFIED BY 'mypassword';
GRANT ALL PRIVILEGES ON mydatabase.* TO 'romain'@'localhost' WITH GRANT OPTION;

Groovy : Détecter une URL dans une String, et la remplacer par un lien HTML

 En Groovy pour détecter une URL dans une String, et remplacer cette URL pour son equivalent HTML il suffit d'utiliser la method replaceAll(urlRegex, string).



String wrapUrlInAHTMLLink(String string){
    return string.replaceAll("\\b(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]""\$0")
}

assert(wrapUrlInAHTMLLink("Salut voici mon url : http://localhost:8443/test-url/tata?id=5&toto=10, tu l'as trouve comment ?")==
'''Salut voici mon url : http://localhost:8443/test-url/tata?id=5&toto=10, tu l'as trouve comment ?'''
)


Pour tester : http://groovyconsole.appspot.com/script/427002

Je pense que ça devrait également fonctionner en java (pas testé).