mercredi 21 décembre 2011

unix / linux : ajouter des users qui se connecte par ssh

Pour gérer simplement les users, la notion de groupe est essentielle. Avec openssh , il est simple de créer et d'ajouter des users pouvant se connecter par ssh.
Tout d'abord ajoutons l'option "AllowGroup" dans le fichier /etc/ssh/sshd_config ... AllowGroup sshlogin ... Puis, redémarrer le process : /etc/init.d/ssh restart
Pour cela, il faut créer un groupe "sshlogin" :

addgroup ssh login Puis on crer des users:
adduser toto On ajoute les users existants au groupe :
adduser toto sshlogin Les utilisateurs peuvent alors se connecter ... Des explications bien plus complètes sur ubuntu.fr

jeudi 3 novembre 2011

outils : astuces putty


Astuce 1 : Ne plus taper le votre user pour se connecter aux machines se connecter au bastion rajouter la ligne la ligne User www dans le fichier ~/.ssh/config on peut maintenant faire : ssh monserveur05 et plus ssh monUser@monserveur05 Astuce 2 : Utiliser le pavé numérique sous VI en utilisant Putty sous putty dans Terminal / Features cocher "Disable application keypad mode" Astuce 3 : Augmenter la taille du scroll de la fenêtre sous Putty sous putty dans Window mettre une nouvelle valeur dans le champs "Lines of scrollback" Attention à ne pas oublier de sauvegarder les options sous Putty!


mardi 13 septembre 2011

Web / http / https / IE : contenu mixte elements non securises

