You are on page 1of 55

Developpez

Le Mag
Edition de Juin Juillet 2010.
Numro 28.
Magazine en ligne gratuit.
Diffusion de copies conformes loriginal autorise.
Ralisation : Alexandre P ottiez
Rdaction : la rdaction de Developpez
Contact : magazine@redaction-developpez.com

Sommaire

Article Dveloppement Web


Java/Eclipse Page 2
Android Page 6
PHP Page 13
Dev. Web Page 27
C/C++/GTK Page 30
Qt Page 38
Mac Page 44 Comment crer facilement un
Conception Page 46 framework JavaScript Partie 3
Liens Page 54

Apprenez pas pas crer un framework JavaScript.

par Teylor Feliz


Page 27

Article C/C++/GTK

Editorial
Interview de James Reinders
Ce sont les grandes vacances et
tout le monde prend du repos bien
mrit mais attention ne pas
perdre les bonnes habitudes ! Dans cette interview, James Reinders, le gourou d'Intel sur le
Ne vous inquitez pas, dveloppement orient dveloppement parallle et auteur d'un
Developpez.com ne les perd pas et
vous propose un nouveau numro livre sur les Thread Building Blocks, fait le point sur les outils
de son magazine pour que vous ne prvus en 2010.
perdiez pas la main pendant vos
vacances.
par Loc Joly
La rdaction Page 30
Java/Eclipse
Les derniers tutoriels et articles
Gradle, le nouvel outil de build incontournable
Gradle, le nouvel outil de build incontournable

Le systme de build propose une approche flexible pour la construction de projets Java, Groovy et Scala, et Java
EE. Vritable alternative Ant et Maven, il est aussi capable de s'intgrer ses deux concurrents.
1. Introduction projets par rpertoires de sources ou encore de gnrer
autant d'artefacts que ncessaire pour votre projet.
La ralisation d'une application est constitue de
nombreuses tapes. Parmi celles-ci, l'tape de
3. Gradle permet de rsoudre les problmes rencontrs
construction, aussi appele tape de build, est la plus
avec Ant ou Maven
importante. Elle permet de transformer un code source,
issu d'une reprsentation humaine, dans un ensemble de Au-del d'tre un comptiteur face aux outils de build
codes excutables constituant une reprsentation machine. existants, Gradle fait office de fdrateur. En effet, l'outil
Il n'est pas rare que cette tape soit complexe, tant par sa peut s'insrer aisment dans des infrastructures utilisant
mise en uvre, que son adquation aux besoins Ant ou Maven, ceci afin d'enrichir les fonctionnalits
changeants du projet. Il est alors ncessaire d'outiller cette existantes, et offre une panoplie de stratgies pour
construction afin de rpondre au plus prs aux besoins du rsoudre les problmes rencontrs avec Ant ou Maven.
projet. Dans le cadre d'Ant, Gradle possde un module d'import
permettant de convertir toutes les cibles d'un script Ant en
De nombreux outils de build existent pour rpondre cette tches Gradle. Celui-ci peut ensuite rajouter du
problmatique. Certains de ces outils, implants depuis des comportement avant ou aprs l'excution de la cible Ant.
annes, dominent le march comme Ant et Maven. Cette fusion native entre Ant et Gradle permet galement
Nanmoins, malgr leur omniprsence, nombreux sont les de faire rfrence une tche Gradle depuis un script Ant
dveloppeurs qui restent bloqus et souffrent d'un manque import. Cette mutualisation donne la possibilit ainsi
de fonctionnalits. Gradle, n de l'exprience des d'utiliser Gradle comme outil complmentaire votre
utilisateurs acquise au cours ces diffrentes annes, tente infrastructure Ant sans un besoin de migration.
de rpondre aux besoins particuliers de build des
applications d'une entreprise. Dans le cadre de Maven, Gradle est capable de collecter
des artefacts dans des dpts Maven travers la librairie
2. Un systme de build de troisime gnration Ivy et d'crire dans des dpts Maven via l'utilisation
native du module Maven inclut dans la distribution Gradle.
Gradle est un systme de build de troisime gnration
Cette fonctionnalit permet d'utiliser Gradle pour ses
proposant une approche flexible pour la construction de
chanes de build et d'utiliser des dpts d'entreprise de type
projets Java, Groovy et Scala et Java EE. Il utilise les
Maven en standard dans la majorit des organisations. Ces
meilleures fonctionnalits de chacun des outils existants
dpts, grs par des outils gestionnaires comme JFrog
comme une structure de dveloppement cadre, une
Artifactory, rendent possible une centralisation du
ossature pour la construction de son projet, des
stockage des librairies utilitaires publiques issues de
conventions de noms, tout en proposant en permanence
dpts Internet avec les artefacts issus des projets, le tout
une personnalisation selon ses besoins. En termes
avec des mtadonnes de type uniforme.
d'architecture technique, Gradle est un toolkit fond sur les
Gradle augmente galement les aspects de fiabilit et de
meilleures librairies du march de l'intgration continue,
performance d'une chane de compilation en fournissant un
comme le gestionnaire de dpendances Ivy, l'utilisation
support extrmement puissant, pour un projet multi
native de taches Ant et le langage Groovy pour dcrire le
module, travers des fonctionnalits de build
build d'un projet.
incrmentales que ses comptiteurs ne possdent pas.
A l'image de ses concurrents, Gradle apporte une approche
dclarative dans la dfinition de la chane de build. Mais
Aprs deux ans d'existence, Gradle atteint un niveau de
Gradle fournit un langage de spcification du domaine
maturit lui permettant d'tre adopt en masse et sans
(DSL) en langage Groovy pour crire un script Gradle.
risques par les grands comptes. A ce jour, les entreprises
Cette DSL orchestre une API Gradle et permet de fournir
ayant utilis Gradle ont constat une plus value immdiate
l'criture du build une grande richesse des lments.
et l'ont implant comme leur principal outil de build.
Chaque script Gradle configure de manire sous-jacente
un objet Gradle Projet sr lequel le script utilise un
4. Liens
ensemble de proprits et de mthodes exposes par l'API.
Comparatif des outils de build pour Java (Lien2).
Ce vritable langage de build vous offre une flexibilit Le forum d'entraide sur Gradle (Lien4).
d'expression rpondant aux besoins de votre entreprise, Le forum d'entraide sur les outils d'intgration
comme la possibilit de pouvoir dclarer plusieurs continue (Lien5).
rpertoires de sources par projet, de configurer les
dpendances trs finement, de mettre en place plusieurs Retrouvez l'article de Grgory Boissinot en ligne : Lien6

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 2
Interview de David Booth et Jevgeni Kabanov (ZeroTurnaround)
Interview de David Booth et Jevgeni Kabanov (ZeroTurnaround)

David et Jevgueni, de la socit ZeroTurnaround, diteur de l'outil de productivit JRebel pour le dveloppement
Java, ont accept de rpondre nos questions sur leur socit et leur produit phare.

1. Au sujet de ZeroTurnaround David Booth - Chief Executive Officer


ZeroTurnaround

ZeroTurnaround est un petit diteur logiciel estonien (le


pays l'origine de Skype, Kazaa, etc). Nous construisons
de petits outils qui apportent une grande valeur ajoute aux
quipes de dveloppement (ainsi qu' leur budget). Par
exemple, JRebel est un fichier JAR qui fait moins d'un
MB, facile d'installation et d'utilisation, qui conomise
entre trois et sept semaines de temps de dveloppement
perdus (sur la base de semaines de 40 heures) et vous
cote moins de 150 $ par an. C'est un assez gros challenge.
A mesure que nous grandissons, notre vision de
l'amlioration de la qualit, de la cohrence, et de la David a t en charge du marketing d'outils de productivit
productivit dans l'industrie du logiciel grandit. dans l'industrie Java depuis 2001, en commenant par
JProbe, puis pour JetBrains (IntelliJ IDEA), prchant pour
Jevgeni Kabanov - Founder, Chief Technical Officer la qualit dans le logiciel et l'amlioration de la
productivit des dveloppements. Il est convaincu de la
ncessit de soutenir les communauts d'utilisateurs, et a
fond sur son temps libre le Young Professionals Forum
(Lien10) Prague o il rside.

2. ZeroTurnaround

Combien de salaris sont employs par


ZeroTurnaround ?
Jevgueni : Un peu moins de 10 en ce moment, sachant que
cela volue au rythme du recrutement de nouvelles recrues
Auparavant, Jevgeni travaillait en tant que directeur R&D ... d'ailleurs connaissez-vous des ingnieurs intresss pour
de Webmedia, Ltd, la plus grande socit balte de travailler en Estonie, ou des commerciaux et marketeux
dveloppement de logiciels custom. Dans le cadre des intresss par Prague ?
efforts de rduction du temps de dveloppement, il crivit
un prototype de JavaRebel et en dirige, depuis la cration Quel EDI est principalement utilis par les quipes de
de ZeroTurnaround en 2007, le dveloppement. Il est ZeroTurnaround ? Pourquoi ?
speaker depuis quelques annes lors de confrences
internationales, parmi lesquelles JavaPolis/Devoxx, Jevgueni : Tout le monde utilise Eclipse. C'est
JavaZone, et JAOO sur des sujets comme : "Do you really probablement en partie de ma faute, tant donn que j'tais
get Classloaders" "Zero Turnaround in Java un fervent partisan d'Eclipse il y a quelques annes.
Development". Il a un intrt certain pour la recherche, Maintenant a m'est indiffrent, mais je pense qu'Eclipse
avec de nombreuses publications sur des sujets allant de possde de meilleures fonctionnalits Java de base et nous
notions thoriques jusqu'aux typesafe DSLs Java. A ct ne faisons pas vraiment de dveloppement Web. Nous
des produits commerciaux raliss dans le cadre de achterions probablement des licences IDEA si nous
ZeroTurnaround, Jevgeni est le co-fondateur de deux avions faire du Web, mais je continue tre mcontent
projets open source - Aranea et Squill. Aranea (Lien7) est de leur support du Compile-On-Save et je pense qu'Eclipse
une plateforme de dveloppement Web et d'intgration a de l'avance sur cet aspect.
base sur de solides principes orients objet. Squill (Lien8)
est un DSL interne type-safe pour la construction et Certaines socits refusent de payer sur la base d'autre
l'excution de requtes SQL. Le blog personnel de Jevgeni chose qu'une facture et uniquement via un
peut tre trouv sur dow.ngra.de (Lien9). transfert bancaire. Comptez vous utiliser autre
chose que les cartes de crdit comme moyen de
paiement ?
Jevgueni : En fait, mme si ce n'est pas crit explicitement
sur notre site Web, la plupart des commandes importantes
viennent avec une facture et un virement direct. Les
socits nous contactent simplement par email et nous

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 3
nous arrangeons pour rpondre ce besoin. J'adorerais Quels sont les prochains challenges pour JRebel aprs
pouvoir faire cela d'une manire automatise, mais je ne la version 3.0 ?
pense pas que notre banque prenne en charge l'un de ces
Jevgueni : Eh bien, il y a de nombreuses choses que nous
services.
avons initi avec la version 3.0 que nous allons continuer
de complmenter. Le support complet de JPA en fait partie.
David : Ce genre de choses est finalement assez simple
Mais nous allons galement mettre notre nergie sur le
mettre en place. Envoyez simplement un email
dveloppement de LiveRebel, lequel dispose d'un gros
sales@zeroturnaround.com.
potentiel et est attendu par plus de 200 socits. Cela se
traduira aussi par une innovation importante pour JRebel.
3. L'outil JRebel
Quels sont les plugins que vous comptez rajouter par la
Comment et quand le projet JRebel (anciennement suite JRebel, pour le support d'autres
JavaRebel) a-t-il vu le jour ? frameworks. Je pense par exemple
actuellement JSF, dont la configuration n'est
Jevgueni : JRebel a dmarr avec une ide courant aot
pas mise jour par JRebel et pour lequel
2006. A cette poque, je travaillais sur le rechargement
l'ajout de bean ncessite quand mme un
chaud chez Aranea et j'ai soudain eu l'ide de faire du
redmarrage, ou commons-chain, qui charge
rechargement chaud pour n'importe quel fragment de
une seule fois ses catalogues.
code Java. C'tait assez compliqu, mais aprs quelques
recherches j'ai pu mettre au point un prototype et le faire Jevgueni : JSF est pris en charge dans la version 3.0, :)
marcher en mars 2007. En septembre 2007 nous lancions Mojarra est d'ores et dj support et MyFaces le sera
une version publique en bta et les premires ventes ont galement bientt. Nous aimerions dsormais moins nous
dmarr en octobre la mme anne. Cela a t un parcours concentrer sur le support des frameworks et davantage
passionnant depuis. permettre la communaut de contribuer aux plugins plus
facilement. Il est dj assez simple de crer des plugins
David : Ce vendredi 16 avril (2010) nous avons sorti pour JRebel, mais nous prvoyons de le rendre trs vite
JRebel 3.0 et nous mesurons le long chemin parcouru encore plus simple. Si vous vous intressez l'criture
depuis la premire version. JRebel se concentre toujours et d'un plugin pour un framework en particulier, faites-moi
encore sur l'limination de la phase de redploiement dans signe directement par mail sur
le dveloppement Java EE, mais possde galement un jevgeni@zeroturnaround.com
support pour les EDI, gre les changements sur la structure
de classe, prend en charge le build instantan (avec des Si ce n'est pas un secret, combien de licences,
EAR, WAR, Maven, Ant), les changements dans la approximativement, avez-vous vendues de la
configuration (Spring, Guice, Struts 1 et 2, Log4J, version 2.2.1, quelle volution envisagez-vous
Tapestry4, Wicket, Stripes, Velocity), et couvre les pour les ventes de la version 3 ?
versions 1.6 1.4 de Java.
Jevgueni : Pour tre honnte, je ne suis pas sr du nombre
de ttes. C'est de l'ordre du millier. Je sais que nous avons
Estimez-vous aujourd'hui avoir des concurrents sur le
plus de 10 000 tlchargements par mois, et cela augmente
crneau couvert par JRebel ?
la manire de la forme d'une crosse de hockey..., hmm...
Jevgueni : Aucun qui ne nous inquite. peut-tre n'est ce qu'une expression valable au Canada ?
Avec la version 3.0, nous modifions lgrement le modle
David : Cela sonne comme une rponse typique de des licences, mais le changement le plus notable est l'ajout
commercial ! Comme nous nous amusons inverser les de l'Enterprise Add-On. Nous ajoutons le support de
rles, je vais complter la rponse pour celle-ci. La version technologies anciennes qui donnent mal la tte bon
courte est "oui, nous avons des concurrents". Il y a nombre de gens... versions majeures de serveurs
HotSwap, "Hot Redeploy" - qui se dcline selon diffrents d'applications en fin de vie, EJB 1.x et 2.x, et l'ajout d'un
noms (comme "FastSwap") selon le conteneur qui serveur de licences qui permettra aux plus importants
l'implmente. Malheureusement, la fois HotSwap et Hot consommateurs de grer leur parc de licences d'une
Redeploy ont d'importantes lacunes... il est plus simple manire plus efficace. Toutes les licences continueront
d'observer ce comparatif (Lien11) pour se faire une ide. tre sur une souscription annuelle et continueront vous
faire conomiser en moyenne cinq semaines de temps de
Avec quel EDI JRebel est-il actuellement le mieux dveloppement en redmarrage et redploiement.
intgr ? ZeroTurnaround se charge-t-il de Vraiment impressionnant.
proposer une intgration pour tous les EDI
principaux du march ou s'appuie-t-il sur les
communauts de ces derniers ?
Jevgueni : Nous fournissons un niveau de support environ
quivalent pour Eclipse et IDEA. Le plugin NetBeans ne
dispose pas de toutes les fonctionnalits que nous
proposons pour les autres EDI. Il y a quelques
contributions par la communaut (par exemple, le plugin
IDEA tait initialement une contribution), mais le plus
souvent nous prenons en charge leur dveloppement.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 4
4. La JVM et le systme de gestion dynamique des rapidement.
modules
LiveRebel, actuellement en bta prive, est-il la suite
logique de JRebel ? Pouvez-vous nous parler
Quelles limitations technologiques de la JVM aimeriez
un peu de ce nouveau produit ?
vous voir disparatre pour amliorer votre
produit. Autrement dit, avez vous des David : Nous avons eu normment de demandes de nos
fonctionnalits que vous aimeriez voir dans clients pour transposer la technologie JRebel du domaine
JRebel mais qu'il est techniquement du dveloppement vers celui de la production et des
impossible de raliser cause de la JVM ? applications en production. Cela a du sens pour nous
d'tudier ce besoin de manire trs srieuse et de voir ce
Jevgueni : En haut de ma liste : Interface Injection.
que nous pouvons proposer. J'ai relev une citation
Comparativement, cela devrait tre simple prendre en
quelque part qui disait que si Amazon.com venait
charge, tant donn que je suppose que cela ne ncessite
tomber, cela leur coterait 31 000 $ par minute, et j'ai
pas ncessairement la mise jour des vtables (qui sont
connaissance d'entreprises pour lesquels le cot serait plus
inline dans la JVM de Sun et sont la raison pour laquelle
lev, donc nous aimerions aider les entreprises
HotSwap ne permet pas l'ajout de mthodes).
conserver leurs applications en ligne mme dans le cadre
de procdures de mises jour mineures. Pour ceux qui
ZeroTurnaround pourrait-il tre intress de participer
sont intresss, nous avons un groupe pour la bta prive
l'amlioration dans OpenJDK du
de LiveRebel, auquel nous allons porter toute notre
fonctionnement du ClassLoader et de
attention sur l'anne venir : Lien12.
HotSwap ?
Jevgueni : Ce serait certainement intressant de faire cela, Pourrait-on voir apparatre dans l'offre de
nous avons discut de cette opportunit mais nous n'avons ZeroTurnaround des JRebel like pour d'autres
rien dcid pour le moment. plateformes, comme par exemple DotNET ?
Jevgueni : J'aimerais pouvoir rpondre oui cette
Que pensez-vous de l'effet de mode OSGi ?
question. :) Nous avons tudi la plateforme .NET et il lui
Jevgueni : C'est effectivement tendance. OSGi n'est utile manque les lments ncessaires la mise disposition de
qu'aux dveloppeurs de frameworks et de serveurs, les fonctionnalits que nous avons pour Java. Cela est
applications ne devraient pas avoir s'en proccuper. principalement d des manques dans le classloader qui
C'est une abstraction bas niveau utile, mais trop gnrique est une formidablement puissante abstraction qui peut
pour les applications. La bonne faon de l'utiliser consiste devenir dangereuse lorsqu'on en abuse.
construire une couche modulaire spcialise par dessus.
6. Conclusion
J'ai galement un problme avec la faon dont les class
loaders sont utiliss. Il est bien connu que les dpendances
Un message faire passer la communaut
circulaires avec OSGi peuvent occasionner des
francophone Java ?
interblocages (deadlocks) de class loader, et je suis assez
convaincu qu'OSGi favorise les leaks de class loader (ce David : Bien sr allez vous impliquer dans vos JUG (Java
n'est pas vraiment de sa faute, mais le modle du class User Groups) locaux. Au cours de ces dernires annes, les
loader en Java n'a jamais t pens pour tre utilis avec communauts franaises de JUG ont rellement perc dans
un graphe). de nombreuses villes de France. C'est formidable de voir
tant de gens se runir pour parler de Java et s'aider
5. A venir... mutuellement !

6.2. Liens
Esprez vous voir se dvelopper une communaut
autour de votre systme de plugin, o tout un Version originale de l'interview : Lien13.
chacun hbergerait, peut tre chez vous, ses ZeroTurnaround : Lien14.
propres plugins destination du public ? Tlchargez la dernire version de JRebel :
Jevgueni : Oui, c'est l'objectif. :) Nous envisageons Lien15.
quelque chose de ce genre, mais nous avons constat que Partagez vos retours sur JRebel : Lien16.
sans notre attention, les pages communautaires tendent Vos questions sur les outils pour Java : Lien17.
rapidement stagner. Maintenant que l'adoption de JRebel
progresse de manire exponentielle, nous avons vraiment Retrouvez l'interview d'Eric Siber et David Delbecq en
besoin de relancer cette communaut de plugins ligne : Lien18

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 5
Android
Les derniers tutoriels et articles
Personnaliser une ListView
Personnaliser une ListView

Cet article est une introduction la manipulation des listes sous Android via le composant ListView. Il permet de
comprendre les bases de l'affichage des items.
1. Prsentation
Sous Android, le composant principal pour afficher et
grer une liste de donnes est le composant ListView. Par
dfaut ce composant affiche une liste de chanes de
caractres. Selon les besoins, il peut tre ncessaire
d'afficher plus d'informations sur chaque ligne de la liste,
ou mme de venir effectuer des oprations particulires
suite des actions sur les lignes.

Dans un premier temps nous allons voir comment afficher


une liste toute simple ne contenant que des chanes de
caractres, puis nous verrons comment personnaliser
l'affichage des items de la liste et enfin comment ajouter
des actions sur les items.

2. Liste de chanes de caractres


Le SDK nous propose un type d'Activity particulier pour
les vues affichant une liste : ListActivity (Lien19). Cette
activity intgre de base pas mal de mcanismes pour grer
les listes.

Il y a galement moyen de grer tout depuis le dbut et


d'afficher une liste depuis une Activity classique.
Maintenant on va changer le type de notre DVPList1.
2.1. Affichage avec une ListActivity l'heure actuelle, c'est une Activity standard. Nous allons
changer a et la remplacer par une ListActivity.
Dans un premier temps, crez un nouveau projet
("Dvp_ListActivity" par exemple). Choisissez le SDK que public class DVPList1 extends Activity {
vous souhaitez ; pour ma part, je me baserais sur la
dernire version (2.1), mais le code est galement valide devient :
pour les versions antrieures.
public class DVPList1 extends ListActivity {
Sur le wizard de cration de projet, il vous est propos de
crer galement une Activity, on va en profiter pour le Maintenant, notre activit sait grer naturellement une liste
faire tout de suite. de donnes. Le problme c'est qu'on n'en a pas encore cr
dans notre layout. Pour ce faire, on ouvre le fichier
Choisissez comme nom pour votre Activity : main.xml et on ajoute le composant ListView.
"DVPList1". Le layout associ sera "main.xml".
<?xml version="1.0" encoding="utf-8"?>
Voici ce que vous devriez avoir sur votre wizard de <LinearLayout
cration de projet : xmlns:android="http://schemas.android.com/apk/res
/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 6
devient :
L'adapter permet de grer les donnes et de raliser le
<?xml version="1.0" encoding="utf-8"?> mapping relationnel entre les donnes et l'IHM. Le
<LinearLayout premier paramtre (this) permet d'identifier le contexte
xmlns:android="http://schemas.android.com/apk/res dans lequel notre adapter va fonctionner. Le deuxime
/android"
android:orientation="vertical"
paramtre "android.R.layout.simple_list_item_1" permet
android:layout_width="fill_parent" d'indiquer la prsentation utilise pour les items de notre
android:layout_height="fill_parent" liste. Ici, il s'agit d'une prsentation simple pour les
> chanes de caractres incluses dans le SDK.
<ListView android:id="@android:id/list"
android:layout_width="wrap_content" L'appel de cette mthode permet donc d'afficher notre
android:layout_height="wrap_content"> liste. Ainsi, si nous excutons notre projet, nous obtenons
</ListView> ceci :
</LinearLayout>

Une chose importante ce niveau-l est l'identifiant du


composant ListView : "@android:id/list". Ici on ne peut
pas mettre un identifiant personnel comme on peut le faire
pour les autres composants, il faut mettre celui indiqu
pour que les mcanismes de gestion de vues (ceux prsents
dans ListActivity) arrivent bien fonctionner. En effet, en
mettant un identifiant personnalis, l'objet ListActivity
n'arriverait pas retrouver notre composant ListView dans
notre layout et on obtiendrait des exceptions du style :

Caused by: java.lang.RuntimeException: Your


content must have a ListView whose id attribute
is 'android.R.id.list'

Maintenant que notre layout contient une liste et que notre


activit sait la grer, on peut donc remplir celle-ci. Pour ce
faire, nous allons tout d'abord initialiser un tableau de
chanes de caractres de la manire suivante :

private String[] mStrings = {


"AAAAAAAA", "BBBBBBBB", "CCCCCCCC",
"DDDDDDDD", "EEEEEEEE", Les sources de cette application sont tlchargeable ici :
"FFFFFFFF", "GGGGGGGG", "HHHHHHHH", Lien20.
"IIIIIIII", "JJJJJJJJ",
"KKKKKKKK", "LLLLLLLL", "MMMMMMMM", 2.2. Affichage sans ListActivity
"NNNNNNNN", "OOOOOOOO",
"PPPPPPPP", "QQQQQQQQ", "RRRRRRRR", Maintenant que nous avons vu comment bnficier des
"SSSSSSSS", "TTTTTTTT", avantages des ListActivity, nous allons voir comment
"UUUUUUUU", "VVVVVVVV", "WWWWWWWW", reproduire ce mcanisme de gestion de listes de A Z.
"XXXXXXXX", "YYYYYYYY",
"ZZZZZZZZ"
Pour ce faire, nous allons repartir de zro et rcrer un
}; nouveau projet comme indiqu sur l'image suivante :

Ici l'initialisation du tableau est statique, mais on peut trs


bien imaginer que les informations contenues dans ce
tableau proviennent par exemple d'un webservice, d'un
fichier XML, d'un provider du systme, etc.

Il ne nous reste plus qu' afficher ces donnes dans notre


liste. Pour ce faire, nous allons utiliser les fonctionnalits
proposes par ListActivity :

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ArrayAdapter<String> adapter = new


ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mStrings);

setListAdapter(adapter);
}

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 7
Maintenant nous allons diter le fichier "main.xml" afin de
lui rajouter un composant ListView.

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res
/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>

