samedi 29 mai 2010

Séminaire logiciels libres

Le SAE : Service des achats de l'état organisait vendredi 28/05/2010 un séminaire relatif au logiciel libre :

Les logiciels libres sont-ils une alternative crédible aux solutions propriétaires ?

Quel enjeu technique et financier pour les administrations ?

Comment gérer de matière mature l'open source et en tirer les bénéfices ?

Quelles bonnes pratiques et enseignements peut-on tirer de nos expériences ?



L'après midi j'ai participé à l'atelier :

Quelle mutualisation interministérielle opérationnelle (développements, packaging, documentation, transfert de compétences, partage d'expérience ...) ?


Conclusion: le point d'entrée pour participer aux réflexions ou pour etre informé sur ce qui se passe est la liste de diffusion service-public-libre.
service-public-libre@listes.adullact.org
partage des savoirs et des expériences entre les services de l'Etat

animée par
christophe.cazin.



mercredi 26 mai 2010

rubik'cube boite à secret

Une idée de cadeau pour la fête des mères ou pour la saint-Valentin: un rubik's cube en forme de coeur. Mais ce n'est pas tout: En plus du plaisir de passer des heures (jours) à trouver la solution, le coeur se dévisse en libérant une cachette.

Idéal pour offrir une bague.



Pour les plus impatientes, il reste la solution ultime:




L'objet est disponible ici: sur ce lien.

lundi 3 mai 2010

Premiers pas avec le serveur web NGINX

J'ai procédé à des essais avec le serveur HTTP NGINX.

Pourquoi utiliser NGINX plutôt qu'Apache ? La réponse est ici: lien vers presentation.

Extraits:
Consommation mémoire:


Nombre de requetes délivrées:




Le secret de nginx réside dans l'application de deux principes:
* Le traitement concurrent (parallèle ) d'une requete.
* Un soin particulier porté dans l'écriture du code.

Nginx est particulièrement adapté pour faire du reverse-proxy et de la répartition de charge.

Installation de nginx.

Une fois que l'archive décompressée, j'ai lancé la commande :
./configure --without-http_rewrite_module --with-debug

Puis make et make install.


J'ai obtenu un répertoire nginx avec l'arborescence suivante:

ginx/conf:
fastcgi.conf koi-utf nginx.conf
fastcgi.conf.default koi-win
fastcgi_params mime.types nginx.conf.default
fastcgi_params.default mime.types.default win-utf


nginx/html:
50x.html index.html

nginx/logs:
access.log error.log nginx.pid

nginx/sbin:
nginx

Lancement.


Le fichier nginx.conf qui contiendra toute la configuration directement ou par un système d'include (ex: include mime.types; ) .


Le service se lance par la commande sbin/nginx et s'arrete par un kill PID.

Le serveur se lance sans modification du fichier de configuration et se met à l'écoute du port 80. Il utilise deux processus par défaut:

9775 ? Ss 0:00 nginx: master process sbin/nginx
9776 ? S 0:00 nginx: worker process



La vérification par telnet localhost 80
GET /
Donne un bienvenue : welcome to NGINX !

Activation du mode Proxy.


J'ai une application Rails qui fonctionne sur la même machine sous serveur mongrel sur le port 3000.

J'ai modifié nginx.conf comme ceci :

server {
listen 80;
server_name localhost;

#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
}

... continuation

Une requete sur http://localhost/ pointe à présent sur l'application Rails.

Les journaux d'accès ou d'erreur sont dans le répertoire nginx/logs

mercredi 28 avril 2010

watir : un outil de test d'application web

Le projet watir permet comme selenium d'enregistrer puis de rejouer des tests avec différents navigateurs.

Il faut pour cela:
* Enregistrer les actions de navigation avec un plugin firefox
* Lancer le programe watir généré par le plugin .

Watir est en ruby, un exemple de programme :

#!/usr/bin/ruby
require 'rubygems'
require 'watir'
Watir::Browser.default = "firefox"
browser = Watir::Browser.start "http://footpedia.org/newsite/"
browser.link(:text, "Messi nouveau Diego ?").click
browser.close


Il est possible de jouer des tests pour d'autres navigateurs (IE)

Watir interagit directement avec le navigateur. On voit littéralement le test se dérouler.

Pour piloter firefox a votre place, watir à besoin du plugin jssh.
Le lancement de firefox se fera par la commande firefox -jssh &.




Un autre usage possible de watir est de simuler de la présence sur une application et donc de contourner ... je vous laisse à votre imagination le soin de compléter la suite.

mardi 27 avril 2010

PHP : classes et objets

J'ai jeté un coup d'œil sur la manière dont PHP implémente les objets.
La syntaxe ressemble globalement au JAVA. Un objet est une référence vers une construction qui se rapproche d'un tableau associatif.

Voici un exemple de manipulation




<?php
abstract class Mamifere {
// nom
var $nom;
function __construct($nickname) {

$this->nom= $nickname ;

}

function parle () { }
}

class Chien extends Mamifere {
function parle () {
echo "ouaf ouaf\n";
}
}
$a= new Chien ("fido");
print_r( $a);
var_dump($a);
echo get_class($a)."\n";
echo get_parent_class($a)."\n";
$method= "parle";
call_user_func(array ($a,$method));
$b= get_class_methods($a);
var_dump($b);
?>



La manipulation d'un attribut d'instance à l'intérieur d'une classe est un peu lourde ($this->attribut) .

Des fonctions comme :
get_class , get_parent_class, get_class_methods permettent d'obtenir des informations sur les objets.

La fonction call_user_func peut etre utilisée pour envoyer un message à un objet afin qu'il exécute une méthode. C'est une des façons de réaliser de la métaprogrammation en PHP.



La sortie du programme donne :


php ./essaiclasse.php
Chien Object
(
[nom] => fido
)
object(Chien)#1 (1) {
["nom"]=>
string(4) "fido"
}
Chien
Mamifere
ouaf ouaf
array(2) {
[0]=>
string(5) "parle"
[1]=>
string(11) "__construct"
}