Si vous créer un site web, dotn le contenu est distribué en HTTPS. Ce dernier peut faire référence à des éléments non sécurisés tel que des image, ou le player Window Media Player ... De ce fait, sous IE, vous aurez à chaque ouverture de la page, une popup, vous demandant si vous souhaitez ou non afficher cette page qui contient des éléments non sécurisés (commençant par http ...) Voici un très bon lien traitant du sujet : Pour corrigez , cela :
  1. si cela est possible, vous pouvez passer ces ressources en https (ex : en
  2. si la ressource ne vous appartient pas ... alors il ne faut pas spécifier le protocole et mettre // (ex : en
  3. la dernière solution est de configurer IE pour qu'il accepte le contenu mixte (ds tools-security->custom level-> accept mixte content (je en suis plus sûr du libellé exact :-) )
Voici un exemple avec le player windows : A noter que les urls ont été modifiées pour être "relative" // en supprimant http ... ce qui supprime le warning sous IE remplacement de : http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer en //www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer Ce qui donne :

Chargement en cours...

web / html / javascript / flash player / video

Voici une petite librairie javascript fort utile nommée flowplayer , qui fonctionne avec jquery et permet d'encapsuler une player flash pour lire des videos / mp3 par exemple ... voici l'exemple de code tiré du site <!-- setup player container --> <div id="player" style="width:500px;height:300px"></div> <div id="info" class="box info"> You have Flash version 9.115 or above. Enjoy high quality video! </div> <!-- flowplayer configuration --> <script> // Flowplayer installation with Flashembed parameters
flowplayer("player", { // our Flash component
src: "/swf/flowplayer-3.2.7.swf", // we need at least this version
version: [9, 115], // older versions will see a custom message
onFail: function() { document.getElementById("info").innerHTML = "You need the latest Flash version to view MP4 movies. " + "Your version is " + this.getVersion() ; } // here is our third argument which is the Flowplayer configuration
}, { clip: "http://blip.tv/file/get/KimAronson-TwentySeconds6421.m4v" }); </script> </body> </html>

mardi 6 septembre 2011

j2ee : retourner du JSON simplement dans une servlet

Voici un exemple cours qui, montre comment retourner simplement du JSON avec une servlet et les lib adéquates : protected String returnJson(HttpServletRequest request, HttpServletResponse response, JSONObject json) { try { response.setContentType("application/json;charset=iso-8859-1"); PrintWriter writer = response.getWriter(); writer.write(json.toString()); writer.close(); return null; } catch (IOException e) { request.getParameterMap().put("json_response", json); return "/json_response.jsp"; } }

mercredi 31 août 2011

web : plugins de developpement JS / CSSsur IE 7

Voici, un lien permettant d'installer le plugin de developpement sous IE 7 (cette dernière étant intégré nativement dans les versions ultérieures

http://www.microsoft.com/download/en/details.aspx?id=18359

jquery : validation plugin

Voici un exemple d'utilisation de jquery validate plugin :


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script src="js/jquery-1.5.1.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script>
<style type="text/css">
* { font-family: Verdana; font-size: 96%; }
label { width: 10em; float: left; }
label.error { float: none; color: red; padding-left: .5em; vertical-align: top; }
p { clear: both; }
.submit { margin-left: 12em; }
em { font-weight: bold; padding-right: 1em; vertical-align: top; }
</style>
<script>
$(document).ready(function(){

$('#commentForm').validate( {
rules: {
comment : {
required: true,
email: true
},
comment2 : {
required: true,
url: true
}}
});
});
</script>

</head>
<body>


<form class="cmxform" id="commentForm" method="get" action="">
<fieldset>
<legend>A simple comment form with submit validation and default messages</legend>
<!-- <p>
<label for="cname">Name</label>
<em>*</em><input id="cname" name="name" size="25" class="required" minlength="20" />
</p>
<p>
<label for="cemail">E-Mail</label>
<em>*</em><input id="cemail" name="email" size="25" class="required email" />
</p>
<p>
<label for="curl">URL</label>
<em> </em><input id="curl" name="url" size="25" class="url" value="" />
</p>
<p>
<label for="ccomment">Your comment</label>
<em>*</em><textarea id="ccomment" name="comment" cols="22" class="required"></textarea>
</p>
<p> -->

<p>
<label for="ctest">Your comment</label>
<em>t*</em><input type="text" id="ctest" name="comment" cols="22" minlength="2" size="25" ></textarea>
</p>
<p>
<label for="ctest2">Your comment</label>
<em>t*</em><input type="text" id="ctest2" name="comment2" cols="22" minlength="2" size="25" ></textarea>
</p>
<input class="submit" type="submit" value="Submit"/>
</p>
</fieldset>
</form>
</body>
</html>

mardi 30 août 2011

java : reflexion / instantiation ./ construction

Voici comment créer une instance d'une classe interne via un constructeur quin'est pas celui par défaut.

A noter qu'il est nécessaire pour les classes interne de passer une instance de la classe englobante comme le montre l'exemple suivant :


package com.ldu.divers;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class Test {

public class UnDTO2 {
private String lastName = "";
private String firstName = "";
public UnDTO2(String lastName,String firstName) {
this.lastName = lastName;
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

Class c = UnDTO2.class;
Constructor [] cos = c.getDeclaredConstructors();
for (Constructor constructor : cos) {
System.err.println(constructor.toString());
}

try {
Constructor constr = c.getConstructor(Test.class, String.class,String.class);
UnDTO2 dto = constr.newInstance(new Test(), "monNom","Enwoo");

} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

jeudi 4 août 2011

Unix/Linux : comment savoir qu'un repertoire est un filer

Regulièrement, lors de l'écritur de script, je me demande si je peux pointer vers tel endroit ou non sur mon fileSystem, et aussi parfois entre 2 machines.

Un moyen simple de le savoir, et aussi de savoir si 2 répertoires différents montés sur 2 points montages différents correspondent à la même machine, et la commade mount.

$mount

/dev/sda1 on / type ext3 (rw)
none on /proc type proc (rw)
/dev/sda2 on /usr type ext3 (rw)
/dev/sda3 on /var type ext3 (rw)
/dev/sda4 on /tmp type ext3 (rw)
/dev/sda6 on /usr/local/MIDDLELOGS type ext3 (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw)
dmz-data45:/vol/vol5/stockage_system on /LOCAL/system type nfs (ro,nfsvers=3,addr=172.168.200.215)


Comme on peut le remarquer, le réperoire monter en "/LOCAL/system" est en fait une machine distante dont l'IP est 172.168.200.215, et le nom symbolique est dmz-data45, et le répertoire physique est /vol/vol5/stockage

Et voilà, je sait maintenant que je peut mutualiser des choses sur cette machine

vendredi 29 juillet 2011

mysql : faire un dump

il faut utiliser l'utilitaire mysqldump :


mysqldump --complete-insert --compact --add-drop-table --compatible=mysql40 -uMASTLogin -pmonLogin -hMonPassword maBDD >> monFichier.dump


Ensuite, il est nécessaire de l'importer :

/usr/bin/mysql -uMonLogin -pMonPassword -hMonServeur monSchema < monDump.dump

mercredi 20 juillet 2011

bash : copie de répertoires distants

Pour cela, on peut utiliser la commande scp avec l'option -r

Ce qui donne par exemple :
scp -r www@monHote:/usr/local/framework/lib .

Cet exemple effectue une copie recursive de l'ensemble du contenu du répertoire "/usr/local/framework/lib" sur la machine "monHote" vers le répertoire local courant

bash : faire un tar a partir d'une liste de fichiers

La commande tar permet de réaliser une archive de fichier à partir de la commande suivante :

Tout d'abord une commande utilse pour créer une liste de fichier, et j'insiste bien sur une liste de fichiers:


Dans l'exemple suivant, on exclut le répertoire "lib" :
find -type f | egrep -v "^\.\/lib\/" > ../liste.txt


Puis on lance la commande tar avec l'option -T qui prend une liste de fichiers ... (de fichiers en chemin absolu ou relatif):

tar -cvf ../monfichier.tar -T ../liste.txt

mardi 7 juin 2011

jquery : astuce ajax ...

Une méthode simple pour faire de jolie objets, et de l'ajax simplement :

tout d'abord une astuce sympa pour configurer tous les appels ajax avec une conf par defaut :

$.ajaxSetup({
type: 'POST'
url: 'test.php',
timeout: 3500
});



Une seconde façon, pour faire des appels ajax, via un objets :

var GALLERY = {
container: "#gallery",
url: "getImages",
delay: 5000,
load: function() {
// faire l'appel ajax
},
display: function(image_url) {
// traiter les donnees, et leur affichage

}
};



load: function() {
var _gallery = this;
$.ajax({
type:"get",
url: this.url,
success: function(data) {
var images = data.split('|');
$.each(images, function() {
_gallery.display(this);
});
}
});
}



display: function(image_url) {
$('')
.attr('src', 'images/' + data)
.hide()
.load(function() {
$(this).fadeIn();
})
.appendTo(this.container);
}



$(document).ready(function() {
GALLERY.load();
});

service Rest avec Spring MVC et jquery

Avec Spring 3.0, il est vraiment simple de faire des services RESTFull, voici, un exemple très simple de d'un controller spring qui propose 2 methodes :
La première par un GET permettant de recuperer une personne en JSON
et la seconde de sauver un tableau de personnes. Pour cette dernière, il faut noter l'utilisation d'un POST, et la recupération de l'objet par ResquestBody :

A noter, que JSON ne supporte que très peu de type (par exemple pas de liste, seulement des tableaux:


@Controller
public class MonServices {

@Resource(name = "Modele")
private Modele modele;

@RequestMapping(value = "**/{instance}/personne/{name}", method = RequestMethod.GET)
public @ResponseBody Personne getPersonne(HttpServletRequest request,
HttpServletResponse response, @PathVariable String instance,
@RequestParam(required = false) String httpCode,@PathVariable String name) {

setHTTPStatus(response, "200");
Personne p = new Personne("john",name);
System.out.println("JSON => " + p.toString());
return p;
}

@RequestMapping(value = "**/{instance}/personne/save", method = RequestMethod.POST)
public @ResponseBody Personne [] savePersonne(@RequestBody Personne [] p,HttpServletRequest request,
HttpServletResponse response) {
setHTTPStatus(response, "200");
for (Personne personne : p) {
personne.setFirstname("postOK" + personne.getName());
}
return p;
}
}


Voici le bean Personne, en java :

public class Personne extends ModeleBean{

public Personne() {
// TODO Auto-generated constructor stub
}

public Personne(String firstname, String name) {
this.name = name;
this.firstname = firstname;
}

/**
* @return the name
*/
public String getName() {
return name;
}

/**
* @param name
* the name to set
*/
public void setName(String name) {
this.name = name;
}

/**
* @return the firstname
*/
public String getFirstname() {
return firstname;
}

/**
* @param firstname
* the firstname to set
*/
public void setFirstname(String firstname) {
this.firstname = firstname;
}

private String name;
private String firstname;
}


Pour la parti javascript, je vous conseille JQuery, et les plugins jquery.postJSON :

Pour le GET:

$.getJSON('instance/personne/toto.smvc', function(data) {
var items = [];

$.each(data, function(key, val) {
items.push('>li id="' + key + '"<' + val + '>/li<');
});

$('>ul/<', {
html : items.join('')
}).appendTo('body');
});


Pour le POST:

function postData() {
var personnes = new Array();
personnes[0] = {
name : "duc",
firstname : "lolo"
};
personnes[1] = {
name : "duc",
firstname : "franck"
};

$.postJSON("instance/personne/save.smvc", personnes, function(data) {
var items = [];

$.each(data, function(key, val) {
items.push('>li id="' + key + '"<' + val + '>/li<');
});

$('>ul/<', {
html : items.join('')
}).appendTo('body');
});
return false;
}

lundi 30 mai 2011

web : test de sites avec plusieurs navigateurs IE

Parfois , il est nécessaire de tester des sites avec plusieurs navigateurs IE. il est difficile de faire cohabiter différentes vesions de IE.

Le site Utilu propose une installation tout en un des navigateurs IE 3->IE 8, et la même chose pour Firefox ...

Ceci fonctionne très bien , et très rapide à mettre en oeuvre. Une fois télécharger et installer, vous disposez d'un icone par version de IE, ce qui vous permet de tester rapidement votre site en plusieurs versions ...

C'est simple et efficace ...

vendredi 1 avril 2011

java J2EE : tapestry et Spring

Pour utiliser Spring et Tapestry sur le même projet, il est nécessaire d'utiliser une version de tapestry < 5.1.0.18 et d'utiliser les dépendances maven suivantes :

La prise en compte de la configuration Spring par tapestry se fait en utilisant un filter org.apache.tapestry5.spring.TapestrySpringFilter et pas org.apache.tapestry5.TapestryFilter.

Attention, il est nécessaire d'ajouter la dépendance maven tapestry-spring dans votre pom.xml, et il faut noter que les bean spring sont accessibles par l'annotation @inject de tapestry !!!

Ce dernier va remplacer le listener de contexte fournit par Spring.

Les paramètres de configuration sont les mêmes que ceux fournit pour Spring, en l'occurence :

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-front.xml</param-value>
</context-param>


et pour le web.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app

PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>portail Tapestry 5 Application</display-name>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:applicationContext-front.xml</param-value>
</context-param>
<context-param>
<!-- The only significant configuration for Tapestry 5, this informs Tapestry
of where to look for pages, components and mixins. -->
<param-name>tapestry.app-package</param-name>
<param-value>net.portail.web</param-value>
</context-param>

<filter>
<filter-name>app</filter-name>
<filter-class>org.apache.tapestry5.spring.TapestrySpringFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>app</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

lundi 28 mars 2011

Java / J2EE avec Spring (rappel)

Comme tu avais l’air intéressé par Spring , je te fais rapidement une synthèse des possibilités de Spring :

Spring est un container léger. Ceci signifie que tu n’as besoin que d’un Tomcat et des jars « Spring », et qu’il t’apporte des fonctionnalités d’un serveur d’application J2EE (jonas, jboss, etc … ), sans en utiliser un (ex : les transactions, JMS, gestion des objets, sécurité) .

Après si tu as besoin de toutes les fonctionnalités d’un serveur J2EE, il vaut peut-être mieux en utiliser un directement. De plus, J2EE 6 a largement simplifier son modèle de développement suite au critique de la communauté Spring (ejb 3.0, JSF 2.0,etc … ).

Ce dernier est composé de nombreux modules que tu peux intégrer ou non selon tes besoins.

• La grande force de Spring est qu’il est basé sur le POJOs, et de ce fait, il ne contraint pas ton implémentation ( on ne doit pas hériter d’une classe particulière ou implémenter une interface) et peut-être mis en place après coup. La mise en place est simple sur une nouvelle application, et le ticket d’entrée faible.

• Il favorise l’intégration de technologie existante, et ne réinvente pas la roue. C'est-à-dire que qu’il n’essaye pas de concurrencer des Framework reconnus (comme hibernate, activeMQ, etc … ), mais propose des « ponts » pour les intègrer (ex : pour la persistance, il y a un pont vers hibernate, TopLink , JMS, etc …).

• Il fournit un plugin Eclipse qui facilite l’écriture des fichiers XML (Spring IDE).

• Spring adresse l’ensemble des problématiques du développement WEB.
En détails :
1. Gestion du cycle de vie des objets et injection de dépendances (via Spring Core)
a. Ceci permet de substituer facilement une implémentation par une autre (ex : pour les tests, ou pour faire évoluer ton application).
2. Les couches WEB sur une modèle MVC et la création de endpoint REST / JSON (via Spring MVC)
a. Création simple de contrôleur MVC et de vue JSP, two-way binding, validation , et production simple de endpoint REST délivrant du XML/JSON, ou basé sur REST.
3. la sécurité de l’application par JDBC,SSO, LDAP (via Spring Security)
a. Sécuriser simplement une application par un filtre HTTP
4. la couche d’accès à la persistance et gestion des transactions (Spring ORM)
a. Permet de gérer les transactions simplement par annotation, foun
5. exposition des services (via JMX, RMI, JMS, etc …)
a. permet simplement de transformer une « classe normale » en classe appelable via RMI, JMX, Web-Service, etc …)
6. les tests unitaires (via Spring-test)
7. la programmation par aspect (Spring-AOP)
8. plein d’autres modules (Spring batch, etc …)

unix / linux : shell find avec xargs

Voici une astuce lorsque le grep n'est plus possible ... et que grep vous dit :

arg list too long

find . -name "*ClientSession*" | xargs grep 888413

mercredi 16 mars 2011

Seleinium : petit exemple avec du XPATH

Voici un exemple de script qui s'utilise sur Mantis :


package com.example.tests;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import com.thoughtworks.selenium.DefaultSelenium;
import com.thoughtworks.selenium.Selenium;

public class MantisSearch {

/**
* @param args
*/
public static void main(String[] args) {
String chaineARechercher = "";
if (args.length == 1 && !"".equals(args[0])) {
chaineARechercher = args[0];
} else {
System.err.println("Usage : \n");
System.err.println(MantisSearch.class.getSimpleName()
+ " chaineAChercher \n");
System.err.println("Example : \n");
System.err
.println(MantisSearch.class.getSimpleName()
+ " \"at net.mm.ccm.server.DefaultServer.systemFailure (line 1019)\" \n");
System.exit(-1);
}

Selenium selenium = new DefaultSelenium("localhost", 4444, "*chrome",
"http://tracker.com/");
selenium.start();
selenium.open("/login_page.php");
selenium.type("username", "guest");
selenium.type("password", "guest");
selenium.click("//input[@value='Ouvrir la session']");
selenium.waitForPageToLoad("30000");
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("30000");
selenium.type("search", chaineARechercher);
selenium.click("filter");
selenium.waitForPageToLoad("30000");

// si au moins une reponse
StringBuilder builder = new StringBuilder();
int index = 4;
while (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]")) {
if (selenium.isElementPresent("//table[@id='buglist']/tbody/tr["
+ index + "]/td[4]")) {
String link = selenium
.getText("//table[@id='buglist']/tbody/tr[" + index
+ "]/td[4]");
// System.err.println("click sur le lien " + link);

if (selenium.isElementPresent("link=" + link)) {
selenium.click("link=" + link);
selenium.waitForPageToLoad("5000");
index++;
String resultat = selenium.getBodyText();
if (resultat.indexOf(chaineARechercher) != -1) {
builder.append("######################################################"+"\n");
builder.append("Mantis possible : " + link +"\n");
builder.append(resultat+"\n");
builder.append("######################################################"+"\n");
}
selenium.click("link=Afficher les bogues");
selenium.waitForPageToLoad("5000");
} else {
System.err.println("element non trouve link=" + link);
}
}
else
{
// il n'y plus de resultat
// on sort
break;
}
}

try {
FileWriter file = new FileWriter("mantisTrouvees.txt");
file.write(builder.toString());
file.flush();
file.close();
} catch (IOException e) {
e.printStackTrace();
}

System.out.println(builder.toString());

selenium.click("link=Fermer la session");
selenium.waitForPageToLoad("30000");
selenium.stop();

}

}

javascript : ajax exemple

Un très bon site traitant du sujet

Voici un petit exemple Ajax :

Tout d'abord un exemple synchrone :


var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("GET", location.href, false);
xhr_object.send(null);
if(xhr_object.readyState == 4) alert("Requête effectuée !");



Puis , un exemple asynchrone :


var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("GET", "uneJsp.jsp", true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) alert(xhr_object.responseText);
}

xhr_object.send(null);



Un exemple complet avec un POST :


var l1 = f.elements["list1"];
var l2 = f.elements["list2"];
var index = l1.selectedIndex;
if(index < 1)
l2.options.length = 0;
else {
var xhr_object = null;

if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

xhr_object.open("POST", "species.php", true);

xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4)
eval(xhr_object.responseText);
}

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "family="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
xhr_object.send(data);
}