devient :

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout
xmlns:android="http://schemas.android.com/apk/res Comme vous pouvez le voir, il n'y a pas de diffrence
/android" notable entre les deux versions, le rendu est le mme. Pour
android:orientation="vertical"
android:layout_width="fill_parent"
l'instant le seul avantage d'utiliser une ListActivity par
android:layout_height="fill_parent">
rapport un Activity classique rside dans le fait qu'il n'y a
pas besoin de rcuprer l'instance du composant ListView
<ListView android:id="@+id/ListView01" dans l'IHM.
android:layout_width="wrap_content"
android:layout_height="wrap_content"> Les sources de cette application sont tlchargeable ici :
</ListView> Lien21.
</LinearLayout>
3. Personnalisation des items
Dans notre Activity DVPList1, de la mme faon que dans Dans cette partie, nous allons voir comment personnaliser
l'exemple prcdent, nous allons initialiser un tableau de notre liste et surtout, comment personnaliser la
String de manire statique ( titre d'exemple) : prsentation des items de la liste. Le thme de cet exercice
sera d'afficher une liste de personnes. Une personne aura
private String[] mStrings = {
un nom, un prnom, un genre (Masculin / Fminin).
"AAAAAAAA", "BBBBBBBB", "CCCCCCCC",
"DDDDDDDD", "EEEEEEEE",
"FFFFFFFF", "GGGGGGGG", "HHHHHHHH", Dans un premier temps, nous allons crer un projet
"IIIIIIII", "JJJJJJJJ", "DVP_List2", tel que dcrit sur ce wizard :
"KKKKKKKK", "LLLLLLLL", "MMMMMMMM",
"NNNNNNNN", "OOOOOOOO",
"PPPPPPPP", "QQQQQQQQ", "RRRRRRRR",
"SSSSSSSS", "TTTTTTTT",
"UUUUUUUU", "VVVVVVVV", "WWWWWWWW",
"XXXXXXXX", "YYYYYYYY",
"ZZZZZZZZ"
};

Maintenant, nous allons crer un adapter (comme dans


l'exemple prcdent) afin de fournir notre liste de donnes
au composant ListView :

//Cration de l'adapter
ArrayAdapter<String> adapter = new
ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mStrings);

//Rcupration du ListView prsent dans notre IHM


ListView list =
(ListView)findViewById(R.id.ListView01);

//On passe nos donnes au composant ListView


list.setAdapter(adapter);
Ensuite, nous allons crer une classe pour reprsenter les
Voici ce que nous obtenons l'excution : personnes. Cette classe contient trois proprits : "nom",

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 8
"prenom" et "genre". Afin de simplifier les <LinearLayout
dveloppements et l'exemple, on rajoute une mthode xmlns:android="http://schemas.android.com/apk/res
/android"
static dans cette classe pour remplir et renvoyer une liste
android:orientation="vertical"
de personnes. Le code de la classe donne donc : android:layout_width="fill_parent"
android:layout_height="fill_parent">
package com.dvp.list;
<ListView android:id="@+id/ListView01"
import java.util.ArrayList; android:layout_width="wrap_content"
android:layout_height="wrap_content">
public class Personne { </ListView>
public final static int MASCULIN = 1; </LinearLayout>
public final static int FEMININ = 2;

Les personnes possdent trois proprits. Il n'est donc plus


public String nom;
public String prenom;
possible de passer par le layout standard pour les afficher.
public int genre;
Nous allons donc crer un nouveau layout et l'utiliser pour
afficher les items de la liste. Ajoutez un nouveau fichier
public Personne(String aNom, String XML dans le rpertoire layout de votre application. (Clic
aPrenom, int aGenre) { droit sur votre projet, choisissez "New" puis "Android
nom = aNom; XML file"). Configurez le wizard tel qu'indiqu sur
prenom = aPrenom; l'image suivante :
genre = aGenre;
}

/**
* Initialise une liste de personnes
* @return une liste de "Personne"
*/
public static ArrayList<Personne>
getAListOfPersonne() {
ArrayList<Personne> listPers =
new ArrayList<Personne>();

listPers.add(new Personne("Nom1",
"Prenom1", FEMININ));
listPers.add(new Personne("Nom2",
"Prenom2", MASCULIN));
listPers.add(new Personne("Nom3",
"Prenom3", MASCULIN));
listPers.add(new Personne("Nom4",
"Prenom4", FEMININ));
listPers.add(new Personne("Nom5",
"Prenom5", FEMININ)); Dans ce nouveau layout, nous allons donc ajouter deux
listPers.add(new Personne("Nom6", TextView pour dcrire les nom et prnom de chaque
"Prenom6", MASCULIN)); personne. Le genre de la personne sera dcrit par la
listPers.add(new Personne("Nom7",
"Prenom7", FEMININ));
couleur de fond de notre item : bleu pour les garons, rose
listPers.add(new Personne("Nom8",
pour les filles :). Le XML de notre item doit donc
"Prenom8", MASCULIN)); ressembler a :
listPers.add(new Personne("Nom9",
"Prenom9", MASCULIN)); <?xml version="1.0" encoding="utf-8"?>
listPers.add(new <LinearLayout
Personne("Nom10", "Prenom10", FEMININ)); xmlns:android="http://schemas.android.com/apk/res
listPers.add(new /android"
Personne("Nom11", "Prenom11", MASCULIN)); android:layout_width="wrap_content"
listPers.add(new android:layout_height="wrap_content"
Personne("Nom12", "Prenom12", MASCULIN)); android:id="@+id/LL_Fond">
listPers.add(new
Personne("Nom13", "Prenom13", FEMININ)); <TextView android:text="Nom"
listPers.add(new android:id="@+id/TV_Nom"
Personne("Nom14", "Prenom14", MASCULIN)); android:layout_width="wrap_content"
android:layout_height="wrap_content">
return listPers; </TextView>
}
} <TextView android:text="Prnom"
android:id="@+id/TV_Prenom"
Maintenant, dans le layout XML (main.xml), rajoutez le android:layout_width="wrap_content"
composant ListView. Le code XML du layout doit android:layout_height="wrap_content">
</TextView>
correspondre ceci :
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?> Il ne nous reste plus qu' afficher la liste des personnes en

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 9
utilisant notre layout. Pour ce faire, nous allons crer un if (convertView == null) {
objet qui se chargera de grer le mapping entre nos //Initialisation de notre item partir
donnes et le layout des items. Ce composant sera bas sur du layout XML "personne_layout.xml"
layoutItem = (LinearLayout)
un Adapter. Dans Eclipse, crez une nouvelle classe : mInflater.inflate(R.layout.personne_layout,
"PersonneAdapter". Faites-la hriter de "BaseAdapter". parent, false);
} else {
public class PersonneAdapter extends BaseAdapter layoutItem = (LinearLayout) convertView;
{ }

L'Adapter va grer une liste de personnes et va s'occuper //(2) : Rcupration des TextView de notre
galement de l'affichage. On va donc lui ajouter trois layout
proprits TextView tv_Nom =
(TextView)layoutItem.findViewById(R.id.TV_Nom);
TextView tv_Prenom =
// Une liste de personnes (TextView)layoutItem.findViewById(R.id.TV_Prenom)
private List<Personne> mListP; ;

//Le contexte dans lequel est prsent notre //(3) : Renseignement des valeurs
adapter tv_Nom.setText(mListP.get(position).nom);
private Context mContext; tv_Prenom.setText(mListP.get(position).prenom);

//Un mcanisme pour grer l'affichage graphique //(4) Changement de la couleur du fond de notre
depuis un layout XML item
private LayoutInflater mInflater; if (mListP.get(position).genre ==
Personne.MASCULIN) {
Le constructeur va alors ressembler ceci : layoutItem.setBackgroundColor(Color.BLUE);
} else {
public PersonneAdapter(Context context, layoutItem.setBackgroundColor(Color.MAGEN
List<Personne> aListP) { TA);
mContext = context; }
mListP = aListP;
mInflater = LayoutInflater.from(mContext); //On retourne l'item cr.
} return layoutItem;
}

Le LayoutInflater permet de parser un layout XML et de le


transcoder en IHM Android. Pour respecter l'interface Le paramtre "convertView" permet de recycler les
BaseAdapter, il nous faut spcifier la mthode "count()". lments de notre liste. En effet, l'opration pour convertir
Cette mthode permet de connatre le nombre d'items un layout XML en IHM standard est trs coteuse pour la
prsents dans la liste. Dans notre cas, il faut donc renvoyer plateforme Android. On nous propose ici de rutiliser des
le nombre de personnes contenu dans "mListP". occurrences cres qui ne sont plus affiches. Donc si ce
paramtre est "null" alors, il faut "inflater" notre layout
public int getCount() { XML, sinon on le rutilise (1). Maintenant que notre
return mListP.size(); layout est initialis, on peut rcuprer les deux champs
} texte qui y sont prsents (2) afin de modifier leur valeur
(3). Afin de respecter notre contrat, les garons doivent
Ensuite, il y a deux mthodes pour identifier les items de tre en bleu et les filles en rose. Il nous suffit donc de
la liste. Une pour connatre l'item situ une certaine changer la couleur du fond (4).
position et l'autre pour connatre l'identifiant d'un item en
fonction de sa position. Pour rsumer, nous avons une vue contenant une liste
(main.xml), une description de la prsentation d'un item de
public Object getItem(int position) { la liste (personne_layout.xml) et un composant pour grer
return mListP.get(position); le mapping donne - IHM (PersonneAdapter.java). Il ne
} nous reste donc plus qu' afficher notre liste. Pour ce faire,
modifiez l'Activity principale, DVPList2.java :
public long getItemId(int position) {
return position; public void onCreate(Bundle savedInstanceState) {
} super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Maintenant il faut surcharger la mthode pour renvoyer
une "View" en fonction d'une position donne. Cette view //Rcupration de la liste des personnes
contiendra donc une occurrence du layout ArrayList<Personne> listP =
Personne.getAListOfPersonne();
"personne_layout.xml" convenablement renseigne (avec
le nom et prnom au bon endroit). //Cration et initialisation de l'Adapter
pour les personnes
public View getView(int position, View PersonneAdapter adapter = new
convertView, ViewGroup parent) { PersonneAdapter(this, listP);
LinearLayout layoutItem;
//(1) : Rutilisation des layouts

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 10
//Rcupration du composant ListView aListener) {
ListView list = mListListener.add(aListener);
(ListView)findViewById(R.id.ListView01); }

//Initialisation de la liste avec les donnes


La prochaine mthode permet de prvenir tous les listeners
list.setAdapter(adapter);
en mme temps pour diffuser une information :
}

private void sendListener(Personne item, int


Maintenant, si vous excutez votre programme, vous position) {
devriez obtenir ceci : for(int i = mListListener.size()-1; i >= 0;
i--) {
mListListener.get(i).onClickNom(item,
position);
}
}

Le mcanisme pour ajouter / prvenir les listeners est en


place. On peut ajouter le listener interne sur le clic du
TextView du nom des personnes. Pour ce faire, dans la
mthode "getView" de l'adapter, ajoutez ceci :

if (mListP.get(position).genre ==
Personne.MASCULIN) {
layoutItem.setBackgroundColor(Color.BLUE);
} else {
layoutItem.setBackgroundColor(Color.MAGENTA);
}

//------------ Dbut de l'ajout -------


//On mmorise la position de la "Personne" dans
le composant textview
tv_Nom.setTag(position);
//On ajoute un listener
tv_Nom.setOnClickListener(new OnClickListener() {
Les sources de cette application sont tlchargeables ici :
Lien22. @Override
public void onClick(View v) {
4. Ajout d'vnements //Lorsque l'on clique sur le nom,
on rcupre la position de la "Personne"
Nous allons maintenant voir comment ajouter un Integer position =
mcanisme pour couter ce qu'il se passe sur notre liste. (Integer)v.getTag();
Nous allons simplement enrichir l'application prcdente.
Le but de ce prochain exemple sera d'couter si l'utilisateur //On prvient les listeners qu'il
clique sur le nom d'une personne. y a eu un clic sur le TextView "TV_Nom".
sendListener(mListP.get(position)
, position);
Dans un premier temps, crez une interface pour votre
listener personnalis et dans votre fichier }
"PersonneAdapter.java", rajoutez la partie suivante :
});
/** //------------ Fin de l'ajout -------
* Interface pour couter les vnements sur le
nom d'une personne
return layoutItem;
*/
public interface PersonneAdapterListener {
public void onClickNom(Personne item, int Maintenant, nous allons retravailler sur notre activity
position); principale (DVPList2.java) pour qu'elle coute les
} vnements sur notre liste. Tout d'abord, faites-l
implmenter notre interface "PersonneAdapterListener" :
Ensuite, crez le mcanisme pour grer l'ajout de listener
sur notre adapter : public class DvpList2 extends Activity implements
PersonneAdapterListener {
//Contient la liste des listeners
private ArrayList<PersonneAdapterListener> Rajoutez la mthode dclenche lors d'un clic sur le nom
mListListener = new d'une personne. Dans notre cas, un popup s'ouvrira pour
ArrayList<PersonneAdapterListener>(); donner le nom de la personne cliqu.
/**
* Pour ajouter un listener sur notre adapter
public void onClickNom(Personne item, int
*/ position) {
public void addListener(PersonneAdapterListener

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 11
Builder builder = new souhaitez couter les vnements (onClick) sur une liste
AlertDialog.Builder(this); depuis une activity de type "ListActivity", il vous suffit de
builder.setTitle("Personne"); surcharger la mthode onListItemClick :
builder.setMessage("Vous avez cliqu
protected void onListItemClick(ListView l, View
sur : " + item.nom);
v, int position, long id)
builder.setPositiveButton("Oui", null);
builder.setNegativeButton("Non", null);
builder.show(); A partir de l, vous pourrez rcuprer l'item qui a t
} slectionn par l'utilisateur. Voici un exemple
d'implmentation qui peut tre insr dans la classe
Et enfin, branchez votre listener sur votre liste : DVP_List1.java de l'exemple du paragraphe I :

@Override
public void onCreate(Bundle savedInstanceState) {
protected void onListItemClick(ListView l, View
super.onCreate(savedInstanceState);
v, int position, long id) {
setContentView(R.layout.main);
super.onListItemClick(l, v, position, id);

ArrayList<Personne> listP =
Builder builder = new
Personne.getAListOfPersonne();
AlertDialog.Builder(this);
PersonneAdapter adapter = new
builder.setTitle("Item");
PersonneAdapter(this, listP);

builder.setMessage("Vous avez cliqu sur : " +


//Ecoute des vnements sur votre liste
mStrings[position]);
adapter.addListener(this);
builder.setPositiveButton("Oui", null);
builder.setNegativeButton("Non", null);
ListView list =
builder.show(); }
(ListView)findViewById(R.id.ListView01);

list.setAdapter(adapter); 5. Conclusion
}
Pour conclure, l'utilisation des composants pour lister les
donnes sous Android peut dans un premier temps paratre
Maintenant, si vous excutez votre programme, vous trs simple pour une utilisation basique, mais offre
devriez obtenir ceci : galement de puissants moyens de personnalisation ds
que l'on souhaite enrichir un peu plus notre interface. Ce
tutoriel vous aura permis de dcouvrir les bases de ces
personnalisations, il y en a encore bien d'autres,
notamment les optimisations d'affichage (en plus de celle
que l'on a dcouvert dans le paragraphe III).

6. Liens
Site du dveloppeur : Lien24
FAQ Android : Lien25
Installation de l'environnement : Lien26

Retrouvez l'article de Mickal Le Trocquer en ligne :


Lien27

Les sources de cette application sont tlchargeables ici :


Lien23.
Je tiens galement vous faire remarquer que si vous

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 12
PHP
Les derniers tutoriels et articles
Compilation dtaille de PHP sous Linux
Compilation dtaille de PHP sous Linux

PHP est crit en C et, ce titre, il est compilable en langage machine. Nous allons dtailler comment fonctionne ce
processus sous Linux, ainsi qu'une partie de l'cosystme de PHP : ses extensions, les bibliothques utilises, son
moteur... Pour suivre cet article, vous devez connatre le langage PHP et avoir quelques notions d'UNIX, c'est tout.
Nous effleurerons galement quelques concepts relatifs au langage C, sans rentrer dans les dtails. La version de
PHP considre est 5.3.x.

1. Premier pas avec la compilation de PHP nombreuses pas forcment disponibles sans passer par la
case compilation manuelle), ou encore activer des options
Avant tout, compiler c'est quoi ? C'est trs simple : c'est
trs spciales dont nous reparlerons plus tard.
transformer un langage informatique en un autre. Le
Enfin, cela vous permettra sans aucun doute de mieux
moteur du langage PHP est crit en C, pour obtenir
matriser le langage : la compilation peut tre assimile
l'environnement PHP il faut donc le compiler, c'est--dire
la fabrication et la naissance d'un PHP faites par vos soins,
transformer son code source C en un code binaire
de vos propres mains.
excutable par le processeur de la machine cible. Ce code
sera encapsul dans un binaire que vous pourrez excuter :
Pourquoi faire cela sous Linux ? PHP a t conu pour
ce sera PHP !
Unix, puis a t port sous Windows et autres systmes
PHP est open source, vous pouvez donc tlcharger son
non Unix. Quoi qu'on en dise, PHP est plus performant
code source, l'tudier, le modifier et le transformer (le
sous Linux et beaucoup plus facile compiler sous ce
compiler).
systme (au sein duquel il est n il y a maintenant 15 ans)
que sous un autre, particulirement Windows. Lorsque
1.1. Quelques questions pour un bon dpart
PHP est sous Linux, considrez cela comme un poisson
Je peux dj rcuprer PHP sur le site officiel, sans dans l'eau : il est dans son milieu, dispose de tout ce dont il
tlcharger ses sources ? Oui, vous pouvez tlcharger ce a besoin nativement et se sent en pleine forme.
que l'on appelle "les binaires". En fait, il s'agit d'un PHP
compil par les dveloppeurs du langage. Compiler PHP sous Linux, c'est difficile ? J'espre que ce
Il a t compil "basiquement", pour rpondre une trs tutoriel saura vous dmontrer que NON : absolument pas,
large palette de besoins, mais pas forcment aux vtres. c'est un jeu d'enfant. Vous devez simplement tre familier
de Linux (sans pour autant tre un pro), c'est tout.
Je peux aussi trouver PHP dans des packages comme
WampServer, Xamp ou ZendServer, des prcisions ? Oui ; 1.2. Prparation du systme
ces logiciels sont l'oppos du "pourquoi compiler moi-
Nous allons utiliser un systme Ubuntu Server (Lien28).
mme ?", ils encapsulent un PHP sur lequel vous n'avez la
Historiquement, le systme le moins "galre" pour
plupart du temps aucun pouvoir de dcision. Il est aussi
compiler PHP et l'utiliser est Debian.
possible qu'ils aient eux-mmes compil le PHP qu'ils
Ubuntu est une branche trs proche de Debian, les
embarquent avec des options qui en restreignent l'usage
manipulations notes ici seront quasi identiques sous
(par exemple, il n'est pas possible de charger telle
Debian. Concernant les autres systmes Linux, a ne
extension donne). Ce sont des solutions convenables si
change pas beaucoup, c'est vraiment trs ressemblant.
vous ne souhaitez vraiment pas vous embter, mais soyez
Idem pour les systmes Unix, il existe quelques
conscients que vous laissez des personnes tierces
diffrences avec Linux selon les distributions, mais
configurer PHP du cur l'piderme, sans que vous ayez
vraiment rien de trs mchant.
la main sur quoi que ce soit.
Utilisez une machine virtuelle ! Pour installer un systme
Pourquoi compiler PHP moi-mme alors ? Il y a beaucoup
Ubuntu Server sans toucher votre machine, utilisez une
d'avantages cela : dj vous pourrez utiliser des options
machine virtuelle. Si votre systme hte est Windows,
de compilation propres votre plateforme. Vous
vous vous retrouverez avec un poste de dveloppement
obtiendrez ainsi un PHP prt tre excut sur votre
PHP sous Windows, mais pouvant excuter un PHP
machine, pour son processeur, avec toutes les
totalement personnalis et cr par vos soins sous Linux,
optimisations qui le concernent. Par rapport aux binaires
ce qui offre des avantages considrables.
PHP que vous pouvez tlcharger pour votre systme,
Je vous conseille l'utilisation de VirtualBox (Lien29)
vous gagnerez en performance et vous pourrez atteindre
comme hyperviseur, si vous ne savez pas vers quoi vous
(avec des connaissances et de l'exprience) un gain
tourner.
pouvant aller jusqu' 10 ou 15 % dans certains cas.
Ensuite, compiler soi-mme PHP c'est pouvoir le
A partir de maintenant, nous supposons que vous disposez
personnaliser la source : inclure ou exclure des
d'un systme Ubuntu Server, classiquement install sans
extensions au langage (et vous savez qu'il en possde des

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 13
option superflue. Nous supposons aussi que le systme est Lorsqu'une bibliothque dpendante va manquer, le script
jour. Excutez les commandes aptitude update puis configure chouera avec un message d'erreur. Ce message
aptitude safe-upgrade si ce n'est pas le cas. est peu explicite pour un nophyte, mais pour un
informaticien avec un peu de jugeote, il est suffisamment
2. Au cur de PHP clair.
C'est l que le systme d'exploitation entre en jeu : soit
Il ne va pas s'agir ici de dcrire prcisment le
celui-ci est bourr craquer de bibliothques C, auquel cas
fonctionnement du langage, mais plutt de manire
il est fort peu probable que le script configure choue, soit
globale. C'est essentiel pour pouvoir comprendre la
il est raisonnablement lourd en bibliothques C, auquel cas
compilation des sources.
il faut qu'il dispose d'un gestionnaire de paquets
Vous savez que PHP est modulaire, entendons par l qu'il
suffisamment riche pour pouvoir rcuprer celles-ci
dispose d'un corps (des fonctionnalits de base) enrichi par
facilement.
des extensions. Que ce soient les extensions de PHP ou
Ubuntu Server ne dispose pas de tout ce qu'il faut
bien son cur le plus profond, tout son code source est
nativement pour compiler PHP sur le tas (presque), mais
crit en C ( 98 %). Or en C, comme en PHP, on se sert
dispose de dpts logiciels riches et on trouvera toutes les
d'extensions, que l'on appelle des bibliothques ("libraries"
bibliothques que l'on souhaite lui ajouter assez
en anglais).
rapidement.
Bien sr il reste aussi la possibilit de tlcharger la
Les bibliothques C dont se sert PHP peuvent tre vues
bibliothque directement sur Internet sur le site de celle-ci,
comme un ensemble de fonctions C dont le code source de
c'est plus pnible mais parfois ncessaire si le gestionnaire
PHP tire parti.
de paquets ne connat pas la bibliothque en question ou
Prenons un exemple : les fonctionnalits XML de PHP.
ne possde pas la bonne version.
Vous connaissez DOM, SimpleXml, SOAP etc. Ces
fonctionnalits ont t en partie codes par les
2.2. L'architecture de PHP (simplifie)
dveloppeurs de PHP. En partie seulement, car analyser du
code XML, trouver les noeuds, valider avec des DTD ou La compilation, c'est aussi la possibilit d'ajouter de
des schmas... sont autant de fonctionnalits qui existent nombreuses briques au mur PHP que vous tentez de
aussi hors de PHP. Prenez un langage comme Python : il monter (schmatiquement). Au travers du script configure,
sait aussi faire tout cela. vous allez pouvoir ajouter, ou au contraire retirer des
Ainsi, les fonctionnalits communes sont crites dans des fonctionnalits au langage PHP. Trs souvent ce seront des
bibliothques C qu'on appelle bibliothques partages, extensions (je suppose que tout le monde connait le
ou shared libraries. Notez au passage que lorsque ces systme d'extension de PHP), parfois ce seront des options
bibliothques sont compiles, on appelle cela des shared et vous allez voir que PHP est trs riche sur ce point.
objects, dont l'extension est .so , je pense que a vous dit
quelque chose non ? PHP se dcompose globalement en trois parties : le
moteur, le cur et les extensions.
Pour rsumer : le code source de PHP repose sur tout un Sans rentrer dans les dtails, le moteur est la partie la plus
tas de bibliothques C dont vous aurez besoin pour indispensable et la plus complexe : le ZendEngine.
compiler PHP lui-mme. Si une bibliothque manque... Eh L-dessus se greffe le cur : un ensemble de
bien en PHP il se passe quoi ? En gnral : fatal error, il fonctionnalits vitales PHP (les fonctions de base,
manque du code source et ce sera pareil pour compiler comme fopen() - les tableaux - les chaines), c'est son
PHP, s'il manque une bibliothque utilise par le code enveloppe minimale.
source que vous tentez de compiler, la compilation Enfin viennent les extensions qui enrichissent le langage.
chouera fatalement.
Lors de la compilation, vous pouvez ne choisir que le cur
2.1. Dpendances des bibliothques C (avec le moteur bien sr) : vous aurez alors un PHP
extrmement lger, trs rapide, mais qui ne saura en
Nous n'allons pas entrer dans les dtails de la
contrepartie pas faire grand chose.
programmation C, ni mme de la compilation de code C.
Au contraire, vous aurez aussi la possibilit de compiler de
Des articles et des tonnes de livres existent ce sujet.
nombreuses extensions dans PHP : le langage deviendra
Ct pratique, les questions suivantes ressortent donc : de
alors extrmement riche en fonctionnalits, mais au prix
quelles bibliothques C PHP a-t-il besoin pour tre
de performances lgrement moindres et d'un binaire PHP
compil ? O trouver ces bibliothques ?
compil trs lourd (plusieurs dizaines de Mo). A vous de
voir, c'est vous le capitaine bord du navire !
Heureusement, sous Linux tout a t prvu. Avant de
lancer une compilation, nous allons lancer un script qui va
Le script configure utilise une configuration par dfaut que
permettre deux choses : prciser quelles sont les options,
vous trouvez sur php.net. Par exemple, sans rien
les briques, les extensions que l'on veut compiler dans
personnaliser, PHP est compil avec le support complet de
PHP, et surtout : est-ce que celles-ci sont disponibles sur le
XML.
systme actuel ?
Plus vous ajouterez d'extensions ou de possibilits au
On appelle cela le script configure.
langage, plus il vous faudra de bibliothques C tierces, et
Un nombre incalculable de projets sous Linux utilise ce
plus le temps de compilation sera long. Aussi, il est tout
systme-l qui date d'il y a trs longtemps. Le noyau Linux
fait possible la compilation d'embarquer des extensions
lui-mme utilise un tel systme de compilation ainsi que
PECL dans PHP. PECL (PHP Extensions Code Libraries
des bibliothques C utilises par PHP.
(Lien30)) est un dpt d'extensions qui n'ont pas t

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 14
choisies pour faire partie du code source distribu de PHP, Bon, les habitus de Linux et de la compilation ne seront
ni des binaires PHP par dfaut. Mais PECL regorge pas surpris (et sauront d'ailleurs continuer tout seuls).
d'extensions dont vous ignorez coup sr l'existence, et
qui risquent de vous tonner. Nous verrons cela par la Nous n'allons pas tout dtailler, seulement certaines parties
suite. qui vous permettront par la suite de vous lancer et
d'exprimenter.
Enfin, sachez qu'il existe deux modes de liaisons des Je vous conseille vivement - si vous dcouvrez un
extensions dans PHP : statique ou partage (on dit aussi "nouveau terrain" en voyant le rsultat de configure - de
dynamique). On retombe l sur des concepts de C et du vous familiariser avec le langage C sous Linux. Vous
dveloppement informatique en gnral. Retenez dcouvrirez alors configure en dtail, mais aussi l'outil
simplement que la compilation d'une extension de manire make, les autotools Unix et tout le vaste univers qui tourne
statique la fusionnera dans le cur de PHP et celle-ci ne autour.
sera plus dsactivable notamment au moyen de php.ini.
Dans ce mode-l, l'extension fait partie de PHP, ce qui Les options sont spares en sections, celles du dessus ne
offre un gain en performance, surtout si vous utilisez (en nous intressent pas ici. La partie SAPI modules permet
PHP donc) l'extension de manire intensive. comme son nom l'indique de configurer les modules SAPI.
En mode partag, l'extension est charge par un Une Server Application Programming Interface (SAPI) est
mcanisme spcifique, au lancement de PHP (ou via sa une interface d'interaction avec PHP, les plus connues sont
fonction dl()) : cela offre l'avantage de pouvoir dmarrer CLI (ligne de commandes), APXS (Apache), CGI.
PHP avec ou sans cette extension et donc d'allger son L'utilisation de embed (embarqu) est aussi intressante
empreinte mmoire et son poids au runtime (au dmarrage pour des programmes C qui veulent intgrer de la syntaxe
du langage) ou encore d'utiliser alternativement plusieurs PHP, nous y reviendrons.
versions d'une mme extension. En contrepartie, le Vient ensuite la partie General settings dont je vous laisse
chargement dynamique lie l'extension au cur par "des deviner l'utilit puis Extensions qui est la plus
ficelles" (schmatiquement) : l'extension sera moins volumineuse et la plus utile : quoi embarquer dans PHP ?
performante que si elle est lie statiquement, a se joue On pourra noter la fin les sections PEAR, Zend
trs peu mais si vous utilisez l'extension de manire (configuration du moteur et de la machine virtuelle),
intensive dans un environnement haute charge, ce dtail TSRM (gestion de la Thread Safety), Libtool (Options
a son importance. gnrales de la LibTool Unix).

3. Prparation des sources 4. Installation basique


Aprs ces quelques notions simplifies, nous pouvons Toutes les options de configuration sont passer en
dmarrer. Avant de compiler, il faut rcuprer les sources paramtres configure.
et les prparer au moyen du script configure livr avec les --prefix=/home/julien/monphp permet d'indiquer o
sources. installer PHP une fois qu'il a t compil. Par dfaut,
/usr/local est utilis, mais des droits root seront
Nous supposons que l'installation se fait dans votre /home, ncessaires pour crire dans ce rpertoire. Nous avons
de manire ce que votre utilisateur possde tous les choisi d'installer dans /home/julien/monphp que nous
droits ncessaires sur son arborescence. avons cre prcdemment. Evidemment, vous aurez
Une installation en conditions de production se ferait remplac julien par votre nom de compte.
plutt dans /usr/local, et ncessiterait des droits root.
A ce stade, il est possible de lancer la commande. S'en
prparation des sources suivra alors une prparation de PHP et une vrification de
/> cd ~ toutes les dpendances ncessaires.
~> mkdir -p monphp/src && cd monphp/src Un dtail important : tout ce qui est --disable-xxx permet
~/monphp/src> wget http://fr.php.net/get/php- de dsactiver une fonctionnalit alors que --enable-xxx ou
5.3.2.tar.gz/from/this/mirror
--with-xxx permet d'activer une fonctionnalit.
~/monphp/src> tar xzf php-5.3.2.tar.gz
Vous en dduisez donc que tout ce qui vous propose
~/monphp/src> cd php-5.3.2
--disable-xxx suppose que par dfaut, la fonctionnalit est
active. On peut donc remarquer que, par exemple, la
Nous venons de crer une arborescence minimale sous prsence de --disable-phar indique que le support de Phar
/home/votre-utilisateur : un dossier de travail (monphp) sera activ par dfaut si on ne prcise pas le contraire, et
puis un dossier contenant les sources (src). Nous avons inversement : la prsence de, par exemple, --enable-soap
tlcharg PHP5.3 dedans (la version la plus rcente la indique que par dfaut le support de Soap n'est pas inclus.
date d'criture de cet article), nous l'avons dcompress et De version en version de PHP, certaines options changent :
nous sommes dans son dossier. les dveloppeurs de PHP considrent que pour telle
Ds lors, nous pouvons lancer le script configure avec version, l'option n'est pas active par dfaut, par contre elle
l'option --help demeure le plus souvent activable la main avec le
paramtre --enable-xxx o xxx reprsente la fonctionnalit
Le configure de PHP en question. Lisez le changelog de PHP (Lien32) pour plus
~/monphp/src/php-5.3.2> ./configure --help
d'informations.
Voir le rsultat complet de la commande en ligne
(Lien31). 4.1. Avant de commencer
Halte ! si vous lancez votre commande maintenant, elle

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 15
chouera. Ceci pour la simple et bonne raison que notre correctement par la suite, avec les options indiques, c'est-
distribution Ubuntu Server ne dispose pas des logiciels et -dire rien du tout (compilation basique) sauf le chemin
bibliothques C suffisants pour compiler PHP, le tout par vers lequel installer PHP une fois celui-ci compil.
dfaut. Si tout se passe bien (et a devrait tre le cas), le script
Nous devons installer un environnement de compilation, termine avec un message ressemblant ceci :
ainsi que la libxml2, car le support de XML est par dfaut
inclus dans PHP (--disable-xml est prsente si on veut fin du configure avec succs
supprimer les possibilits XML de PHP et donc sa +-----------------------------------------------+
dpendance envers la libxml2). | License:
Concernant tout le reste : Ubuntu Server possde tout ce |
| This software is subject to the PHP License,
qu'il faut par dfaut. available in this |
| distribution in the file LICENSE. By
Installation des outils et dpendances de base continuing this installation |
~/monphp/src/php-5.3.2> sudo aptitude install | process, you are bound by the terms of this
build-essential libxml2-dev autoconf2.13 license agreement. |
| If you do not agree with the terms of this
build-essential est un mtapaquet sous Ubuntu qui license, you must abort |
| the installation process at this point.
comporte tout l'environnement GNU de compilation |
(notamment le trs connu GCC, mais pas seulement). +-----------------------------------------------+
La libxml2 se trouve dans le paquet libxml2-dev et nous
rappelons qu'elle est ncessaire car par dfaut (sans Thank you for using PHP.
prciser au configure) le support de XML est activ dans
PHP et tire ses fonctionnalits de bas niveau de la libxml2. ~/monphp/src/php-5.3.2>
autoconf2.13 est un paquet Linux aidant la compilation,
il possde des dpendances qui seront tlcharges par le Nous pouvons lancer la compilation proprement parler
gestionnaire de paquets, notamment automake, libtool et avec la commande make qui va "fabriquer" notre projet et,
tout le tralala classique concernant la compilation de code entre autres, compiler les sources prpares par configure.
C sous Linux. Ce sont des bibliothques additionnelles trs L'tape prend plus ou moins de temps en fonction des
largement utilises sous Linux permettant de charger des capacits matrielles de votre machine mais aussi des
bibliothques partages, de crer des scripts configure options prcises : en installation par dfaut, ce n'est pas
automatiquement, etc. Attention, la version 2.13 est trs long, mais rien que le support XML prend environ 15-
obligatoire et pas une autre (il en existe une plus rcente) 20 % du temps de la compilation (tout de mme).
Il est trs fortement recommand que vous vous
familiarisiez un peu plus avec ces outils l si vous voulez Compilation
comprendre en profondeur la compilation de PHP. Son ~/monphp/src/php-5.3.2> make
manuel indique d'ailleurs ces dpendances (Lien33).
L, tout va bien se passer : en gnral si configure termine
Pourquoi "-dev" alors que le paquet libxml2 existe aussi et
bien, le make terminera bien, sauf cas rares (erreurs dans le
semble plus logique ? Tout simplement parce que les
code source C, dans le makefile ou autre...).
paquets suffixs par -dev contiennent les fichiers en-ttes
C (fichiers .h) dont le compilateur aura besoin pour
Compilation termine avec succs !
compiler les fonctions que le code utilise. Le paquet Build complete.
"normal" (sans le -dev) contient lui la bibliothque Don't forget to run 'make test'.
partage .so qui sera ncessaire PHP pour dmarrer. ~/monphp/src/php-5.3.2>
Tlcharger le "-dev" rcuprera obligatoirement par
dpendance le paquet "normal" contenant le module .so.
Si vous voulez tester PHP sur votre plateforme avec vos
Ainsi, lorsque le script configure choue car il manque une
options de configuration et envoyer un rapport de tests au
dpendance, trs souvent on note le nom de cette
PHPGroup (et ainsi contribuer modestement
dpendance, on cherche le paquet avec aptitude search et
l'amlioration de PHP), lancez la commande make test.
on trouve un paquet avec le bon nom suffix par "-dev",
Sinon, passons l'installation avec make install.
puis on l'installe. Sous Ubuntu : c'est aussi simple que cela
(avec quelques exceptions), car le gestionnaire aptitude
Installation
gre trs bien les dpendances et rapatrie tout ce qu'il faut ~/monphp/src/php-5.3.2> make install
pour nous. { ... ... ... }

4.2. Configuration, compilation, installation Installing PHP SAPI module: cgi


Installing PHP CGI binary:
Une fois l'installation de ces paquets termine, nous /home/julien/monphp/bin/
pouvons lancer notre commande : Installing PHP CLI binary:
/home/julien/monphp/bin/
Lancement de la configuration des sources Installing PHP CLI man page:
~/monphp/src/php-5.3.2> ./configure /home/julien/monphp/man/man1/
--prefix=/home/julien/monphp Installing build environment:
/home/julien/monphp/lib/php/build/
Le script configure vrifie alors que votre systme est Installing header files:
/home/julien/monphp/include/php/
compatible et possde tout ce qu'il faut pour compiler

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 16
Installing helper programs: | |-- peclcmd.php
/home/julien/monphp/bin/ | `-- test
program: phpize |-- man
program: php-config | `-- man1
Installing man pages: | |-- php-config.1
/home/julien/monphp/man/man1/ | |-- php.1
page: phpize.1 | `-- phpize.1
page: php-config.1 `-- src
Installing PEAR environment: |-- php-5.3.2
/home/julien/monphp/lib/php/
| |-- CODING_STANDARDS
[PEAR] Archive_Tar - already installed: 1.3.3
[ ... toute la source ... ]
[PEAR] Console_Getopt - already installed: 1.2.3
[PEAR] Structures_Graph- already installed: 1.0.2
[PEAR] XML_Util - already installed: 1.2.1 /bin contient les binaires et scripts excutables : php (le
[PEAR] PEAR - already installed: 1.9.0 SAPI CLI), php-cgi (le SAPI CGI), phar (un script de
Wrote PEAR system config file at: gestion des archives Phar), Pear et Pecl que nous
/home/julien/monphp/etc/pear.conf connaissons et enfin deux scripts importants pour la suite,
You may want to add: /home/julien/monphp/lib/php phpize et php-config (nous y reviendrons).
to your php.ini include_path
/etc contient la configuration (de pear pour le moment).
/home/julien/monphp/src/php-5.3.2/build/shtool
install -c ext/phar/phar.phar /lib contient les bibliothques : ici il s'agit de l'installation
/home/julien/monphp/bin minimale de PEAR, mais vous pouvez aussi y loger votre
ln -s -f /home/julien/monphp/bin/phar.phar framework prfr (par exemple). Aussi, ce dossier
/home/julien/monphp/bin/phar contient les extensions PHP que vous voudrez par la suite
Installing PDO headers: ajouter. Il s'agit de
/home/julien/monphp/include/php/ext/pdo/
/home/julien/monphp/lib/php/extensions/no-debug-non-
zts-20090626 par dfaut mais a se change dans le php.ini.
make nous informe des endroits dans lesquels il a install /man contient les pages man, mais il faut les ajouter ou les
PHP et ses utilitaires. lier au manuel de base, car celui-ci ne cherchera pas dans
ce dossier-l par dfaut.
4.3. Vrification de l'arborescence installe /include contient les fichiers d'en-ttes C (fichiers .h)
Voyons voir la structure installe de plus prs ; installez utiliss pour compiler PHP et qui pourront servir tout
l'utilitaire tree et lancez-le depuis le rpertoire de base : programme futur voulant intgrer PHP ou une de ses
~/monphp/src/php-5.3.2> tree -L 3 fonctionnalits (les extensions PHP par exemple).
.
|-- bin Vous pouvez personnaliser chacun de ces dossiers grce
| |-- pear aux options du configure, regardez la section Directory
| |-- peardev and file names.
| |-- pecl
| |-- phar -> /home/julien/monphp/bin/phar.phar Par dfaut, aucun php.ini n'est gnr. PHP va chercher
| |-- phar.phar par dfaut dans monphp/lib ce qui n'est pas tout fait
| |-- php correct, monphp/etc tant plus logique : nous changerons
| |-- php-cgi cela dans un chapitre relatant de la compilation avance.
| |-- php-config Sinon, les sources de PHP sont livres avec deux fichiers
| `-- phpize php.ini, un pour le dveloppement et un pour la
|-- etc
production. Ils comportent tous les deux des options
| `-- pear.conf
recommandes par le PHPGroup dans chacun des cas
|-- include
respectifs. Vous pouvez donc copier l'un d'entre eux
| `-- php
| |-- TSRM
(php.ini-development recommand pour essayer) dans
| |-- Zend monphp/lib en le nommant php.ini et PHP l'utilisera
| |-- ext immdiatement.
| |-- include
| `-- main Le dossier des futures extensions que PHP chargera est
|-- lib /home/julien/monphp/lib/php/extensions/no-debug-non-
| `-- php zts-20090626. La dernire partie du dossier prcise que
| |-- Archive PHP a t compil sans le mode debug, sans la gestion des
| |-- Console threads et avec une API de son moteur portant le numro
| |-- OS 20090626.
| |-- PEAR Pour le changer, utilisez la directive extension_dir de
| |-- PEAR.php php.ini.
| |-- PEAR5.php
| |-- Structures 4.4. Rappel de quelques commandes et outils utiles
| |-- System.php
| |-- XML Avant de continuer vers une tape de personnalisation de
| |-- build la compilation de PHP, rappelons quelques commandes et
| |-- data outils intressants.
| |-- doc php --ini liste des informations sur le fichier php.ini
| |-- pearcmd.php utilis.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 17
dynamiquement, en cherchant dans le extension_dir)
informations sur le php.ini Le dossier des extensions PHP
~/monphp/bin> ./php --ini ~/monphp/bin> ./php -m
Configuration File (php.ini) Path: [PHP Modules]
/home/julien/monphp/lib Core
Loaded Configuration File: (none) ctype
Scan for additional .ini files in: (none) date
Additional .ini files parsed: (none) dom
ereg
Compiler PHP avec l'option --with-config-file-scan- fileinfo
dir=mon/dossier fera que PHP cherchera dans filter
mon/dossier tous les fichiers .ini qu'il trouvera et tentera hash
de les charger. C'est trs pratique pour clater sa iconv
configuration en plusieurs fichiers .ini. J'utilise souvent json
libxml
php.ini puis autant de fichiers .ini annexes que
pcre
d'extensions que j'ai : xdebug.ini, pdo.ini...
PDO
Attention au cot sur les performances au chargement de
pdo_sqlite
PHP, plus il y a de fichiers, plus c'est long. Phar
posix
ldd est un programme Linux qui liste les bibliothques Reflection
dont dpend un binaire pour tre lanc (entre autres session
choses), appliquons-le sur PHP : SimpleXML
SPL
liste des bibliothques partages dont PHP a besoin SQLite
~/monphp/bin> ldd ./php sqlite3
linux-gate.so.1 => (0x005a3000) standard
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 tokenizer
(0x00ae5000) xml
libresolv.so.2 => xmlreader
/lib/tls/i686/cmov/libresolv.so.2 (0x0039a000)
xmlwriter
librt.so.1 => /lib/tls/i686/cmov/librt.so.1
(0x00f9b000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 [Zend Modules]
(0x002d5000)
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 PHP Modules sont les extensions pour PHP. "Core" et
(0x00f21000) "standard" reprsentent le cur dont nous parlions dans les
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1
(0x006fa000)
chapitres prcdents : les fonctions string, array, la gestion
libxml2.so.2 => /usr/lib/libxml2.so.2 des objets...
(0x00d54000) Zend Modules sont les dbogueurs (ou les extensions qui
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 redfinissent des fonctions du Zend Engine, donc affectant
(0x00110000) trs fortement les entrailles de PHP).
libpthread.so.0 => Notez que nous retrouvons l les extensions que nous
/lib/tls/i686/cmov/libpthread.so.0 (0x0092d000)
avons compiles : nous n'avons rien prcis configure,
/lib/ld-linux.so.2 (0x00bda000)
nous sommes donc en prsence des extensions que le
libz.so.1 => /lib/libz.so.1 (0x00cd1000)
PHPGroup considre comme "par dfaut pour cette
version de PHP".
Notez que lixml2.so est prsent dans le paquet libxml2 :
PHP a bien besoin de cette bibliothque pour fonctionner, php -v renseigne sur la version de PHP, la SAPI utilise, la
sa suppression entranera l'impossibilit de lancer PHP (il date de compilation, la version du moteur et ses options
lui manquera du code : la bibliothque est partage). (thread safe, debug activ, memory manager activ, etc.).
Si vous dcouvrez ldd, alors je ne saurais que vous
conseiller de vous documenter (Lien34) vivement sur Version de PHP et SAPI
l'architecture des programmes Linux ELF (Executable ~/monphp/bin> ./php -v
Linking Format) et sur la compilation de code C de PHP 5.3.2 (cli) (built: Mar 11 2010 20:09:34)
manire gnrale sous Linux, notamment le Copyright (c) 1997-2010 The PHP Group
fonctionnement des linkers (Lien35). Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend
Technologies
php -i | grep extension_dir : le dossier qu'utilise PHP
pour charger ses extensions php --re foo donne les fonctionnalits ajoutes PHP par
Le dossier des extensions PHP l'extension foo (si celle-ci est charge, sinon erreur).
~/monphp/bin> ./php -i | grep extension_dir
extension_dir = Liste des fonctionnalits de l'extension json
/home/julien/monphp/lib/php/extensions/no-debug- ~/monphp/bin> ./php --re json
non-zts-20090626
Extension [ <persistent> extension #12 json
version 1.2.1 ] {
php -m liste toutes les extensions charges (statiquement -
c'est--dire incluses la compilation dans PHP - ou - Constants [10] {

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 18
Constant [ integer JSON_HEX_TAG ] { 1 } 5. Installation avance
Constant [ integer JSON_HEX_AMP ] { 2 }
Constant [ integer JSON_HEX_APOS ] { 4 } Dans ce chapitre, nous verrons quelques unes des
Constant [ integer JSON_HEX_QUOT ] { 8 } nombreuses directives du script configure, leur utilisation
Constant [ integer JSON_FORCE_OBJECT ] { 16 } et leur impact sur le binaire PHP compil par la suite.
Constant [ integer JSON_ERROR_NONE ] { 0 }
Constant [ integer JSON_ERROR_DEPTH ] { 1 } A chaque invocation du script configure (avec ses
Constant [ integer paramtres), celui-ci enregistre la ligne de commande
JSON_ERROR_STATE_MISMATCH ] { 2 } tape dans un fichier appel 'config.nice', ce qui permet de
Constant [ integer JSON_ERROR_CTRL_CHAR ] { 3 relancer la commande ou de la modifier en ditant ce
}
fichier
Constant [ integer JSON_ERROR_SYNTAX ] { 4 }
}
5.1. PHP minimal
- Functions { L'option --disable-all permet de compiler un PHP
Function [ <internal:json> function minimal, avec uniquement les modules essentiels. C'est un
json_encode ] {
raccourci pour viter d'crire tous les disable-xxx
- Parameters [2] {
Les modules chargs sont :
Parameter #0 [ <required> $value ]
~/monphp/bin> ./php -m
Parameter #1 [ <optional> $options ]
Core
}
date
}
ereg
Function [ <internal:json> function
json_decode ] { pcre
Reflection
- Parameters [3] { SPL
Parameter #0 [ <required> $json ] standard
Parameter #1 [ <optional> $assoc ]
Parameter #2 [ <optional> $depth ] Ceci est valable pour PHP5.3, Reflection et SPL sont
} devenus obligatoires en 5.3, on pouvait les dsactiver dans
} la branche 5.2
Function [ <internal:json> function Votre PHP possde une empreinte mmoire minimale (les
json_last_error ] {
possibilits avances pour rduire encore cette empreinte
sont en dehors du cadre de cet article), un temps de
- Parameters [0] {
}
dmarrage amlior, mais en contrepartie il ne saura pas
}
faire grand chose
}
} Quelques statistiques sur un PHP minimal
~/monphp/bin> ./php -r 'echo
count(current(get_defined_functions()));'
Attention si vous voulez regarder les extensions Core ou 647
standard, utilisez un pipe vers un programme tel que less
parce que la sortie sera trs grande. ~/monphp/bin> ./php -r 'echo
count(get_declared_classes());'
php --ri foo liste les directives de configuration et des 69
informations gnrales sur l'extension foo.
~/monphp/bin> ./php -r 'echo
count(get_defined_constants());'
~/monphp/bin> ./php --ri json
417
json
PHP minimal ne comporte aucune fonctionnalit d'accs
json support => enabled des bases de donnes, aucune gestion de XML, pas de
json version => 1.2.1 support des sessions... Des programmes comme PEAR ne
fonctionneront pas.
Ces quelques outils et commandes rappels, nous pouvons
nous lancer maintenant dans une compilation et une On utilise un PHP minimal lorsqu'on dveloppe des
personnalisation plus avances. extensions que l'on souhaite tester (pour limiter les risques
d'interaction), ou lorsqu'on cre des dmons qui n'ont
Vous noterez au passage l'extrme modularit du langage besoin que des fonctions de base, mais d'une empreinte
PHP dont on connat la rputation. Le design de PHP et de mmoire matrise. Le temps de dmarrage de PHP est trs
son moteur Zend Engine sont trs flexibles, et c'est en se optimis aussi, cela peut servir pour des scripts haute
penchant sur la compilation du programme qu'on le charge ayant besoin de forker.
remarque particulirement d'un point de vue extrieur
(plongez dans son code source sinon, si vous en avez les 5.2. Plusieurs PHP
capacits). Si vous voulez compiler plusieurs PHP, vous devrez alors
changer leurs prfixes, c'est le plus pratique grer.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 19
Il existe une autre solution : --program-prefix=PREFIX native-ttf --enable-intl --enable-mbstring
donnera naissance des binaires comme PREFIXphp et --with-mcrypt --with-mysqli=mysqlnd
inversement, --program-suffix=SUFFIX fera que make --with-pdo-mysql=mysqlnd --with-libedit --with-
openssl --enable-soap=shared --enable-sqlite-utf8
crera des binaires comme phpSUFFIXE . --with-tidy=shared --enable-wddx --with-xsl
--enable-zip
utilisation d'un suffixe de programme '532', pour rappeler
la version 5.3.2 Le premier message d'erreur apparat :
~/monphp/src/php-5.3.2> ./configure
--prefix=/home/julien/monphp --program-suffix=532
Il manque une bibliothque sur le systme
[...]
[Aprs compilation, tous les binaires ont un nom
suffix par "532"] checking for BZip2 in default path... not found
~/monphp/bin> ./pear532 configure: error: Please reinstall the BZip2
distribution
~/monphp/src/php-5.3.2>
En ralit, si vous compilez les extensions statiquement
(nous allons y venir), seul le binaire de PHP (gnralement Qui se solutionne par :
le CLI) est utile : c'est lui qui possde toutes les
fonctionnalits compiles. ~/monphp/src/php-5.3.2> sudo aptitude install
Si vous voulez compiler plusieurs versions simplement, libbz2-dev
vous pouvez vous pencher sur le projet phpfarm (Lien36) :
c'est un ensemble de scripts qui fournissent un frontend un Installez la bibliothque dans sa version dveloppement.
peu plus sympa. Sous Ubuntu Server, le paquet de la bibliothque est dj
install le plus souvent (sinon il sera inclus par
5.3. Compiler des extensions (fournies) dpendance), mais pas le paquet de dveloppement (xxx-
Si on passe par la compilation manuelle (l'objet de cet dev) ncessaire pour que le compilateur puisse lier les
article), c'est en grande partie pour compiler les extensions fonctions.
que l'on souhaite et obtenir un PHP "sur mesure". Nous
allons donc voir comment intgrer des extensions dans Avec la ligne de configure de l'exemple ci-dessus, PHP est
PHP, la compilation. hautement personnalis et beaucoup de fonctionnalits lui
Tout se passe une fois encore avec le script configure. sont ajoutes, beaucoup d'entre elles de manire statique
--enable-xxx active l'extension xxx pour une compilation car elles seront utilises souvent (dans l'exemple),
statique (extension fusionne). quelques-unes sous forme dynamique (shared object).
--enable-xxx=shared active l'extension xxx pour une Notez que vous ncessiterez l'ajout d'un nombre assez
compilation dynamique (objet .so construit et install dans consquent de bibliothques de code si vous suivez cette
le dossier des extensions). ligne.
--with-xxx active l'extension xxx pour une compilation Notez aussi que les extensions dynamiques sont activer
statique (extension fusionne). Attention, cette extension dans un php.ini avec la directive extension=xxx, le dossier
possde une dpendance envers une/plusieurs dans lequel PHP cherche les fichiers ini a t prcis dans
bibliothques tierces. l'exemple grce l'option --with-config-file-scan-
--with-xxx=shared active l'extension xxx pour une dir=/home/julien/monphp/etc.
compilation dynamique (objet .so construit et install dans
le dossier des extensions). Attention, cette extension Pour relancer la ligne de configure, jouez avec l'historique
possde une dpendance envers une/plusieurs de votre interprteur (bash) ou lancez le script config.nice.
bibliothques tierces.
--disable-xxx dsactive l'extension xxx qui serait sinon ~/monphp/src/php-5.3.2> sudo aptitude install
libcurl4-dev libpng-dev libjpeg-dev libicu-dev
incluse de manire statique. libmcrypt-dev libedit-dev libtidy-dev libxslt-dev
libssl-dev
Lisez le dtail de ./configure --help pour plus ~/monphp/src/php-5.3.2> ./config.nice
d'informations sur certaines options. Tout y est crit
clairement. Nous choisissons la solution simple : le gestionnaire de
paquets. Si vous prfrez tlcharger la bibliothque sur le
Activer une extension avec l'option "with" requiert une ou site officiel de celle-ci, libre vous.
plusieurs bibliothques qui ne sont pas forcment Vous devrez alors prciser son chemin grce aux
prsentes sur le systme. Gardez en tte une technique nombreuses options que propose le script configure cet
simple : notez le nom de la bibliothque dans le message effet, lisez son aide. Il peut tre intressant de tlcharger
d'erreur de configure, cherchez-la dans le gestionnaire de la bibliothque soi-mme dans le cas o votre gestionnaire
paquets aptitude search xxx et notez le nom du paquet qui de paquets ne la prend pas en charge, ou n'a pas la bonne
convient, si xxx-dev est disponible, il faut prendre celui-l. version. Ce n'est jamais (sauf si vous tirez sur les ficelles)
le cas sous Ubuntu Server. De plus, il est relativement
Une installation bien personnalise casse-tte d'installer soi-mme des bibliothques
~/monphp/src/php-5.3.2> ./configure manuellement, du moins si vous ne maitrisez pas bien
--prefix=/home/julien/monphp --disable-cgi
--with-config-file-scan- Linux et votre distribution ; n'oubliez pas que vous devrez
dir=/home/julien/monphp/etc --disable-short-tags aussi compiler et installer ladite bibliothque la main
--with-zlib --with-bz2 ainsi que grer ses mises jour et ventuellement sa
--with-curl --enable-exif --with-gd --enable-gd- liaison avec le systme...

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 20
libstdc++.so.6 => /usr/lib/libstdc++.so.6
Toutes les extensions ne peuvent tre compiles et (0x00355000)
charges de manire dynamique, certaines ncessitent une libresolv.so.2 =>
/lib/tls/i686/cmov/libresolv.so.2 (0x00236000)
liaison statique. libgcrypt.so.11 => /lib/libgcrypt.so.11
(0x00837000)
Lorsque le script configure se termine correctement, vous libbsd.so.0 => /lib/libbsd.so.0 (0x0024a000)
enchanez bien sr par une compilation via make, puis libpthread.so.0 =>
l'installation proprement parler par make install. /lib/tls/i686/cmov/libpthread.so.0 (0x00c52000)
/lib/ld-linux.so.2 (0x00f77000)
Attention, veillez bien nettoyer votre espace avant libidn.so.11 => /usr/lib/libidn.so.11
(0x00253000)
chaque compilation (make) par la commande make clean.
liblber-2.4.so.2 => /usr/lib/liblber-2.4.so.2
Si vous oubliez cette tape, il est possible que la (0x00286000)
compilation choue, ou pire fonctionne, mais pas le PHP libldap_r-2.4.so.2 => /usr/lib/libldap_r-2.4.so.2
compil. make mmorise des donnes afin de ne pas (0x00295000)
recompiler chaque module entre deux compilations, mais libgssapi_krb5.so.2 =>
ceci est souvent cause de problmes casse-tte. /usr/lib/libgssapi_krb5.so.2 (0x002e0000)
Renseignez-vous sur l'outil make pour plus de dtails. libgnutls.so.26 => /usr/lib/libgnutls.so.26
(0x005a3000)
libgpg-error.so.0 => /lib/libgpg-error.so.0
5.3.1. Vrifier la prsence des extensions (0x0030a000)
libsasl2.so.2 => /usr/lib/libsasl2.so.2
Maintenant que notre PHP est fabriqu et install, nous (0x0064b000)
pouvons relancer un ldd : libkrb5.so.3 => /usr/lib/libkrb5.so.3
(0x00ba6000)
Vrification des dpendances du binaire php libk5crypto.so.3 => /usr/lib/libk5crypto.so.3
~/monphp/bin> ldd ./php (0x00665000)
linux-gate.so.1 => (0x00ccd000) libcom_err.so.2 => /lib/libcom_err.so.2
libcrypt.so.1 => /lib/tls/i686/cmov/libcrypt.so.1 (0x00f2a000)
(0x00110000) libkrb5support.so.0 =>
libz.so.1 => /lib/libz.so.1 (0x007fc000) /usr/lib/libkrb5support.so.0 (0x0030f000)
libexslt.so.0 => /usr/lib/libexslt.so.0 libkeyutils.so.1 => /lib/libkeyutils.so.1
(0x00a2f000) (0x00317000)
libedit.so.2 => /usr/lib/libedit.so.2 libtasn1.so.3 => /usr/lib/libtasn1.so.3
(0x001d1000) (0x00447000)
libncurses.so.5 => /lib/libncurses.so.5
(0x00b6e000) Naturellement, PHP est maintenant li au systme via
librt.so.1 => /lib/tls/i686/cmov/librt.so.1 beaucoup plus de bibliothques partages que lors de son
(0x00b4c000)
installation minimale. Comme nous avons compil la
libmcrypt.so.4 => /usr/lib/libmcrypt.so.4
(0x00323000) majorit de ses extensions statiquement, il n'est plus
libltdl.so.7 => /usr/lib/libltdl.so.7 possible de les enlever et il faudra veiller ce que ces
(0x00142000) dpendances soient systmatiquement satisfaites.
libpng12.so.0 => /usr/lib/libpng12.so.0
(0x008c9000) La compilation avec liaison statique des dpendances
libbz2.so.1.0 => /lib/libbz2.so.1.0 (0x006b8000) envers les bibliothques du systme dpasse le cadre de
libm.so.6 => /lib/tls/i686/cmov/libm.so.6
(0x00d2c000)
cet article. La plupart du temps, c'est un casse-tte
libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2
monstrueux qui se solde par un chec.
(0x00459000) PHP dpend (dans notre cas) de beaucoup de bibliothques
libnsl.so.1 => /lib/tls/i686/cmov/libnsl.so.1 externes, le systme de nommage et le loader (ld)
(0x00c87000) devraient en thorie, en assurer la prsence et la mise
libssl.so.0.9.8 => /lib/i686/cmov/libssl.so.0.9.8 jour.
(0x0014c000)
libcrypto.so.0.9.8 =>
/lib/i686/cmov/libcrypto.so.0.9.8 (0x0045d000) Voyons le contenu du dossier des extensions de PHP :
libcurl-gnutls.so.4 => /usr/lib/libcurl-
gnutls.so.4 (0x00192000) Vrification des extensions dynamiques de PHP
libicui18n.so.40 => /usr/lib/libicui18n.so.40 ~/monphp/lib/php/extensions/no-debug-non-zts-
(0x00d52000) 20090626> ls -l
libicuuc.so.40 => /usr/lib/libicuuc.so.40 -rwxr-xr-x 1 julien julien 1041408 2010-03-14
(0x006ca000) 16:18 soap.a
libicudata.so.40 => /usr/lib/libicudata.so.40 -rwxr-xr-x 1 julien julien 840564 2010-03-14
(0xb6a88000) 16:18 soap.so
libicuio.so.40 => /usr/lib/libicuio.so.40 -rwxr-xr-x 1 julien julien 125350 2010-03-14
(0x001f4000) 16:18 tidy.a
libxslt.so.1 => /usr/lib/libxslt.so.1 -rwxr-xr-x 1 julien julien 116434 2010-03-14
(0x001ff000) 16:18 tidy.so
libxml2.so.2 => /usr/lib/libxml2.so.2
(0x008f1000)
Bien, toutes les extensions que nous avions indiques via
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00ad3000)
le suffixe "=shared" sont bien partages et seront lies
libc.so.6 => /lib/tls/i686/cmov/libc.so.6
(0x00f94000) dynamiquement au lancement de PHP si php.ini les
prcise.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 21
Par la mme occasion, nous pourrions regarder leurs {
dpendances : PHP_EMBED_START_BLOCK(argc, argv)
zend_eval_string("echo 'Hello World!';",
NULL,
Les dpendances systmes des extensions PHP
"My Hello World"
~/monphp/lib/php/extensions/no-debug-non-zts-
TSRMLS_CC);
20090626> ldd tidy.so
PHP_EMBED_END_BLOCK()
linux-gate.so.1 => (0x0067d000)
return 0;
libtidy-0.99.so.0 => /usr/lib/libtidy-0.99.so.0
(0x00735000) }
libc.so.6 => /lib/tls/i686/cmov/libc.so.6
(0x00384000) --with-curlwrappers : lie les couches basses du rseau de
/lib/ld-linux.so.2 (0x0083b000) PHP sur curl plutt que leur implmentation native.

Charger tidy.so dans PHP ncessitera bien la libtidy sur le Vrification des couches basses du rseau pour PHP
systme, nous l'avions installe avant de compiler. ~/monphp/bin> ./php -r
Le fichier .a est une archive contenant les fichiers .o qui 'var_dump(stream_get_meta_data(fopen("http://www.
reprsentent du code liable (relocatable) mais non google.fr", "r")));'
array(10) {
chargeable. Ces fichiers ne vous serviront pas pour utiliser
## tronqu ##
PHP, vous pouvez tranquillement les effacer. Pour plus
["wrapper_type"]=>
d'informations leur sujet, renseignez-vous sur le format string(4) "cURL"
des excutables Linux ELF. ["stream_type"]=>
string(4) "cURL"
5.4. Quelques options de compilation ## tronqu ##
L encore votre connaissance de Linux, des bibliothques
open source C que l'on peut trouver et de leur utilit vous --with-mysqli=mysqlnd | --with-pdo-mysql=mysqlnd :
feront gagner un temps prcieux. depuis PHP5.3, les fonctionnalits MySQL de PHP
Par exemple --with-libedit ou --with-readline permettent peuvent utiliser MySQLnd (NativeDriver). NativeDriver
de bnficier d'un mode interactif (php -a) beaucoup plus est une couche basse de dialogue avec MySQL dveloppe
complet : historique des commandes, compltions des par le PHPGroup, et permettant notamment une licence
fonctions PHP... Bash ou encore ssh utilisent ces d'utilisation identique celle de PHP, ainsi que des
bibliothques, par exemple : optimisations sur les structures mmoires sous-jacentes. Si
vous ne prcisez pas mysqlnd, l'extension sera lie avec la
PHP interactif aid de la libedit libmysql, vous devrez donc tlcharger son paquet.
~/monphp/bin> ./php -a MySQLnd est pratique en ce sens que PHP n'est plus du
Interactive shell tout dpendant de MySQL pour tre compil.

php > str_ [pression sur tab] --with-zend-vm=switch|goto|call : pour les puristes, elle
str_getcsv str_ireplace str_pad change le modle d'excution de la machine virtuelle PHP.
str_repeat str_replace str_rot13
str_shuffle str_split str_word_count
Cela affecte le moteur d'excution de la machine virtuelle.
Les plus tmraires pourront se renseigner dans la source
directement (Lien37) ou lire quelques benchmarks ici
--enable-debug active le mode de dbogage. (Lien38).
Principalement, cela active le switch -g de GCC qui va
alors laisser les symboles de dbogage dans le binaire
6. Installation personnalise d'extensions
ELF. Il sera donc utilisable au travers d'un dbogueur
comme gdb. Cela est indispensable dans le cas du Bien, nous allons voir ici comment installer des extensions
dveloppement de PHP lui-mme ou d'une de ses dynamiques pour PHP une fois celui-ci compil et install.
extensions. Nous allons aussi voir comment lier celles-ci de manire
Le rsultat de php -v indiquera (DEBUG) et certaines statique PHP, il faudra pour cela entirement le
extensions devront tre recompiles avec ce mode pour recompiler.
tre utilisables (les dbogueurs PHP notamment comme
Xdebug). 6.1. Dynamiquement
Le mode debug dsactive aussi toutes les optimisations du
Imaginons que nous souhaitions installer l'extension
compilateur avec un switch -O0 automatiquement.
Memcache, qui n'est pas livre avec PHP. Nous
Pour dboguer la mmoire, dmalloc peut tre utilis avec
procderons en trois temps.
l'option --enable-dmalloc
1. Tlcharger et dpaqueter la source de l'extension
(dans le dossier monphp/src afin de ranger les
--enable-embed permet de construire la SAPI embed, qui
choses).
permet de lier PHP dans son code C grce libphp5.so qui
2. Importer l'environnement de prparation des
sera construit lors de la compilation.
sources qui permettra de lier le code de
l'extension au code source de PHP.
Exemple minimal simplifi d'inclusion de PHP dans du
3. Configurer, compiler, installer et activer le .so
code C
#include <php_embed.h>
obtenu dans php.ini.

int main(int argc, char *argv[]) Toutes ces tapes peuvent tre excutes en une seule

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 22
commande : pecl install xxxx. Nous n'utiliserons pas ce --with-gnu-ld assume the C compiler
raccourci afin de dtailler et pour que vous compreniez uses GNU ld [default=no]
bien le cheminement. --disable-libtool-lock avoid locking (might
break parallel builds)
--with-pic try to use only PIC/non-
Les paquets autoconf-2.13, automake et libtool sont PIC objects [default=use both]
indispensables pour prparer les sources d'une extension. --with-tags[=TAGS] include additional
L'installation d'autoconf-2.13 rsout les autres configurations [automatic]
dpendances. --with-gnu-ld assume the C compiler
uses GNU ld [default=no]
Tlchargement et dpaquetage de l'extension
~/monphp/src> ../bin/pecl download memcache L'aperu ci-dessus a t tronqu, ce qui nous intresse c'est
downloading memcache-2.2.5.tgz ... ce qui est spcifique l'extension. On devinera ici :
Starting to download memcache-2.2.5.tgz (35,981 --enable-memcache ou encore disable-memcache-
bytes) session.
..........done: 35,981 bytes Soyons clairs, il n'est pas ncessaire d'activer --enable-
File /home/julien/monphp/src/memcache-2.2.5.tgz memcache lorsqu'on configure memcache... C'est idiot
downloaded
oui, mais a provient de la libtool (tout comme les autres
~/monphp/src> tar xzf memcache-2.2.5.tgz && cd
options que vous voyez et avez dj vues). Evidemment, si
memcache-2.2.5 on lance configure sans aucune option, il configurera les
~/monphp/src/memcache-2.2.5> sources pour activer memcache, est-il besoin de le prciser
?
Nous nous trouvons dans le dossier des sources de
l'extension Memcache. A ce stade-l, il est ncessaire --with-php-config est important : il permet de prciser le
d'importer les outils de configuration et de compilation chemin vers le script php-config. Ce script possde en lui
dans l'arbre des sources. toutes les variables qui refltent la configuration de PHP
C'est l qu'intervient le programme phpize. Il suffit de qui a t effectue (la manire dont il a t compil).
lancer phpize dans le dossier courant (celui des sources de Prciser cela reviendra faire en sorte que le configure
l'extension) et il cre automatiquement configure (et autres trouve automatiquement le prefix (le chemin d'installation)
outils ncessaires comme libtool, config.m4, etc.). notamment. Il est recommand de le prciser (mais pas
obligatoire).
importation des outils de prparation et de compilation
dans les sources Testez : lancez monphp/bin/php-config et regardez ce qui
~/monphp/src/memcache-2.2.5> ../../bin/phpize s'affiche : toute la configuration qui a t utilise pour
Configuring for: compiler PHP (les chemins notamment). Le configure des
PHP Api Version: 20090626 extensions peut utiliser ce script pour tre aid.
Zend Module Api No: 20090626
Zend Extension Api No: 220090626 Comme vous le savez (j'espre), l'extension memcache
~/monphp/src/memcache-2.2.5> peut aussi tre compile pour crer un backend pour les
sessions PHP. Par dfaut c'est le cas, si vous ne le
On voit bien que phpize a trouv les versions des API souhaitez pas, activez --disable-memcache-session.
internes PHP : en effet il est possible que vous ayez
recompiler vos extensions lorsque vous changez de Nous configurons pour une compilation en module. La
version de PHP (surtout sur les majeures) car les API compilation gnrera donc un objet .so : une extension
internes changent. PHP, qu'il suffira de copier dans le dossier des extensions
Ds lors, vous pouvez lancer configure pour votre et d'activer dans php.ini (gnralement, make install
extension. excute ces tapes). Nous verrons la compilation statique
dans le chapitre suivant.
options de configuration d'une extension PHP
~/monphp/src/memcache-2.2.5> ./configure --help configuration compilation, installation et activation de
[...] l'extension
--with-libdir=NAME Look for libraries ~/monphp/src/memcache-2.2.5> ./configure --with-
in .../NAME rather than .../lib php-config=/home/julien/monphp/bin/php-config &&
--with-php-config=PATH Path to php-config [php- make && make install
config] [...]
--enable-memcache Enable memcache support
--disable-memcache-session Disable memcache Build complete.
session handler support Don't forget to run 'make test'.
--with-zlib-dir[=DIR] memcache: Set the path to Installing shared extensions:
ZLIB install prefix. /home/julien/monphp/lib/php/extensions/debug-non-
--enable-debug compile with debugging zts-20090626/
symbols
--enable-shared[=PKGS] build shared libraries
[default=yes]
Et voil : il faut ajouter manuellement la ligne
--enable-static[=PKGS] build static libraries extension=memcache.so dans le fichier ini utilis si vous
[default=yes] voulez utiliser l'extension.
--enable-fast-install[=PKGS] optimize for fast
installation [default=yes] Si vous voulez nettoyer votre source, excutez make clean

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 23
puis phpize --clean : vous retrouverez les sources de votre Oui, qui dit liaison statique dit recompiler tout PHP
extension telles qu'elles taient juste aprs leur extraction. chaque fois. C'est un des inconvnients de la
compilation/liaison statique d'extension.
6.2. Statiquement
7. Petit tour d'extensions PHP sympathiques
Nous allons maintenant voir comment compiler une
extension extrieure (non prsente dans la source de PHP Si vous n'avez jamais fouill PECL, vous allez peut-tre
par dfaut) de manire statique : c'est--dire fusionne tre tonns par les extensions qui y sont prsentes. Nous
dans le binaire de PHP. n'allons pas apprendre utiliser PECL ici, c'est trs simple,
L'opration n'est pas complexe mais diffre un peu de la je vous laisse voir sa documentation (Lien40). Nous allons
mthode dynamique, voici les tapes suivre : passer en revue quelques extensions intressantes, et en
1. tlcharger et dpaqueter la source de l'extension plus vous savez les installer maintenant.
dans le dossier source-de-php/ext, l o sont
loges les autres extensions, fournies par dfaut ; Rappel : une extension PHP, c'est du code C. Le code C
2. supprimer le script configure de la source PHP ; compil est environ 10 fois plus rapide que du code PHP
3. lancer le script buildconf pour rgnrer le (souvent plus, ~15 fois), il ne faut donc pas hsiter
configure et inclure le switch (--enable ou --with) utiliser une extension PHP pour des tches que vous aviez
concernant l'extension fraichement ajoute ; l'habitude d'implmenter en PHP, surtout si le code est
4. lancer le configure de PHP normalement, en "lourd". Vous allez voir qu'on peut parser du bbcode, ou
ajoutant le switch concernant l'extension encore jouer avec du Yaml via des extensions PHP. Refaire
concerne. cela en PHP va dj vous prendre un temps non
ngligeable et sera beaucoup plus lent que l'appel des
Passons la pratique, je propose de compiler statiquement fonctions similaires apportes par les extensions en
l'extension APC (Lien39) dans PHP. C'est un cas pratique question, pour peu que celles-ci rpondent prcisment
trs classique : APC est un cache d'OPCode trs proche de votre besoin. Dans le cas contraire, vous pourrez songer
PHP et du ZendEngine. L'utiliser de manire dynamique les modifier si vous vous sentez d'attaque.
(charg comme un .so) n'est pas trs malin, pour tirer
partie de toute la puissance du cache d'opcode, il faut le Attention, ne dployez pas une extension non stable
fusionner PHP. (alpha, bta) en production, sauf si vous avez bien analys
son code source et que vous savez prcisment ce que
Intgration d'une extension dans la source de PHP pour vous faites.
compilation statique
~/monphp/src> ../bin/pecl download apc-alpha Voici un panach choisi par mes soins, pour vous prouver
downloading APC-3.1.3p1.tar ... que des extensions PHP... il y en a !
~/monphp/src> tar xf APC-3.1.3p1.tar Regardez bien la date de la dernire version de l'extension
~/monphp/src> mv APC-3.1.3p1 ./php-5.3.2/ext et la version de PHP ncessaire pour la construire. Il peut
arriver que certaines extensions ne soient plus maintenues
Le dossier APC a t ajout la source de PHP dans son depuis des annes (mais fonctionnelles).
dossier ext/. Rgnrons le configure :
Certaines des extensions ne sont pas hberges sur
Recration du script configure pour prendre en compte pecl.php.net, car leurs auteurs ont prfr les hberger
APC eux-mmes (ou utilisent une licence diffrente). A ce
~/monphp/src> cd php-5.3.2 moment-l, il n'est pas possible d'utiliser l'utilitaire PECL,
~/monphp/src/php-5.3.2> rm ./configure il faut tlcharger l'extension manuellement, vous
~/monphp/src/php-5.3.2> ./buildconf --force connaissez le reste de la procdure (voir les chapitres
Forcing buildconf prcdents).
rebuilding configure
rebuilding main/php_config.h.in
Comme ce sont des "extensions", on utilise trs souvent la
notation "ext/xxx" pour dsigner l'extension xxx dans une
voil ! regardons le configure : discussion ou un manuel. Par exemple, "utilisez ext/apc
pour acclrer vos applications", ou encore "le support des
Le configure prend bien APC en compte sessions en PHP est implment par ext/session".
~/monphp/src/php-5.3.2>./configure --help | grep
apc
7.1. bytekit
--enable-apc Enable APC support
--enable-apc-filehits Enable per request file Pour tous ceux qui sont intresss par la reprsentation
info about files used from the APC cache (ie:
interne des instructions de la machine virtuelle de PHP
apc_cache_info('filehits'))
--disable-apc-mmap
("l'OPcode"), ext/bytekit vous permet d'en prendre
--enable-apc-sem connaissance.
--disable-apc-pthreadmutex Cette extension propose aussi le trac graphique du
--enable-apc-spinlocks schma d'excution du code (branchements), ce qui permet
de l'analyser en vue de le comprendre et ventuellement de
Il ne reste plus qu' recompiler PHP avec un configure qui fabriquer un optimiseur ou de crer des statistiques de
inclut --enable-apc (je vous laisse vous pencher sur les code trs pousses.
autres options d'apc). Une extension analogue est ext/vld (Virtual Logic
Disassembler) (Lien41). Tlchargez ext/bytekit ici

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 24
(Lien42). Il peut tre intressant d'utiliser le frontend dimensions est retourn contenant les OPCodes. Les
bytekit-cli avec (Lien43). erreurs (de tous types) sont gres.
Le manuel de ext/parsekit fait partie du manuel de PHP sur
7.2. Imagick php.net (Lien50).
Fournisseur de services vers la bibliothque ImageMagick
7.8. yaml
(Lien44). Cette bibliothque permet une gestion avance
des images, une centaine de formats est gre, dont DPX, ext/yaml utilise la libyaml (Lien51) pour permettre une
EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, conversion de PHP vers la syntaxe Yaml et inversement.
Postscript, SVG, TIFF... Une bibliothque indispensable si Son manuel est prsent sur php.net (Lien52)
vous traitez massivement des images en PHP, elle est plus
rapide et plus fournie que la bibliothque GD (fournie 7.9. http
avec PHP) et propose une orientation objets du code PHP
Si vous avez besoin d'un client HTTP puissant et rapide,
l'utilisant. Sa documentation est sur php.net (Lien45).
ext/http est faite pour vous. Elle peut optionnellement
utiliser Curl. ext/http est sans doute la manire la plus
7.3. Inclued
aboutie d'utiliser le protocole HTTP en PHP. La cration
ext/inclued (notez l'orthographe) permet de tracer un d'un serveur ou d'un client est tout fait dans ses cordes.
graphe des appels include/require. On peut donc voir Elle gre SSL, la ngociation de contenu et de langues, les
graphiquement quel fichier inclut quel fichier, etc. cookies, les jeux de caractres, le cache, la compression
(GraphViz ncessaire). Pour peu que vous manipuliez un Gzip et le pooling de connexions. Elle peut aussi ajouter
projet trs orient objets - base de framework notamment des fonctions de callback pour le buffer de sortie PHP.
- et que l'autoload ne soit pas utilis (les instructions Rien que a !
require/include doivent tre prsentes), ext/inclued pourra Son manuel est dans php.net (Lien53)
servir pour tracer des graphes de dpendances objets
moindre frais. Trs pratique. 7.10. haru
ext/haru fournit des services vers la libharu (Lien54) : c'est
7.4. Memcache
une bibliothque C libre permettant la gnration de
Nous l'avons utilise comme exemple dans les chapitres fichiers PDF. Nous sommes l en prsence d'une extension
prcdents. ext/memcache fournit une API pour piloter un crite en C, donc dpassant largement les performances de
serveur Memcached. Vous trouverez plus d'informations n'importe quelle implmentation identique ralise en
sur le site officiel de Memcached (Lien46) et sur le manuel PHP. Reste tester les possibilits offertes, un article
de ext/memcache (Lien47) prsent dans php.net. Une existe par ici pour les curieux (Lien55).
extension trs recommande pour grer la monte en Son manuel se trouve sur php.net (Lien56)
charge d'applications par le cache d'entits (souvent des
objets). 7.11. amfext
ext/amfext permet d'implmenter le protocole d'Adobe
7.5. Scream
AMF et AMF3. Voyez le site officiel pour plus
Lorsque la bibliothque ext/scream est active, l'effet de d'informations (Lien57). Attention, a n'a pas t test sous
masquage des erreurs, obtenu par le caractre at (@) plac PHP5.3 ni sous PHP5.2 pour Linux.
devant les commandes PHP, est annul : les erreurs sont
alors gres normalement, comme en l'absence du 7.12. svn
caractre @.
ext/svn offre des possibilits d'interaction avec SVN ct
Son manuel (trs court, car ext/scream ne dploie aucune
PHP au travers de la libsvn. Toutes les oprations clientes
classe/fonction supplmentaire dans PHP) est sur php.net
sont rendues possibles au moyen de fonctions PHP.
(Lien48).
Indispensable si vous devez communiquer avec un serveur
SVN depuis PHP.
7.6. bbcode
Son manuel est sur php.net (Lien58).
Je cite le manuel de PHP : "ext/bbcode se propose de vous
aider dans l'analyse du texte BBCode afin de le convertir 7.13. xdiff
en HTML ou dans un autre langage base de balises. Elle
ext/xdiff implmente libxdiff pour PHP (Lien59). Vous
utilise une analyse en un seul passage et est bien plus
pourrez crer des patchs (textes ou binaires), extraire des
rapide qu'une approche base sur les expressions
diffs ou excuter des fusions (merge). L encore, si vous
rgulires. De plus, elle vous aidera obtenir du code
utilisez PHP au sein de votre systme d'informations, les
HTML valide en rorganisant les balises d'ouverture et de
possibilits xdiff sont considrer.
fermeture et en fermant automatiquement les balises."
Le manuel de ext/xdiff est intgr php.net (Lien60).
Son manuel est disponible sur php.net (Lien49).
7.14. sphinx
7.7. parsekit
ext/sphinx ajoute via libsphinxclient les possibilits de
ext/parsekit fait globalement la mme chose que
Sphinx PHP. Sphinx est un moteur de recherche SQL full
ext/bytekit, mais propose des fonctions PHP. Ainsi, elle
text libre. Son site Web vous en apprendra plus si besoin
propose deux fonctions prenant soit un fichier PHP, soit
(Lien61).
une chane reprsentant du code PHP et elle passe
Le manuel de ext/sphinx est sur php.net (Lien62)
l'analyseur syntaxique PHP dessus. Un tableau multiples

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 25
7.15. runkit programmes. Ce parseur a maintes fois t rimplment
en PHP (pour crer la documentation d'une classe de
ext/runkit est un outil de sandboxing permettant la
manire automatique par exemple), ici il s'agit d'une
modification de fonctions, classes, constantes ou variables
extension C, donc beaucoup plus performante.
(y compris superglobales) au runtime PHP (c'est--dire
Le manuel de ext/docblock est sur PECL (Lien65).
directement pendant l'excution). Une extension trs
puissante qui permet aussi de faire du vrai n'importe quoi
8. Conclusion
si on est pas trs averti (comme par exemple changer la
dfinition d'une fonction, alors qu'elle est en cours Voil, j'espre vous avoir fait prendre conscience que
d'utilisation). Voyez le manuel de ext/runkit intgr compiler son logiciel manuellement, c'est avant tout en
php.net pour plus d'informations (Lien63). matriser les rouages et avoir la possibilit de personnaliser
trs hautement le programme en question. Dans le cas de
7.16. xdebug PHP, qui est tout de mme trs modulaire, il y a du
travail !
On ne prsente plus l'extension que tout dveloppeur
Plus d'excuses du type "oui mais je ne peux pas avoir cette
devrait possder. Xdebug permet de tracer la pile d'appel
extension" : vous avez ici toutes les billes pour compiler et
de fonctions PHP, d'afficher l'tat de la mmoire et de
crer votre propre PHP et vous avez dj eu un aperu de
rcuprer des informations sur le moteur PHP via des
quelques extensions PECL sympathiques. Profitez de tous
fonctions.
les atouts du monde open source !
Xdebug est aussi et avant tout un dbogueur PHP trs
efficace, ainsi qu'un profileur. Il permet galement
Pour ceux qui ne sont pas du tout habitus la compilation
l'analyse de code source lorsque coupl PHPUnit (par
de sources sous Linux, je vous conseille grandement de
exemple), afin de dtecter le code mort. Un must-have.
vous y mettre si vous voulez creuser certaines options du
Xdebug s'installe via PECL ou son site officiel
script configure.
(lgrement plus jour). Voyez ce lien pour l'installation et
Lumire sur la compilation de programmes C :
le manuel des fonctions : Lien64.
compilateur, assembleur, diteur de liens et chargeur
(Lien66).
7.17. docblock
Cration de Makefiles : Lien67
ext/docblock est un parseur de commentaires au format Editeurs de liens et chargeurs : Lien68
PHPDoc (/** @foo=bar */). Trs pratique lors de Article dvp : La compilation spare : Lien69
l'utilisation de la programmation oriente objets dans ses
Retrouvez l'article de Julien Pauli en ligne : Lien70

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 26
Dveloppement Web
Les derniers tutoriels et articles
Comment crer facilement un framework Javascript - Partie 3
Comment crer facilement un framework Javascript - Partie 3

Traduction de l'article How to Easily Create a JavaScript Framework, Part 3 (Lien71) de Teylor Feliz paru sur
AdmixWeb.
1. Introduction
// Vrification du chargement du DOM
Dans " Comment crer facilement un framework // Callback est une fonction anonyme qui
JavaScript - Partie 2 " (Lien72), j'ai parl de quelques s'excute ds que le DOM est prt
mthodes de navigation DOM, comme les techniques domReady:function(callback){
"getByName", "getByTag" et "getByClass". J'ai aussi var done = false; // Cration d'une variable
expliqu comment crer d'autres mthodes appele done initialise false
supplmentaires juste pour le fun, telles que les fonctions // Vrifie toutes les 10 millisecondes si le
document.body et le document.getElementById sont
"even" (pair), "odd" (impair) et "SetOpacity". Dans le chargs
tutoriel de cette semaine, je vais continuer cette srie // S'ils sont disponibles, alors on change la
d'articles sur le framework JavaScript "VOZ" et continuer valeur de done en true
ajouter de nouvelles mthodes au code de la partie 2. Je var checkLoaded = setInterval(function()
vais donc complter un peu le framework en ajoutant des { if(document.body && document.getElementById)
{done = true;}},10);
mthodes pour utiliser le JavaScript avant qu'une page ne
// Vrifie toutes les 10 millisecondes si done
soit charge et d'autres techniques toutes aussi utiles. == true
Continuez lire la suite pour suivre l'volution du // Si c'est le cas, alors on excute la
framework ! N'hsitez pas laisser vos commentaires et fonction callback
amusez-vous ! var checkInter = setInterval(function()
{if(done)
{clearInterval(checkLoaded);clearInterval(checkIn
2. Attendre jusqu'au chargement du DOM ter);callback();}},10);
Avant de continuer avec notre framework, nous devons },
parler du chargement des pages Web. L'un des plus gros
problmes auquel un dveloppeur peut tre confront est Utilisez donc cette mthode pour excuter une partie du
l'utilisation du JavaScript avant que la page ne soit code aussitt que le DOM est disponible. Exemple :
compltement charge. Dans de nombreuses applications
web, le JavaScript entre en action aprs le chargement $$.domReady(function(){
d'une page. C'est un gros problme car l'application ne fait alert('Hello World');
rien jusqu' ce que toutes les images et fichiers rattachs });
soient entirement chargs. Pour expliquer ce phnomne,
je vais utiliser un exemple. 3. Modification de la fonction "setStyle()"
Imaginons que nous ayons une page avec 20 images en
Maintenant, modifions la mthode setStyle() pour utiliser
miniatures pour prsenter les produits d'une socit.
un objet en paramtre. Il est souvent difficile de se
Imaginons que l'on utilise le JavaScript pour crer une
souvenir de l'ordre des paramtres d'une fonction. Utiliser
popup sur chaque miniature pour que, lorsque l'on clique
un objet est trs pratique, car nous n'avons plus nous
sur l'une d'elles, l'image apparaisse en taille relle. Le
proccuper de l'ordre des paramtres. De plus, ce sera plus
problme est que l'application ne marchera pas tant que
simple pour organiser ce que nous faisons.
tous les lments ne seront pas chargs. Notre page peut
Exemple d'une fonction qui insre des donnes en AJAX.
ressembler a :
// Utilisation de paramtres littraux
function popUpImagen(imagen){
function
... ici le code ... insertCustomer(prenom,nom,adresse,anniversaire,ge
} nre,telephone){
window.onload = popUpImagen; ... ici le code ...
}
Ce script attend que la page soit entirement charge pour
commencer lier les images en taille relle aux Cela pourrait devenir pnible d'appeler cette fonction si
miniatures. Si l'utilisateur une connexion Internet lente, nous ne nous souvenons pas de l'ordre des paramtres. Par
le script ne fonctionnera pas, tant que les tous les lments exemple, nous pourrions utiliser la fonction comme a :
de la page ne seront pas chargs.
Pour rsoudre ce problme nous pouvons crer une petite insertCustomer('Teylor','Feliz','Mon
mthode pour vrifier la disponibilit du DOM. Ds que adresse','Male','09/15/1978','555-555-5555');
celui-ci est charg, nous pouvons travailler avec.
Nous recevons immdiatement une erreur, car nous

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 27
envoyons le paramtre "genre" la place de pour afficher les donnes dans les lments de saisie et
"anniversaire". Une excellente faon d'viter ce problme l'autre pour rcuprer ces mmes donnes.
est de crer un objet et de le passer en paramtre de la
fonction. De cette manire, nous devons juste connatre les // Renvoie la valeur d'un lment ou un tableau
noms des paramtres, plutt que leur ordre d'envoi. avec toutes les valeurs trouves
Exemple de l'appel de la mme fonction lorsque l'on utilise // Cette fonction ne se chaine pas
getValue:function(){
un objet en paramtre :
var elemstemp = [];// Cration d'un tableau
temporaire pour sauvegarder les lments trouvs
insertCustomer({prenom:'Teylor', nom:'Feliz',
for(var i=0;i < this.elems.length;i++){// On
genre:'Male', telephone:'555-555-5555',
parcourt tous les lments pour vrifier leur
anniversaire:'09/15/1978', adresse:'Mon
valeur
adresse'});
if(this.elems[i].getAttribute('type') ==
'checkbox' || this.elems[i].getAttribute('type')
Pour utiliser cet objet dans la fonction, nous devons la == 'radio'){
modifier comme dans l'exemple suivant : // Si l'lment du formulaire est un
checkbox ou un bouton radio, on vrifie s'il est
coch
function insertClient(args){
// Si c'est le cas, on enregistre la
// Un exemple d'utilisation de la fonction est valeur
args.nom
if(this.elems[i].checked === true){
var prenom = args.prenom;
elemstemp.push(this.elems[i].value);
var nom = args.nom;
}
... ici le code ...
} else{
}
elemstemp.push(this.elems[i].value);
}
Revenons sur la mthode "setStyle" et prsent
modifions-la pour qu'elle prenne en paramtre un objet. }
//
// Mise jour de la mthode setStyle elemstemp.push(if(this.elems[i].getAttribute)this
// Maintenant le paramtre est un objet .elems[i].value); // Ajout de la valeur dans le
tableau temporaire
// Utilisation : var mystyle
={color:'red',background:'black'}; if(elemstemp.length === 1){ // Si le tableau
temporaire a un seul lment, on renvoie
// .setStyle(mystyle) ou alors nous pouvons
uniquement cet lment
passer l'objet directement lors de l'appel
return elemstemp[0];
//
.setStyle({color:'red',background:'black'}); }
// Notez que le nom des styles utiliss sont les return elemstemp; // Sinon, on renvoie le
mmes qu'en JavaScript. tableau temporaire avec toutes les valeurs
trouves
// Par exemple : background-color en css donne
backgroundColor en JavaScript, margin-left en css },
donne marginLeft en JavaScript, etc.
setStyle:function(objStyle){ // Mise jour de la valeur pour les lments
for(var i = 0;i < this.elems.length;i++){// trouvs
Parcours des lments et ajout des styles // Val est la valeur pour les lments trouvs
for(var k in objStyle){ // Parcours de setValue:function(val){
l'Objet ObjStyle en utilisant la proprit nom for(var i=0;i < this.elems.length;i++){ // On
comme nom de style parcourt tous les lments pour vrifier leur
// et sa valeur valeur
comme valeur de style // Si l'lment du formulaire est un
// Par exemple : {top:20px} donnera checkbox ou un bouton radio, on vrifie si val ==
elem.style.top = 20px; elem.value
this.elems[i].style[k] = objStyle[k]; // Si c'est le cas, alors on coche
} l'lment
} if(this.elems[i].getAttribute('type') ==
'checkbox' || this.elems[i].getAttribute('type')
return this; // Renvoie this dans l'ordre
== 'radio'){
d'appel
if(this.elems[i].value === val){
},
this.elems[i].checked = true;
}
Cela aide envoyer plus d'une proprit de style en mme }
temps. Exemple : else{
this.elems[i].value = val; // Mise jour
$$.getById('myid').setStyle({color:'red', de la valeur de l'lment
border:'1px solid blue'}); }
}
4. Mthodes set et get pour les lments d'entre return this;// Renvoie this dans l'ordre
d'appel
Les lments d'entre reprsentent la partie la plus },
importante d'une page Internet pour un dveloppeur Web,
car c'est le seul moyen d'obtenir des informations de 5. Effets amusants : "fadeIn()" et "fadeOut()"
l'utilisateur pour interagir avec ceux-ci en arrire-plan.
C'est pourquoi nous allons crer deux fonctions : l'une On s'attend trouver dans un Framework JavaScript de

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 28
superbes effets comme en DHTML, nous allons donc crer valeur 100, alors on stoppe l'intervalle
des mthodes pour faire apparatre ou disparatre des clearInterval(interval);
lments en fondu. Mais, avant a, nous devons crer un }
objet d'aide (helper) appel "Helpers". L'objet d'aide va },time/100);
contenir les mthodes cls de nos fonctions d'effets. On }
ajoutera en plus quelques mthodes AJAX dont nous
aurons besoin dans le chapitre suivant. Le code est bien }
comment, je ne m'tendrai donc pas plus sur le sujet.
La mthode d'aide est : Ajoutons maintenant les mthodes "fadeIn" et "fadeOut"
dans le framework "VOZ".
var Helpers={
// Mthode pour dfinir l'opacit d'un lment // Mthode de disparition avec fondu
// C'est presque le mme que la mthode // Utilisation de l'objet Helpers
setOpacity() // time est en millisecondes par exemple 8
// elem est l'lment sur lequel on va modifier secondes = 8000
l'opacit fadeOut:function(time){
// Niveau d'opacit souhait, en pourcentage : for(var i=0; i < this.elems.length;i++){//
les valeurs sont entre 0 et 100 Parcours des lments et excution de la fonction
setOpa:function(elem,level){ fadeOut du helpers
if(level>=0 && level< =100){// La Helpers.fadeOut(this.elems[i],time)
valeur de l'opacit doit tre entre 0 et 100 }
elem.style.opacity = return this;// Renvoie this dans l'ordre
(level/100); // On dfinit l'opacit pour d'appel
Firefox, Safari, Opera, Chrome,etc. },
elem.style.filter =
'alpha(opacity='+level+')'; // On dfinit // Mthode d'apparition avec fondu
l'opacity pour IE :(
// Utilisation de l'objet Helpers
}
// time est en millisecondes par exemple 8
}, secondes = 8000
// Mthode pour crer l'effet de disparition avec fadeIn:function(time){
fondu
for(var i=0; i < this.elems.length;i++){
// Utilisation de la mthode setOpa
Helpers.fadeIn(this.elems[i],time)
// elem est l'lment sur lequel on va modifier
l'opacit }
// time est la dure de l'effet return this;// Renvoie this dans l'ordre
d'appel
fadeOut:function(elem,time){
},
var level = 100; // Dfinit le niveau 100
var interval = setInterval(function(){ // On
cre un intervalle en utilisant la mthode setOpa 6. Conclusion
Helpers.setOpa(elem,--level); // On
utilise la mthode setOpa pour dcrmenter le Exemple du framework JavaScript VOZ partie 3 : Lien73
niveau de 1
if(level==0){ // Si le niveau a pour Comme dans les parties 1 et 2, j'ai fait une page qui vous
valeur 0, alors on stoppe l'intervalle montre en action la partie 3 du framework JavaScript
clearInterval(interval);
"VOZ", visitez le lien ci-dessus. Aussi, dans la quatrime
}
partie de cette srie sur le framework JavaScript VOZ,
},time/100);
nous crerons d'autres mthodes AJAX et je vous
},
montrerai comment les utiliser. Comme toujours, j'espre
// Mthode pour crer l'effet d'apparition avec
que vous avez trouv ce tutoriel amusant et facile
fondu suivre ! N'hsitez pas laisser vos commentaires.
// Utilisation de la mthode setOpa
// elem est l'lment sur lequel on va modifier 7. Articles de cette srie
l'opacit
// time est la dure de l'effet Comment crer facilement un framework
fadeIn:function(elem,time){ Javascript - Partie 1 : Lien74
var level = 0;// Dfinit le niveau 0 Comment crer facilement un framework
var interval = setInterval(function(){// On Javascript - Partie 2 : Lien72
cre un intervalle en utilisant la mthode setOpa
Comment crer facilement un framework
Helpers.setOpa(elem,++level); // On
utilise la mthode setOpa pour incrmenter le Javascript - Partie 3 : Lien75
niveau de 1
if(level==100){// Si le niveau a pour Retrouvez l'article de Teylor Feliz traduit par KalyParker
en ligne : Lien75

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 29
C/C++/GTK
Les derniers tutoriels et articles
Interview de James Reinders
Interview de James Reinders

Intel propose des outils de dveloppement orients dveloppement parallle pouvant tirer parti des architectures
matrielles actuelles. Dans cette interview, James Reinders, le gourou d'Intel sur le sujet et auteur d'un livre sur les
Thread Building Blocks, fait le point sur les outils prvus en 2010.
J'avais dj ralis une interview de James l'anne dernire (Lien76), laquelle il peut tre intressant de se rfrer
pour des questions plus gnrales. En outre, j'ai rdig un compte rendu de la confrence en elle-mme (Lien77).

1. Questions gnrales finalis.


Pendant la confrence, vous avez mentionn de
Le compilateur prendra aussi en compte Cilk, avec l'ajout
multiples reprises le compilateur C++ d'Intel et celui de
de trois primitives, ainsi que la notation tableau. Cette
Microsoft. Qu'en est-il du compilateur Clang,
notation sera comprise par le C et le C++. Voici quelques
sponsoris par Apple ?
exemples :
Nous avons discut avec eux et sommes trs au courant de a[:] = b[:] + 3; // Permet de copier les lments
ce qu'ils font. Notre compilateur Fortran et C++ fonctionne d'un tableau une dimension vers un autre
avec Mac Os X et nous comptons continuer ainsi.
Beaucoup de gens apprcient que nous supportions a[:] = b[3][:] * c[:][12]; // Extrait des
plusieurs plateformes, c'est une des principales raisons de vecteurs lignes ou colonnes pour faire des
la popularit de nos compilateurs. calculs

Nous nous changeons des plans, et parfois des Cette notation, semblable celle de Matlab, pourra
technologies ou des revues avec Apple. J'ai assist une automatiquement bnficier d'une paralllisation, de SSE,
prsentation chez Intel il y a environ deux ans prsentant d'AVX. Nous travaillons avec d'autres constructeurs de
comment ils s'loignaient de GCC et prsentant la compilateurs, pour se mettre d'accord sur une syntaxe, et
technologie LLVM (sur laquelle est construit Clang). Mais peut tre au final, bas sur l'exprience apporte par une
nous n'investissons pas de manire massive dans leur implmentation dans plusieurs compilateurs, en tirer une
technologie de compilateur. proposition pour les comits de normalisation C et C++.

Pourquoi CILK est prsent l'utilisateur, et non pas Intel Parallel Advisor a t en phase d'incubation cette
simplement utilis en interne par des bibliothques anne, mais deviendra un produit part entire dans cette
comme TBB. version. Il permet d'acclrer une tape critique de
dveloppement parallle. Quand on se lance dans la
L'objectif de CILK est de prendre un programme paralllisation, la premire tape est d'essayer de voir o
fonctionnel et de le rendre parallle avec le minimum de l'on souhaite parallliser, la seconde est d'crire le code
modifications, comme changer un for en cilk_for, un appel correspondant et d'effectuer des mesures.
de fonction par un cilk_spawn. Son extrme simplicit
devrait en faire un point d'accs ais au monde du Mais cette seconde tape peut tre longue, des semaines ou
paralllisme. Sa syntaxe est faite de telle faon, qu'en des mois pour trouver les bugs, les race conditions, les
ignorant les mots clefs spciaux, on se retrouve avec le deadlocks... pour parfois au final se rendre compte que a
code initial, ce qui rend la comprhension facile. ne marche pas aussi bien qu'on l'avait espr. Nous
essayons d'acclrer cette tape les dveloppeurs ajoutent
2. Parallel Studio dans leur code des annotations indiquant leur souhait d'en
parallliser une portion, sans vraiment coder cette
Quand la prochaine version de Parallel Studio,
paralllisation. Un outil prend alors le relais pour analyser
compatible avec Visual Studio 2010, est-elle prvue ?
ce code et indiquer : si vous faites a, vous allez avoir des
race conditions, ou bien votre code ne sera pas scalable.
Le programme de bta officiel devrait commencer vers mi-
mai. La sortie est prvue pour la fin du troisime trimestre,
Ces notations permettent ainsi de prototyper rapidement le
nous esprons pouvoir le sortir pour l'IDF (Intel
code, il n'est mme pas ncessaire de l'excuter sur une
Developper Forum (Lien78)), la mi-septembre, San
machine multi-curs. Ce produit est conu pour aider les
Francisco.
architectes choisir entre diffrentes manires de
parallliser du code, avant d'investir dans la paralllisation
Quelles seront les nouvelles fonctionnalits ?
elle-mme.
Tout d'abord, comme indiqu, le support pour Visual
Dans Visual Studio 2010, Microsoft a introduit la
Studio 2010. Nous avons d attendre que ce produit soit

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 30
notion de tche (par opposition aux threads) dans le d'ajustements pour la prise en compte de C++0x. On grait
dbogueur. Avez-vous une notion semblable ? dj les lambda-fonctions, par exemple dans un
parallel_for, mais pas dans l'ensemble de TBB, en
Nous avons ajout des annotations dans TBB afin que particulier pour la gestion des pipelines.
notre Inspector (qui dtecte des race conditions) ou
Amplifier (qui mesure des performances) comprenne la Un autre exemple est la manire dont fonctionne le thread
notion de tche au sens TBB. Microsoft a fait de mme principal, qui a lanc les autres threads utiliss par TBB.
avec les tches de TPL et PPL afin que leur propre En gnral, ce thread fait tourner des tches, comme les
dbogueur puisse les comprendre. Mais ces annotations ne autres threads, et a ne pose pas de problme. Mais selon
sont pas compatibles. Nous tudions ce que nous pouvons la manire dont on prend des verrous, ce comportement
faire afin d'harmoniser la situation, que nos outils peut produire des deadlocks et la nouvelle version permet
comprennent les tches de TPL et PPL et que leurs outils de rgler ce comportement, et de rendre le thread principal
comprennent les tches de TBB. passif.

Les utilisateurs veulent pouvoir utiliser un outil unique Ce que les utilisateurs de TBB apprcient beaucoup, c'est
dans tous les cas. Nous avons dj crit des extensions qu'elle est suffisamment mature pour tre mise en uvre,
leur dbogueur qui amliorent son comportement avec et rsoudre de vrais problmes dans de vrais programmes.
OpenMP, ils ont ajout des extensions trs agrables pour
les tches, nous regardons si on peut communiquer avec 4. Ct
leur dbogueur afin d'en tirer les mme bnfices avec
Est-ce que Ct sera distribu en open source ?
TBB.
Pour l'instant, on ne sait pas vraiment quelle est la bonne
Une partie de Parallel Studio devrait tre disponible
faon de faire. Si TBB a t place en open source, c'est
sous Linux. Quand ? Quel ordre de grandeur de prix ?
parce que c'tait la bonne manire de la rendre disponible
sur de nombreuses plateformes. OpenMP prsente un autre
Novembre. Le programme bta devrait commencer en
modle, une API standardise que plusieurs personnes
juin/juillet, pour une sortie du produit en novembre.
peuvent implmenter.
En terme de prix, on devrait tre dans la mme gamme que
Nous voulons que Ct soit disponible sur de nombreuses
nos autres outils de dveloppement (compilateur, VTune),
plateformes, et nous sommes en discussions avec des
et donc un peu plus cher que Parallel Studio. Le
compagnies qui pourraient en raliser un portage. Nous ne
compilateur Fortran sera en option, ce qui pourrait
savons pas encore ce qui serait le mieux, entre une
augmenter le prix. Mais nous n'avons pas encore annonc
solution open source et une solution base sur une API
de tarif actuellement.
ouverte et des implmentations propritaires tirant parti
des bnfices de chaque plateforme. Il est en tout cas
3. TBB
probable que Ct ne soit pas uniquement une technologie
Les styles de programmation entre TBB et PPL sont propritaire.
trs proches, pensez-vous qu'il est possible, en se
restreignant un sous-ensemble de ces bibliothques, Nous voulons aussi avoir une API ouverte au niveau du
d'avoir un code source qui serait compatible avec ces front-end, afin de permettre l'interface avec d'autres
deux bibliothques ? langages, comme par exemple Python ou Perl.

Il est vrai que ces bibliothques sont trs semblables dans Quels compilateurs seront supports pour la premire
leur interface. On pourrait imaginer un programme qui version ?
juste avec un peu de macros permettrait de basculer de l'un
l'autre. Ce qui est important, c'est que la smantique est Au minimum, Intel Compiler, Microsoft Visual C++ et
la mme. Par exemple, il se passe la mme chose quand on gcc. Mais la technologie n'est pas trs dpendante du
utilise le parallel_for de TBB et celui de PPL. La syntaxe compilateur et devrait marcher avec n'importe quel
peut lgrement varier, puisque par exemple ils grent les compilateur C++. On avait eu des problmes avec TBB, en
indices lgrement diffremment de nous. particulier sur la gestion des exceptions, qui nous avait
forcs faire des modifications, par exemple pour le
Pour les structures de donnes (concurrent_queue, compilateur Solaris. C'tait il y a longtemps, mais c'est
concurrent_vector...), c'est encore plus vrai, puisqu'il s'agit pourquoi je ne m'avance pas plus pour Ct.
du mme code, Microsoft ayant repris le code d'Intel. Il n'y
avait en effet aucune raison de ne pas avoir les mmes Quels sont les concepts techniques derrire Ct. Est-ce
structures de donnes. plus qu'une bibliothque de matrice grant la
paralllisation ?
Quelles sont les nouveauts de la version 3 de TBB ?
Ct cre le concept d'un environnement protg, avec des
La version 3 va tre officiellement annonce la semaine variables sur lesquelles on ne peut pas tout faire (par
prochaine. Tout d'abord, sous Windows, il y a l'utilisation exemple, prendre des pointeur dessus). a nous donne un
du concurrency runtime, que Microsoft vient juste de contrle complet sur ces variables, et on peut donc prendre
sortir. Il y a aussi plein de modifications que je qualifierais en compte des processeurs spcialiss, de la mmoire
d'entretien. Par exemple, on a effectu un certain nombre distribue... Le problme des variables en C et C++ est

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 31
qu'il est possible de prendre leur adresse de tant de pour le mettre en uvre. Nous pensons que cette
manires diffrentes, qu'on ne peut pas bouger les donnes technologie de JIT va tre trs efficace, mais elle est
en mmoire sans casser le programme. complexe et nous devons faire attention pleins de dtails.

Avec Ct, tant qu'on ne prend pas de pointeur sur une Remarque : James doit m'envoyer des papiers entrant
variable, on a donc une latitude d'optimisation un peu plus dans les dtails. Peut-tre un prochain
supplmentaire, qui nous permet d'utiliser du GPGPU, article ? Une prsentation plus dtaille est aussi
l'architecture Larrabee, ou le CPU. Pouvoir bouger la prvue pendant le salon SuperComputing aux US en
donne est donc l'un des concepts principaux de Ct. novembre.

La prise en compte de toutes ces architectures aura-t- Qu'est-ce qui va changer dans Ct suite l'acquisition
elle lieu la compilation ou l'excution ? de RapidMind ?

A l'excution. Nous avons une technologie de JIT. Par Principalement deux points :
exemple, quand on excute le code, si l'on dtecte la
prsence d'un GPU, on peut dcider de lui dlguer tout un Tout d'abord, ils avaient de trs bonnes technologies pour
problme mathmatique, ou encore de partager cette tche cibler la GPU, nous allons en bnficier. Ils nous
entre un CPU et le GPU. permettent aussi de rendre plus prvisible notre technique
de JIT.
C'est un aspect important du design, ce n'est pas une
simple bibliothque de templates gnrant directement du Ensuite, ils ont de nombreux retours utilisateurs sur leur
code, elle gnre des oprations, qui seront ensuite technologie et ont pu proposer des modifications de
envoyes vers un systme grant leur excution. Ce syntaxe, comment la rendre plus en phase avec le C++ et
systme pourra dcider de bouger les donnes, d'agrger plus simple. Par exemple, dans certains cas, du code crit
ou pas des oprations, de les distribuer sur diverses units avec la syntaxe actuelle prend trois ou quatre fois plus de
de calcul... place que du code crit avec la prochaine version.

Ce qui est intressant, c'est que le code source reste Retrouvez l'article de Loc Joly en ligne : Lien79
simple, alors que tant de choses complexes sont utilises
Visual C++ 2010 premires impressions
Visual C++ 2010 premires impressions

Depuis quelques mois je travaille avec Visual Studio 2010 dans un premier temps avec les bta 1 et 2 et maintenant
avec la RC disponible depuis les TechDays 2010.
Mon environnement de travail est un PC sous Seven 64 bits avec deux crans, 2 Go de mmoire et un processeur
Core Duo 6600 2,40 GHz.
L'installation n'a pas caus de problme particulier et cela fait presque deux mois que je travaille sur des projets
migrs de Visual Studio 2008.
1. Comment se comporte cette version en termes de Par dfaut l'IDE utilise le rpertoire de votre solution pour
rapidit ? stocker les fichiers .sdf.
En indiquant un rpertoire dans la rubrique " Emplacement
Je n'ai pas constat de problmes de lenteur, cette version
de secours " l'IDE utilisera cet emplacement pour crer ces
se comporte normalement.
fichiers.
N'oubliez pas de paramtrer votre anti-virus pour exclure
2. Vraiment finie la galre du fichier .ncb et de la perte
ce fichier de l'analyse.
de l'IntelliSense ?
IntelliSense a aussi volu puisqu'il donne maintenant des
Comme vous l'avez peut tre appris, cette nouvelle version informations sur la validit ou la cohrence du code crit,
ne travaille plus avec le fichier .ncb mais utilise une base Exemples :
SQL (locale) pour tenir jour les informations relatives
aux classes (classview) et d'IntelliSense.
En cas de problme nous tions habitus supprimer le
.ncb, dornavant une nouvelle commande "Relancer
l'analyse de la solution", apparat dans le menu projet pour
scanner la solution. Ou encore :
Le fichier .ncb porte l'extension .sdf et est exploit par
SQL Server Compact database.
Un onglet de paramtrage de l'IntelliSense a t rajout
dans les options l'emplacement : Menu
Outils/Options/Editeur de texte/ C/C++ /Avanc.

Une section qui peut tre intressante modifier est "


Emplacement de secours ".

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 32
l'usage cette fonctionnalit est trs pratique, d'un simple <image>D:\Program Files (x86)\Microsoft Visual
coup d'il je sais que mon code ne compilera pas, alors Studio
10.0\Common7\IDE\StartPages\en\developpez.PNG</im
que prcdemment il faillait lancer une compilation pour age>
voir les erreurs <description id="welcome_developpez_desc">le
club des professionnels de
3. Puis-je distribuer mon programme MFC ou C++ l'informatique</description>
avec les DLL systmes associes ? <commands>
<command>
La rponse est oui, il est maintenant possible de distribuer <commandtype>Browse</commandtype>
son programme dans un rpertoire avec les DLL MFC et <title
celle de la CRT. id="welcome_developpez_cmd1_title">La Faq Visual
C++</title>
Il ne sera donc plus ncessaire priori d'utiliser vcredist.
<parameter>http://cpp.developpez.com/faq/vc
/</parameter>
4. Quelles sont les nouveauts de l'diteur et de </command>
l'interface ? <command>
<commandtype>Browse</commandtype>
La nouvelle interface utilise WPF. Le premier apport
<title
important est le zoom vectoriel rendu possible sur un id="welcome_developpez_cmd2_title">La Faq C+
fichier source. +</title>
Il suffit d'utiliser la molette de la souris avec la touche <parameter>http://cpp.developpez.com/faq/cp
CTRL enfonce pour zoomer sur le texte. p/</parameter>
- Gestion des projets rcents : </command>
<command>
Les projets ouverts peuvent tre punaiss comme sur la <commandtype>Browse</commandtype>
<title
barre d'outils de Seven.
id="welcome_developpez_cmd3_title">Forums Visual
C++</title>
- Nouvelles possibilits de l'interface MDI : <parameter>http://www.developpez.net/forums
/f29/c-cpp/outils-c-cpp/visual-cpp/</parameter>
Le menu contextuel sur l'onglet du document donne de </command>
nouvelles fonctionnalits : </commands>
</item>
Une fonctionnalit qui me manquait depuis longtemps : la
commande " flotter " qui permet de dtacher la fentre des mon avis la solution retenue en XML est plus simple
onglets MDI, cela permet de disposer un lment en que la prcdente en XAML.
dehors de l'interface de l'diteur.
Cette fonctionnalit s'applique bien sr aux autres - Cibler une autre plateforme de construction du
lments de l'interface comme le gestionnaire de projets projet :
ou par exemple un fichier source.
Les fentres de l'interface se ferment par la croix Il est possible de spcifier Visual Studio 9.0 pour la
directement disponible sur l'onglet. construction du binaire de votre application, dans ce
- Personnaliser la page d'accueil de Visual Studio : contexte, Visual Studio 2010 utilisera Visual Studio 2008
(qui devra tre prsent sur la machine) pour construire le
Quand j'ai commenc m'intresser ce sujet sur les projet. Ce rglage se fait directement dans votre projet
versions bta il fallait travailler sur un fichier au format l'emplacement suivant: Proprits de
XAML, avec la RC exit le format XAML retour au XML configuration/Ensemble d'outils de plateforme.

Les fichiers modifier sont situs l'emplacement 5. Gestion des chemins de recherche
d'installation de Visual Studio 2010, ce qui donne sur ma
Avant vous dfinissiez vos diffrents chemins de recherche
machine :
pour les sources, bibliothques etc dans le menu options de
D:\Program Files (x86)\Microsoft Visual Studio
Visual Studio.
10.0\Common7\IDE\StartPages\en
Eh bien, c'est fini.
Il y a un fichier par type d'environnement, dans mon cas
Ce paramtrage a migr dans votre projet !
j'ai modifi le fichier Links.Ultimate.VC.xml.
Rajouter une nouvelle section est un jeu d'enfant. Je me
Vous pouvez exporter le paramtrage des chemins de
suis concoct une nouvelle section pour rester connect
recherche dfinis globalement dans Visual studio 2008
avec ma tribu :
pour les rintgrer dans Visual Studio 2010.
Au final, dans chaque nouveau projet ou projet migr, on
J'ai commenc par capturer la page d'accueil de
retrouve l'ensemble des chemins de recherche dans les
developpez.com que j'ai enregistre dans un fichier au
diffrentes sections.
format .png
Pour dfinir globalement vos chemins de recherche, il
J'ai ensuite rajout la section suivante juste en dessous de
existe plusieurs solutions : pour les dfinir par l'IDE, il
celle de " Community and Learning Resources "
faut appeler partir d'un projet l'option affichage /
<item>
Gestionnaire de proprits.
<title id="welcome_developpez_title">Communaut
developpez.com</title> L'item Microsoft.Cpp.Win32.user.props contient la

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 33
dfinition des chemins par dfaut. "));
Il est possible de modifier directement ce fichier au format dlg.AddRadioButton( 4, _T("Pas du tout"));
xml, stock par l'utilisateur.
Il est situ l'emplacement (sous seven) : dlg.SetMainIcon(TD_SHIELD_ICON);
C:\Users\user\AppData\Local\Microsoft\MSBuild\v4.0 dlg.SetFooterIcon(TD_INFORMATION_ICON);
En voici un exemple vierge de toutes modifications: INT_PTR nResult = dlg.DoModal();

}
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build"
ToolsVersion="4.0" C'est une traduction directe de l'exemple que l'on peut
xmlns="http://schemas.microsoft.com/developer/msb trouver sur le blog de l'quipe Visual US.
uild/2003">
<PropertyGroup>
- Redmarrage de l'application aprs un crash :
<ExecutablePath>$
(ExecutablePath)</ExecutablePath> Ce systme que vous avez peut tre dj expriment dans
<IncludePath>;$(IncludePath)</IncludePath> Office 2007 ou Visual Studio permet de relancer
<ReferencePath>$ l'application avec une restauration de l'environnement de
(ReferencePath)</ReferencePath> travail, qui est rgulirement sauvegard par l'application.
<LibraryPath> $(LibraryPath)</LibraryPath> La bibliothque MFC implmente donc maintenant ce
<SourcePath>$(SourcePath)</SourcePath> mcanisme qui devient une option de l'assistant la
<ExcludePath>$(ExcludePath)</ExcludePath> gnration du programme.
</PropertyGroup>
</Project>
- DPI Awareness :

Il vous faudra donc rajouter toutes vos dfinitions globales Cette option permet d'adapter le texte et les contrles de
dans ce fichier en sparant les chemins par des " ; ", ou en nos applications MFC en fonction du rglage des fontes
passant par l'interface de l'IDE. Windows : la petite fonte correspondant 96 dpi, la
moyenne 120 dpi et la grande 144 dpi.
Bien qu'on arrive au mme fonctionnement qu'avec Visual Cette option est activable dans les options du projet
Studio 2008, la diffrence tient dans le paramtrage, qui a l'emplacement : Outil Manifeste/Prise en charge DPI.
migr dans un fichier stock par l'utilisateur. - Gestion des transactions sur les oprations fichier et
sur les fonctions associes la Base de registre:
6. Quelles sont les nouveauts sur les MFC ? Une nouvelle classe ATL CAtlTransactionManager
- La classe CTaskDialog : permettant de grer les transactions des fichiers a t
rajoute.
Cette nouvelle classe permet de dfinir rapidement des Les diffrentes classes MFC de manipulation de fichiers
botes messages plus volues que la classique bote de ou de rpertoires ont t modifies pour supporter cette
dialogue obtenue par la fonction MessageBox. fonctionnalit.
Elle ne sera disponible qu'avec Windows Vista et Seven, et
CFile(CAtlTransactionManager *);
est une encapsulation directe de l'API Win32.
CStdioFile(CAtlTransactionManager *);
La mthode DoModal appelle directement dans
CAtlFile(CAtlTransactionManager *);
COMCTL32.DLL la fonction TaskDialogIndirect.
CFileFind(CAtlTransactionManager *);

Un petit exemple ?
J'ai rajout ces quelques lignes dans mon projet de tests Les API : AfxRegCreateKey, AfxRegOpenKey,
sur un bouton d'une FormView : AfxRegDeleteKey disposent dsormais d'un paramtre
TransactionManager.
void Ctestvc2010View::OnBnClickedButtontaskdlg()
{ Exemple avec AfxRegCreateKey :
// TODO: Add your control notification handler
code here LONG AFXAPI AfxRegCreateKey(HKEY hKey, LPCTSTR
CTaskDialog dlg(_T("Une CTaskDialog prsente des lpSubKey, PHKEY phkResult,
informations d'une manire claire et cohrente"), CAtlTransactionManager* pTM = NULL);
_T("Que pensez-vous de CTaskDialog?"),
_T("Exemple CTaskDialog"), 0,
Cet exemple issu du blog US de Visual Studio illustre
TDF_ENABLE_HYPERLINKS |
TDF_USE_COMMAND_LINKS , _T("J'espre que vous l'utilisation de la transaction (commit) et du retour arrire
l'aimez!")); (rollback) :

dlg.AddCommandControl( 10, _T("&Utilisez- CAtlTransactionManager tmCommit;


la!\nC'est la meilleure bote dialogue que vous CFile
pouvez avoir!!")); cfile1(_T("c:\\TransactionFileSystemDemo\\cfile1.
dlg.AddCommandControl( 20, _T("&Peut- txt"), CFile::modeCreate, &tmCommit);
tre?\nVous ne voulez pas l'essayer ?"));
dlg.AddCommandControl( 25, _T("&Aucune CStdioFile
chance!\nJe ne vais pas l'utiliser!")); stdiofile1(_T("c:\\TransactionFileSystemDemo\\cst
diofile1.txt"), CFile::modeCreate, &tmCommit);
dlg.AddRadioButton( 3, _T("Beaucoup"));
dlg.AddRadioButton( 7, _T("Un Petit peu CAtlFile atlfile1(&tmCommit);

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 34
atlfile1.Create(_T("c:\\TransactionFileSystemDem virtual BOOL OnTouchInput(CPoint pt, int
o\\atlfile1.txt"), STANDARD_RIGHTS_REQUIRED, nInputNumber, int nInputsCount, PTOUCHINPUT
FILE_SHARE_READ, CREATE_ALWAYS, pInput);
FILE_ATTRIBUTE_NORMAL);

Cette mthode va nous permettre de traiter les diffrents


tmCommit.Commit();
vnements possibles :
tmCommit.Close();

BOOL CChildView::OnTouchInput(CPoint pt, int


CAtlTransactionManager tmRollback;
nInputNumber, int nInputsCount, PTOUCHINPUT
CFile pInput)
cfile2(_T("c:\\TransactionFileSystemDemo\\cfile2.
{
txt"), CFile::modeCreate, &tmRollback);
if ((pInput->dwFlags & TOUCHEVENTF_DOWN) ==
CStdioFile
TOUCHEVENTF_DOWN) // Touch Down event
stdiofile2(_T("c:\\TransactionFileSystemDemo\\cst
diofile2.txt"), CFile::modeCreate, &tmRollback); {
CAtlFile atlfile2(&tmRollback); // votre traitement
return TRUE;
atlfile2.Create(_T("c:\\TransactionFileSystemDem }
o\\atlfile2.txt"), STANDARD_RIGHTS_REQUIRED, else if ((pInput->dwFlags & TOUCHEVENTF_MOVE)
FILE_SHARE_READ, CREATE_ALWAYS, == TOUCHEVENTF_MOVE) // Touch Move event
FILE_ATTRIBUTE_NORMAL); {
// votre traitement
tmRollback.Rollback(); return TRUE;
tmRollback.Close(); }
else if ((pInput->dwFlags & TOUCHEVENTF_UP) ==
TOUCHEVENTF_UP) // Touch Move event
- Le support du multi-touch :
{
// votre traitement
Les applications MFC peuvent prendre en compte le multi-
return TRUE;
touch de Windows Seven. }
Voici rapidement comment procder : dans la mthode
InitInstance de votre classe d'application rajouter les lignes return FALSE;
suivantes pour tester le support matriel du multi-touch : }

BYTE digitizerStatus = (BYTE)


GetSystemMetrics(SM_DIGITIZER); Voil pour la mise en place de l'architecture.
if ((digitizerStatus & (0x80 + 0x40)) == 0) Il ne reste plus qu' mettre en place votre traitement.
//Stack Ready + MultiTouch
{ - Le retour de Class Wizard :
AfxMessageBox(L"Pas de priphrique Multi-Touch
disponible"); Cet outil, prsent dans Visual 6.0 a t enlev avec Visual
return FALSE;
Studio 2002.
}
Il fait son grand retour dans Visual Studio 2010.
BYTE nInputs = (BYTE)
GetSystemMetrics(SM_MAXIMUMTOUCHES); Il faut dire que cela fait des annes que tout le monde le
CString str; rclame.
str.Format(L"Priphrique Multi-Touch disponibl
avec %d points.", nInputs); Le raccourci clavier n'est pas le mme que sous Visual 6.0
//AfxMessageBox(str); CTRL+X mais CTRL+MAJ+X
On retrouve enfin les mmes fonctionnalits dont nous
Pour indiquer que votre application cliente est apte a disposions sous Visual 6.0.
recevoir les messages Multi-Touch, il faudra appeler la
mthode CWnd::RegisterTouchWindow() dans la Pour ceux qui n'ont pas connu Class Wizard c'est une bote
mthode de rponse au message WM_CREATE de votre onglets permettant de raliser l'ensemble des oprations
fentre fille (la child ) de traitement. possibles sur une classe fentre : messages, ajout de
donnes membres, etc.
int CChildFrame::OnCreate(LPCREATESTRUCT Plutt que de courir diffrents endroits pour effectuer des
lpCreateStruct) oprations, tout est disponible dans un seul outil.
{ D'autre part, diffrentes actions peuvent tre ralises en
if mme temps, comme l'ajout de plusieurs variables
(CMDIChildWndEx::OnCreate(lpCreateStruct) == -1)
associes des contrles, ce qui n'tait pas (plus) le cas
return -1;
if (!RegisterTouchWindow()) return -1;
avant.
}
- Image de fond dans les dialogues :
Il est maintenant possible de rajouter une image en fond
L'appel de cette mthode rend l'application capable de
d'une bote de dialogue avec la " mockup bar " , celle-ci
recevoir les messages WM_TOUCH.
est disponible en bas de l'diteur de ressources.
Il vous faut ensuite rajouter manuellement dans la child la
Un clic sur le bouton de parcours de fichier dans la barre
mthode suivante :
permet de slectionner une image que l'on pourra
positionner grce aux zones d'offset dont on pourra rgler

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 35
l'opacit.
Malgr cela je ne peux que regretter l'absence d'un C++0x :
dispositif permettant de rgler la couleur de fond d'une fonctionnalits de Proposition VC9 VC10
bote de dialogue ou d'une FormView. langage
Rfrences Rvalue N2118 (Lien80) NON V2
- Autorisation d'affichage des ActiveX dans l'diteur de
ressources : Rfrences Rvalue
N2844 (Lien81) NON V2
Si des ActiveX sont prsents dans vos ressources, Visual v2
Studio vous demandera l'autorisation de les afficher, ce qui Rfrences Rvalue
risque la longue de devenir fatiguant. N2439 (Lien82) NON NON
pour this
Initialisation de
Certains d'entre vous ont d remarquer depuis Visual
classe d'objets par N1610 (Lien83) OUI OUI
Studio 2008 l'absence de l'application qui permettait de
rvalues
tester un Activex, celle-ci est en fait disponible dans les
exemples des MFC situs l'emplacement suivant : static_assert N1720 (Lien84) NON OUI
pour VS2008 : [Program Files]\Microsoft Visual Studio auto N1984 (Lien85) NON OUI
9.0\Samples\1033\AllVCLanguageSamples.zip ;
Dclarations
pour VS2010: [Program Files]\Microsoft Visual Studio N1737 (Lien86) NON OUI
multiples avec auto
10.0\Samples\1033\VC2010Samples.zip.
L'exemple se nomme TSTCON dans le dossier OLE. Suppression de
l'ancienne N2546 (Lien87) NON OUI
- Prvisualisation des documents dans la barre de fonctionnalit auto
Windows Seven : Mise en place du
N2541 (Lien88) NON OUI
type de retour
J'ai gnr une application multi-document MFC avec une
Lambdas N2927 (Lien89) NON V1.0
CeditView.
Lorsque j'ouvre trois onglets dans mon application MFC decltype N2343 (Lien90) NON OUI
ils deviennent visibles dans la barre d'application de Crochets en chevron
Windows Seven. N1757 (Lien91) OUI OUI
droite (>>)
De plus, le clic sur le document dans la barre des taches
Modle (template)
active l'onglet correspondant dans l'application. N1987 (Lien92) OUI OUI
Externe
Au moment de la gnration de l'application, j'ai coch les
options de prvisualisation du document et de l'affichage nullptr N2431 (Lien93) NON OUI
simplifi. enums Fortement
N2347 (Lien94) Partiel Partiel
typs
Ces options permettent la prvisualisation du document
Pr- dclaration des
dans l'explorateur Windows, son affichage simplifi N2764 (Lien95) Partiel Partiel
enums
(Thumbnail) et la recherche de contenu.
Toute la logique de traitement est gnre Dclarations amies
N1791 (Lien96) Partiel Partiel
automatiquement dans la classe document. (friend) tendues
Il faudra adapter ce code pour vos documents. Type local et non
nomm en tant
- Programmation du Ruban (ribbon) : N2657 (Lien97) OUI OUI
qu'arguments de
modles
Le ruban est maintenant directement ditable dans l'diteur
Fonctionnalits de
de ressources.
langage de base:
Sa description est au format XML.
Concurrence
Sa composition est donc moins laborieuse que dans Visual
Studio 2008 o il fallait tout coder manuellement. exception_ptr N2179 (Lien98) NON OUI
Stockage de donnes
L'ensemble des contrles ncessaires la cration du local au thread
ruban est donc disponible dans la Bote outils. (TLS) pour info
Une remarque personnelle : le ruban est beau mais il ne se N2659 (Lien99) Partiel Partiel
cette technique est
prte pas toutes les applications. utilise dans les
Les crans d'aujourd'hui sont pratiquement tous au format MFC.
large (wide) et la perte de surface en hauteur provoque
Fonctionnalits de
par ce style d'interface est trs pnalisante.
langage de base:
Il serait intressant (c'est un appel du pied) de disposer de
C99
la mme interface la verticale de l'cran
__func__ N2340 (Lien100) Partiel Partiel
7. Support partiel de C++0x Prprocesseur C99 N1653 (Lien101) Partiel Partiel
Le tableau ci-contre expose les avances du support de C+ long long N1811 (Lien102) OUI OUI
+0x pour Visual Studio 2010 par rapport Visual Studio
2008 :

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 36
8. La nouvelle bibliothque sur le paralllisme en mode o parallel_invoke
natif : Parallel pattern Library o parallel_accumulate
Cette bibliothque permet de parallliser des applications
d) Les containeurs avec gestion de la concurrence
natives en C++.
o concurrent_queue
Elle rentre en concurrence avec celle d'Intel : TBB (voir
o concurrent_vector
mon compte rendu des Techdays 2008 (Lien103))
o concurrent_unordered_map
o combinable
La bonne nouvelle c'est qu'Intel utilisera pour la partie
Windows, le moteur d'excution de Microsoft : le
Il est noter que le dbogueur de Visual Studio a t
Concurrency Runtime.
remani pour tenir compte du paralllisme avec une vision
Cette bibliothque adopte le style standard de la Template
par thread par tche etc.
Librairie (STL) tout en tirant parti des nouvelles
caractristiques du standard C++0x avec notamment les
Voil pour l'essentiel.
expressions lambda.
je vous invite consulter MSDN pour plus d'informations.
Voici un aperu express des diffrentes fonctionnalits
dont on peut distinguer quatre parties :
9. Conclusion
a) Le paralllisme de tache Beaucoup de nouveauts et de points positifs pour ce
o task_handle produit d'ores et dj disponible.
o task_group Nouvelles fonctionnalits, confort d'utilisation de l'IDE
amlior, Visual Studio 2010 est en nette volution par
b) Les primitives de synchronisation rapport Visual Studio 2008.
o reader_writer
o enter_critical Ce sera tout pour ce tour d'horizon rapide des nouveauts
o Event apportes l'interface de la version 2010 de Visual Studio
et son module C++.
c) Les algorithmes
o parallel_for Retrouvez l'article complet de Patrick OTTAVI en ligne :
o parallel_for_each Lien104

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 37
Qt
Les dernires news

Naissance du projet QExtend Sortie de Qt Mobility 1.0.0


Bonjour, Aprs un peu d'attente, voil enfin la premire sortie
officielle de Qt Mobility.
Nous sommes heureux de vous annoncer la cration du
projet QExtend : Lien105. Cette release contient 10 API dont 9 sont considres
comme finales et 1 comme bta.
QExtend est une bibliothque C++ dveloppe par l'quipe Les 9 API finales sont les suivantes :
Qt de la communaut Developpez.com. Son objectif est Service Framework
d'tendre et de simplifier l'utilisation de Qt ainsi que celle Bearer Management
d'autres bibliothques (Qwt, OpenCV...). Messaging
Contacts
Le projet venant de commencer, il n'y a pas encore Versit
normment de choses disponibles sur le repository.
Publish and Subscribe
Toutefois, nous pouvons vous faire part d'une bonne liste
de fonctionnalits prvues : Location
* pointeurs intelligents ; System Information
* manipulateurs de layouts, signaux/slots et XML ; Sensors
* dtection d'appui sur des touches du clavier ;
* classes d'aide pour QGraphics ; L'API multimdia quant elle, est un trs bon tat de
* logger ; dveloppement, mais l'quipe de dveloppement se rserve
* widgets, comme un menu de fichiers rcemment la possibilit de modifier cette version. Dans ce cas, cette
ouverts ; version bta ne sera pas maintenue, il est donc vos
* CUDA ; risques et prils de l'utiliser ds prsent.
* Qwt ;
* trouver la grande question sur la vie, l'univers et le reste. O les trouver ?

Et ce n'est qu'un petit rsum ! Elles sont disponibles sur la page Qt Solutions (Lien107)
ainsi que dans la version bta du SDK de Qt (Lien108).
Si vous avez des questions, des remarques, des
propositions, n'hsitez pas nous les proposer sur ce Pour bien commencer, n'hsitez pas parcourir le guide
thread. Si vous utilisez d'ores et dj QExtend, nous vous d'utilisation (Lien109).
proposons d'ajouter un tag [QExtend] au titre de votre
message. Et pour Symbian ?

De plus, une fois connect sur le gestionnaire de projets, Cette release pour Maemo supporte uniquement Maemo
vous pourrez aussi nous remonter les bogues rencontrs ou PR 1.2 qui n'est pas encore paru.
proposer des amliorations. Il y aura dans les semaines venir un patch pour
l'utilisation de Qt Mobility avec la plateforme Symbian.
Si vous souhaitez participer au projet, manifestez-vous ici,
nous vous recontacterons. Voir aussi

Commentez cette news en ligne : Lien106 Le site Web de Qt (Lien110).

Et vous ?

Attendiez-vous avec autant d'impatience que nous cette


sortie ? Prvoyez-vous d'utiliser ces API dans vos
applications dans les mois venir ?

Commentez cette news en ligne : Lien111

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 38
Les derniers tutoriels et articles
Concevoir la prochaine gnration d'interface utilisateur multiplateformes avec Qt
Concevoir la prochaine gnration d'interface utilisateur multiplateformes avec Qt

Le framework Graphics de Qt apporte diffrents outils permettant d'amliorer l'interface utilisateur de vos
applications en modifiant l'apparence des objets graphiques et en les animant.
Cet article est une traduction autorise de Building Next Generation UIs Across Platforms with Qt (Lien112), par
Johan Thelin.

1. L'article original anime. Avant de pouvoir utiliser ces outils, nous avons
besoin de donner l'application une apparence correcte.
Qt Quarterly est une revue trimestrielle lectronique
propose par Qt destination des dveloppeurs et
3. L'apparence de l'application
utilisateurs de Qt. Vous pouvez trouver les versions
originales (Lien113). Traditionnellement, les applications de bureau sont
fabriques partir de widgets rectangulaires. Les widgets
Nokia, Qt, Qt Quarterly et leurs logos sont des marques grent leur propre contenu ainsi que le contenu de leurs
dposes de Nokia Corporation en Finlande et/ou dans les enfants dans un rectangle qui leur est allou. Ils sont
autres pays. Les autres marques dposes sont dtenues galement conus pour tre positionns les uns par rapport
par leurs propritaires respectifs. aux autres et pour rester peu prs la mme place la
plupart du temps. Le rsultat est une interface plus ou
Cet article est la traduction de l'article Building Next moins rigide construite sur des rectangles. Les
Generation UIs Across Platforms with Qt (Lien112) de environnements de bureau jouent parfois avec les coins
Johan Thelin paru dans la Qt Quarterly Issue 32. arrondis des boutons et ajoutent un peu de couleur.
Aujourd'hui, les utilisateurs veulent plus.
Cet article est une traduction d'un des tutoriels crits par
Nokia Corporation and/or its subsidiary(-ies) incluse
dans la documentation de Qt, en anglais. Les ventuels
problmes rsultant d'une mauvaise traduction ne sont pas
imputables Nokia.

2. Introduction
Classique Moderne
Avec Qt 4.6, une multitude de nouvelles classes ont t
ajoutes. Toutes ces classes vont dans la mme direction : Pour contourner les limitations des widgets, il est possible
des interfaces modernes, animes et ractives. d'utiliser le framework Graphics View (Lien114) comme
base de votre interface utilisateur. Ce framework a
En regardant les interfaces utilisateur d'un point de vue remplac l'ancienne API mais l'a aussi tendu. Avec
utilisateur, les appareils mobiles actuels ont commenc Graphics View, il est possible de faire pivoter, de modifier
employer des interfaces utilisateur imitant le monde rel. l'chelle, de dtacher et de dplacer des lments, mais
Cela a permis d'ajouter des effets graphiques avancs tels galement d'appliquer des pseudo-transformations
que les transformations en trois dimensions, le flou, tridimensionnelles comme la rotation d'un objet autour de
l'opacit, mais aussi les transitions fluides et la simulation l'axe x ou y.
physique. Dans ce type d'application, utiliser des blocs de
construction de l'interface utilisateur standard n'est pas Au cours de l'volution de Qt, de plus en plus de
toujours dsir. Au contraire, l'interface utilisateur doit fonctionnalits ont t ajoutes, y compris la capacit
s'intgrer dans l'appareil physique qui a sa propre intgrer des widgets dans des scnes graphiques. Parmi les
interface. apports de Qt 4.6, on trouve un framework de classes pour
l'animation, des effets graphiques, les tats et des
Qt permet d'aborder cette situation selon deux approches transitions pour l'interface utilisateur. En tant capable de
complmentaires. La premire est constitue des mthodes mlanger des lments graphiques avec des widgets et des
d'interaction avec l'utilisateur. Qt supporte le multi-touch animations, le rsultat permet de crer des interfaces
et la gestuelle en complment du clavier et de la souris. utilisateur modernes.
L'autre approche correspond aux graphiques, aux
transitions et aux effets. Nous allons nous concentrer sur Lors de la cration d'une interface utilisateur moderne, le
cette partie dans cet article. travail des designers est d'obtenir la bonne combinaison
d'effets. Le dveloppeur qui implmente l'interface doit
Les nouvelles classes de graphiques et d'animations de Qt dcider quel outil utiliser pour chaque partie du design.
4.6 peuvent tre divises en trois groupes : les effets L'outil tout prt est le framework Animation (Lien115).
graphiques, les animations de proprits et le framework Ces classes dfinissent, regroupent et ordonnent les
de machine tats. Ces trois composants forment animations. En plus des animations, un ensemble d'effets,
ensemble la base d'une interface utilisateur moderne et tels que le flou et l'ombrage, sont galement disponibles.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 39
Pour conduire une telle exprience de l'utilisateur, une QgraphicsItemGroup (Lien121) est utilis pour le second
sorte de machine tats est ncessaire. Cela est permis par effet.
le framework de machine tats de Qt (Lien116). Ici,
plusieurs tats peuvent tre dfinis ainsi que des transitions
entre eux avec des animations et des effets. Il n'est pas
ncessaire de crer une liste de boolens et une variable
globale reprsentant l'tat courant associe des
minuteries et des slots utilisateurs. Une configuration
unique d'une machine tats encapsule l'interface
utilisateur complte avec des transitions et des animations
couples. Avec ce problme administratif rgl, les
dveloppeurs peuvent se concentrer sur l'ajout de
fonctionnalits modernes l'application.

3.1. Les effets graphiques


L'une des caractristiques nouvelles de Qt 4.6 est
l'ensemble des nouvelles classes d'effets graphiques. La
classe de base, QgraphicsEffect (Lien117), forme la base
d'un framework ajoutant des effets tels que le flou et les
ombres projetes. Ces effets peuvent tre appliqus aux Des rectangles avec des effets de flou et d'opacit
lments d'interface utilisateur comme les widgets et les
lments graphiques. Il est possible de crer des effets 3.2. Les classes d'animations
personnaliss qui peuvent tre utiliss dans les mmes
circonstances, ce qui signifie que vous pouvez faire ce que Un des lments cls d'une interface utilisateur moderne
vous voulez. est d'avoir des transitions animes et fluides au lieu des
changements immdiats et soudains. Cela peut aider
Tous les effets graphiques sont contrls par un certain l'utilisateur comprendre comment les lments sont relis
nombre de proprits. Cela signifie non seulement que les entre eux et rendre l'interface utilisateur plus raliste.
effets peuvent tre adapts pour chaque application, mais Dernier point mais non des moindres, il contribue
aussi qu'ils peuvent tre modifis par le systme galement amliorer l'attrait visuel de l'ensemble du
d'animation que nous examinerons plus tard. systme.

Qt 4.6 est livr avec un tout nouveau framework


d'animation (Lien122). L'animation aurait pu tre
implmente en utilisant des versions antrieures de Qt
mais celle-ci aurait t limite la fourniture de time lines
pour les animations et les classes animant des
transformations d'objets graphiques. Le nouveau
Flou Ombre projete framework rend possible d'animer n'importe quelle
proprit d'un Qobject (Lien123).
L'un des effets disponibles est l'effet de flou par la classe
QgraphicsBlurEffect (Lien118). Elle applique un flou sur
son lment source en fonction de la proprit blurRadius
(Lien119). Un petit rayon donne peu de flou tandis qu'un
grand rayon conduit un flou plus important. Pour
appliquer l'effet graphique un lment graphique, utilisez
la mthode QGraphicsItem::setGraphicsEffect() (Lien120)
comme indiqu ci-dessous.

QGraphicsBlurEffect *effect = new


QGraphicsBlurEffect(this); Le framework d'animation se compose de nombreuses
effect->setBlurRadius(0); classes bases sur la classe QabstractAnimation (Lien124).
Fondamentalement, les classes utilisaient soit des outils
QGraphicsPixmapItem *item = new facilitant la synchronisations des animations, soit des
QGraphicsPixmapItem(); animations de proprits. La synchronisation permet aux
// ... animations d'tre excutes en srie ou en parallle. La
item->setGraphicsEffect(effect); classe QpropertyAnimation (Lien125) est probablement
celle que vous utiliserez le plus souvent. Elle permet
Pour obtenir plus d'effets, il est possible de les combiner. d'animer individuellement les proprits des Qobjects
Ceci est obtenu en ajoutant une hirarchie aux objets (Lien126).
graphiques et en appliquant un effet sur chaque niveau. Par
exemple, des effets de flou et d'opacit sont appliqus Lors de l'animation d'une proprit, les valeurs de dbut et
ensemble dans l'exemple suivant. La classe de fin doivent tre prcises. Cela est obtenu en spcifiant
QgraphicsRectItem (Lien121) est l'lment sur lequel nous les QpropertyAnimation::setStartValue() (Lien127) et
voulons appliquer les effets tandis que la classe QpropertyAnimation::setEndValue() (Lien128) pour cette

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 40
proprit. Il est galement possible de fixer des valeurs Q_OBJECT
intermdiaires en utilisant la fonction Q_PROPERTY(qreal rotation READ rotation WRITE
QpropertyAnimation::setKeyValueAt() (Lien129). setRotation)
Lorsque vous dfinissez la valeur de proprit, l'animation
public:
est suppose fonctionner entre 0 et 1. Ce n'est pas tout
CustomRectItem(const QRectF &rect)
fait vrai puisque les animations peuvent utiliser les
: QObject(0),QGraphicsRectItem(rect)
diffrentes courbes de relaxation. Ces courbes peuvent se { }
dplacer lgrement en dehors de la gamme de 0 1 };
comme illustr ci-dessous.
Compte tenu de la dfinition de la classe CustomRectItem,
la rotation de l'objet est aussi simple que de crer un objet
QpropertyAnimation (Lien136) pour cette classe et de le
dmarrer.

QPropertyAnimation *animation = new


QPropertyAnimation(item, "rotation", this);
animation->setStartValue(0);
animation->setEndValue(90);
animation->start();

3.3. Ajouter des tats


Un cas habituel d'utilisation des animations est de changer
entre diffrents tats de l'interface utilisateur comme une
vue en liste, une vue dtaille et un mode d'dition. La
plupart des dveloppeurs ont entendu parler, et mme
peut-tre dj utilis, des machines tats. Celles-ci sont
parfaites pour dfinir des tats et les transitions entre ces
tats.
Pour illustrer toutes ces techniques, le code ci-dessous
montre une animation simple qui permet un Qt 4.6 est livr avec un tout nouveau framework de
QpushButton (Lien130) d'apparatre dans un widget machine tats (Lien137) qui vous permet de faire cela.
conteneur. Comme cette animation ne sera utilise qu'une Grce ce framework, la valeur des proprits des objets
seule fois, l'argument peut tre dfinie pour un ensemble d'tats. Une transition
QAbstractAnimation::DeleteWhenStopped (Lien131) est peut ensuite tre ajoute entre les diffrents tats et
pass la mthode de dmarrage. Cela garantit que l'objet l'ensemble peut alors tre dmarr.
animation soit supprim quand il est arrt.
Un exemple simple montrant cela peut tre construit
QPropertyAnimation *animation = new partir de nos exemples prcdents. Nous prenons une
QPropertyAnimation(button, "geometry");
scne graphique avec deux rectangles inclus dans des
animation->setStartValue(startRect);
animation->setEndValue(endRect);
groupes (pour utiliser deux effets). Nous dfinissons
animation-
ensuite deux tats, le premier dans lequel le rectangle vert
>setEasingCurve(QEasingCurve::OutBounce); apparat opaque 100% sans flou tandis que le rectangle
animation- jaune est opaque 50% et flou, le second tat o ces effets
>start(QAbstractAnimation::DeleteWhenStopped); sont appliqus au rectangle vert au lieu du jaune.

La mme technique, montre ici pour des widgets, peut


tre utilise pour n'importe quel Qobject (Lien123).
Cependant, la classe couramment utilise pour cela,
QabstactGraphicsItem (Lien132), n'hrite pas de Qobject
(Lien123). Pour rsoudre ce problme, un lment
graphique personnalis doit tre cr dans ce cas. Ce n'est
pas aussi lourd qu'il y parat. Tout ce que la nouvelle classe
doit faire est d'hriter de Qobject (Lien123) et d'une des
La premire chose pour crer cela est de mettre en place la
classes drivant de QgraphicsItem (Lien133) puis de
scne : vous pouvez voir comment faire dans le code
rendre accessible la proprit voulue. Par exemple, la
source disponible en tlchargement la fin de cet article.
classe CustomRectItem ci-dessous rend accessible la
Les rsultats produits sont des rectangles et des groupes
proprit de rotation d'un QgraphicsRectItem (Lien134)
appels greenRect, yellowRect, greenGroup et
pour le systme d'animation. Aucun code supplmentaire
yellowGroup. Nous pouvons ensuite leur appliquer des
n'est ncessaire, l'exception d'un constructeur court et de
effets puis ajouter ces lments la scne.
la ligne Q_PROPERTY (Lien135).
QGraphicsOpacityEffect *greenOpacity = new
class CustomRectItem : public QObject, public QGraphicsOpacityEffect();
QGraphicsRectItem
QGraphicsOpacityEffect *yellowOpacity = new
{ QGraphicsOpacityEffect();

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 41
QGraphicsBlurEffect *greenBlur = new machine->addState(greenState);
QGraphicsBlurEffect(); machine->addState(yellowState);
QGraphicsBlurEffect *yellowBlur = new machine->setInitialState(greenState);
QGraphicsBlurEffect();

greenRect->setGraphicsEffect(greenOpacity); Maintenant, il est temps de dire la machine tats


yellowRect->setGraphicsEffect(yellowOpacity); comment changer d'un tat un autre. C'est l que les
greenGroup->setGraphicsEffect(greenBlur); classes d'animation que vous avez vues plus tt entrent en
yellowGroup->setGraphicsEffect(yellowBlur); jeu. Il est possible de prciser exactement quelle animation
utiliser pour chaque objet, proprit et transition. Mais
Quand tout cela est en place, le framework de machine pour faire avancer les choses, vous pouvez galement
tats entre en scne. Nous crons deux tats, nomms spcifier une animation par dfaut pour chaque objet et
greenState et yellowState. L'initialisation de l'tat proprit un niveau de la machine tats.
greenState est indique ci-dessous. Notez que les
proprits modifies par cet tat sont dfinies l'aide de la machine->addDefaultAnimation(new
QPropertyAnimation(greenBlur, "blurRadius"));
mthode assignProperty() (Lien138) qui prend un pointeur machine->addDefaultAnimation(new
d'objet, un nom de proprit et une valeur. La valeur est QPropertyAnimation(yellowBlur, "blurRadius"));
traite comme un Qvariant (Lien139), donc vous pouvez machine->addDefaultAnimation(new
utiliser ce que vous voulez dedans. Vous pouvez mme QPropertyAnimation(greenOpacity, "opacity"));
ajouter le support de vos propres types en utilisant le machine->addDefaultAnimation(new
QPropertyAnimation(yellowOpacity, "opacity"));
systme de type de Qt, mais je m'gare.

QState *greenState = new QState(); Avant de pouvoir dmarrer l'application et profiter des
greenState->assignProperty(greenOpacity, transitions amusantes, il reste une tape finale : dmarrer
"opacity", 1); la machine tats.
greenState->assignProperty(greenBlur,
"blurRadius", 0); machine->start();
greenState->assignProperty(yellowOpacity,
"opacity", 0.5);
greenState->assignProperty(yellowBlur, 4. Qu'en est-il des widgets ?
"blurRadius", 5);
Jusqu' prsent, nous nous sommes concentrs sur les vues
graphiques et les lments, mais presque tout le monde
Pour chaque tat, une srie de transitions doit tre ajoute. utilise une interface utilisateur base sur les widgets. La
Ces transitions permettent de passer de l'tat actuel vers un perspective de devoir remplacer tout le travail dj
autre tat. Comme nous n'avons que deux tats, a nous accompli semble tre une tche assez lourde. La bonne
laisse avec une transition par tat. nouvelle est que presque tous les effets peuvent aussi bien
tre utiliss dans un environnement bas sur les widgets.
Avant de regarder le code, nous allons discuter des
transitions. Toutes les transitions hritent de la classe Commenons par un exemple. Regardons les deux tats de
QabstractTransition (Lien140). ce niveau, les tats dialogue ci-dessous. Ici, les widgets inutiliss sont placs
d'origine et de fin peuvent tre spcifis. Il y a donc des en dehors du widget contenant. Une autre option aurait t
spcialisations de cette classe abstraite reprsentant une de modifier la visibilit des lments.
transition en fonction de la faon dont la transition est
dclenche. Par exemple, il y a des transitions dclenches
par un vnement (QeventTransition (Lien141)) qui peut
intercepter diffrents vnements : l'appui sur une touche
spcifique du clavier (QkeyEventTransition (Lien142)) ou
une action de la souris (QmouseEventTransition
(Lien143)). Il y a galement la classe QsignalTransition
(Lien144) qui implmente une transition dclenche par
un signal spcifique. C'est la classe que nous utilisons dans
le code ci-dessous. Ces tats sont traduits dans le code ci-dessous par le biais
des variables viewState et editState. Les tats spcifiques
QSignalTransition *t = new chaque tat sont dfinis par des appels assignProperty()
QSignalTransition(this, SIGNAL(yellowClicked()));
(Lien146). Comme vous pouvez le voir, pour rendre
t->setTargetState(yellowState);
greenState->addTransition(t);
possible l'utilisation de ces effets, vous devez sacrifier les
layouts. C'est malheureux, mais en explorant les
diffrentes possibilits, vous trouverez le bon mlange
Maintenant que tous les tats sont crs, ils doivent tre entre le bricolage et la flexibilit des layouts. (NDLT : il
ajouts l'objet QstateMachine (Lien145) qui gre est maintenant possible d'utiliser des layouts avec la
l'ensemble. Comme vous pouvez le voir, nous ajoutons machines tats en masquant ou affichant les objets
tous les tats dans la machine tats mais un seul comme l'aide de la proprit visible des Qwidget (Lien147)).
tant l'tat initial. Cela est ncessaire pour donner la
machine tats un point de dpart (n'oubliez pas que QState *viewState = new QState();
toutes les transitions ont un tat d'origine). viewState->assignProperty(editButton, "geometry",
QRect(180, 5, 70, 30));
QStateMachine *machine = new QStateMachine(this);

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 42
viewState->assignProperty(okButton, "geometry",
QRect(110, -35, 70, 30)); QStateMachine *machine = new QStateMachine(this);
viewState->assignProperty(cancelButton, machine->addState(viewState);
"geometry", QRect(180, -35, 70, 30));
machine->addState(editState);
viewState->assignProperty(m_textLabel,
machine->setInitialState(viewState);
"geometry", QRect(5, 5, 175, 30));
viewState->assignProperty(m_textEdit, "geometry",
QRect(-110,5, 105, 30)); QPropertyAnimation *pa;
machine->addDefaultAnimation(pa = new
QPropertyAnimation(editButton, "geometry"));
QState *editState = new QState();
pa->setEasingCurve(QEasingCurve::InOutBack);
editState->assignProperty(editButton, "geometry",
QRect(180, 55, 70, 30));
editState->assignProperty(okButton, "geometry", // ...
QRect(110, 5, 70, 30));
editState->assignProperty(cancelButton, machine->addDefaultAnimation(new
"geometry", QRect(180, 5, 70, 30)); QPropertyAnimation(m_textEdit, "geometry"));
editState->assignProperty(m_textLabel,
"geometry", QRect(-200, 5, 175, 30));
Aprs avoir dfini tous les tats et les transitions,
editState->assignProperty(m_textEdit, "geometry",
QRect(5,5, 105, 30));
l'ensemble de l'interface utilisateur prend vie ds que
l'instance de QstateMachine (Lien149) est dmarre. Vos
utilisateurs devraient avoir une agrable surprise en
Maintenant que les tats ont t dfinis, il est temps
cliquant sur le bouton Edit pour la premire fois.
d'ajouter les transitions.

viewState->addTransition(editButton,
5. Divers
SIGNAL(clicked()), editState); Le code source de l'exemple prsent dans cet article est
editState->addTransition(okButton,
SIGNAL(clicked()), viewState);
disponible au tlchargement l'adresse suivante : qq32-
editState->addTransition(cancelButton,
blurstates.zip (Lien150).
SIGNAL(clicked()), viewState);
Johan Thelin est l'auteur du livre Foundations of Qt
Nous ajoutons ensuite les tats au gestionnaire avant Development de chez Apress et a un faible pour les
d'ajouter les animations par dfaut. Les widgets systmes embarqus. Il est galement impliqu sur le site
m_textLabel et m_textEdit sont dplacs l'aide de la QtCentre ainsi que dans le dveloppement de logiciels et
courbe standard tandis que les boutons se dplacent selon la rdaction technique.
un chemin plus "dynamique" en utilisant la courbe
QeasingCurve::InOutBack (Lien148). Retrouvez l'article de Johan Thelin traduit par Guillaume
Belz en ligne : Lien151

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 43
Mac
Les livres Mac

Mac OS X Snow Leopard Prcis et C'est donc au format PDF que j'ai reu l'exemplaire de ce
livre. PDF qui ne contient aucune protection de type
Concis DRM. Ce qui signifie que vous pouvez installer ce PDF o
Snow Leopard, la nouvelle version du dsormais clbre vous voulez. Que ce soit sur votre Mac, votre iPhone,
Mac OS X n'abonde pas, cette fois, en nouveauts. Cette votre iPad, votre PC, liseuse lectronique.
nouvelle version est une amlioration notable du sytme
Leopard, tant du point de vue des technologies employes Par contre, pour viter tout de mme que le PDF se
(comme Grand Central Dispatch) que des applications qui retrouve un peu partout dans la nature, l'adresse email de
ont t revisites et offrent une plus grande souplesse la personne qui a achet le livre apparat au pied de chaque
d'utilisation au quotidien. page.

Le systme s'est fait plus lger et rapide. Le Mac prend en Cela n'est aucunement drangeant puisque la mise en page
charge Microsoft Exchange, le Finder a t largement du livre tient compte du fait que l'adresse email sera
amlior, les applications comme Aperu, iChat, rajoute au bas de chaque page.
QuickTime, Automator ont galement t revisites. Le
menu Services propose plus de fonctionnalits, etc. En 310 pages, Nicoletis Nathalie nous fait passer en revue
ce nouveau systme d'exploitation qu'est Mac OS X Snow
Cette sixime dition est une visite guide du systme. Leopard.
Ouvrage de rfrence conu dans le but de vous aider
matriser et optimiser votre Mac, vous y apprendrez Les sujets abords sont vastes, les nouveauts de Mac OS
d'abord installer votre systme et migrer vos donnes. X Snow Leopard bien traites, et la mise en page rend ce
livre agrable lire l'cran.
Le troisime chapitre est une prise en main : vous y
dcouvrirez le Finder, le compte utilisateur, les diverses Le fait que ce livre soit au format PDF permet d'utiliser le
fonctionnalits de scurit. moteur de recherche pour y retrouver facilement ce qu'on
cherche. Et on profite de plus des copies d'cran en
Le quatrime chapitre est consacr l'interface : du Dock couleur, ce qui n'aurait certainement pas t le cas si le
au Finder, aux Services ou Expos et Dashboard, tout est livre avait t disponible au format imprim.
pass en revue.
Je voulais galement partager avec vous. combien j'ai
Le chapitre 5 vous permettra d'apprhender les Prfrences t agrablement surpris de la ractivit de Digitbooks !
Systme, partir desquelles vous aurez le loisir de En effet, une fois que j'ai eu fini la lecture du livre, j'ai
personnaliser votre Mac. envoy DigitBooks quelques petites remarques.

Les applications et utilitaires prsents sur votre Mac sont Eh bien, figurez-vous que peu de temps aprs je recevais
ensuite dtaills un par un. une rponse de DigitBooks disant que certaines remarques
avait t prises en compte et m'envoyait une nouvelle
L'auteure termine sur un chapitre de questions/rponses version du PDF o la majorit de mes remarques (et
qui fournit la fois des astuces et des solutions en cas de d'autres) avaient t prises en compte.
soucis.
Et l, je dis bravo.
Ce Prcis et concis est un condens de ce qu'il faut savoir
sur Snow Leopard. Il en dessine la cartographie l'aide Si vous n'avez pas encore de livre consacr Mac OS X
d'explications synthtiques et rpond aux besoins Snow Leopard votre disposition, n'hsitez pas une
immdiats des utilisateurs. seconde vous procurer ce livre qui vous permettra de
dcouvrir les nouveauts apparues avec Snow Leopard (et
Critique du livre par Marcos Ickx elles sont plus nombreuses que ce que l'on pourrait croire).

Contrairement Mac OS X Leopard, Prcis et concis o Le prix de 11 n'est vraiment pas exagr. De plus, il faut
Nicoletis Nathalie avait traduit le livre crit par Chuck savoir que pour ce prix vous avez non seulement le livre
Toporek, il s'agit ici d'une version originale et non d'une au format PDF, mais galement au format MobiPocket, et
traduction du livre Mac OS X Snow Leopard Pocket au format epubs (format reconnu par la plupart des
Guide crit cette fois-ci par Chris Seibold. lecteurs de livres lectroniques, par le Kindle, par l'iPad,
l'iPhone...).
Les livres qui sont publis aux ditions Digit Books ne le
sont, comme le laisse supposer le nom de la maison Pour 1 de plus, vous pouvez galement feuilleter le livre
d'dition, qu'au format numrique. en ligne depuis la liseuse en ligne du site immateriel.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 44
Et si vous ne voulez lire ce livre que depuis la liseuse en Les raccourcis clavier principaux sont dcrits, des plus
ligne du site immateriel, il ne vous en coutera que 5, ce simples aux plus complexes.
qui est vraiment un prix ridiculement bas.
Les principaux lments d'interface, comme le Dock, le
Critique du livre par kOrt3x Finder, Expos ou la barre des menus sont trs bien
dvelopps, voire un peu trop, comme le Dashboard qui
Aprs avoir lu plusieurs livres sur Mac OS X, celui l est est dcrit dans les moindres coins, car tous les widgets
diffrent. installs par dfaut sont dvelopps.

Rien voir avec les livres qui expliquent pendant des Toutes les applications principales d'Apple et les utilitaires
chapitres comment paramtrer son client de messagerie ou sont dtaills avec une simple description sans rentrer dans
configurer son Time Machine. les dtails de chaque application.

Il n'est pas fait pour expliquer la naissance de Mac OS X Vous trouverez une trs bonne partie de questions/rponses
avec son histoire et l'historique de son entreprise qui l'a avec une srie de questions toutes simples pour certains
cr, mais vraiment pour expliquer tous les petits dtails utilisateurs de Mac OS X, mais qui peuvent tre trs
de Mac OS X. pratiques pour les nouveaux utilisateurs de Mac.

Certes il explique les nouveauts et volutions de Mac OS Puis l'ouvrage se termine avec une partie "Ressources" qui
X, comme le support de Microsoft Exchange, l'adressage rfrence une liste de logiciels pouvant complter votre
64 bits, Grand Central Dispatch, etc. ventail d'applications ou le manque de certains logiciels
Tous les dtails sont passs au peigne fin, voire mme des pouvant tre utiliss sous Windows ou Linux, comme des
fois un peu trop. traitements de texte, des clients FTP et bien d'autres.

Les prfrences systme sont trs bien dtailles : elles En rsum, cet ouvrage serait plus orient vers les
sont dcrites une par une, du fond d'cran au FireWall. dbutants ou les futurs utilisateurs de Mac OS X.
Elles y passent toutes.
Retrouvez cette critique de livre sur la page livres Mac :
Pratique pour savoir exactement o aller pour modifier un Lien152
paramtre systme.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 45
Conception
Les derniers tutoriels et articles
Simulacres de tests avec EasyMock et JUnit 4
Simulacres de tests avec EasyMock et JUnit 4

Cet article va vous prsenter l'utilisation de Easymock et de JUnit 4 pour effectuer des tests unitaires avec des
simulacres de tests.

1. Introduction } catch (NotExistingException e){


return false;
Les objets simulacres permettent d'effectuer des tests }
unitaires sur un objet dpendant d'autres objets. On va
remplacer ces objets dont dpend l'objet tester par des return true;
simulacres. On va, par exemple pouvoir vrifier que la }
mthode xyzzy() a t appele 5 fois et a retourn 33. Cela
peut tre pratique dans bien des cas. Par exemple si l'objet public int size(){
rel (celui qu'on mock) est lent ou non-dterministe return dao.count();
(dpendant du temps ou mme de la mto). Ces objets }
sont trs difficiles tester car on pourrait faire plein de
tests sans jamais tomber sur les cas spciaux. Les cas de public void debug(){
tests nous permettront de traiter ces cas spciaux. System.out.println("Debug
information of SimpleService");
dao.debug();
Il existe plusieurs outils permettant de faire des objets
}
simulacres. Dans cet article, nous allons utiliser EasyMock }
2.5.2 pour effectuer ces tests. Pour ce qui est des tests,
nous allons utiliser JUnit 4.7.
Notre mock va donc implmenter l'interface ISimpleDao
Voici l'interface tester : et nous allons le passer SimpleService qui est la classe
tester dans notre cas. Cet exemple est vraiment simpliste.
public interface ISimpleDao { Dans les cas pratiques, vous ferez face des cas beaucoup
void save(String title); plus complexes, mais cet exemple permettra de couvrir la
void remove(String title) throws plupart des fonctionnalits d'EasyMock.
NotExistingException;
int count(); La vrification se fait essentiellement via deux mthodes :
void debug(); expect(T value) : permet de spcifier une valeur
boolean isValid(String title); de retour attendue ;
void insert(String title);
expectLastCall() : utiliser pour les mthodes ne
}
retournant rien.

Et voici notre classe tester : Ces deux mthodes renvoient un objet IExpectationSetters
qui permet de configurer ce que l'on attend de la mthode
public class SimpleService { mocke, comme par exemple, le nombre de fois qu'elle
private ISimpleDao dao;
doit tre appele.
public void setDao(ISimpleDao dao){
2. Vrifier un comportement
this.dao = dao;
} Voici la structure de base pour notre classe de test :

public void insert(String title){ import org.junit.Before;


if(dao.isValid(title)){ import org.junit.Test;
dao.insert(title);
} import static org.junit.Assert.*;
} import static org.easymock.EasyMock.*;

public void save(String... titles){ public class SimpleServiceTest {


for(String title : titles){ private SimpleService simpleService;
dao.save(title); private ISimpleDao simpleDaoMock;
}
} @Before
public void setUp(){
public boolean remove(String title){ simpleService = new SimpleService();
try { simpleService.setDao(simpleDaoMock);
dao.remove(title); }

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 46
@Test @Test
public void insertValid(){} public void debug(){
simpleDaoMock.debug();
@Test
public void insertNotValid(){} replay(simpleDaoMock);

@Test simpleService.debug();
public void save(){}
verify(simpleDaoMock);
@Test }
public void removeWithoutException() throws
NotExistingException {}
La mthode replay() permet de sauvegarder
@Test
l'enregistrement et la mthode verify() permet de vrifier
public void removeWithException() throws que ce qui est fait aprs replay() est bien conforme
NotExistingException {} l'enregistrement. Si vous lancez le test, il va tre valid.
Maintenant, si on commente dao.debug() dans
@Test SimpleService, le test ne va pas se drouler correctement :
public void size(){}
java.lang.AssertionError:
@Test Expectation failure on verify:
public void debug(){} debug(): expected: 1, actual: 0
} at
org.easymock.internal.MocksControl.verify(MocksCo
ntrol.java:111)
Premirement, nous allons commencer par crer un objet at
simulacre (un mock). Pour cela, il nous faut utiliser la org.easymock.EasyMock.verify(EasyMock.java:1608)
classe EasyMock et sa mthode createMock() qui prend en at
paramtre l'interface que doit implmenter le mock. Pour com.dvp.wichtounet.easymock.SimpleServiceTest.deb
ug(SimpleServiceTest.java:45)
amliorer la clart du code, on va utiliser un import
at
statique comme pour JUnit. sun.reflect.NativeMethodAccessorImpl.invoke0(Nati
ve Method)
import org.junit.Before; at
import org.junit.Test; sun.reflect.NativeMethodAccessorImpl.invoke(Nativ
eMethodAccessorImpl.java:57)
import static org.junit.Assert.*; at
import static org.easymock.EasyMock.*; sun.reflect.DelegatingMethodAccessorImpl.invoke(D
elegatingMethodAccessorImpl.java:43)
at
public class SimpleServiceTest { org.junit.runners.model.FrameworkMethod$1.runRefl
private SimpleService simpleService; ectiveCall(FrameworkMethod.java:44)
private ISimpleDao simpleDaoMock; at
org.junit.internal.runners.model.ReflectiveCallab
@Before le.run(ReflectiveCallable.java:15)
public void setUp(){ at
org.junit.runners.model.FrameworkMethod.invokeExp
simpleDaoMock =
losively(FrameworkMethod.java:41)
createMock(ISimpleDao.class);
at
org.junit.internal.runners.statements.InvokeMetho
simpleService = new SimpleService(); d.evaluate(InvokeMethod.java:20)
simpleService.setDao(simpleDaoMock); at
} org.junit.internal.runners.statements.RunBefores.
} evaluate(RunBefores.java:28)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild
Cela va simplement crer un objet mock implmentant (BlockJUnit4ClassRunner.java:76)
l'interface ISimpleDao. La premire action que nous at
pouvons entreprendre avec EasyMock est de vrifier org.junit.runners.BlockJUnit4ClassRunner.runChild
qu'une mthode a bien t appele. Avec EasyMock, cela (BlockJUnit4ClassRunner.java:50)
fonctionne comme un enregistrement : at
org.junit.runners.ParentRunner$3.run(ParentRunner
on joue la squence dsire sur l'objet mock ; .java:193)
on enregistre la squence joue ; at
on teste l'objet ; org.junit.runners.ParentRunner$1.schedule(ParentR
unner.java:52)
on vrifie si la squence a t correctement at
rejoue. org.junit.runners.ParentRunner.runChildren(Parent
Runner.java:191)
On va donc simplement tester pour commencer si la at
mthode debug() de SimpleService appelle bien la org.junit.runners.ParentRunner.access$000(ParentR
unner.java:42)
mthode debug() de notre classe DAO (Data Access
at
Object) :

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 47
org.junit.runners.ParentRunner$2.evaluate(ParentR spcifier une exception qu'il faut lever avec la mthode
unner.java:184) andThrow(). Voyons ce que a donnerait avec le test de la
at mthode remove() avec et sans exception :
org.junit.runners.ParentRunner.run(ParentRunner.j
ava:236)
at //Sans exception
org.junit.runner.JUnitCore.run(JUnitCore.java:157 @Test
) public void removeWithoutException() throws
at NotExistingException {
com.intellij.junit4.JUnit4IdeaTestRunner.startRun simpleDaoMock.remove("Mary");
nerWithArgs(JUnit4IdeaTestRunner.java:94)
at replay(simpleDaoMock);
com.intellij.rt.execution.junit.JUnitStarter.prep
areStreamsAndStart(JUnitStarter.java:165)
assertTrue(simpleService.remove("Mary"));
at
com.intellij.rt.execution.junit.JUnitStarter.main
(JUnitStarter.java:60) verify(simpleDaoMock);
at }
sun.reflect.NativeMethodAccessorImpl.invoke0(Nati
ve Method) //Avec exception
at @Test
sun.reflect.NativeMethodAccessorImpl.invoke(Nativ
eMethodAccessorImpl.java:57) public void removeWithException() throws
NotExistingException {
at
com.intellij.rt.execution.application.AppMain.mai simpleDaoMock.remove("Arthur");
n(AppMain.java:110)
expectLastCall().andThrow(new
NotExistingException());
EasyMock dtecte donc bien que notre mthode n'a pas t
appele au contraire de ce qui a t spcifi par replay(simpleDaoMock);
l'enregistrement et, de ce fait, le test choue. Si vous
essayez de vrifier si des mthodes non-void ont bien t assertFalse(simpleService.remove("Arthur"));
appeles de la mme manire, vous devriez avoir une
exception de type IllegalStateException. En effet, pour les verify(simpleDaoMock);
mthodes retournant quelque chose, il faut indiquer }
EasyMock ce qu'il faut retourner. Nous allons voir cela au
prochain chapitre. Encore une fois, il nous a suffi d'un seul appel de mthode
pour spcifier une exception et, ensuite, nous avons pu
3. Attendre des valeurs de retour vrifier le comportement de notre service en fonction du
Nous allons maintenant traiter des mthodes qui retournent comportement de notre mock.
quelque chose. Dans ce cas, il faut dfinir un
comportement pour pouvoir vrifier ce comportement. 5. Divers
Pour ce faire, il faut utiliser la mthode expect() et
andReturn() pour spcifier une valeur de retour. Voici 5.1. Vrifier le nombre d'appels
comment cela pourrait s'crire pour le test de la mthode
size() : Testons maintenant notre mthode save() :

@Test @Test
public void size(){ public void save(){
expect(simpleDaoMock.count()).andReturn(32); simpleDaoMock.save("xyzzy");
simpleDaoMock.save("xyzzy");
replay(simpleDaoMock); simpleDaoMock.save("xyzzy");
simpleDaoMock.save("xyzzy");
assertEquals(32, simpleService.size()); simpleDaoMock.save("xyzzy");

verify(simpleDaoMock); replay(simpleDaoMock);
}
simpleService.save("xyzzy", "xyzzy", "xyzzy",
"xyzzy", "xyzzy");
Par ces quelques lignes de code, on fait deux tests. On
vrifie si la mthode count() a bien t appele et si size() verify(simpleDaoMock);
retourne la mme valeur que count(). Ce qui est bien le cas }
si on lance le test. On vient donc voir qu'il est trs simple
de spcifier une valeur de retour pour une mthode sur un Ce genre de code devient vite trs lourd crire en
objet mock. fonction du nombre d'appels. On a deux solutions : soit on
fait une boucle pour appeler les mthodes du mock, soit on
4. Traiter les exceptions utilise les fonctionnalits d'EasyMock qui permettent de
EasyMock permet galement de traiter les exceptions. Il spcifier le nombre de fois qu'une mthode doit tre
nous faudra nouveau utiliser la mthode expect(), mais appele grce la mthode times() :
cette fois, au lieu de spcifier une valeur de retour, on va

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 48
@Test vrification de l'ordre. Un mock strict est un bouchon qui
public void save(){ va vrifier l'ordre des appels. On n'a donc pas besoin de
simpleDaoMock.save("xyzzy"); changer nos tests, il suffit simplement d'utiliser une de ces
deux mthodes dans notre mthode before().
expectLastCall().times(5);
5.3.Mocker une classe
replay(simpleDaoMock);
EasyMock met disposition une extension pour crer un
simpleService.save("xyzzy", "xyzzy", "xyzzy", mock d'une classe et non d'une interface. Il s'agit
"xyzzy", "xyzzy"); d'EasyMock Class Extension. L'utilisation de base reste la
mme, il faut juste changer l'import :
verify(simpleDaoMock);
} import static
org.easymock.classextension.EasyMock.*;
Beaucoup plus clair, non ? Il est galement possible de
spcifier qu'une mthode peut tre appele un nombre En plus de cela, il est galement possible d'effectuer un
indfini de fois avec la mthode anyTimes() ou encore un mocking partiel en ne mockant par exemple qu'une seule
certain nombre de fois compris dans un intervalle avec la mthode :
mthode times(min, max).
Mocked mock =
5.2. Vrifier l'ordre des appels createMockBuilder(Mocked.class).addMockedMethod("
mockedMethod").createMock();
On va maintenant tester notre mthode insert() :
Il faut toutefois faire attention au fait que les classes
@Test finales ne sont pas supportes. Si la classe contient des
public void insertValid(){
mthodes finales, elles ne seront pas mockes et elles
expect(simpleDaoMock.isValid("Arthur")).andRe
turn(true);
seront appeles normalement.

simpleDaoMock.insert("Arthur"); 6. Conclusion
Voil, nous avons maintenant pass en revue les
replay(simpleDaoMock);
principales fonctionnalits que nous offre EasyMock pour
la cration d'objets mocks pour les tests unitaires. Comme
simpleService.insert("Arthur");
vous avez pu le constater, c'est un moyen simple mais trs
verify(simpleDaoMock);
puissant de vrifier le comportement d'un objet en fonction
} du comportement d'un objet dont il dpend. Il existe
d'autres librairies qu'EasyMock pour faire cela comme
@Test JMock, JMockit ou encore Mockito. Personnellement, je
public void insertNotValid(){ trouve qu'EasyMock est la plus agrable utiliser et
expect(simpleDaoMock.isValid("Arthur")).andRe fournit toutes les fonctions dont j'ai besoin pour faire mes
turn(false); tests, c'est pourquoi j'ai choisi de prsenter cette librairie.

replay(simpleDaoMock); Vous pouvez tlcharger les sources de cet article ici :


Lien153
simpleService.insert("Arthur");
Si vous tes intress par un autre framework, je vous
verify(simpleDaoMock);
invite lire cet article sur Jmockit (Lien154), de Florence
}
Chabanois.
Vous allez me dire qu'on a dj vu tout cela, certes, mais Pour vos questions sur les outils de test Java, vous pouvez
dans ce genre de cas, il peut galement tre intressant de consulter le forum ddi (Lien155).
vrifier que les appels se font au bon endroit. En effet, si la
mthode isValid() est appele aprs que l'insert() a t fait, Pour plus d'informations sur EasyMock, je vous invite
elle n'a pas beaucoup d'intrt. Avec EasyMock, il y a consulter la documentation officielle en Franais
deux faons de vrifier l'ordre des appels. Soit on utilise la (Lien156).
mthode createStrictMock() au lieu de createMock() ou
alors on utilise checkOrder(mock, true) pour activer la Retrouvez l'article de Baptiste Wicht en ligne : Lien157

Amliorer la testabilit

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 49
Amliorer la testabilit

Cet article donne quelques pistes de rflexion pour faciliter les tests dans le cadre d'une mthode de dveloppement
"cycle en V".

1. Introduction d'autre part vital pour la socit d'obtenir rapidement 5 %


de part de march. Les lments stratgiques concernant le
produit sont donc connus. Ils sont essentiels pour porter les
1.1. De quoi s'agit-il ?
efforts de test au bon endroit.
Un produit peut tre plus ou moins facile tester. Qui n'a L'ergonomie doit permettre au client de trouver facilement
pas t confront un jour ce type de problmes : les services qu'il dsire, et les accs au site doivent tre
1. Un logiciel sans spcifications ou des rapides sous peine de voir le client se tourner vers un site
spcifications peu fiables : comment crire le plan quivalent.
de test dans ces conditions ? En plus des tests fonctionnels classiques, il va falloir
2. Une anomalie est dtecte mais il est impossible valider la performance des interfaces et leur ergonomie.
de localiser le problme. Ces tests demandent des comptences particulires qu'il
3. Une architecture peu adapte aux tests unitaires. faudra prvoir. ce stade nous voyons galement qu'il
faudra un environnement de test et des moyens ddis. Ces
Cet article a pour objectif d'tudier quels sont les points lments qui seront traits dans le chapitre suivant,
qui vont faciliter notre travail de testeur. Plusieurs contribuent galement la testabilit du produit.
lments vont contribuer amliorer la testabilit
diffrentes phases du processus de test d'un cycle en V. 2.2. Comment ?
Nous voulons mettre notre logiciel en situation relle et
1.2. Quelques dfinitions
simuler tous les scnarios d'utilisation et d'erreur possibles.
1. Tests unitaires : tests de composants logiciels En rgle gnrale, nous ne travaillons pas dans le monde
individuels faits par les dveloppeurs. rel mais dans un environnement simul qui se rapproche
2. Tests d'intgration : tests permettant de valider les du rel. Nos outils devront :
interfaces entre composants. Ces tests sont 1. tre capables de simuler un environnement rel
gnralement effectus par l'quipe de en mode nominal, erreur et charge.
dveloppement ou par une quipe ddie dans le 2. tre fiables c'est--dire eux-mmes tests.
cas d'une intgration complexe.
3. Tests systme : tests permettant de valider un Simuler un environnement externe peut tre complexe, ces
systme intgr par rapport des exigences outils peuvent se trouver sur le march comme par
spcifiques. Ces tests sont gnralement effectus exemple un simulateur de rseau GSM pour tester un
par une quipe de validation ddie ou par mobile. Dans ce cas, l'outil est connu et test. Il suffit de
l'quipe de dveloppement. Ces tests couvrent les faire une tude pour choisir celui qui conviendra le mieux
aspects fonctionnels et non fonctionnels (fonctionnalits offertes, type de tests, profil utilisateur). Si
(performance, installation, robustesse, sauvegarde nous devons dvelopper ou faire dvelopper notre propre
...) simulateur, tout se complique, il faudra :
4. Recette : processus qui permet au client de valider 1. Identifier correctement nos besoins en terme de
que la livraison des fonctionnalits dveloppes test.
par le fournisseur, correspond au cahier des 2. valuer la charge et bien planifier.
charges. 3. Tester l'outil.
4. Prvoir la premire utilisation la possibilit
2. Stratgie de test d'anomalie du ct de l'outil.
Deux lments de la stratgie de test concernent la Quels sont les risques ?
testabilit : 1. Outil non livr en temps et en heure ce qui va
1. Quels sont les objectifs qualit de nos tests ? retarder la phase de tests.
2. De quels moyens allons-nous avoir besoin ? 2. Impossibilit de tester certains scnarios (en
particulier les cas d'erreur) car l'outil n'a pas t
2.1. Quoi ? correctement spcifi.
Quand on parle de tester un produit le premier lment que 3. Outil non test qui va rendre le debug trs pnible
nous exigeons est les spcifications fonctionnelles et et entraner des conflits entre dveloppeur et
pourtant il me semble encore plus important dans un utilisateur de l'outil.
premier temps de bien cerner quels sont les objectifs de 4. Un bon outil va donc faciliter la phase de tests, il
nos futures campagnes de tests. Ces lments sont faudra donc veiller sa qualit.
essentiels pour calibrer nos efforts de test dans la bonne
direction. Dans le chapitre automatisation j'aborderai la question des
Imaginons que nous devons tester un nouveau service outils plus en dtail.
rendu par une interface Web. Nous ne sommes pas les
premiers sur ce march et la concurrence est rude. Il est

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 50
3. Conception et codage permettre de mieux contrler et observer
l'volution du systme lors des tests et ainsi de
Mais le plus efficace est d'intgrer la testabilit lors de la
vrifier la consistance du systme. Cela peut tre
conception. Deux aspects sont prendre en compte :
fait par l'intermdiaire d'une base de donnes ou
1. La contrlabilit : la possibilit de contrler l'tat
d'API.
d'un composant en vue de le tester.
2. L'observabilit : la possibilit d'observer les
Certains outils tels que les mulateurs ou les dbogueurs
rsultats de test (intermdiaires et finaux).
peuvent tre plus ou moins performants en terme de
fonctionnalits et vont eux aussi permettre d'amliorer
3.1. Contrlabilit
l'observabilit. Dans le dveloppement d'un logiciel
Roy Osherove, dans son article "Achieving And embarqu, l'absence d'mulateur peut ralentir
Recognizing Testable Software Designs", propose les considrablement la sortie d'un produit, car le debug se
rgles suivantes pour atteindre cet objectif et amliorer la fera ttons par l'mission d'hypothses.
testabilit :
1. Des excutions partielles : pour dboguer une 3.3. Ds la conception
fonctionnalit nous pouvons excuter de faon
La testabilit doit tre prise en compte ds la conception
partielle une partie des tests unitaires.
du logiciel, car l'architecture peut amliorer grandement ce
2. Des rsultats identiques chaque excution : les
critre. Il est d'ailleurs trs difficile de l'amliorer a
rsultats ne dpendent pas de l'tat du systme.
posteriori :
3. Pas de configuration : aucune configuration du
1. Tenter de rajouter des tests unitaires sur un
systme n'est ncessaire pour tourner les tests.
logiciel o cet aspect a t nglig peut se rvler
4. L'ordre des tests n'est pas important : nous
une tche ardue. Car il est peu probable qu'il ait
pouvons excuter les tests dans l'ordre que nous
t conu de faon modulaire.
voulons.
2. De mme, mettre niveau des logs ou de la
5. Temps d'excution rapide : la masse de tests
gestion d'erreur peut s'avrer tre une tche
unitaires est importante, pour acclrer
coteuse mais ventuellement mettre en balance
l'excution, nous vitons par exemple de nous
avec le cot du debug, support et maintenance
connecter aux bases de donnes.
ainsi que l'image vis--vis du client.
Pour respecter ces rgles, il faudra mettre en place des
4. Plan de tests
rgles de codage qui visent faciliter le test.
Si nous atteignons ces objectifs nous gagnons en Pour crire un plan de tests complet, nous aurons besoin
"contrlabilit". Le rsultat est la possibilit de tester des points suivants :
compltement et simplement le code par morceaux. Un 1. Les spcifications sont connues et leurs
autre point qui amliore la testabilit est de limiter la volutions matrises.
complexit du code. Il est mesurable par la complexit 2. Elles sont compltes et abordent tous les aspects
cyclomatique (li au nombre d'imbrications). Plus cette (fonctionnels, oprationnels, performance,
mesure est leve plus le code est source d'erreurs. De scurit, etc. ).
plus, il augmente le nombre de jeux d'essais qui permettent
le test. D'autre part nous allons limiter le nombre de jeux Comment crire un plan de tests si nous ne savons pas
d'essais et augmenter la contrlabilit. L encore, ce sont quoi vrifier ? Sans exigences dfinies, comment faire une
les rgles de codage qui vont amliorer la testabilit. couverture et tre sr de la compltude de nos tests ?
Nanmoins, si elles sont absentes une technique de tests
3.2. Observabilit peut pallier ce manque : les tests dits exploratoires. Il s'agit
d'crire et d'excuter les tests en dcouvrant le logiciel.
Voil nos tests unitaires et d'intgration ont t raliss et
Ces sessions seront conduites avec des objectifs qualit
ont permis de dboguer le code, reste vrifier que notre
dfinis (comme l'usage d'une fonctionnalit, la scurit...).
logiciel a bien le niveau de qualit en terme de
Cette technique peut tre applique si :
fonctionnalits attendues mais aussi en terme de rendu de
1. Le produit est connu (existe par ailleurs, les
service (stabilit, scurit...). Il nous faut passer aux tests
testeurs connaissent le mtier).
systme. L encore, un certain nombre d'lments doivent
2. Les testeurs ne sont pas des dbutants.
tre prvus pour nous aider dans nos tests :
3. Les consquences des erreurs sont minimes
1. Politique de gestion d'erreurs : date, type d'erreur
(donnes sensibles, contrat, scurit des
sont des informations qui permettront de
personnes).
dboguer et trouver rapidement la cause en cas
d'erreur dtecte par les tests.
Nanmoins, il faut rester conscient que certains points
2. Politique de log : diffrents niveaux que l'on peut
peuvent chapper au testeur, car il n'a pas la matrise des
activer ou dsactiver chaud. Si ces logs doivent
spcifications de faon complte et sre. De plus, tout est
tre utiliss par le support, il faudra les rendre
srialis, ce qui augmente les dlais de livraison.
comprhensibles et accessibles tous. Ils
facilitent le debug et permettent d'analyser les
5. Excution des tests
causes d'erreurs.
3. Connaissance des tats internes du systme ou
des objets : donner les moyens de connatre les 5.1. Tests Unitaires
tats du systme, voire de les grer, vont
Les tests unitaires sont essentiels pour amliorer la

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 51
testabilit : L'injecteur est la partie la moins complexe, sauf pour les
1. Ils vont faciliter le droulement des tests tests de performance. Pour ces tests il faudra galement
systme : les anomalies lies des erreurs de prvoir le hardware ncessaire. L'autre difficult est d'tre
codage sont plus facilement dtectes et corriges capable de simuler une utilisation raliste de l'application.
ce niveau. La partie vrification : pour automatiser il faut pouvoir
2. Lors d'volution ou de correction, ils vont accder certaines donnes qui sont les sorties, mais
permettre de localiser les erreurs de faon fine et parfois des donnes internes en base ou l'tat d'un
permettre de corriger des anomalies ou service en cours. Peut-tre faudra-t-il faire dvelopper des
d'amliorer le code sans crainte de non- API internes ?
rgression. Les rsultats devront tre dterministes. Lors d'un de mes
projets nous avions ralis un systme d'automatisation de
5.2. Tests d'intgration la faon suivante : le test tait excut manuellement une
premire fois ; le rsultat aprs vrification tait enregistr
Il est absolument ncessaire de planifier ces tests avec tous
comme rfrence ; le test automatis vrifiait la sortie par
les intervenants avant de commencer les tests systme. Si
rapport la rfrence. Malheureusement il s'agissait d'une
cette phase n'est pas ralise, au lieu de tester les aspects
liste de contacts et la version suivante l'ordre des
fonctionnels les testeurs feront face un systme qui ne
contacts n'tait plus dterministe. Impossible de repasser
fonctionne pas. Ils devront faire appel tous les
les tests automatiques mme en changeant les rsultats.
intervenants pour dboguer le systme petit petit. Ils
Nous avons demand une relivraison car c'tait plus facile
prendront du retard et des conflits vont apparatre.
ct dveloppement.
Une phase d'intgration planifie et mene terme facilite
Autre exemple : pour utiliser Slnium (outil
les tests systme.
d'automatisation d'interfaces Web) les objets graphiques
doivent tre identifis par un identifiant unique, qui doit
5.3. Automatisation tre positionn par le dveloppeur d'applications Web.
Tester prend du temps. Quand le nombre de tests devient Ct simulateur il faut qu'il rponde aux besoins de tests,
trop important, les versions tester se multiplient et c'est--dire tre capable de simuler tous les cas de figure,
l'automatisation est la solution qui s'impose. Sinon faute de cas normaux et cas d'erreurs. La meilleure solution est de
temps nous allons procder des coupes dans les tests scripter le comportement du monde extrieur.
pour livrer en temps et en heure et prendre des risques sur
la qualit du livrable. L'automatisation est donc ncessaire
mais encore faut-il s'y prendre l'avance. Le schma
suivant rsume l'outillage ncessaire et nos choix vont
augmenter ou non la testabilit de l'application de par les
possibilits de nos outils :

Injecteur : l'outillage qui va permettre d'appeler les


interfaces externes de l'application comme par exemple
des scripts de tests crits pour des API (Java, C++, Soap)
Ici la conception du simulateur est trs simple, elle
ou des tests automatiques d'interfaces (QTP,
consiste essentiellement envoyer et recevoir des
WINRUNNER, Selenium...).
messages dcrits dans les scripts, grer des expirations de
Simulateur : outil qui simule le monde extrieur. Si
dlais, vrifier que le message reu est conforme celui du
l'application communique avec d'autres applications il faut
script et fournir un compte rendu d'excution du script.
simuler la communication entre ces applications. Si le
Aucune interprtation du message n'est demande dans ce
monde extrieur se rduit aux utilisateurs finaux, il n'y a
cas.
pas besoin de simulateur on utilise le mme outil que
La plus mauvaise solution serait de simuler avec du code
l'injecteur, soit des outils d'automatisation de tests
le comportement du monde extrieur. C'est--dire que le
d'interfaces.
simulateur va interprter les messages qu'il reoit et
Vrification : toutes les vrifications qui vont dterminer
rpondre en fonction. Dans ce cas le dveloppement du
si le test est russi ou non.
simulateur va tre aussi complexe que celui de
Outil de gestion d'excution des tests : le matre d'oeuvre
l'application et poser les problmes dcrits dans le chapitre
qui va squencer les autres outils et centraliser les rsultats
II-B. Il y a galement de fortes chances que l'on ne pourra
des tests.

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 52
pas tester de faon exhaustive les fonctionnements plus n'tant pas du tout une spcialiste de ces mthodes.
inattendus ou les expirations de dlais. Tous ces pr-requis sont ncessaires pour tester dans les
Le choix des outils de manire gnrale est crucial et peut meilleures conditions :
rduire considrablement le nombre de cas de tests ou les 1. Des objectifs, des risques identifis orientent nos
rendre difficilement ralisables, je pense en particulier aux tests.
cas d'erreurs. 2. Sans spcifications, pas de rfrences pour nos
De mme travailler en amont en intgrant lors de la oracles de test.
conception des exigences relatives au test, est ncessaire 3. Sans rel moyen de test, l'efficacit des tests est
(par exemple des API internes qui permettraient de vrifier diminue ou bien les tests sont fastidieux faire,
des tats de transactions) et facilite les activits de test. etc.
Cela est aussi vrai pour les activits de maintenance. 4. Un logiciel testable va de pair avec une bonne
conception base sur les principes de modularit,
6. Planification etc.
5. Respecter les diffrentes phases de test (unitaires,
La livraison des fonctionnalits dans le temps peut
intgration et systme).
galement jouer. Par exemple dans le cadre d'un
6. Les outils de tests livrs temps et correctement
dveloppement itratif, les fonctionnalits de cration
tests.
d'abonns ont t livres mais pas celles de suppression.
7. Des logs et une gestion d'erreurs facilitent le
Aprs un test de cration pour dtruire les donnes, il faut
debug.
chaque fois arrter le serveur, dtruire en base et
8. Planification des livraisons en prenant en compte
redmarrer le serveur tout en se synchronisant avec les
les besoins des tests.
personnes utilisant ce mme serveur. Compliqu, il et t
plus simple de livrer directement les fonctions de
valuer la testabilit et mettre en amont les moyens pour
suppression.
l'amliorer sont donc ncessaires la bonne excution de
De mme, planifier la livraison des corrections
l'activit de test. Cela a un cot, ncessite de la rigueur et
d'anomalies peut faciliter l'excution des tests surtout en
du travail en amont, mais acclre les phases de test.
cas d'anomalie bloquante.
8. Rfrences, liens
7. Conclusion
Achieving And Recognizing Testable Software Designs
La testabilit se joue ds les dbuts de la ralisation de
Part I
l'application toutes les tapes (dfinition de la stratgie
Roy Osherove
de test, spcifications, conception...). Le test et le
le forum ddi aux pratiques de test : Lien158
dveloppement doivent donc travailler ensemble avec
les articles et tutoriels sur les tests : Lien159
comme objectif rendre l'application testable. Les mthodes
agiles facilitent la gestion de cette problmatique (criture
Retrouvez l'article de Dominique Mereaux en ligne :
des tests avant le codage, participation des utilisateurs
Lien160
finaux, quipe projet mixte etc...) mais je ne saurais en dire

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 53
Liens
Lien2 : http://linsolas.developpez.com/articles/java/outils/builds/
Lien4 : http://www.developpez.net/forums/f1360/java/edi-outils-java/build/autres/
Lien5 : http://www.developpez.net/forums/f1001/general-developpement/conception/outils/integration-continue/
Lien6 : http://zenika.developpez.com/articles/java/build/gradle/
Lien7 : http://www.araneaframework.org/
Lien8 : https://squill.dev.java.net/
Lien9 : http://dow.ngra.de/
Lien10 : http://www.youngprofessionalsforum.cz/
Lien11 : http://www.zeroturnaround.com/jrebel/comparison
Lien12 : http://groups.google.com/group/liverebel-private-beta
Lien13 : http://java.developpez.com/interview/zeroturnaround/jrebel/en/
Lien14 : http://www.zeroturnaround.com/
Lien15 : http://www.zeroturnaround.com/jrebel/current/
Lien16 : http://www.developpez.net/forums/d901582/java/edi-outils-java/zeroturnaround-sort-version-3-0-loutil-productivite-jrebel/
Lien17 : http://www.developpez.net/forums/f199/java/edi-outils-java/
Lien18 : http://java.developpez.com/interview/zeroturnaround/jrebel/
Lien19 : http://developer.android.com/reference/android/app/ListActivity.html
Lien20 : http://mickael-lt.developpez.com/tutoriels/android/personnaliser-listview/fichiers/DVP_ListActivity.zip
Lien21 : http://mickael-lt.developpez.com/tutoriels/android/personnaliser-listview/fichiers/DVP_List1.zip
Lien22 : http://mickael-lt.developpez.com/tutoriels/android/personnaliser-listview/fichiers/DVP_List2.zip
Lien23 : http://mickael-lt.developpez.com/tutoriels/android/personnaliser-listview/fichiers/DVP_List2_event.zip
Lien24 : http://developer.android.com/index.html
Lien25 : http://android.developpez.com/faq/
Lien26 : http://ydisanto.developpez.com/tutoriels/android/debuter/
Lien27 : http://mickael-lt.developpez.com/tutoriels/android/personnaliser-listview/
Lien28 : http://www.ubuntu.com/getubuntu/download-server
Lien29 : http://www.virtualbox.org/
Lien30 : http://pecl.php.net/
Lien31 : http://julien-pauli.developpez.com/tutoriels/php/compilation/#LIII
Lien32 : http://www.php.net/ChangeLog-5.php
Lien33 : http://php.net/svn.php
Lien34 : http://docsun.cites.uiuc.edu/sun_docs/C/solaris_9/SUNWdev/LLM/p12.html#CHAPTER3-1
Lien35 : http://www.iecc.com/linker/
Lien36 : http://svn.php.net/viewvc/pear/ci/phpfarm/trunk/README?view=markup
Lien37 : http://svn.php.net/viewvc/php/php-src/trunk/Zend/README.ZEND_VM?view=markup
Lien38 : http://sebastian-bergmann.de/archives/504-PHP-5.1-Performance.html
Lien39 : http://julien-pauli.developpez.com/tutoriels/php/apc/
Lien40 : http://pear.php.net/manual/en/guide.users.commandline.cli.php
Lien41 : http://svn.xdebug.org/cgi-bin/viewvc.cgi/vld/?root=php
Lien42 : http://www.bytekit.org/
Lien43 : http://github.com/sebastianbergmann/bytekit-cli
Lien44 : http://www.imagemagick.org/
Lien45 : http://www.php.net/imagick
Lien46 : http://memcached.org/
Lien47 : http://www.php.net/memcache
Lien48 : http://www.php.net/scream
Lien49 : http://www.php.net/bbcode
Lien50 : http://www.php.net/parsekit
Lien51 : http://pyyaml.org/wiki/LibYAML
Lien52 : http://www.php.net/yaml
Lien53 : http://www.php.net/http
Lien54 : http://libharu.org/wiki/Main_Page
Lien55 : http://devzone.zend.com/article/4044
Lien56 : http://www.php.net/haru
Lien57 : http://www.teslacore.it/wiki/index.php?title=AMFEXT
Lien58 : http://www.php.net/book.svn
Lien59 : http://www.xmailserver.org/xdiff.html
Lien60 : http://www.php.net/xdiff
Lien61 : http://sphinxsearch.com/
Lien62 : http://www.php.net/sphinx
Lien63 : http://www.php.net/runkit
Lien64 : http://www.xdebug.org/
Lien65 : http://pecl.php.net/package/docblock
Lien66 : http://www.tenouk.com/ModuleW.html
Lien67 : http://www.cs.bu.edu/teaching/cpp/writing-makefiles/
Lien68 : http://www.iecc.com/linker/
Lien69 : http://melem.developpez.com/tutoriels/langage-c/compilation-separee/
Lien70 : http://julien-pauli.developpez.com/tutoriels/php/compilation/
Lien71 : http://www.admixweb.com/2009/06/23/how-to-easily-create-a-javascript-framework-part-3/
Lien72 : http://kalyparker.developpez.com/articles/js/VOZ-partie-2/
Lien73 : http://kalyparker.developpez.com/articles/js/VOZ-partie-3/fichiers/vozpart3_fr.html
Lien74 : http://kalyparker.developpez.com/articles/js/VOZ-partie-1/
Lien75 : http://kalyparker.developpez.com/articles/js/VOZ-partie-3/
Lien76 : http://loic-joly.developpez.com/articles/interview-james-reinders/
Lien77 : http://loic-joly.developpez.com/articles/intel-software-conference-2010/
Lien78 : http://www.intel.com/idf/
Lien79 : http://loic-joly.developpez.com/articles/interview-james-reinders-2010/

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 54
Lien80 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html
Lien81 : http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2009/n2844.html
Lien82 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm
Lien83 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1610.html
Lien84 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1720.html
Lien85 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1984.pdf
Lien86 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
Lien87 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2546.htm
Lien88 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2541.htm
Lien89 : http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2009/n2927.pdf
Lien90 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2343.pdf
Lien91 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1757.html
Lien92 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1987.htm
Lien93 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2431.pdf
Lien94 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf
Lien95 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2764.pdf
Lien96 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1791.pdf
Lien97 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm
Lien98 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2179.html
Lien99 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2659.htm
Lien100 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2340.htm
Lien101 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1653.htm
Lien102 : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1811.pdf
Lien103 : http://farscape.developpez.com/Articles/TechDays2008_1/
Lien104 : http://farscape.developpez.com/Articles/VisualStudio2010/
Lien105 : http://projets.developpez.com/projects/qextend
Lien106 : http://www.developpez.net/forums/d906429/c-cpp/bibliotheques/qt/naissance-projet-qextend/
Lien107 : http://qt.nokia.com/products/appdev/add-on-products/catalog/4/new-qt-apis/mobility
Lien108 : http://www.forum.nokia.com/Tools_Docs_and_Code/Tools/IDEs/Nokia_Qt_SDK/
Lien109 : http://qt.nokia.com/files/pdf/qt-mobility-whitepaper-1.0.0
Lien110 : http://qt.nokia.com/
Lien111 : http://www.developpez.net/forums/d914761/c-cpp/bibliotheques/qt/sortie-qt-mobility-1-0-0-a/
Lien112 : http://qt.nokia.com/doc/qq/32/qq32-next-gen-uis.html
Lien113 : http://doc.trolltech.com/qq/
Lien114 : http://doc.qt.nokia.com/4.6/graphicsview.html
Lien115 : http://doc.qt.nokia.com/4.6/animation-overview.html
Lien116 : http://doc.qt.nokia.com/4.6/statemachine-api.html
Lien117 : http://doc.qt.nokia.com/4.6/qgraphicseffect.html
Lien118 : http://doc.qt.nokia.com/4.6/qgraphicsblureffect.html
Lien119 : http://doc.qt.nokia.com/4.6/qgraphicsblureffect.html#blurRadius-prop
Lien120 : http://doc.qt.nokia.com/4.6/qgraphicsitem.html#setBlurEffect
Lien121 : http://doc.qt.nokia.com/4.6/qgraphicsitemgroup.html
Lien122 : http://doc.qt.nokia.com/4.6/animation-overview.html
Lien123 : http://doc.qt.nokia.com/4.6/qobject.html
Lien124 : http://doc.qt.nokia.com/4.6/qabstractanimation.html
Lien125 : http://doc.qt.nokia.com/4.6/qpropertyanimation.html
Lien126 : http://doc.qt.nokia.com/4.6/qobjects.html
Lien127 : http://doc.qt.nokia.com/4.6/qvariantanimation.html#startValue-prop
Lien128 : http://doc.qt.nokia.com/4.6/qvariantanimation.html#endValue-prop
Lien129 : http://doc.qt.nokia.com/4.6/qvariantanimation.html#setKeyValueAt
Lien130 : http://doc.qt.nokia.com/4.6/qpushbutton.html
Lien131 : http://doc.qt.nokia.com/4.6/qabstractanimation.html#DeletionPolicy-enum
Lien132 : http://doc.qt.nokia.com/4.6/qabstactgraphicsitem.html
Lien133 : http://doc.qt.nokia.com/4.6/qgraphicsitem.html
Lien134 : http://doc.qt.nokia.com/4.6/qgraphicsrectitem.html
Lien135 : http://doc.qt.nokia.com/4.6/qobject.html#Q_PROPERTY
Lien136 : http://doc.qt.nokia.com/4.6/qpropertyanimation.html
Lien137 : http://doc.qt.nokia.com/4.6/statemachine-api.html
Lien138 : http://doc.qt.nokia.com/4.6/qstate.html#assignProperty
Lien139 : http://doc.qt.nokia.com/4.6/qvariant.html
Lien140 : http://doc.qt.nokia.com/4.6/qabstracttransition.html
Lien141 : http://doc.qt.nokia.com/4.6/qeventtransition.html
Lien142 : http://doc.qt.nokia.com/4.6/qkeyeventtransition.html
Lien143 : http://doc.qt.nokia.com/4.6/qmouseeventtransition.html
Lien144 : http://doc.qt.nokia.com/4.6/qsignaltransition.html
Lien145 : http://doc.qt.nokia.com/4.6/qstatemachine.html
Lien146 : http://qt.nokia.com/doc/4.6/qstate.html#assignProperty
Lien147 : http://doc.qt.nokia.com/4.6/qwidget.html#visible-prop
Lien148 : http://doc.qt.nokia.com/4.6/qeasingcurve.html#Type-enum
Lien149 : http://doc.qt.nokia.com/4.6/qstatemachine.html
Lien150 : http://qt-quarterly.developpez.com/qq-32/prochaine-generation-ui/fichiers/qq32-blurstates.zip
Lien151 : http://qt-quarterly.developpez.com/qq-32/prochaine-generation-ui/
Lien152 : http://mac.developpez.com/livres/
Lien153 : ftp://ftp-developpez.com/baptiste-wicht/tutoriels/java/tests/mocks/easymock/fichiers/source.zip
Lien154 : http://fchabanois.developpez.com/tutorial/java/jmockit/
Lien155 : http://www.developpez.net/forums/f413/java/edi-outils-java/tests-performance/
Lien156 : http://easymock.org/EasyMock2_5_2_Documentation_fr.html
Lien157 : http://baptiste-wicht.developpez.com/tutoriels/java/tests/mocks/easymock/
Lien158 : http://www.developpez.net/forums/f623/general-developpement/conception/methodes/gestion-projet/test/
Lien159 : http://conception.developpez.com/cours/?page=qualite-cat#tests
Lien160 : http://dominique-mereaux.developpez.com/tutoriels/general/ameliorer-testabilite/

Numro 28 Juin-Juillet 2010


Developpez Magazine est une publication de developpez.com Page 55

You might also like