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.

mardi 20 avril 2010

Combien faut-il d'informaticien pour changer une ampoule ?

J'ai trouvé cette perle sur reddit.com:



>> How many programmers does it take to change a light bulb?

On Wed, 14 Jan 1998, Paul Bleisch wrote:

> What are light bulbs?

On Thu, 15 Jan 1998, Steve Baker replied:

Oh dear. I wish people would RTFM...

---------------------------------------------------------------------
lightbulb(1) lightbulb(1)

NAME
lightbulb - Convert electrons to photons

SYNOPSIS
lightbulb [-wattage number]

DESCRIPTION
lightbulb reads a stream of electrons from standard input and
produces photons on standard output.
Thus

lightbulb <110_volts_ac>light

The following options apply to lightbulb:

-wattage Sets the rate at which electrons are converted
to photons.

FILES
None

SEE ALSO
xmas_tree_lights(1), streetlamp(1), led(2)

KNOWN BUGS
lightbulb is known to fail unexpectedly after some unknown
number of applications. Repeated complaints to the authors
of lightbulb have failed to come up with a fix for this
bug. The only known workaround for a crashed lightbulb is
re-installation from a fresh copy of the source media.

NOTES
I believe M$ Windows is based on lighbulb because they
share the same bug - and the same workaround.

It is important to ensure that the input stream is correctly
formatted or the lightbulb may crash unexpectedly and with
undefined results.

Do not attempt to apply lightbulb's input files to other
UNIX tools (esp. 'finger(1)'), however, lightbulb's output
stream is fairly compatible with most other devices.

INSTALLATION
Consult a hardware engineer.

PREREQUISITES
Your operating system must support sockets and switches.



Avec des commentaites de ce style :

How many Microsoft programmers does it take?
  • One dev to spend five minutes implementing ChangeLightBulbWindowHandleEx.
  • One program manager to write the specification.
  • One localization expert to review the specification for localizability issues.
  • One usability expert to review the specification for accessibility and usability issues.
  • At least one dev, tester and PM to brainstorm security vulnerabilities.
  • One PM to add the security model to the specification.
  • One tester to write the test plan.
  • One test lead to update the test schedule.
  • One tester to write the test cases and add them to the nightly automation.
  • Three or four testers to participate in an ad hoc bug bash.
  • One technical writer to write the documentation.
  • One technical reviewer to proofread the documentation.
  • One copy editor to proofread the documentation.
  • One documentation manager to integrate the new documentation into the existing body of text, update tables of contents, indexes, etc.
  • Twenty-five translators to translate the documentation and error messages into all the languages supported by Windows.The managers for the translators live in Ireland (European languages) and Japan (Asian languages), which are both severely time-shifted from Redmond, so dealing with them can be a fairly complex logistical problem.
  • A team of senior managers to coordinate all these people, write the cheques, and justify the costs to their Vice President.

Ou comme ceci :

I just rent light from the cloud.
Pour java :

  • One to design the ILightBulbChanger interface,
  • one to implement the LightBulbChangerImpl class
  • one to create the LightBulbChangerFactory
  • one to design and create different LightBulbChangerStrategies
  • one to throw all that out and just change the damn bulb
Pour les autres
Combien de programmeurs C++ pour changer une ampoule ?
Six. Un pour la changer et 5 autres six mois plus tard pour comprendre comment il a fait.
Combien de programmeurs Erlang pour changer une ampoule ?
Aucun, le programme la changera tout seul.
En ruby : aucun,on envoie un message ampoule.changement(); l'ampoule se changera elle-même.

Conclusion on trouve des pages de MAN(uel) sur tout y compris le sexe

 

SEX(6) EUNUCH Programmer's Manual SEX(6)







NAME

sex - have sex



SYNOPSIS

sex [ options ] ... [ username ] ...



DESCRIPTION

sex allows the invoker to have sex with the user(s) speci-

fied in the command line. If no users are specified, they

are taken from the LOVERS environment variable. Options to

make things more interesting are as follows:



-1 masturbate



-a external stimulus (aphrodisiac) option



-b buggery



-B

bestiality with



-c chocolate sauce option



-C chaining option (cuffs included) (see also -m -s -W)



-d

get a date with the features described in



-e exhibitionism (image sent to all machines on the net)



-f foreplay option



-F nasal sex with plants



-i coitus interruptus (messy!)



-j jacuzzi option (California sites only)



-l leather option



-m masochism (see -s)



-M triple parallel (Menage a Trois) option



-n necrophilia (if target process is not dead, program

kills it)



-o oral option



-O parallel access (orgy)



-p debug option (proposition only)











Printed 2/15/87 2/15/87 1













SEX(6) EUNUCH Programmer's Manual SEX(6)







-q quickie (wham, bam, thank you, ma'am)



-s sadism (target must set -m)



-S sundae option



-v voyeurism (surveys the entire net)



-w whipped cream option



-W whips (see also -s, -C, and -m)



ENVIRONMENT

LOVERS

is a list of default partners which will be used if

none are specified in the command line. If any are

specified, the values in LOVERS is ignored.



FILES

/usr/lib/sex/animals animals for bestiality



/usr/lib/sex/blackbook possible dates



/usr/lib/sex/sundaes sundae recipes



/usr/lib/sex/s&m sado-masochistic equipment







BUGS

^C (quit process) may leave the user very unsatisfied.



^Z (stop process) is usually quite messy.



MAN AUTHOR

Author prefers to be anonymous.



HISTORY

Oldest program ever.


samedi 3 avril 2010

Les 3 qualites d'un bon developpeur


Les trois qualités pour faire un bon développeur sont:
  • La paresse : je ne vais pas me fatiguer à écrire plus de 10 lignes pour ce programme
  • La vanité: J'ai fait ce programme en moins de 10 lignes
  • L'impatience: je vais vite faire 10 ligne de code pour résoudre ce problème
Thanks for Larry Wall
I possess a fortuitous surplus of the three chief virtues of a programmer: Laziness, Impatience and Hubris. I was too lazy to do it in awk because it would have been hard to get awk to jump through the hoops I was wanting it to jump through. I was too impatient to wait for awk to finish because it was so slow. And finally, I had the hubris to think I could do better.