Une troisième façon de faire, mais qui ne me semble pas être de l'ajax car elle rafraichi tout la page :

Voici la page complète :


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
<script type="text/javascript">
function updateData()
{
var dt = new Date();
window.status = dt.getSeconds();
}

function timer()
{
var value = 1000;
if(value > 0)
{
//window.setTimeout(function() {var dt = new Date();window.status = dt.getSeconds();},2000);
var date = new Date();
var e = window.document.getElementById("date");
e.innerHTML = date.getSeconds();
window.setTimeout('document.location=document.location',2000);
}
else
{
alert("erreur de saisie");
}

}

</script>
<title>test refresh</title>
</head>
<body onload="timer()">
<h1 id="date">pas de date</h1>
</body >
</html>

vendredi 11 mars 2011

jeudi 10 mars 2011

unix /linux : la commande diff et la commande patch

un très bon site ici

Voici les 2 commandes à connaitre pour appliquer automatiquement les différences détectées par la commande diff:

Supposons que nous ayons 2 fichiers nommés version1 et version2 en 2 versions différentes :

Tout d'abord, effectuons, un diff que nous redirigeons vers un fichier de patch nommé pdate1to2.patch :
$ diff -u version1 version2 > update1to2.patch

Ensuite, il faut appliquer la commande patch
patch -p0 < update1to2.patch

