mercredi 30 juin 2010

windows : bureau a distance

Il est possible de se connecter a distance sur un pc windows en bureau à distance via la commande :

Démarrer->exécuter, puis lancer la commande suivante :

mstsc

Ensuite il faut se logger de manière classique à un poste Windows. Il faut faire attention au domaine (voir préfixer l'utilisateur par le nom de domaine)

bash : script de test existence fichier

Voici un super cours de shell ... Voici un super cours de shell ...

Explications :
1) Toute l'astuce consiste a faire un "echo" de ma variable CLASSPATH, et a remplacer en live les séparateurs ':' par des ' ' afin de pouvoir être utiliser dans un for ...

Via la commande :
librairies=`echo $CLASSPATH | sed "s/:/ /g"`

2) puis on itere via un for :
librairies=`echo $CLASSPATH | sed "s/:/ /g"`

for librairie in ${librairies}


3) on test la non existence du fichier via :
if [ ! -e "${librairie}" ]

4) on definit 2 procédures :
- controleClasspath()
- lancerScript()


La première met à true la variable classpathOk si tous les jars sont présents et appelle la procédure lancerScript , sinon à false.


if [ "${classpathOk}" == "true" ]
then
lancerScript
fi




#!/bin/bash

# Definit l'emplacement des jars
# export LIB_HOME=${domaine.basedir}/../../.wlnotdelete/extract/bocorchestre_bocorchestreEAR_bocorchestre/jarfiles/WEB-INF/lib/
export LIB_HOME=/cygdrive/d/bea/user_projects/domains/bocV8lot1/myserver/.wlnotdelete/extract/myserver_web_web/jarfiles/WEB-INF/lib
# Ajoute le répertoire au Path
export PATH=$PATH:$BATCH_HOME

# Defini le classpath
export CLASSPATH=$CLASSPATH:$BATCH_HOME/batch.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/framework.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/framework.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/communs.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/domaine.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/services.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/log4j-1.2.11.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/datedFileAppender-1.0.2.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/poi-2.5.1.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/bocvaloservicesejb.jar
export CLASSPATH=$CLASSPATH:$LIB_HOME/concurrent-1.3.4.jar

classpathOk=true

controleClasspath()
{
librairies=`echo $CLASSPATH | sed "s/:/ /g"`

for librairie in ${librairies}
do
if [ ! -e "${librairie}" ]
then
echo "le jar suivant \"${librairie}\" est inexistant"
classpathOk=false
fi
done
}

lancerScript()
{
echo "cool"
}

echo "controle du classpath"
echo "${classpathOk}"
controleClasspath
echo "${classpathOk}"

if [ "${classpathOk}" == "true" ]
then
lancerScript
fi

jeudi 17 juin 2010

cvs : résumé des commandes utiles

Si le plugin eclipse changelog est fort utile ...

Sinon, voici un résumé des commandes :

ici un très bon site d'ou est extrait la suite ...


Résumé des commandes CVS
Télécharger le fichier brut

Creation du repository :
========================
=> setenv $CVSROOT ...
==> cvs init

Creation d'un module :
======================
aller dans le repertoire de travail du module
=> cvs import -m "Message" module vendor_tag branch_tag
si vous ne comprenez pas ce que sont les vendor et branch_tag, c'est
normal, personne ne le sait. mettez par exemple "main" et "start".



Creation d'une copie locale d'un module :
=========================================
depuis la branche principale
=> cvs co module
depuis une branche
=> cvs co -d branch_name module_name
depuis un tag
=> cvs co -r tag module_name

Exportation sans repertoires CVS administratifs :
=================================================
memes options que cvs check out
=> cvs export

Suppression d'une copie locale :
===============================
pour eviter d'effacer un checkout en oubliant nos modifications
=> cd ..
==> cvs release -d module



Mise a jour des fichiers locaux :
=================================
depuis la branche courante
=> cvs up
depuis la fin de la branche principale
=> cvs up -A
depuis une branche
=> cvs up -r branch_name
depuis un tag
=> cvs up -r tag_name

Sauver les fichiers locaux dans le repository :
===============================================
=> cvs ci -m "message"
changer la revision (doit etre plus grand que tous les numeros existants)
=> cvs ci -r 3.0



Ajouter des fichiers :
======================
=> cvs add file1 file2 ...
==> cvs ci -m "ajout des fichiers"