J'ai installé PHP 'client' pour faire tourner mon programme sous forme de script et non pas de CGI afin de m'affranchir de la couche du serveur Apache.

lundi 26 avril 2010

webmail roundcube vs squirrelMail

Après avoir fait le tour des porjets webmail opensource la liste se réduit à deux projets : roundcube et squirrelmail ;

Roundcube.

Le code est PHP la base en PostgreSQL

C. a réussi à installer après pas mal de manipulations roundcube derrière un portail internet de test avec une base données PostgreSQL , j'ai reversé sa documentation d'installation de roundcube en francais sur lemon-labs. Dans la foulée, il entièrement mis en place les fonctions de SSO dans roundcube. Ce dernier utilise un token de pré-authentification et un identifiant de session stocké dans la base PostgreSQL.

Conclusion: Roundcube fonctionne. Il reste à régler les types mimes pour les transfert de message au format HTML.




SquirrelMail.

Le code est PHP, la base est optionnelle.
L'installation n'a pas a être détaillée car il est très simple à réaliser par l'intermédiaire d'un script Perl. En revanche, cette installation ne prend pas en compte l'utilisation d'une base de données. Et je ne suis pas certain que squirrelmail soit taillé pour s'intégrer dans une architecture à répartition de charge comme la notre.
L'interface est en anglais, l'internationalisation (francais) est présente mais ne fonctionne pas.Il reste là aussi à régler les types mimes pour les transfert de message au format HTML.





Conclusion sur le match roundcube vs squirrelmail: roundcube fonctionne en francais, il s'intègre dans une architecture de répartition de charge et de SSO. Il fait plus de choses que son concurrent et en plus ergonomique. SquirrelMail reste un produit très simple d'installation et d'usage.