A noter : L'argument -p{nb} indique de tronquer x répertoires dans les noms de fichiers affectés par le patch. Cela peut-être pratique quand un patch s'applique à une aborescence qui n'est pas la même que la votre.

A noter diff -r pour 2 répertoires
diff -r repertoire1 repertoire1

mysql : se connecter au shell SQL

Voici, un rappel des commande à lancer pour se connecter à un shell mysql :

mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"
Server version: 5.0.56_AWL-Enterprise-log Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>connect maBDD
select * from Client;


Comment demarrer une transaction (BEGIN pourt mysql <= 4.1 ou sinon START TRANSACTION)
mysql>START TRANSACTION;
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 1000;
...
mysql>ROOLBACK;
...
mysql>UPDATE Client SET PROFILE='GOLD' WHERE TOTAL >= 3000;
...
mysql>commit;


la transaction est svalidé par le mot clé COMMIT ou invalidé par ROLLBACK

A noter : lors d'une commande insert, update ou delete, il est possible de connaître le nombre de colonne impactées avec la requête suivante :
select ROW_COUNT();

Voici une commande pour lancer un script SQL :
mysql>source monFichier.sql

Ou une seconde commande (qui correspond à la commande source mais en mode "court")
mysql>\. monFichier.sql


Lancer une commande directement (dasn un sh par exemple) :
mysql -hmaMachineHote -P3306 -umonUser -pmonMotDePasse -e "SELECT * FROM Client"

mysql : lancer des commandes SQL via un script ksh

Voici un exemple simple de script ksh, qui se connecte a une BDD et lance des commandes :

Tout d'abord, il suffit de lancer un shell myqsl via la commande suivante :

A noter que les argument sont "collés" au options, et l'option -e pour lancer une commande sql.


$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt


Voici; l'exemple complet ...

#!/bin/ksh
set -x
echo "Debut de ${0}"

#------------------------------------------------------------
# VALIDATION ET RECUPERATION DES PARAMETRES
#------------------------------------------------------------
NB_PARAM=5

if [ $# -ne $NB_PARAM ]
then
echo "Nombre de paramètre incorrect"
echo
echo "USAGE : "
echo "${0} NomBase User PWD nomFileARenommer nomNouvelleFile"
exit 0
fi

# ------------------------------------------------------------------
# Chargement du profile
# ------------------------------------------------------------------

echo "Chargement du profile"

. /etc/conf/ini_trt_mysql.ksh

BASE=$1
USER=$2
PWD=$3
NOM_ORIGINE=$4
NOM_NOUVEAU=$5

REQUETE_NEW="use $BASE;SELECT * FROM client WHERE name='${NOM_NOUVEAU}'"
REQUETE_SAV="use $BASE;SELECT * FROM client WHERE name='${NOM_ORIGINE}'"
REQUETE_UPDATE="use $BASE;UPDATE client SET NAME='${NOM_NOUVEAU}' WHERE NAME='${NOM_ORIGINE}'"
echo "BASE = " $1
echo "USER = " $2
echo "PWD = " $3

# ------------------------------------------------------------------
# Lancement de la requête
# ------------------------------------------------------------------
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_SAV" > sauvegardeDonnees.txt
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_UPDATE"
$MYSQL -h$MYSQL_SERVEUR -P3306 -u$USER -p$PWD -e "$REQUETE_NEW" > nouvelleDonnees.txt
diff sauvegardeDonnees.txt nouvelleDonnees.txt

# ------------------------------------------------------------------
# Fin du traitement
# ------------------------------------------------------------------

echo "Fin de ${0}"

lundi 7 mars 2011

unix / linux : charger simplement des variables d'environnements

Une syntaxe simple permet de charger des variables ou d'exécuter un script de "contexte", il s'agit de :


echo "chargement du contexte"
. /home/enwoo/monScriptDeContexte.sh
echo "démarrage du script"


Cette simple commande lancera le premier script et permettra par exemple de positionner des variables d'environnements nécessaires aux commandes suivantes ...

unix / linux : find multiple commande exec

Voici, comment exécuter plusieurs commande dans le même find ... C'est tout simple et parfois très pratique ...


find . \( -name "*.*" \) -type f -exec grep -i 'style=' {} \; -exec grep -i '<STYLE>' {} \; -print > allStyle.txt


A noter, qu'il existe une syntaxe alternative avec des + pour la séparation

vendredi 25 février 2011

J2EE : recupérer des informations sur la mémoire JVM

Il arrive fréquemment d'avoir bsoin d'information sur la consommation mémoire de'une application, pour cela, il existe des moyen simple de récupérer ces infos, en les incluant dans une servlet ou une page jsp.

Voici, ce que fournit la classe Runtime :


long freeMemory = Runtime.getRuntime().freeMemory() ;
long maxMemory = Runtime.getRuntime().maxMemory() ;
long totalMemory = Runtime.getRuntime().totalMemory() ;
long usedMemory = totalMemory - freeMemory ;
double ratio = ( ( (double)usedMemory / (double)maxMemory ) * 100 ) ;


Après il est simple d'utilser CURL ou WGET pour interroger régulièrement ces pages, ou de faire un thread directement dans la pages jsp ou la servlet.

mardi 22 février 2011

J2EE : transformer du XML en une chaine

Tout d'abord, il faut initialiser un transformer et mettre l'option OMIT_XML_DECLARATION pour éviter la déclaration du XML :


tf = TransformerFactory.newInstance();
try {
c = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException e1) {
logger.error("Erreur de configuration du builder XML", e1);
}
try {
transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
"yes");
} catch (TransformerConfigurationException e) {
logger.error("Erreur d'instantiation du transformer XML", e);
}


Et ensuite la transformation :


String htmlResult;
tf = TransformerFactory.newInstance();
DOMSource domSource = new DOMSource(d);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(domSource, result);
htmlResult = writer.toString();



Voici l'exemple complet :

package com.generic.description;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import com.generic.description.mapping.Element;
import com.generic.description.mapping.FieldDes;
import com.generic.front.Init;
import com.generic.link.LinkManager;
import com.generic.project.Project;
import com.generic.project.ProjectManager;
import com.generic.user.User;
import com.generic.util.ReloadablePropertyResourceBundle;