Supprimer des fichiers :
========================
Il faut d'abord supprimer le fichier du répertoire
=> rm file1 file2 ...
==> cvs rm file1 file2 ...
===> cvs ci -m "suppression des fichiers"

Supprimer un répertoire :
=========================
Pas possible directement, il faut aller le supprimer dans le serveur.



Créer un tag :
==============
dans la branche courante
=> cvs tag tag_name
dans une autre branche
=> cvs rtag -r branch_name tag_name
uniquement les fichiers deja taggée
=> cvs rtag -r old_tag_name tag_name
en verifiant qu'aucun fichier n'est modifié localement
=> cvs tag -c tag_name

Créer une branche :
===================
dans la branche courante
=> cvs tag -b branch_name
dans une autre branche
=> cvs rtag -b -r branch_name new_branch_name
passer dans cette branche
=> cvs up -r branch_name

Merge avec une branche :
========================
merge d'une autre branche dans la branche courante
=> cvs up -j branch_name
==> cvs ci -m "Applied branch_name modifications"

Remerger une branche mergée et modifiée :
=========================================
si la branche branch_name a été mergée dans la branche
courante puis tagguée a tag_name
=> cvs up -j tag_name -j branch_name (attention à l'ordre)
==> cvs ci -m "Applied new branch_name modificatios"

Associer un nouveau nom symbolique :
====================================
pour creer un alias sur un tag ou une branche existant
=> cvs admin -n newname:oldname [repertoire]
si le nom "oldname" est supprimé, le contenu de la branche reste accessible par "newname".

Annuler une branche :
=====================
si une branche a été crée et qu'on veut la fusionner (par exemple parce qu'un sous-repertoire ne sera
jamais modifié dans la branche et peut donc rester synchrone avec la branche principale), on commence
par sauver l'ancienne branche au cas ou :
=> cvs admin -n newname:oldname [repertoire]
ensuite on supprime l'ancien nom de la branche :
=> cvs tag -B -d oldname [repertoire]
enfin on aliase l'ancien nom sur la branche avec laquelle on veut fusionner :
=> cvs admin -n oldname:branchtomerge [repertoire]
il peut être bien d'updater entre les opérations pour récupérer les fichiers qui ne sont pas présents
dans chaque branche.


Obtention d'une version sticky :
================================
sticky tag
=> cvs up -r tag_name/branch_name
=> cvs ou -r tag_name/branch_name module
sticky date
=> cvs up -D yesterday/"1 hour ago"/"24 Sep"/"24 Sep 1972 12:05"/"1972-09-24 11:56"

Suppression des sticky :
========================
=> cvs up -A



Annulation des modifications locales :
======================================
les fichiers remplacés sont sauvés en .#file.revision
=> cvs up -C



Obtention des messages de log des commit :
==========================================
=> cvs log file_name


Voir l'historique des revisions d'un fichier :
(avec les branches et les tags)
==============================================
=> cvs st -v file_name



Voir l'historique brute du module :
===================================
=> cvs his -ea module


Options classiques :
==================
creation des nouveaux repertoires apparus dans le repository
=> cvs up -d
suppression des repertoires vides
=> cvs up/co -P
update non recursif
=> cvs up -l
diminuer les messages affichés
=> cvs -q
utiliser le format unifié pour diff
=> cvs diff -u
ne pas faire attention aux lignes/caracteres blancs insérés
=> cvs diff -b -B
prendre la version la plus recente si aucune de convient avec -d ou -r
=> cvs up/co -f -D/-r

A mettre dans .cvsrc
cvs -q
update -d -P
checkout -P
diff -u -b -B

mercredi 16 juin 2010

SQL / oracle : mettre a jour une vue ...

J'ai été surpris de découvrir qu'il était possible de mettre à jour une vue, ou d'insérer des valeurs. Evidemment, il y a des restrictions:

Apparemment , il est possible de faire des update , insert dans une vue, sous réserves qu’elle ne contienne pas :

De champ calculé,
Plusieurs tables
De valeurs obligatoires dans la table sur laquelle la vue fait référence et qui ne serait pas présente dans la table et qui n’a pas de valeur par défaut.

SQL / oracle : retrouver une colonne ou une table dans un schema

Voici, une requête fort utile lorsque l'on recherche une colonne et que l'on ne sait pas vraiment ou elle se trouve, et son nom :

Dans ce cas, on peut utiliser les tables system .. a condition d'avoir les droits adéquats ... Une série de table commençant par dba_* ... (ex: dba_objects)