Remarques sur les protocoles POP ou IMAP.
Les deux projets ne gèrent que le protocole IMAP. C'est d'ailleurs un anachronisme dangereux que de faire du POP. En effet, pas mal de personnes utilisent leurs messageries POP pour gérer leurs documents : Dossiers, archivage etc. Or les messages sont sur la machine en local, rien sur le serveur (POP) . Tous ces documents seront perdus en cas de plantage de la machine ou de départ de la personne....

Si on persiste à vouloir faire du POP avec un webmail IMAP : 3 solutions
a) Modifier le webmail.
b) Utiliser un proxy IMAP/POP comme par exemple NGINX .
c) Utiliser un client POP qui ira chercher vos messages pour les envoyer sur un serveur IMAP dédié.

L'IMAP n'est pas l'avenir du mail, c'est le mail (ne croyez pas ce que vous dit google fight) .

vendredi 23 avril 2010

Métaprogrammation et introspection en JAVA

La métaprogrammation au sein d'un langage pseudo-compilé ou comilié est très difficile et surtout d'une utilité limitée. En revanche l'introspection est un moyen pour approfondir ses connaissances d'un langage.

En java la classe : java.lang.reflect permet d'obtenir des informations intéressantes. Cette classe utilisée avec l'utilitaire 'javap' (livré avec le jdk) seront de bons compagnons de jeux:

Reflec liste les méthodes d'une classe , les attributs publics , les constructeurs et aussi la classe Mère.

Ici un exemple d'utilisation :



import java.lang.reflect.*;
abstract class mammifere {
public String nom;
mammifere(String s){
nom = s;
}


abstract void parle();
void quiSuisJe(){
System.out.println( "--------------------------" );
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
System.out.println( " Je suis un " + s );
}
void jeSaisFaire() {
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
try {
Class c = Class.forName(s);

Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
{
System.out.println("je sais faire :" + m[i].toString());
}
}
catch (Throwable e) {
System.err.println(e);
}
}
void mesQualites() {
Object o = this.getClass();
String s = o.toString();
s = s.substring(6);
try {
Class c = Class.forName(s);

Field f[] = c.getFields();

for (int i = 0; i < f.length; i++)
{
System.out.println("Mes qualites sont :" + f[i].toString());
}
}
catch (Throwable e) {
System.err.println(e);
}
}

}
class Humain extends mammifere {
Humain( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "Bonjour je m'appelle " + nom +
" et je deteste la java !!" );
System.out.println("");
}
}

class Chien extends mammifere {
public String race ;
Chien( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "OUAF OUAF OUAF je m'appelle " + nom +
" et je ronge mon frein !! non !! mon os ..." );
System.out.println("");
}
void FaireLeBeau(){
System.out.println("sur deux pates");
}
}

class Chat extends mammifere {
Chat( String s ){
super( s );
}
void parle(){
quiSuisJe();
System.out.println( "MIAOUUUUUUUU je m'appelle " + nom +
" et je ronronne un max ..." );
System.out.println("");
}
}

class mam {
public static void main(String args[]){
mammifere mams[] = new mammifere[ 3 ];
mams[0] = new Humain( "Jean Valjean" );
mams[1] = new Chat( "O'Mallet" );
mams[2] = new Chien( "Droopy" );

for(int i=0; i<3; i++){
mams[ i ].parle();
mams[ i].jeSaisFaire();
mams[ i].mesQualites();

}
}
}

Avec des exemples de resultats.



je sais faire :void Chien.parle()
je sais faire :void Chien.FaireLeBeau()
Mes qualites sont :public java.lang.String Chien.race
Mes qualites sont :public java.lang.String mammifere.nom




La méthode GetMethods retourne les méthodes 'friendly' ,en revanche getFields ne fonctionne que sur les attributs explicitement publics.


Le programme javap est un décompilateur
Il s'utilise comme ceci :
javap <>


ex: javap Chien

Avec le résultat suivant:

javap Chien
Compiled from "mam.java"
class Chien extends mammifere{
Chien(java.lang.String);
void parle();
void FaireLeBeau();
}


Tout cela reste bien triste en raison de l'aspect statique de JAVA.


Ici un article complet sur le sujet.