public class PostTraitementHelper {

private static PostTraitementHelper instance = null;

private static final Logger logger = Logger.getLogger(ProjectLoader.class);

private String directory = "";

private HashMap methodCache = new HashMap();

private TransformerFactory tf;

private Transformer transformer;

private DocumentBuilder c;

static {
// initialisation
ResourceBundle rb = ReloadablePropertyResourceBundle
.getResourceBundle(Init.PROP_GENERAL);
String dir = rb.getString(ProjectManager.PROPERTIES_SPECIFIQUES_DIR);
instance = new PostTraitementHelper();
instance.setDirectory(dir);
instance.initActionMap();
}

public static final String NONE = "none";
public static final String POSTTRAITEMENT_PROPERTIES = "posttraitement.properties";

private Map actionMap = new HashMap();
private long lastModification = 0L;

private PostTraitementHelper() {
super();

tf = TransformerFactory.newInstance();
try {
c = DocumentBuilderFactory.newInstance().newDocumentBuilder();
} catch (ParserConfigurationException e1) {
logger.error("Erreur de configuration du builder XML", e1);
}
try {
transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
"yes");
} catch (TransformerConfigurationException e) {
logger.error("Erreur d'instantiation du transformer XML", e);
}
}

public static PostTraitementHelper getInstance() {
return instance.initActionMap();
}

@SuppressWarnings("unchecked")
public synchronized PostTraitementHelper initActionMap() {
Date debut = new Date();

if (directory == null && "".equals(directory)) {
throw new IllegalArgumentException(String.format(
"l'argument [%s] est invalide", directory));
}

String pathFile = directory + "/"
+ PostTraitementHelper.POSTTRAITEMENT_PROPERTIES;

File f = null;
FileReader r = null;
try {
f = new File(pathFile);

if (f.exists() && f.canRead()) {
if (f.lastModified() > lastModification) {
// le fichier a changé et doit etre relu
lastModification = f.lastModified();

r = new FileReader(f);
Properties properties = new Properties();

if (logger.isDebugEnabled()) {
logger
.debug(String
.format(
"valeur de config du fichier [%s] sous forme [key]=[value]",
POSTTRAITEMENT_PROPERTIES));
}

try {
// lecture des cle
properties.load(r);

// nettoyage
this.actionMap.clear();
this.methodCache.clear();

// ajout du cas par defaut
this.actionMap.put(NONE, NONE);

// iteration et traitement de chaque cle
Enumeration keys = properties.keys();

while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = properties.getProperty(key, NONE);

if (!this.actionMap.containsKey(key)) {

try {
if (logger.isDebugEnabled()) {
logger.debug(String.format(
"[%s]=[%s] \n", key, value));
}
this.actionMap.put(key, value);
getActionMethod(key);
} catch (SecurityException e) {
logger.error(
"erreur lors de la reflection", e);
this.actionMap.remove(key);
} catch (NoSuchMethodException e) {
logger.error(
"erreur lors de la reflection", e);
this.actionMap.remove(key);
}
} else {
logger
.warn(String
.format(
"the following key [%s] exists in conf file [%s]",
key,
POSTTRAITEMENT_PROPERTIES));
}
}

} catch (IOException e) {
logger.error("I/O ERROR", e);
}
}
} else {
logger
.error(String
.format(
"Le fichier [%s] n'a pas les droits de lecture, les posts-traitements sont inutilisables",
POSTTRAITEMENT_PROPERTIES));
}

} catch (FileNotFoundException e1) {
logger.error("fichier introuvable", e1);
} finally {
if (logger.isDebugEnabled()) {
Date fin = new Date();
logger.debug(String.format(
"temps pour la lecture du fichier [%d] ms", fin
.getTime()
- debut.getTime()));
}

if (r != null) {
try {
r.close();
} catch (IOException e) {
logger.error("Echec de la fermeture du fichier", e);
}
}
}

return instance;
}

public Collection getActionList() {
return Collections.unmodifiableCollection(this.actionMap.values());
}

public Collection getChampsPostTraite() {
return Collections.unmodifiableCollection(this.actionMap.keySet());
}

public boolean isPostTraite(final String idChamp) {
if (actionMap.containsKey(idChamp)) {
return true;
} else {
return false;
}
}

/**
* methode pour le hmtl
* @param idChamp
* @return
*/
public String isPostTraiteToStr(final String idChamp) {
return isPostTraite(idChamp) == true ? "true" : "false";
}

public String getAction(String methodName) {
if (actionMap.containsKey(methodName)) {
return actionMap.get(methodName);
} else {
return NONE;
}
}

public void setDirectory(String directory) {
this.directory = directory;
}

public String getDirectory() {
return directory;
}

/**
* permets de retrouver une methode a invoquer, et declarer dans le fichier postraitement.properties
* @param fieldId est la cle a rechercher
* @return une methode a invoquer
* @throws SecurityException si une erreur se produit
* @throws NoSuchMethodException si une erreur se produit
*/
private synchronized Method getActionMethod(final String fieldId)
throws SecurityException, NoSuchMethodException {
Method m = null;
String nomMethod = getAction(fieldId);

if (!methodCache.containsKey(nomMethod)) {
// si pas dans le chache, on la cherche, et on l'ajoute
Class c = PostTraitementHelper.class;
m = c.getDeclaredMethod(nomMethod, Object[].class);
methodCache.put(nomMethod, m);
} else {
m = methodCache.get(nomMethod);
}

return m;
}

/**
* methode permettant l'invocation du methode par reflexion
* @param fieldId ID du champ HMTL
* @param params listes des parametres necessaires à l'application de la regle metier
* @return l'objet calcule a partir de la regle d'affichage
*/
public Object invokeActionMethod(final String fieldId, Object... params) {
Method m = null;
Object result = null;

try {
m = getActionMethod(fieldId);
result = m.invoke(this, new Object[] { params });

} catch (SecurityException e) {
logger.error("Reflection ERROR", e);
} catch (NoSuchMethodException e) {
logger.error("Reflection ERROR", e);
} catch (IllegalArgumentException e) {
logger.error("Reflection ERROR", e);
} catch (IllegalAccessException e) {
logger.error("Reflection ERROR", e);
} catch (InvocationTargetException e) {
logger.error("Reflection ERROR", e);
}
return result;
}

public FieldDes affichageCRAM(Object[] params) {
// recupe des params
Object o = params[0];
FieldDes fieldToChange = null;

if (o instanceof FieldDes) {
fieldToChange = (FieldDes) o;
}

// pas de cast c'est une interface
User u = (User) params[1];

o = params[2];
Project p = null;
if (o instanceof Project) {
p = (Project) o;
}

if (!LinkManager.isAdmin(p, u)) {
// le champ sdoit etre post traite et l'utilisateur n'est pas un
// profil admin
String login = u.getLogin();

Element[] elts = fieldToChange.getElement();

for (Element element : elts) {
if (element.getValue().equals(login)
|| element.getKey().equals(login)) {
Element[] newElts = new Element[1];
newElts[0] = element;
fieldToChange.setElement(newElts);
break;
}
}
}

return fieldToChange;
}