Sinon, il existe les mêmes tables avec un filtre sur le owner et qui sont préfixée par user_* (ex: user_tab_cols)



select * from dba_tab_cols where owner = 'MonUser' and UPPER(column_name) like '%TARE%'


ou encore :


select * from user_tab_cols;


Il est aussi possible de retrouver une table en utilisant une requête du type :
Dans l'exemple, on recherche des tables contenant le mot ANO ...


select * from dba_all_tables where UPPER(table_name) like '%ANO%'

jeudi 10 juin 2010

java : astuces configuration log4j

un petit rappel issue du site apache pour parametrer log4j via des parametres en ligne de commandes :

ici un exemple pour choisir le niveau de logs et un fichier de configuration ... via une variable d'environnement.

ça peut toujours être pratique.

ici, le fichier sera recherché dans le WEB-INF/classes
export TOMCAT_OPTS="-Dlog4j.debug -Dlog4j.configuration=foobar.xml"


ici, on ajoute une factory :
set TOMCAT_OPTS=-Dlog4j.configuration=foobar.lcf -Dlog4j.configuratorClass=com.foo.BarConfigurator


ici, un chemin complet Windows c:/foobar.properties
set TOMCAT_OPTS=-Dlog4j.configuration=file:/c:/foobar.properties


ici, avec la servlet d'init et un parametre :


package com.foo;

import org.apache.log4j.PropertyConfigurator;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.io.IOException;

public class Log4jInit extends HttpServlet {

public
void init() {
String prefix = getServletContext().getRealPath("/");
String file = getInitParameter("log4j-init-file");
// if the log4j-init-file is not set, then no point in trying
if(file != null) {
PropertyConfigurator.configure(prefix+file);
}
}

public
void doGet(HttpServletRequest req, HttpServletResponse res) {
}
}


et le web.xml

<servlet>
<servlet-name>log4j-init</servlet-name>
<servlet-class>com.foo.Log4jInit</servlet-class>

<init-param>
<param-name>log4j-init-file</param-name>
<param-value>WEB-INF/classes/log4j.lcf</param-value>
</init-param>

<load-on-startup>1</load-on-startup>
</servlet>

java : bonnes pratiques

Voici un très bon site qui rappelle les bonnes pratiques java / java EE ... De précieux conseil s'y trouve ...

http://www.javapractices.com

mardi 8 juin 2010

oracle : trigger , vue concrètes, vue matiérialisée (<=> snapshot)

Voici un exemple complet de création d'une vue concrète par un trigger, ou de la création d'une vue matérialisées (<=> appelée aussi snapshot).

Ce code est extrait du très bon cours (de M. Lalonde) suivant

Cet exemple contient un rappel sur les trigger, les shapshot, et la création d'une vue concrète via le trigger ...


DROP TABLE Skieur;

CREATE TABLE Skieur (
IdSki INTEGER NOT NULL,
Nom VARCHAR2(15) NOT NULL,
Prenom VARCHAR2(15) NOT NULL,
Categ VARCHAR2(10),
CHECK (Categ IN ('0-6', '7-8', '9-10', '11-12', '13-14', '15-et-plus')),
PRIMARY KEY( IdSki )
);


CREATE VIEW Vue_Skieur_11_12 AS
SELECT IdSki, Nom, Prenom FROM Skieur WHERE Categ = '11-12';



CREATE TABLE Concrete_Skieur_11_12 (
IdSki INTEGER NOT NULL,
Nom VARCHAR2(15) NOT NULL,
Prenom VARCHAR2(15) NOT NULL,
PRIMARY KEY ( IdSki ),
FOREIGN KEY (IdSki) REFERENCES Skieur (IdSki)
);


CREATE OR REPLACE TRIGGER Trig_Concrete_Skieur_11_12

AFTER INSERT OR UPDATE OR DELETE ON Skieur
FOR EACH ROW
BEGIN

IF INSERTING THEN
IF :new.Categ = '11-12' THEN
INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
END IF;

END IF;

IF UPDATING THEN
IF :old.Categ = '11-12' THEN
IF :new.Categ = '11-12' THEN
UPDATE Concrete_Skieur_11_12
-- Il n'est pas necessaire de modifier IdSki car la contrainte referencielle empeche -- deja toute modification de cet attribut
SET Nom = :new.Nom, Prenom = :new.Prenom
WHERE IdSki = :new.IdSki;
ELSE
DELETE FROM Concrete_Skieur_11_12 WHERE IdSki = :new.IdSki;
END IF;
ELSE
IF :new.Categ = '11-12' THEN
INSERT INTO Concrete_Skieur_11_12 VALUES (:new.IdSki, :new.Nom, :new.Prenom);
END IF;
END IF;
END IF;