public String affichageCRAMParUser(Object[] params) {
// recupe des params
Object o = params[0];
String html = "";
String htmlResult = "";

if (o instanceof String) {
html = (String) o;
htmlResult = html;
}

// pas de cast c'est une interface
User u = (User) params[1];

o = params[2];
Project p = null;
if (o instanceof Project) {
p = (Project) o;
}

o = params[3];
String tagName = "*";
if (o instanceof String) {
tagName = (String) o;
}

o = params[4];
String idValue = "";
if (o instanceof String) {
idValue = (String) o;
}

if (!LinkManager.isAdmin(p, u)) {
// le champ sdoit etre post traite et l'utilisateur n'est pas un
// profil admin
String login = u.getLogin();

try {
htmlResult = parseXML(tagName, idValue, login, html);
} catch (TransformerException e) {
logger.error("erreur lors de la transformation XML", e);
} catch (ParserConfigurationException e) {
logger.error("erreur lors parsing XML", e);
} catch (SAXException e) {
logger.error("erreur SAX lors du parsing XML", e);
} catch (IOException e) {
logger.error("erreur I/O lors du parsing XML", e);
}
}
else
{
if(logger.isDebugEnabled())
{
logger.debug("cas d'un user admin, donc pas de modification de la liste d'option");
}
}

return htmlResult;
}

public String parseXML(final String tagName, final String idValue,
final String optionAGarder, final String html)
throws TransformerException, ParserConfigurationException,
SAXException, IOException {

String htmlResult = html;

List aSupprimer = new ArrayList();

Document d = c.parse(new InputSource(new StringReader(html)));
NodeList selects = d.getElementsByTagName(tagName);
boolean found = false;
Node select = null;

// si on a trouve au moins un selec avec id qui matche, on sort
for (int i = 0; i < selects.getLength() && found != true; i++) {
select = selects.item(i);
// on recherche un tag de type tagName et contentant un attribut id
// avec la valeur idValue
NamedNodeMap atts = select.getAttributes();
Node att = atts.getNamedItem("id");

if (att.getNodeValue().equals(idValue)) {
// un noeud a ete trouve
NodeList options = select.getChildNodes();
for (int j = 0; j < options.getLength(); j++) {
Node option = options.item(j);
NamedNodeMap child = option.getAttributes();
Node attChild = child.getNamedItem("value");

String valeur = attChild.getNodeValue();

if (valeur != null
&& !valeur.equalsIgnoreCase(optionAGarder)) {
aSupprimer.add(option);
} else {
if (option instanceof org.w3c.dom.Element) {
if(logger.isDebugEnabled())
{
logger.debug("OPTION trouvee = " + valeur);
}
org.w3c.dom.Element e = (org.w3c.dom.Element) option;
e.setAttribute("selected", "selected");
/*
* on considere que c'est bon si et on a trouve
* un noeud select, et avec id correspondant et
* une option qui correspond au login sinon, on
* renvoie tout
*/
found = true;
}
}
}
}
}

if (found && !aSupprimer.isEmpty()) {
// si on a trouve et qu'il y a des option a supprimer
nettoyageDOM(aSupprimer, select);
// on regenere la chaine
htmlResult = xml2String(d);
}
else
{
if(logger.isDebugEnabled())
{
logger.debug("OPTION non trouvee pour l'id = [" + idValue + "] et la valeur = [" + optionAGarder + "]");
}
}

return htmlResult;
}

private String xml2String(Document d)
throws TransformerFactoryConfigurationError,
TransformerConfigurationException, TransformerException {
String htmlResult;
tf = TransformerFactory.newInstance();
DOMSource domSource = new DOMSource(d);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(writer);
transformer.transform(domSource, result);
htmlResult = writer.toString();
return htmlResult;
}

private void nettoyageDOM(List aSupprimer, Node select) {
for (Node supp : aSupprimer) {
select.removeChild(supp);
}
}

}

mercredi 16 février 2011

java EE : jstl méthode pour récupérer des variables JSTL en scriptlet

La chose important à noter, n'est pas que ce n'est ni très jolie, ni recommandé d'utiliser les scriplets.

La chose intéressantes est de récupérer une varaible JSTL dans le scriptlet pour pouvoir appeler une méthode JAVA :

<c:set var="fieldId" value="${field.id}"/>

et une récupération par la scriptlet qui va bien :
Object id = pageContext.getAttribute("fieldId");

Voici, l'exemple complet :

<td>
<select name="<c:out value="${field.id}"/>FIELD_POSTTRAITEMENT" onChange="javascript:submitRefresh();">
<c:set var="fieldId" value="${field.id}"/>
<c:set var="fieldPostTraitement" value="${field.postTraitement}"/>
<%
Object id = pageContext.getAttribute("fieldId");
Object postTr = pageContext.getAttribute("fieldPostTraitement");
boolean isPostTraite = com.generic.description.PostTraitementHelper.getInstance().isPostTraite((String) id);

if(isPostTraite==false){%>
<option

value="<c:out value="<%= com.generic.description.PostTraitementHelper.NONE %>"/>"><c:out

value="<%= com.generic.description.PostTraitementHelper.NONE %>" />
</option>
<%}else{%>
<c:forEach var="action" items="${NEW_PROJECT.actionList}">
<option value="<c:out value="${action}"/>"
<%
Object act = pageContext.getAttribute("action");
if(postTr.equals((String)act)){
%>
selected
<%}%>
><c:out value="${action}" /></option>
</c:forEach>
<%}%>
</select>
</td>

dimanche 13 février 2011

Java / J2EE : Créer simplement un projet tapestry

IL suffit d'utiliser l'archetype maven et lancer la commande suivante :

mvn -DarchetypeVersion=5.2.4 -Darchetype.interactive=false -DgroupId=com.enwoo -DarchetypeArtifactId=quickstart -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=org.apache.tapestry -Dpackage=com.enwoo.followMe -DartifactId=followMe --batch-mode -DarchetypeRepository=http://tapestry.apache.org archetype:generate

lundi 7 février 2011

windows / svn : enregistrer svn comme un service

Voici comment enregistrer svn comme un service. Ceci permettra qu'il soit démarré dès que le PC fonctionne, et que vos petits camarades puissent l'utiliser :