IF DELETING THEN
IF :old.Categ = '11-12' THEN
DELETE FROM Concrete_Skieur_11_12 WHERE :old.IdSki = IdSki;
END IF;
END IF;
END;
.
RUN Trig_Concrete_Skieur_11_12;


CREATE SNAPSHOT Snapshot_Skieur_11_12
REFRESH COMPLETE
AS (SELECT IdSki, Nom, Prenom
FROM Skieur
WHERE Categ = '11-12');

lundi 7 juin 2010

J2EE : weblogic deployement auto

Voici un extrait des taches ANT à utiliser pour deployer automatiquement une webApp ou un EAR sous weblogic 8.1.5

Ceci est utiliser par le plugin weblogic sous eclipse et se trouve :

${WORKSPACE_HOME}\.metadata\.plugins\org.eclipse.jst.server.generic.core\buildfiles\wldeploy.xml


<project name="weblogicpublish" default="deploy" basedir=".">
<target name="init">
<taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
<classpath>
<fileset dir="${serverRootDirectory}">
<include name="server/lib/weblogic.jar" />
</fileset>
</classpath>
</taskdef>
</target>

<target name="deploy" depends="init">
<echo>Deploying module ${module.name}</echo>
<wldeploy
action="deploy"
verbose="true"
debug="true"
nowait="false"
name="${module.name}"
source="${module.dir}"
user="${username}"
password="${password}"
failonerror="true"
adminurl="t3://localhost:${port}"/>
</target>

<target name="undeploy" depends="init">
<echo>Undeploying module ${module.name}</echo>
<wldeploy
action="undeploy"
verbose="true"
debug="true"
nowait="false"
name="${module.name}"
user="${username}"
password="${password}"
failonerror="true"
adminurl="t3://localhost:${port}" />
</target>

</project>

vendredi 4 juin 2010

shell : commande find

voici un petit rappel pour faire des find un peu évolué ...

ici, ce find recherche les fichiers core ou les fichiers dump ...

find . \( -name 'core\.*' -o -name '*dump*' \) -exec ls -al {} \;

jeudi 3 juin 2010

sql : oracle limiter le nombre de requêtes

Attention comment limiter le nombre d'enregistrements retournés par oracle ... pour cela il faut utiliser rownum ...

attention, si la requete est trié avec un order by ... le rownum ne fonctionne plus ... eh oui !!! le rownum est attribué avant le tri final !!!

La solution est simple, il faut faire une sous-requete et le rownum ensuite ...

ici on recupère les 1000 premiers ...

SQL> SELECT * FROM (
SELECT *
FROM Commande c
ORDER BY NO_CMD
)
WHERE ROWNUM <= 1000 ;


Il est aussi possible de mettre un parametre dans une clause where afin de filtrer les resultats (ex: de 1000 à 2000 , puis de 3000 à 4000) comme pour une pagination ...

ici, les 1000 premiers enregistrements pour les commande de n° commande > 2564 ...

tout est bien explique ici !!!

SQL> SELECT * FROM (
SELECT *
FROM Commande c WHERE c.NO_CMD > 2564
ORDER BY NO_CMD
) a
WHERE ROWNUM <= 1000 ;


Attention ROWNUM avec supérieur ne fonctionne pas ...

mercredi 2 juin 2010

spring : config simple

Voici, un exemple simple de config spring dont le but est d'instancier des singleton ... Attention, les classes doivent etre instanciable (convention javabean)


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="adminServices"
class="com.services.AdminServices"
singleton="true">
</bean>
<bean id="referentielServices"
class="com.services.ReferentielServices"
singleton="true">
</bean>

<bean id="commandeBocServices"
class="com.services.CommandeBocServices"
singleton="true">
</bean>

<bean id="commandeBocDetailServices"
class="com.services.CommandeBocDetailServices"
singleton="true">
</bean>
</beans>


Ne pas oublier de mettre dans le web.xml, le listener suivant (et les hjar dans la webapp)


<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

mardi 1 juin 2010

apache : rappel

Détecter si un process apache est démarré ?

ps -edf | grep httpd

Démarrer/Stopper un serveur apache :
apachectl start
apachectl stop