Tout d'abord, il faut installer un SVN (en l'occurence silkSVN), et créer un repository (le mien se trouve dans D:\repoSVN\monProjet").

Tout d'abord, il faut enregistre le service avec la commande sc sous DOS :

sc create SvnServer binPath= "svnserve --service -r D:\ --log-file=D:\logSVN.txt" type= own start= auto

A noter:
Il faut scpécifier l'option --service pour svnserve. Les autres options servent à spécifier un fichier de log, et à préciser ou se trouve le root directory des repo SVN.

Attention, les chemin avec espace nécessite d'être encadré par des double-quotes, et les options nécessitent de passer un espace (bizarre ... ) ex : type= own

Puis, le démarrer en ligne de commande, ou via l'interface de gestion des services:
sc start SvnServer

Pour l'arrêter :
sc stop SvnServer

Pour le supprimer :
sc delete SvnServer

Ensuite, si le service est démarré , on peut tester avec tortoiseSVN (et le rep browser)ou autre par exemple :

svn co svn://localhost/repoSVN/monProjet D:\sources

unix / linux : synchroniser des arborescence de fichiers simplement

Il exsite un moyen simple de synchroniser des arborescences de fichiers / répertoire soit en local, mais plutôt avec un serveur distant :

Pour cela, sous cygwin et un serveur cible et un répertoire cible de destination avec des droits adéquats, vous pouvez utiliser la commande rsync :

Pour synchroniser un répertoire local->local
rsync -a /cygdrive/c/repSource /cygdrive/d/repDest

Pour synchroniser un répertoire distant (et faire les suppressions si besoin). On crée donc simplement un répertoire mirroir, et l'option delte-after permet de supprimer les fichiers supprimés de la source

rsync -av --delete-after ../WebContent/ enwoo@monServeurCible:/DATA/tmp/monMirroir

Attention, il faut un accès ssh. En effet, ce dernier est le protocole utilisé par défaut par rsync.

ici, un très bonne article sur ubuntu.fr

PS: attention pour les arbo CVS ou SVN, je conseille de faire un export, ce qui supprime l'ensemble des fichiers .svn ou .cvs ...

unix / linux : afficher la taille d'un répertoire

une simple commande toujours utile de s'en rappelr :

du -sh monRepertoire

windows : outils sympa deblouer / killer /tuer process

Voici un petit outil fort pratique pour trouver quel est le processus qui locke une ressources (ficher, etc...).

De plus se lie avec l'explorateur de fichier sous windows.

Il s'agit de unlocker

mercredi 2 février 2011

bash : script de redémarrage d'environnement

Voici, un script très simple qui permet de rechercher des chaines et si elle matche, ce dernier lance une commande.

Voici le code :

#!/bin/bash
#set -x

TOMCAT_PATH='/home/serverMiddle/@ENV@/tomcat1/logs/ccm'
ENVS=`cat /etc/motd`

for ENV in $ENVS
do
if [[ ("$ENV" == *wacd* && ( "$ENV" == *cgss* || "$ENV" == *cnav* || "$ENV" == *cram* )) ]]
then
#echo "chaine acceptee = [$ENV]"
stop_service $ENV";
sleep 5;
start_service $ENV";
sleep 5;
fi
done


Voici un exemple plus complet qui lit les fihcier de log et attend de trouver une chaine particuliere


#!/bin/bash
TOMCAT_PATH='/MIDDLE/cnav/ENV/tomcat1/logs'
ENVS=`cat /etc/motd`
NOM_FIC="`date +"%Y.%m.%d"`_SERVER.log"

DETECTION_ACD_STARTED="FIN APPEL SERVICE accesFileCounterrs"
DETECTION_TOMCAT_STARTED="FIN APPEL SERVICE accesFileCounterrs"

function isTomcatStarted()
{
TOMCAT_LOG_DIR=`echo "$1/stdout.log" | sed -e "s@ENV@$2@g"`

if [ -e "$TOMCAT_LOG_DIR" ]
then
while read line; do
case "$line" in
*"Ajp13Processor"*)
echo "Le server Tomcat [$2] est demarre => [$line]"
return 0;
break
;;
*)
;;
esac
done < $TOMCAT_LOG_DIR
else
echo "fichier [$TOMCAT_LOG_DIR] est introuvable"
fi

# cas erreur
return 1;
}

function isACDStarted()
{
WACD_LOG_DIR=`echo "$1/ccm/$NOM_FIC" | sed -e "s@ENV@$2@g"`

if [ -e "$WACD_LOG_DIR" ]
then
while read line; do
case "$line" in
*"Started"*)
echo "L'ACD [$2] est demarre => [$line]"
return 0;
break
;;
*)
;;
esac
done < $WACD_LOG_DIR
else
echo "fichier [$WACD_LOG_DIR] est introuvable"
fi
# cas erreur
return 1;
}

function AR()
{
echo "stop_service $ENV";
sleep 2
echo "start_service $ENV";
isACDStarted $TOMCAT_PATH $ENV
isACDOK=$?
isTomcatStarted $TOMCAT_PATH $ENV
isTomcatOK=$?

if [[ ("$isACDOK" -eq 1 || "$isTomcatStarted" -eq 1) ]]
then
echo "erreur lors du demarrage"
echo "isACDOK =[$isACDOK]"
echo "isTomcatOK=[$isTomcatOK]"
fi
}

for ENV in $ENVS
do
if [[ ("$ENV" == *wacd* && ( "$ENV" == *cgss* || "$ENV" == *cnav* || "$ENV" == *cram* )) ]]
then
AR $ENV
if [ "$?" -eq 0 ]
then
echo "isStarted OK"
else
echo "isStarted KO"
fi
fi
done

vendredi 28 janvier 2011

java EE : jsp prévenir le cache des jps par un proxy

Voici, les paramètres à ajouter dans la réponse jsp ... pour éviter qu'un proxy ne cache votre jsp.


<%
response.setHeader("Cache-Control","no-cache"); //HTTP 1.1
response.setHeader("Pragma","no-cache"); //HTTP 1.0
response.setDateHeader ("Expires", 0); //prevent caching at the proxy server
%>


Pour une servlet :


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
response.setDateHeader ("Expires", 0);

}

mardi 25 janvier 2011

Unix/linux commandes vi

Ces commandes sont utilisables en ligne de commande Unix/Linux et pas seulement sous VI.

Edition de texte

* i --> Insert le texte avant le caractère Sélectionné

* a --> Append – Ajoute du texte après le caractère sélectionné

* A --> Append – Ajoute du texte en fin de phrase

* o --> Ajoute une ligne après et passe en mode saisie

* O --> Ajoute une ligne avant et passe en mode saisie

* u --> Undo de la dernière modification

* U --> Undo de la ligne

* J --> Concatène la ligne suivante avec la ligne en cours


Manipulation de texte

* r --> Remplace un caractère (et reste en mode commande)

* R --> Remplace plusieurs caractères (et reste en mode Saisie)

* cw --> Change Word – Remplace le mot courant (jusqu’au $)

* : %s/toto/titi/g --> Remplace dans le fichier toutes les occurrences de toto par titi (g signifie qu’il faut remplacer les multiples occurrences sur la même ligne)

* . --> Répète la dernière action


Copier/Coller

* x --> Coupe un caractère

* 20x --> Coupe 20 caractères

* dd --> Coupe la ligne

* 13dd --> Coupe 13 lignes à partir de la ligne en cours

* yy --> Copie la ligne

* 10yy --> Copie 10 lignes à partir de la ligne en cours

* p --> Colle : 1- à partir du caractère (si x)......... 2- à partir de la ligne suivante (si dd ou yy)

* P --> Colle : 1- avant le caractère (si x)......... 2- au dessus de la ligne courante (si dd ou yy)


Recherche de texte

* /toto --> Recherche le mot toto dans le texte vers le bas

* / --> Recherche l’occurrence suivante

* ?toto --> Recherche le mot toto dans le texte vers le haut

* ? --> Recherche l’occurrence précédente

* % --> Recherche la parenthèse fermante de la parenthèse sélectionnée


Déplacement

* j --> Vers le bas

* k --> Vers le haut

* h --> Vers la gauche

* l --> Vers la droite

* f --> Page down

* b --> Page up

* 0 (zéro) --> Début de ligne

* $ --> Fin de ligne

* w --> Passe de mot en mot

* b --> Revient de mot en mot

* :0 --> Revient à la première ligne du fichier

* :123 --> Va à la ligne 123 du fichier

* g --> Donne le numéro de la ligne en cours

* G --> Va à la dernière ligne du fichier


Enregistrement

* :w --> Enregistre le fichier en cours

* :w toto.ksh --> Enregistre le fichier sous le nouveau nom « toto.ksh »

* :q --> Quitte VI

* :q! --> Quitte VI sans sauvegarder

* :wq --> Enregistre le fichier en cours et quitte VI

* :n --> Passe au fichier suivant dans le cas d’ouverture de plusieurs fichiers

lundi 24 janvier 2011

perl : script MAJ BDD

Voici, un petit script qui met à jour un champ en BDD


#!/usr/local/bin/perl -w

use strict;
use diagnostics;

use DBI;
use Date::Manip;

# Parametres de connexion a la base de donnees
my $usermysql = $ENV{ MYSQL_USR};
my $passmysql = $ENV{ MYSQL_MDP};
my $mysqlBase = $ENV{ MYSQL_BASE};
my $mysqlServer = $ENV{ MYSQL_SRV};
my $portmysql = $ENV{ MYSQL_PORT};
my $projet = $ENV{ PROJET};

print "login=[$usermysql] et password=[$passmysql]";
# Ouverture de la connexion BDD
my $mysqlCnx = "DBI:mysql:database=".$mysqlBase.";host=".$mysqlServer.";port=$portmysql";
my $mysqlDbFctl = DBI->connect($mysqlCnx, $usermysql, $passmysql) || die("Pas de connexion a la base!");

# Requete SQL
my $updateQuery = "UPDATE WebServiceAccess SET authenticationKey = '12345678906'";

# Lancement de la requete d'update
my $updateStatement = $mysqlDbFctl->prepare($updateQuery);
$updateStatement->execute() || print "Can't execute statement: $DBI::errstr";
$updateStatement->finish();

# Lancement de select
my $selectQuery = "SELECT userId,authenticationKey FROM WebServiceAccess";
my $selectStatement = $mysqlDbFctl->prepare($selectStatement);
$selectStatement->execute() || print "Can't execute statement: $DBI::errstr";
$selectStatement->finish();

my @resultat;
while ((@resultat) = $selectStatement->fetchrow_array) {
print $resultat[0]."==>".$resultat[1]."\n";
}

$mysqlDbFctl->disconnect() || die ("erreur lors de la deconnexion a la BDD");

outils : le connexion manager de putty

Voici un outil vraiment pas mal pour putty, ce dernier vous permet d'avoir des onglets et évite les nombreuses fenêtre pour putty

le connexion manager est disponible ici

A noter , que dans mon cas, j'ai du désactiver les HOTKEYS car elle rentrer en conflit avec la complétion automatique de bash ... etc ...

unix / linux : faire une copie scp

Comment uploader les fichiers sur un serveur avec scp ?

scp /home/enwoo/download/* www@monServeurDistant:/Tache/etc/enwoo/

Comment downloader les fichiers sur un serveur avec scp ?

scp www@monServeurDistant:/Tache/etc/enwoo/* /home/enwoo/download/

jeudi 20 janvier 2011

java : faire une méthode générique

Voici un petit exemple de méthode générique :

Voici une première méthode simple qui prend un type paramétrable :




Une plus complexe, qui déclare un type TDAO qui doit obligatoirement étendre l'inteface GenericDAO, qui elle même, prend 2 types génériques, un TBEAN et un type ? qui implemente Serialisable)


private <TDAO extends GenericDAO<TBEAN, ? extends Serializable>, TBEAN> void supprimerRelation(

final TDAO dao, final Collection<TBEAN> beans)


Attention, les types sont réutilisés pour les paramètres de la méthode :

final
private <TDAO extends GenericDAO<TBEAN, ? extends Serializable>, TBEAN> void supprimerRelation(final TDAO dao, final Collection<TBEAN> beans )



Voici le code complet :


/**
* initialise puis supprime la collection de bean passés en paramètre
* Attention, les types DAO et beans doivent correspondrent
* @param <TDAO> est le type de DAO
* @param <TBEAN> est le type de bean
* @param dao est le DAO
* @param beans est une Collecion de beans
*/
private <TDAO extends GenericDAO<TBEAN, ? extends Serializable>, TBEAN> void supprimerRelation(
final TDAO dao, final Collection<TBEAN> beans) {
if (beans != null && dao != null) {
isInitialized(beans);
for (TBEAN bean : beans) {
supprimerRelation(dao,bean);
}
}
else if(beans == null)
{
logger.debug("La collection passée en paramètre ne doit pas être null");
}
else{
logger.debug("Le DAO passée en paramètre ne doit pas être null");
}
}

/**
* initialise puis supprime le bean passé en paramètre
* Attention, les types DAO et bean doivent correspondrent
* @param <TDAO> est le type de DAO
* @param <TBEAN> est le type de bean
* @param dao est un DAO
* @param bean est le bean
*/
private <TDAO extends GenericDAO<TBEAN, ? extends Serializable>, TBEAN> void supprimerRelation(
final TDAO dao, final TBEAN bean) {
if (bean != null && dao != null) {
isInitialized(bean);
dao.delete(bean);
} else if (bean == null) {
logger.debug("Le bean passé en paramètre ne doit pas être null");
} else {
logger.debug("Le DAO passé en paramètre ne doit pas être null");
}
}

/**
* initialise et retourne au sens hibernate un bean
* @param <T> le type du bean
* @param bean le bean a initialiser
* @return le bean passé en paramètre (ne sert que pour pouvoir faire une affectation )
*/
private <T> T isInitialized(T bean) {
if (bean != null && !Hibernate.isInitialized(bean)) {
Hibernate.initialize(bean);
}
return bean;
}

BDD : MySQL import / export d'un dump

Voici les commandes pour créer puis importer un dump MySQL (ici sous Windows et les binaires mySQL dans le PATH) :

mysqldump.exe -uMonUser -pMonMotDePasse -hlocalhost -P3306 monSchema --compress --opt > monFichierDump.sql

Attention il n'y a pas d'espace après le mot de passe ...

Voici, la ligne pour l'importer :

mysql --user=MonUser --password=MonMotDePasse monSchema --compress < monFichierDump.sql

A noter, que si la BDD, le user et les droits doivent exister ...

De plus, il semblerait que lors de l'import d'un dump, il vaut mieux supprimer l'ancien, et recréer une BDD vide afin d'éviter un "merge" du nouveau et de l'ancien schéma.

jeudi 13 janvier 2011

BDD mysql : rappel creation/suppression de foreign key

Voici un petit exemple de creation de 2 tables, une "parente" et une enfant liées par une clé étrangère.

A noter qu'il est nécessaire de créer des index via le keyword (INDEX ou KEY) pour chacune des clés étrangères


create table parent
( id bigint(20) NOT NULL AUTO_INCREMENT,
nom varchar(40),
primary key(id)
) type=INNODB;

create table enfant
(id bigint(20) not null auto_increment,
nom varchar(40),
parent_id bigint(20),
primary key(id),
index fk_parent_id (parent_id),
foreign key (parent_id) references parent(id) on delete cascade
) TYPE = INNODB;


La suppression d'une foreign key se fait via la commande suivante :
ALTER TABLE `maTable` REMOVE FOREIGN KEY `FK_leNomDeMaForeginKey`

Un petit exemple d'insertion avec AUTO_INCREMENT

insert into parent (nom) values ("enwoo");
insert into enfant (nom,parent_id) values ('julie',1);
insert into enfant (nom,parent_id) values ('maxime',1);


Si vous supprimez le parent, les enfants liés le seront aussi grâce à la claude on delete cascade.