Vous êtes sur la page 1sur 100

PROGRAMMEZ.

COM

Mensuel n180 - Dcembre 2014

Facebook Parse
Dveloppez rapidement vos applications mobiles

DevOps
= Dveloppement
+ Exploitation
DevOps va-t-il tuer le dveloppeur ?
Le dveloppement continu
Les outils, les bonnes pratiques 10-18-13 FulopZsolt

Le DevOps au quotidien
SWIFT .Net / Visual Studio
3:HIKONB=^UZ^Z]:?k@b@i@a@k";

le nouveau Microsoft supporte Android,


M 04319 - 180 - F: 5,95 E - RD

langage dApple iOS, Linux, OS X et Xamarin

Carrire Web Design


Testeur : un mtier davenir Utiliser le One Page
Printed in EU - Imprim en UE - BELGIQUE 6,45 SUISSE 12 FS - LUXEMBOURG 6,45 - DOM Surf 6,90 Canada 8,95 $ CAN - TOM 940 XPF - MAROC 50 DH
Pub cahier couv 180_180 17/11/14 22:33 Page2

P
003-180_180 17/11/14 22:37 Page3

Le boss.
ftonic@programmez.com
4 8 11Les mtiers
tableau co-
Les lois dAsimov de bord conception du test
sont-elles flippantes ?
1 un robot ne peut porter atteinte un tre humain, ni restant passif, ni
permettre quun tre humain soit expos au danger,
23 16 6 hot news
Swift IoT Intel
2 un robot doit obir aux ordres que lui donne un tre humain sauf si de tels
ordres entrent en conflit avec la premire loi,

3 un robot doit protger son existence tant que cette protection nentre pas en
conflit avec la premire ou la deuxime loi.
86 18
Wordpress
Algorithme
Ces Lois furent crites par le matre de la Science-Fiction, Isaac Asimov, en de tris
1942. Elles peuvent donner rflchir sur le futur rle de la robotique et des
machines volues et intelligentes. A notre sens, il ne faut pas sen
proccuper aprs, mais ds maintenant. Comme nous lavons abord le mois
dernier avec les ralits alternatives, de lHomme augment et bionique, il y a
70 66 84
Angular.JS
ASP.net Vnext Java : Volley
une dimension philosophique, morale, thique et socitale. Ce nest pas la
premire fois que jvoque ce sujet dans Programmez ! mais je pense que
dsormais, le dbat ne peut plus tre occult. Il doit tre clairement abord
par les gouvernants, la socit, les industriels, les utilisateurs (= nous). 32 DevOps
Sommes-nous prts ces dbats ? Non. Regardez la rapide explosion et
volution de limpression 3D. En France, on en parle encore comme dune
curiosit, souvent limite un cercle assez restreint (mme si cette perception
volue). Mais la rvolution quelle prfigure est colossale et va bousculer tout
un pan de lconomie traditionnelle. Et si cette conomie ne prend pas en
compte limpression 3D, les consquences seront ngatives (fermetures
dusines, de magasins, chmage). Plus largement le do it yourself et le
mouvement maker vont contribuer reconsidrer la manire de
consommer.

On peut aussi se poser des questions sur les consquences dune greffe dun
bras (ou dune autre partie du corps) robotis (ou plus intelligent et autonome
quune prothse). Augmente-t-on la capacit de lindividu ? Quelles
consquences psychologiques sur lindividu long terme ? Quelles
consquences sur la sant et son corps ? Quelles consquences pour les
personnes augmentant ces capacits ou utilisant toute extension augmente 61 81 77 Drupal
sans que cela soit ncessaire ? Le risque nest-il pas daboutir des tres IoT 2e partie MKframework
techno-dpendants qui ne vivraient et fonctionneraient que par les
technologies ? Une sorte davilissement de lHomme par la technologie?

Depuis quelques semaines, on parle de robots et notamment de ces robots


qui seront des employs la place dhumains, qui seront capables de nous
95
Open World
96 57
Framework
servir, de prendre des commandes, dtre autonomes, avec un minimum
Time Machine
Forum web
dintelligence et de rflexion. Rappelons-nous de la dfinition du mot robot :
robot vient de robota, mot tchque invent par Karel Capek signifiant corve ,
travail , servage . Ce mot apparat dans sa pice de thtre R.U.R. en
1920. Il faut comprendre robot/robota comme une force de travail. Dans
98 93 73
Facebook
cette premire apparition, robot na pas le sens quon lui donne maintenant; il CommitStrip Web Design
sagit dune personne artificielle non pas mcanique, mais chimique. Parse

Aujourdhui, le robot a une intelligence


peu ou pas autonome et une rflexion LIRE Xamarin Parallle / HPC Scala
rduite ou inexistante. De plus, elle DANS LE Dvelopper des w Comment et pourquoi La puissance
utiliser la programmation de l'objet et
dpend de son programme qui reste le PROCHAIN applications
parallle ? Les outils, les du fonctionnel
mobiles
plus souvent constant. Demain, la NUMRO multiplateforme frameworks, les bonnes au coeur de
cration des vrais cerveaux artificiels, ou
la possibilit de transfrer le contenu n181 Android, iOS, pratiques
w Exascale : comment
Java
de son cerveau sous une forme en kiosque le Windows Phone
exploiter 100 millions de
numrique, a le potentiel de fournir aux
robots une intelligence humaine. Les
29 Dcembre 2014 coeurs processeurs ?

robots auront-ils une me et une


conscience ?
Dcembre 2014 > Programmez! 3
004_005_180 17/11/14 22:39 Page4

Internet: familles et mtiers de lInternet OpenStack


tableau de bord

Petite infographie du Ministre de lconomie, de lindustrie et du numrique.


Summit Paris:
+5000 personnes

PHP Forum 2014


+400 personnes

Apple Watch
rveil prvu
pour le printemps 2015

Microsoft Band:
disponible aux USA, aucune
date pour la France.

Fire Phone
le flop smartphone 2014 mais
Amazon dit : encore

Le Jedisme
est-il une religion? LEmpire ne
fait aucun commentaire

OS Mobile: Microsoft A quand de vrais


ferme son laboratoire de ordinateurs sur
Android, iOS crasent tout recherche, Microsoft processeurs
Bon ok, Windows Phone est la 3e plate-forme mobile. Mais les rapports Research Silicon Valley ARM?
et chiffres sont parfois cruels. Windows Phone perd des points de
march ou stagne ailleurs, pendant que Android et iOS continuent
dominer le monde mobile. LibreSSL, HTML 5
Lun des rares marchs o WP dpasse iOS est en Italie. Sur le march alternative devient officiellement
amricain, le constat est amer et mme inquitant: peine 4 %! OpenSSL une recommandation du W3C.
Preuve que malgr tous les efforts, Microsoft na pas su imposer sa
plate-forme. Et les nouveaux Android et iOS risquent de faire trs mal.
Le march WP stagne en France et rgresse en Angleterre. Miroir, miroir,
En Chine, march cl du mobile, Windows Phone devient inexistant et quel est le langage le plus utilis?
chute largement en un an.
Lindex TIOBE donne chaque mois les langages les plus utiliss par
les dveloppeurs. Il sagit dun indicateur bas sur les recherches
Android iOS Windows Phone
Web. Des % manipuler avec prcaution.
USA 61,8 32,6 4,3
Chine 83,4 15,2 0,4
Japon 64,5 31,3 0,9
France 72,7 15,4 10,6
Allemagne 79,2 11,8 7,1
Angleterre 58,2 31 9,6
Espagne 90,4 6,3 3
Italie 71,8 10,4 15,2
Chiffres Kantar, pour septembre 2014. En % Pas de changement pour le trio de tte: Le trio reste immuable, C,
Java et Objective-C. Plus loin, Dart apparat dsormais la 17e
Pour Strategy Analytics, au niveau mondial (au 3e trimestre 2014), Android place et Swift la 19e. JavaScript sort du top10.
tait 1er avec 83,6 % du march, iOS suit 12,3 % et Microsoft 3,3 %.

4 Programmez! < Dcembre 2014


004_005_180 17/11/14 22:40 Page5

agenda
Dcembre

tableau de bord
Tour de France PC Soft 2014

PC Soft dvoilera les versions 20 de WinDev, WebDev


et WinDev Mobile durant son tour de France annuel.
Lvnement se droule laprs midi, partir de
13h45. Les dates de dcembre : Strasbourg (2), Gen-
ve (3). Toutes les informations sur http://windev20tdf.fr

Les robots, les nouveaux salaris? Sessions de dcembre


Les commentaires et tudes se multiplient pour dire que les robots Zenika vous propose pour dcembre une slection
remplaceront les salaris humains dans de nombreux domaines. Info ou intox? de sessions et vnements tech-
Il faut rester trs prudents sur ces tudes. niques suivants:
Les lments w Jeudi 4 dcembre partir de 19h :
1 Une tude de luniversit dOxford pointe du doigt que + 10 millions de postes salaris NightClazz Java 8 avance. Inscrip-
pourraient tre remplacs par des robots, ordinateurs, machines, dici 2034 en Angleterre. tions venir. Organis par Zenika.
2 Une tude du cabinet Roland Berger voque la possibilit que 20 % des tches soient w 4-5/12 : Dockercon14 Amsterdam - Zenika sponso-
ralises par des robots, des machines, soit lquivalent de 3 millions demplois. Cela rise cette confrence. Informations sur http://euro-
concerne la classe moyenne et les consquences de la transformation numrique. pe.dockercon.com/
Le cabinet Roland Berger voque plusieurs impacts numriques et technologiques sur lemploi: w Jeudi 11 dcembre partir de 9h : Club(21 organi-
s par Rupture(21 sur la transformation d'organisa-
cabinet notre commentaire tions agiles. Inscriptions venir :
Big Data Impact trs fort sur lemploi. Le Big Data na pas pour nous un impact sur lemploi. http://rupture21.com/club21/
Automatisation des tches. Pour le moment cela concerne une poigne de postes dont w 26-27 mars 2015 : NoSQL Matters Paris - Informa-
les Data Scientist. En revanche, cela aura des consquences tions surhttps://2015.nosql-matters.org/par/
sur les quipes marketing (organisation, optimisation)
Robotique avance Trs fort sur les tches Cest une volution de la robotique actuelle notamment en
physiques industrie. Ce sera lautomatisation des chanes futures
Communaut Paris DevOps
et actuelles. A Paris, la communaut DevOps est trs active. Chaque
Vhicule autonome Fort sur les transports. Limpact est difficile dterminer. Les mtiers vont changer, mois, elle se rassemble durant un meetup. Occasion de
de nouveaux vont apparatre. Limpact sera-t-il sur le parler DevOps, exprience, bonnes pratiques, usages,
transport en commun ou sur lindustrie automobile? etc. Pour en savoir plus: http://parisdevops.fr
Objets connects Modr Lobjet connect peut remplacer des emplois. Actuellement
cependant, il sagit surtout dun complment aux Actus des communauts Java
utilisateurs, la vie quotidienne. Peut crer de nouvelles ParisJUG annonce:
socits (construction, maintenance, etc.). w une soire performance Java le 9 dcembre,
Internet mobile Limit. distributeur Le eCommerce mobile a dj un impact fort. w une soire Young Blood II le 12 janvier 2015
Les magasins et distributeurs qui napporteront pas de
w une soire Cassandra le 10 fvrier 2015
valeurs ajoutes ou de vrais services joueront leur survie.
Site: http://www.parisjug.org/xwiki/bin/view/Meeting/Next
Cloud Trs limit / SI Peut crer des emplois spcialiss mais attention aux
employs des dpartements informatiques et prestataires Riviera JUG annonce pour le printemps 2015 son v-
extrieurs qui sont / seront impacts par des mutations nement Riviera Dev! A suivre ici: http://rivieradev.fr
et licenciements.
La nuit
Lien tude: http://www.rolandberger.fr/media/pdf/Roland_Berger_TAB_Transformation_Digitale- de Linformatique:
20141030.pdf les 4 et 5 dcembre
Ds les annes 1980, la polmique avait eu lieu en France, et ailleurs, sur les chanes Du 04 au 05 dcembre, Toulou-
robotises dans lindustrie automobile. Le mouvement sacclre et concerne dautres se ou ailleurs (32 sites): 3000 tu-
industries mais ce nest pas spcifique la robotique. diants, 600 personnels et
Cependant, il y a la robotique qui va aider le salari, la personne et la robotique salarie partenaires industriels (bnvoles)
remplaant lhumain, purement et simplement. Et l nous ne parlons plus de lindustrie issus de 80 coles et universits
pour rpondre plus de 54 dfis
mais dans des magasins, des restaurants, etc. Bref, une nouvelle robotique autonome et
nationaux dots et lancs sur une
capable de remplir des fonctions de salaries. Ces postes ne sont pas forcment tenus
thmatique particulire: c'est la
par ce que lon appelle la classe moyenne. Ainsi, des robots serveurs (apparence et fonc- Nuit de l'Informatique bien sr!
tions encore basiques) sont dploys dans quelques restaurants en Chine et Japon. Nous Contact: nuitinfo-contact@univ-tlse3.fr
sommes dans une catgorie trs particulire de robots : les androdes. Exemple : des Infos : http://www.nuitdelinfo.com
robots guides dans des muses (modle: Kodomoroid, Japon). https://www.facebook.com/groups/nuitdelinfo2014/

Dcembre 2014 > Programmez! 5


006_007_180 17/11/14 22:41 Page6

Intel fait le bonheur des dveloppeurs


IoT

dobjets connects
Un objet connect, ou lInternet des objets (IoT), se compose de deux lments fondamentaux: du
matriel (board, shield, capteurs) et de logiciels (firmware, systme, logiciels et services logiciels).
Intel propose pour la partie matrielle deux dvelopper des projets IoT avec les langages pouvoir crer rapidement une application
kits: Galileogen2 (+ Grove Starter kit, kit de et technologies Web: HTML, JavaScript, compagnon votre projet IoT. Cela signifie que
capteurs), Edison (board miniature base sur Node.JS. On peut ainsi coder, dployer et vous crez une application (smartphone,
un SoC). Pour le dveloppement des IoT et excuter du code JavaScript sur sa carte tablette, desktop) pour utiliser, contrler,
des applications embarques, Intel propose Galileo ou Edison. Cest une relle nouveaut interagir avec votre objet connect. Cette app
plusieurs IDE. Chaque IDE cible une catgorie par rapport aux dveloppements natifs. Loutil utilise les librairies Cordova pour linterface
de dveloppeurs et de dveloppement. est rgulirement mis jour. lheure de la graphique. Pour accder aux services Cloud
Galileo peut se comparer Arduino dans son rdaction de cet article, nous tions en version IoT, des API sont disponibles et utilisables par
fonctionnement et son extensibilit. Galileo 75. Fonctionnalit importante, vous pouvez lapplication cliente.
partage de nombreux points communs avec faire du remote debug de votre application
Arduino, mais ce nest pas une plateforme JavaScript. Intel System Studio
Arduino bis. Galileo a son cosystme, sa Si vous ne matrisez pas C ou C++, XDK IoT Intel propose une suite professionnelle pour les
communaut. Edison est vritablement taill Edition est une excellente alternative pour vos dveloppeurs C, C++: System Studio. Il s'agit
pour linformatique Wearable, les IoT. Dune objets connects. Pour pouvoir dployer et dune suite de dveloppement incluant (selon
taille minuscule, Edison fonctionne sur un Soc excuter ces applications CDK, il faut que le ldition) : le compilateur C++, les librairies
Atom complet et permet de crer des objets systme Yocto (distribution Linux) install sur mathmatiques, Vtune, Threading Building
connects autonomes et trs petits. la board (Galileo ou Edison) possde les Block, Inspector for Systems Ces outils per-
librairies Node.JS propres XDK. En principe, mettent daller trs loin dans loptimisation, les
Les IDE: faites votre choix! elles sont installes par dfaut, mais elles performances et la disponibilit des applica-
Arduino IDE peuvent ncessiter une mise jour. tions notamment en environnements embar-
Dans lunivers Arduino, les dveloppeurs vont Lautre intrt de XDK IoT Edition est de qus comme Edison. u
la plupart du temps utiliser Arduino IDE. Lger
et trs sobre, Arduino IDE est le parfait outil
Ressources
pour dmarrer en douceur avec Galileo et
Galileo Software Downloads: vous y trouverez tous les outils, images systmes/firmware, Arduino
Arduino. Il est disponible sur Linux, OS X,
IDE pour Galileo. https://communities.intel.com/docs/DOC-22226
Windows. Il permet de coder rapidement ses
sketches et daccder de nombreux Edison Software Downloads: page ddie aux outils et logiciels Edison. Vous y trouverez Arduino
exemples de code. Il permet de compiler et IDE, Yocto Edison, les diffrents SDK, les pilotes Windows. https://communities.intel.com/docs/DOC-23242
transfrer la carte. On dispose aussi dun
Page gnrale sur Intel XDK IoT Edition: https://software.intel.com/en-us/html5/xdk-iot
moniteur qui pourra, par exemple, sortir les
donnes du capteur de temprature. Il permet Page gnrale sur les solutions IoT (zone dveloppeur): https://software.intel.com/en-us/iot/downloads
de mettre jour le firmware de sa board.
C/C++: https://software.intel.com/en-us/iot-c-eclipse
JavaScript: https://software.intel.com/en-us/installation-for-javascript-intel-xdk-galileo-and-edison
Intel XDK IoT Edition Visual Programming: https://software.intel.com/en-us/getting-started-for-visual-programming-wyliodrin-galileo
XDK IoT Edition est le dernier environnement
Arduino: https://communities.intel.com/docs/DOC-23147
intgr dIntel. La premire version a t
Cloud Analytics: https://software.intel.com/en-us/iot-cloud-analytics-guide
dvoile fin septembre dernier. Disponible sur
Ubuntu, OS X et Windows, cet IDE permet de La majorit des ressources techniques est en Anglais.

Intel IoT Cloud Analytics En rsum


Arduino Programmation Dveloppeur Dveloppeur Wind river
Un des dfis des objets connects/IoT est dveloppeur visuelle JavaScript c, c++ (galileo)
la collecte et lanalyse des informations et Type de dveloppeur Maker Dbutant Intermdiaire Avanc Avanc,
donnes issues des capteurs, de lobjet en professionnel
lui-mme. Ces services Cloud permettent Systme Yocto Yocto Yocto Yocto VxWorks
de traiter et stocker ces donnes. Intel IoT IDE Arduino IDE Wyliodrin XDK Intel System Studio WR Eclipse
Analytics sutilise avec Galileo et Edison. Eclipse
Pour assurer l'interconnexion du matriel Langages Sketch, C++ Python JavaScript C, C++ C, C++
connect aux services Cloud, un agent (en Outils/librairies Arduino Wyliodrin XDK ISS Work Bench
/ISS
JavaScript) doit tre dploy sur lIoT. Un
Cloud IoT Cloud Analytics IoT Cloud Analytics IoT Cloud Analytics IoT Cloud Analytics WR Cloud
tableau de bord sur le portail IoT Analytics
Widget Mashery Mashery
permet dactiver le service. Tiers Tiers

6 Programmez! < Dcembre 2014


006_007_180 17/11/14 22:41 Page7
008_010_180 17/11/14 22:42 Page8

coconception web 4 partie e


cologie

Code client : viter les interaction inutiles


Malgr les progrs des compilateurs JavaScript, lusage parcimonieux dun code optimis reste la
meilleure garantie de fluidit pour linterface utilisateur.
- des chanes de caractres en argument. Outre le fait qu'il est dconseill
Frdric Bordage,
expert coconception logicielle, GreenIT.fr, @greenit d'utiliser eval() et donc de passer des chanes de caractres, si l'argument
Jrmy Chatard, pass est sous forme de chane, le moteur d'interprtation va devoir
directeur technique de Breek, @breekfr valuer cette chane pour la transformer en code. Ce qui n'est pas le cas
lorsque l'argument est une fonction ou rfrence une fonction. Ceci
Les interfaces graphiques des sites Web sont restes statiques de 1994 permet d'conomiser de la CPU. Par exemple, ne pas crire :
1998. Elles nincorporaient alors que des listes droulantes et des
var timeoutID = setTimeout('console.log(""Hello Dolly"");', 1000);
formulaires. Pour aller plus loin, il fallait utiliser des ActiveX (Microsoft),
Mais :
des applets Java ou des composants Flash (Macromedia / Adobe). Ce
nest quavec lavnement de HTML 4.2, des Cascading Style Sheet var uneFonction = function() {
(CSS) 2.0, et des prmices dECMAscript fin 1998 que larchitecture console.log('Hello Dolly');
Dynamic HTML (DHTML) a permis de crer des interfacesWeb vraiment }
interactives. HTML5 a ensuite pouss cette logique lextrme en var timeoutID = setTimeout(uneFonction, 1000);
transformant les navigateurs en socles dexcution trs volus, Vous pouvez aussi mettre en cache les objets souvent accds en
capables deffectuer des traitements complexes, de dialoguer avec des JavaScript. L'accs au DOM est coteux en termes de ressources CPU.
backends via larchitecture AJAX et de stocker des donnes Lorsque vous utilisez plusieurs fois le mme lment du DOM depuis
relationnelles localement. Ces dernires annes, nombre de JavaScript, stockez la rfrence de l'lment dans une variable afin de ne pas
dveloppeurs ont abus de ce potentiel en crant des interfaces re-parcourir le DOM pour ce mme lment. Par exemple, ne pas crire :
utilisateurs gaves de Javascript, souvent sans aucune justification.
document.getElementById('menu').property1 = 'foo';
Cest notamment le cas dun fameux site de transport de voyageurs
document.getElementById('menu').property2 = 'bar';
franais. Rsultat, la consultation du site devient tellement lente quil faut
Mais :
parfois remplacer son ordinateur par un plus puissant pour y accder.
Lcoconception Web vise viter ce genre de situation en sattachant $menu = document.getElementById('menu');
nutiliser des technologies propritaires et / ou des traitements javascript $menu.property1 = 'foo';
complexes que lorsquils sont absolument ncessaires. $menu.property2 = 'bar';

Limiter le recours aux plugins #24 Eviter les variables inutiles #37, #39
Eviter d'utiliser les plug-in tels que Flash, applet Java, Silverlight, etc. Privilgier les variables locales. En JavaScript lorsque l'on fait appel
Prfrer les technologies standard telles que HTML 5, ECMA Script, etc. une variable globale, le moteur d'interprtation doit vrifier qu'elle existe
Par exemple, pour raliser un back office bas sur du drag & drop, dans le scope actuel, dans celui du dessus..., que la variable dispose
prfrer l'utilisation de JQuery Flash. d'une valeur, etc. Il est souvent envisageable de passer les variables
utiles en arguments des routines, les rendant locales. Ceci permet
Ecrivez un code JavaScript efficace #25, #26, #33 d'viter toutes ces vrifications et donc d'conomiser du temps de
Evitez d'utiliser eval(). Cette fonction value et excute une chane de calcul. Par exemple, ne pas crire :
caractres. Cela amne donc une recompilation et une rinterprtation
var aGlobal = new String('Hello Dolly');
du code lors de lexcution. Ceci a pour inconvnient (outre les risques
function globalLength() {
de scurit) d'empcher la mise en cache par le navigateur du code
length = aGlobal.length;
gnr, car la chane de caractre peut contenir des variables qui
console.log(length);
voluent au cours de l'excution du programme. Dans lexemple ci-
}
dessous, le code contenu dans la variable "code" ne peut tre mis en
globalLength();
cache par le navigateur. Par exemple, ne pas crire
Mais :
function anyRoutine(index) { var aGlobal = new String('Hello Dolly');
Version 20 annonce Logiciel professionnel Document non contractuel

// Do something here
console.log(index); function someVarLength(str) {
} length = str.length;
console.log(length);
var foo = 5, }
code = 'for (var i = foo; i > 0; i--) { anyRoutine(i); };';
someVarLength(aGlobal);
eval(code);
Toujours au niveau des variables, utiliser la concatnation de chanes de
Donnez des fonctions en paramtre setTimeout() et setInterval() plutt faon optimale. JavaScript gnre en tche de fond des variables
que des strings. Ces deux fonctions, peuvent prendre des fonctions - ou temporaires lors des concatnations de variables. Certaines syntaxes

8 Programmez! < Dcembre 2014


008_010_180 17/11/14 22:42 Page9

NOUVELLE
VERSION

WINDEV : Logiciel professionnel de


dveloppement multi-plateformes: dveloppez une
application, recompilez-la pour tous les systmes
Dveloppements natifs

Fournisseur
Version 20 annonce. Logiciel professionnel. Document non contractuel

Of ficiel de la
Prparation
Olympique

DVELOPPEZ 10 FOIS PLUS VITE


www.pcsoft.fr
Des centaines de rfrences sur le site
008_010_180 17/11/14 22:42 Page10

sont plus efficaces que d'autres et permettent donc de rduire la


cologie

consommation de mmoire vive. Par exemple, remplacer : <script>


$el.bind('error', function () {
a += 'x' + 'y'; $el.addClass('in-error');
Par : });
$el.bind('running'), function () {
a += 'x';
$el.removeClass('in-error');
a += 'y'; };
Mfiez-vous du DOM #32, #42, #43, #44 </script>
L'accs au DOM via JavaScript est une procdure lourde qui consomme
du temps CPU de faon significative surtout sur les applications utilisant Utilisez la dlgation d'vnements #41
beaucoup JavaScript. Rduisez autant que possible ces accs et vitez La dlgation des vnements permet de ne pas surcharger la mmoire
autant que possible de modifier le DOM lorsque vous le traversez. du navigateur et dinstancier un seul couteur pour plusieurs lments
Modifier le DOM lorsqu'on le traverse peut gnrer des situations o la du DOM. La documentation de Mozilla vous aidera mettre en place ce
boucle devient trs gourmande en ressources. Il est notamment assez type de dlgation. Par exemple:
courant de gnrer une boucle infinie lorsque l'on ajoute des lments
au DOM au fur et mesure qu'on le traverse. Eviter par exemple : <htl>
<head>
<script>
<title>DOM Event Example</title>
$('a.extlink').each(function(el) {
<style type=""text/css"">
$(el).attr('rel', 'external nofollow');
#t { border: 1px solid red }
});
#t1 { background-color: pink; }
</script>
</style>
Pour viter les cycles CPU inutiles, il faut aussi rduire au maximum le <script type=""text/javascript"">
repaint (appearence) et le reflow (layout). Le repaint est le changement
d'apparence d'un lment du DOM. Le reflow est le changement / // Function to change the content of t2
recalcul de la position des lments dans le DOM. Ces deux oprations function modifyText(new_text) {
sont coteuses en ressources. Il faut donc viter de les dclencher. Par var t2 = document.getElementById(""t2"");
exemple, pour viter les repaints, il faut viter de changer les proprits t2.firstChild.nodeValue = new_text;
stylistiques d'un lment (couleur de fond, etc.). Pour viter les reflows, }
il faut minimiser les changements de proprits de positions,
dimensions, de type de positionnement, de contenu, etc. // Function to add event listener to t
Vous pouvez aussi rendre les lments du DOM invisibles lors de leur function load() {
modification. Lorsqu'un lment du DOM doit tre modifi par plusieurs var el = document.getElementById(""t"");
proprits, chaque changement de style ou de contenu va gnrer un el.addEventListener(""click"", function(){modifyText(""four"")}, false);
repaint ou un reflow. Il est gnralement plus conome de rendre }
l'lment invisible (proprit "display" "none") (1 reflow); puis de
modifier toutes les proprits de l'lment et rendre l'lment nouveau </script>
visible (1 reflow). Soit 2 reflows au maximum. </head>
Une autre approche, lorsquelle est possible, consiste modifier <body onload=""load();"">
plusieurs proprits CSS en 1 seule fois pour limiter le nombre de <table id=""t"">
repaint/reflow en utilisant l'ajout/suppression de classes CSS. Ainsi, un <tr><td id=""t1"">one</td></tr>
seul changement permet de modifier plusieurs proprits tout en ne <tr><td id=""t2"">two</td></tr>
gnrant qu'un repaint et/ou reflow. Ne pas faire : </table>
</body>
<script>
</html>
$el.bind('error', function () {

Validez votre code JavaScript #35


$el.css('color', 'red');
$el.css('font-weight', 'bold');
Enfin, pour que votre code Javascript soit efficace, vous devez
});
imprativement le valider avec JSLint. Cet outil vrifie que la syntaxe
$el.bind('running'), function () {
JavaScript utilise sera comprise par tous les navigateurs. Le code
$el.css('color', 'inherit');
obtenu respecte des contraintes syntaxiques
$el.css('font-weight', 'inherit');
permettant aux interprteurs d'excuter le code
};
plus facilement et donc rapidement. La CPU est
</script>
donc sollicite moins longtemps.
Prfrez plutt :
<style> Retrouver ces bonnes pratiques dans le livre:
.in-error { Eco-Conception web
color: red;
Editions Eyrolles
font-weight: bold;
}
</style>

10 Programmez! < Dcembre 2014


011_013_180 17/11/14 22:45 Page11

Mtiers du test: situation actuelle et perspectives

carrire
Le CIGREF a publi fin octobre dernier sa nomenclature des mtiers des DSI. Le Testeur na
droit qu une seule ligne, malgr les nombreux profils de testeurs existants. Je vous propose de
dtailler un peu plus ce mtier davenir.
Bernard Homs w Une composante utilisabilit et relations dcrites ci-dessus, avec un mode de gestion
Consultant Senior TESSCO humaines, le testeur tant vu comme la voix diffrent et complexe,
sas Fondateur et ex-prsi- du client sur le projet, et sinterfaant avec w Responsable qualit, processus et mthodes:
dent du Comit Franais toutes les parties prenantes du projet. Nous en charge des activits "qualit" transverses,
des Tests Logiciels avons donc une composante relationnelle ce qui peut inclure la qualit logicielle et les
bhomes@tesscogroup.com
importante, tests.
Avec plus de 33 ans dexprience dans le domaine du w Une composante de gestion: le test est situ Les dveloppeurs sont aussi testeurs, sans le
dveloppement et du test de logiciels, il est Consultant
Senior pour de grands clients, aprs plusieurs postes sur le chemin critique du projet, tout retard savoir : la relecture du code est du "test sta-
linternational. Il de nombreuses certifications en test impactera la date de livraison, il est important tique", la premire excution du code du "test
(CMAP, ISTQB CTFL, CTAL-TM, CTAL-TA, CTAL-TTA) et en dtre la fois efficace (trouver le plus dinfor- unitaire", etc.
gestion des exigences (IREB et REQB). Il est auteur de 2
ouvrages sur les tests de logiciels. mations possible) et rentable (utiliser le moins
de ressources possible), un dfi pour tout Qualits Techniques
Valeur ajoute manager. et Relationnelles
Un testeur identifie les anomalies avant la livrai- Le test propose, dans des environnements Les testeurs viennent de divers horizons:
son. Il est entre les clients (pour le fonctionnel) varis allant des mainframes et du "Big Data" w Du "mtier", (p.ex. utilisateurs), et mettent
et les dveloppeurs (pour corriger des anoma- aux plateformes mobiles et tablettes de nom- profit leur exprience du domaine ou du pro-
lies), et fournit aussi dautres services: breux dfis techniques et mthodologiques. duit. Leur vision porte sur les fonctionnalits
w Par lanalyse des exigences, le testeur identifie du produit et sur son utilisabilit,
des ambigits, et vite lintroduction de Des profils divers w Du "support", (p.ex. hotline et support utilisa-
dfauts. Sil est impliqu tt sur le projet, cela Comme mentionn prcdemment, il y a plus teur), et utilisent leurs connaissances des
rduit les cots et les dlais de ralisation, dun mtier de testeur. Nous pouvons les clas- types derreurs remontes pour amliorer le
w En tudiant la maintenabilit du code et la qua- ser selon lactivit principale effectue: produit,
lit de la documentation, il aide anticiper les w Technicien de test, excutant des tests dfinis w De la "technique", (p.ex. dveloppeurs), et ils
cots de maintenance, par dautres. Avec ou sans certification ISTQB se focalisent plus sur des aspects maintenabi-
w En analysant les anomalies et leurs corrections, niveau fondation, il fait du test fonctionnel lit, scurit, performances, etc. Ils font de
le testeur identifie les manques de maturit et bas sur son exprience, trs bons Analystes techniques de test, de
les opportunits damlioration des processus w Analyste de test (fonctionnel) : analyse les bons automatiseurs de test, puis dexcellents
de conception et des activits de test, besoins et conoit des tests fonctionnels Test Managers et consultants,
w Via la fourniture de donnes statistiques (p.ex. excuter, et peut encadrer un ou plus testeurs. Quelle que soit lorigine du testeur, certaines
pourcentage de couverture des exigences, Expriment, il a souvent une certification qualits sont importantes:
taux defficacit des processus de test, etc.) le ISTQB niveau avanc danalyste de test, w Un intrt pour la qualit des logiciels et un
test permet didentifier des tendances et de w Analyste technique de test: conoit des tests souci la fois de minutie et une vue den-
prendre ( temps) des dcisions sur le projet de performances ou de scurit. Expriment, semble,
et le produit. il a souvent une certification ISTQB niveau w Des comptences relationnelles et de commu-
Le testeur nest pas seul responsable de la qua- avanc danalyste technique de test, et une nication : il faut sinterfacer avec des per-
lit du logiciel : tous les acteurs du projet (y spcialisation sur le(s) outil(s) utilis(s), sonnes techniques (dveloppeurs) et des
compris les dveloppeurs) sont responsables w Automatiseur de test : traduit des tests en utilisateurs sur des sujets parfois pineux,
chacun son niveau de cette qualit. scripts de tests automatiss. Possde souvent w Des comptences "mtier" ou "business" por-
une spcialisation sur le(s) outil(s) quil utilise, tant sur le domaine applicatif,
Un mtier attrayant w Chef de projet de test: encadre des testeurs w Des comptences "informatiques" largies, les
Contrairement aux ides reues, les mtiers du et dirige un projet de test, rapportant aux par- dfauts provenant de diverses causes (logi-
test sont passionnants et pleins davenir. ties prenantes. Possde une certification de cielles, matrielles, rseaux, OS, etc.),
Cest le dfi permanent didentifier dans de nou- Test Manager ISTQB niveau avanc, w Une curiosit et une volont dapprendre, pour
velles applications des types danomalies diff- w Administrateur denvironnement de test: gre maitriser de nouvelles techniques, et tre effi-
rents, puis dinformer sur le niveau de qualit et met en place les matriels de test, les sau- caces et rentables dans lidentification des
fonctionnelle et technique les acteurs du pro- vegardes et restaurations des donnes de dfauts,
jet. Il y a simultanment: test, des environnements, etc., w Une capacit de travail importante, la fois
w Une composante technique, les testeurs et les w Consultant en test, fournit du conseil spciali- individuel et en quipe, double dune rsis-
dveloppeurs se focalisant sur de nouvelles s en tests, (p.ex. utilisabilit, scurit, perfor- tance au stress (les pressions sur les dlais
technologies. Le testeur est oblig de se tenir mances, etc.) et possde une ou plusieurs sont frquentes).
inform des technologies mergentes. Dans certifications (p.ex. ISTQB, CMAP, etc.), Un dveloppeur possde dj plusieurs de ces
de nombreux cas le "dveloppement" est pr- w Testeur dans un projet Agile: au sein de pro- comptences, donc une volution vers le
sent via lautomatisation des cas de test, jets Agiles, il couvre plusieurs des activits domaine du test est facile.

Dcembre 2014 > Programmez! 11


011_013_180 17/11/14 22:45 Page12

Salaires moyens Intitul du poste Exprience Salaires


carrire

et dbouchs Technicien en test ou Testeur fonctionnel < 2 ans De 33 36 K/a


La grille salariale est plus basse que pour des Analyste de test fonctionnel 3+ ans De 36 45 K/a
dveloppeurs, mais ceci est compens par un Analyste technique de test (non fonctionnel) 3+ ans De 42 55 K/a
travail attrayant et des perspectives de carrire Automatiseur de test 2+ ans De 38 48 K/a
accrues: voir tableau ci-contre. Test manager 5+ ans De 45 55 K/a
Les dbouchs sont nombreux, la fois dans et Responsable denvironnement de test 2+ ans De 38 45 K/a
en dehors du mtier du test ou de linforma- Consultant en test 5+ ans De 48 60 K/a
tique. Certains testeurs sont devenus CTO, Testeur sur projet Agile 2+ ans De 33 38 K/a
dautres Responsables de Dpartements Responsable qualit, processus et mthodes 5+ ans De 48 58 K/a
mtier, quelques-uns se sont tourns vers ldu- En milliers d / annuel.
cation, dautres enfin se sont spcialiss et
sillonnent le monde en donnant des conf- w Des formations focalises sur les outils (com- mal intentionnes, de prendre contrle de
rences et du conseil. La triple comptence merciaux ou open-source) permettent dopti- votre existence et de votre identit. Le dfi est
"Mtier" + "Qualit" + "Logiciel" est de plus en miser leur utilisation, et par exemple de relier dassurer simultanment lutilisabilit et la
plus utile dans les organisations, car elle met la des outils existants ou de valider les rsultats capacit de communication de ces technolo-
satisfaction des utilisateurs et des clients en de tests. gies dune part, et dautre part la scurit,
contact avec la DSI et les technologies. w Certaines formations existent se focalisant sur w Certaines technologies "assistives" (p.ex.
les plateformes mobiles (p.ex. formations lunettes fournissant des informations contex-
Formations CMAP) et identifient les lments quun tes- tuelles) et les risques associs la confidentia-
On ne nait pas testeur, on le devient. Sil est teur devrait connatre sur ces technologies. lit des informations recueillies et/ou
possible dtudier seul partir de livres (en w Des formations aux techniques de test per- affiches. Les dfis ici sont la fois les
anglais, ou en franais(1)), darticles, de webi- mettront dapprendre ou dapprofondir cer- aspects de confidentialit de la vie prive
nars(2) et autres sources trouves via des taines techniques afin de les utiliser plus dune part, et d'autre part la mise disposition
moteurs de recherche ce mode dapprentissa- efficacement, et ainsi dtecter le plus dano- des informations pour les personnes autori-
ge risque des lacunes dans certains domaines. malies. ses,
Suivre des formations bases sur un rfrentiel Tout dveloppeur tirera des bnfices impor- w Le "Cloud", la globalisation et la scurisation
reconnu (p.ex. certifications ISTQB et/ou tants de ces formations car elles lui permettront des informations personnelles ou commer-
CMAP), permet de sassurer de la couverture de damliorer son code, et donc viter lintroduc- ciales qui y sont prsentes. Comme dans les
tous les domaines principaux. tion de dfauts qui seront corriger ensuite. cas prcdents, les aspects de scurit des
De nombreuses formations existent dans le informations sont les premiers sauter les-
domaine des tests de logiciels: Les dfis des annes venir prit, mais les aspects de performances et de
w Des formations spcifiques selon les niveaux Niels Bohr a dit: "les prdictions sont difficiles, mobilit sont aussi prendre en compte,
de test (fondation, avanc ou expert), permet- surtout concernant le futur". Vu les tendances w Le nomadisme, avec les tablettes, smart-
tent datteindre un niveau (p.ex. ISTQB ou actuelles, les dfis du test dans les annes phones et autres devices mobiles (des
CMAP) et de passer la certification associe. venir incluront: lunettes connectes jusquaux drones, de
Une certification est un diffrenciateur impor- w Le "Big Data" et la vrification des rsultats votre tlphone portable jusquau paiement
tant sur un CV, et valide lacquisition dun des algorithmes de calcul au vu de la multipli- sans contact), et les interactions quils pour-
niveau de connaissance. cit des donnes, car ces algorithmes devront ront avoir entre eux. Souvent cela oblige pr-
w Des formations sur des domaines amont tre vrifis sur la base de donnes sres, et voir des tests supplmentaires (p.ex. mesurer
comme la gestion des exigences (rfrentiel de telles donnes sont souvent parsemes de la consommation lectrique pour viter de
IREB ou REQB) permettent de maitriser et limi- donnes primes ou incorrectes. Le dfi est rduire la dure dutilisation dune charge de
ter les ambigits ou les lacunes des exi- de sassurer de la validit des donnes remon- batterie),
gences. tes, et du respect de la confidentialit des w Les aspects de fonctionnement des applica-
w Des formations en gestion de projets de test informations sous contrainte des diverses tions connectes dans un environnement o
sensibiliseront aux aspects defficacit et de lgislations en vigueur, les communications sont limites ou inexis-
rentabilit des activits de test, au reporting et w Linformatique domestique connecte (domo- tantes. Donc des aspects de fonctionnement
linterprtation des mesures, ainsi quaux tique) et les risques associs une utilisation dgrad, de sauvegarde en interne de cer-
interfaces avec les parties prenantes. non maitrise par les utilisateurs de telles tech- taines informations, de synchronisations
w Des formations focalises sur les mthodes nologies. Laccs votre logement, votre vhi- priodiques seront traiter et tester.
permettront une meilleure efficacit en cule et aux sources de vos donnes Ces dfis sont dj ceux des dveloppeurs, et
recherche danomalies. personnelles permettraient des personnes leurs comptences les aideront dans une carri-
re de testeur. Pour les testeurs, ces dfis sont
prsents et relevs au quotidien.
1) P.Ex: "Les Tests Logiciels : Fondamentaux", diteur Lavoisier, ISBN: 978-2-7462-3155-9
2) TESSCO sas propose des webinars mensuels gratuits en franais, et RBCS-US en propose en anglais. u

LIRE DANS LE Xamarin Parallle / HPC Scala


Dvelopper des Comment et pourquoi utiliser la programmation La puissance de
PROCHAIN NUMRO n181 applications mobiles parallle ? Les outils, les frameworks, les l'objet et du
en kiosque le multiplateforme bonnes pratiques fonctionnel au
29 Dcembre 2014 Android, iOS, Exascale : comment exploiter 100 millions de
coeurs processeurs ?
coeur de Java
Windows Phone
011_013_180 17/11/14 22:45 Page13

/update/2014/12
www.componentsource.com

BEST-SELLER Aspose.Words for .NET partir de 783


Lisez, modifiez et crivez des documents Word sans Microsoft Word.
Cration de documents, manipulation du contenu/formatage, puissante capacit de fusion
de courrier et exportation en DOC/HTML
Accs dtaill tous les lments dun document par programmation
Support les formats de fichiers: DOC, DOCX, WordprocessingML, RTF, HTML, OOXML,
OpenDocument, PDF, XPS, EMF et EPUB

BEST-SELLER ComponentOne Studio Enterprise 2014 v3 partir de 1 160


Outils pour le Dveloppeur Professionnel .NET : Windows, HTML5/Web et XAML.
Contrles dinterface utilisateur pour .NET, incluant grilles, graphiques, rapports et planificateurs
Gamme HTML5/JavaScript pour le dveloppement dapplications dentreprise
Thmes intgrs/concepteurs pour la cration de thmes/styles personnaliss
40+ composants pour Windows 8.1 & Windows Phone 8.1 et support pour Universal Windows
Supporte toutes les plateformes de Microsoft: Visual Studio 2013, ASP.NET, WinForms, WPF, etc

Red Gate .NET Developer Bundle partir de 760


radiquez et corrigez le code lent, identifiez le code .NET bogu et comprenez les raisons.
Bnficiez dune vue densemble des performances de vos applications et identifiez les
goulots dtranglement, dans le code ou la base de donnes
Trouvez rapidement les fuites de mmoire et optimisez la mmoire de vos codes C# et VB.NET
Comprenez et dboguez le code de tiers, frameworks, composants et bibliothques inclus
Standardisez la gestion des performances de votre quipe de dveloppement

BEST-SELLER DevExpress DXperience partir de 1 176


Tous les outils DevExpress ASP.NET, WinForms, Silverlight, WPF et IDE Productivity en un.
Abonnement de 12 mois pour tous les produits et mises jour DevExpress et accs aux
versions bta en dveloppement actif
Modles et thmes dapplication intgrs exceptionnels
Support de nouvelle vue Windows 8 UI et panneaux ancrables tactiles
Support interface code pour test environnement utilisateur

1996-2014 ComponentSource. Tous droits rservs. Tous les prix sont corrects au moment de la presse. Prix en ligne mai diffrentes de celles dcrites en raison de fluctuations quotidiennes et remises en ligne.

Nous acceptons les bons de


Sige social en Europe Sige social aux tats-Unis Sige social au Japon
ComponentSource ComponentSource ComponentSource Numero vert: commande. Contactez-nous pour
demander un compte de crdit.
30 Greyfriars Road 650 Claremore Prof Way 3F Kojimachi Square Bldg
Reading
Berkshire
RG1 1PE
Suite 100
Woodstock
GA 30188-5188
3-3 Kojimachi Chiyoda-ku
Tokyo
Japon
0800 90 92 62
Royaume-Uni tats-Unis 102-0083 www.componentsource.com
014_016_180 17/11/14 22:46 Page14

Visual Studio Community, Visual Studio 2015 preview,


hot news

.net sur OS X et Linux, meilleur support iOS


et Android: Microsoft ouvre les vannes!
Diversit, ouverture,
multiplateforme, voil comment
nous pourrions rsumer les
nombreuses annonces de
Microsoft lors de la confrence
Connect, il y a quelques jours.
Nous cherchons rpondre
(aux attentes) des
dveloppeurs non Microsoft. Et
de continuer faire de Visual
Studio le meilleur outil de
dveloppement prcise prochains mois. Cela renforce aussi la Unity et Apache Cordova. Cette dition peut
fondation .net lance au printemps dernier. tre utilise par les dveloppeurs
Jakob Harttung (directeur du ct de cela, il y a lannonce de la portabilit indpendants, la maison, dans les classes, la
ple stratgie plateforme et sur OS X et Linux de .net Core. Il sagit de la recherche, pour des projets open source et en
vanglisme technique brique serveur. Ainsi il sera possible de entreprise (il ne faut pas dpasser 250 PC ou
dployer des applications .net sur de multiples 1 million de revenus annuels et uniquement en
Microsoft France). environnements. Cela signifie que lon pourra dveloppement open source).
dployer des applications ASP.Net 5 sur Il nest pas certain que les versions Express
Franois Tonic
ftonic@programmez.com Windows, Windows Server, Azure, OS X et continuent exister.
Linux Attention: .net ne devient pas
multiplateforme, ce portage concerne C++pour le dveloppement
Connect () a donc t loccasion pour uniquement certaines zones du framework. multiplateforme
Microsoft de dvoiler de nombreux outils et Microsoft accentue donc louverture de Lannonce nest pas passe inaperue.
dimportantes annonces pour le dveloppeur, couches techniques. Cest une bonne nouvelle Microsoft pousse C++ sur mobile. Il sera
quil soit dveloppeur sur technologies pour la communaut et les possibilits de ne possible de dvelopper des apps universelles
.net/Microsoft ou non. plus tre totalement dpendant de Windows pour mobile et pas seulement pour Windows!
comme plateforme dexcution. Le but est de supporter Android et iOS!
.net: de lopen source, Miguel de Icaza (projet Mono) a bien accueilli Cette nouveaut arrive avec Visual
du Mac et du Linux la nouvelle. Et il est dj prvu de remplacer Studio2015. Actuellement, le C++
Microsoft nabandonne pas .net. Au contraire, des pans entiers du code Mono par ces crossplatform est valable pour Android et
lditeur fait un triple mouvement: nouveaux codes open source (et amlioration Windows, la compilation iOS arrivera plus tard.
w continuer le faire voluer la compatibilit entre les deux piles Cette belle nouveaut embarque un nouveau
w ouvrir certaines couches et les rendre open techniques). Les relations entre Microsoft et type de projet Native-Activity Application.
source Mono nont jamais t simples. Mais peu Template projet dune application Android! On
w porter officiellement certaines portions sur peu, Mono a su trouver sa place et crer sa pourra ainsi exploiter lmulateur Android de
dautres systmes communaut. Post complet: VS 2015. Cest donc une 3e possibilit de
Comme le prcise larticle ddi, la http://tirania.org/blog/ dveloppement mobile multiplateforme: C++,
disponibilit sur github concerne uniquement Cordova et Xamarin.
les parties .net Core Runtime et certaines Quelques mots sur Visual Cest une reconnaissance la diversit (des
librairies. On parle ici des couches ncessaires Studio Community dveloppements, NDLR). recadre Jakob. On
pour excuter du code .net (incluant la CLR, le Cette dition rejoint notre stratgie aurait pu croire que Microsoft empitait
compilateur juste temps, le ramasse-miettes douverture. Le dveloppeur profite de toutes fortement sur Xamarin mais pour le moment,
et les librairies .net Core). Ce sont les couches les fonctionnalits et notamment de Xamarin est plus complet et plus riche sur le
basses du framework .net. Il sagit aussi lextensibilit de lenvironnement. prcise dveloppement natif multiplateforme mobile
douvrir plusieurs librairies: XML, SIMD, Jakob. VS Community sappuie sur ldition que loffre Visual Studio 2015.
Metadatareader, ImmutableCollections. Visual Studio 2013 Professional.
Microsoft prcise dailleurs que les Cette version cible les dveloppeurs mobiles Pour en savoir plus: http://goo.gl/fCP1f0
contributions externes seront possibles. Et le et multiplateformes, car il est possible de
mouvement devrait continuer dans les coder pour Windows, Android et iOS, dutiliser u

14 Programmez! < Dcembre 2014


014_016_180 17/11/14 22:46 Page15

Connect(): Quoi de neuf chez Microsoft?

hot news
Les 12 et 13 Novembre 2014, Microsoft a tenu une confrence, Visual Studio 2015 Preview
nomme Connect(), au cours de laquelle un grand nombre et .NET 2015 Preview:
En marge de ces annonces (qui, elles seules,
dannonces ont t faites, beaucoup dentre-elles ayant eu un fort ont provoqu une grande effervescence de la
impact dans la communaut des dveloppeurs. Faisons part de la communaut sur Twitter et autres
un rapide tour dhorizon de ce qui a t annonc par les rseaux sociaux), la confrence Connect() a
galement permis de faire le lancement de
grands pontes de Microsoft! Visual Studio 2015 Preview et du Framework
Thomas LEBRUN Consultant version gratuite (appele Express), cest .NET 2015, en version prliminaire, l-encore.
http://blogs.infinitesquare.com/b/tom quelle ne pouvait tre utilise que pour dve- Ainsi, Visual Studio 2015 propose une intgra-
@thomas_lebrun lopper des applications dun certain type (Web, tion native de Roslyn et les nouvelles fonc-
Windows, Phone, etc.). Ainsi, si je voulais dve- tionnalits du langage C#. Cette version est
Louverture lopper pour Windows Phone et le Web, je prsent testable dans sa version 6 et facilite
du Framework .NET: devais installer 2 versions de Visual Studio grandement le travail du dveloppeur en lui pro-
Lannonce a fait leffet dune bombe lorsque Express. Pour pallier ce problme, Microsoft posant tout un ensemble de techniques servant
Scott Guthrie la annonc: Microsoft a dcid met disposition, une nouvelle version de de sucre syntaxique. De plus, le nouveau
de rendre Open Source le Framework .NET. Visual Studio: Visual Studio Community 2013. systme dampoule (que lon retrouve sur
Attention, il ne sagit pas de tout le Framework Cette nouvelle dition, entirement gratuite Resharper) permet de proposer un refactoring
mais de la partie serveur (.NET Core Server) pour tous les projets qui ne sont pas lis len- proactif et des possibilits doptimisations et
ainsi que des couches basses ; le tout sera treprise, est une version complte de Visual damliorations de code la vole, au fur et
accessible au travers de GitHub Studio (base sur la version Pro de Visual Stu- mesure que vous crivez votre code: Fig.2.
(http://github.com/Microsoft/dotnet & dio) qui permet aux dveloppeurs de cibler Afin damliorer la productivit des dvelop-
https://github.com/dotnet/corefx). nimporte quelle plateforme, de lapplication peurs, des amliorations sur toute la partie
Dans la continuit de la mise en Open Source de native au Web, en passant par le Cloud et le Debugging ont galement t apportes.
.NET, Microsoft va galement mettre disposi- cross-plateforme. De plus, cette version sup- Ainsi, la fonctionnalit PerfTips se rvle tre
tion une version de .NET qui puisse tre installe porte le modle dextensibilit mis en place trs intressante: il devient dornavant pos-
sur Linux et Mac OS (en plus de Windows). Les dans les ditions existantes de Visual Studio. sible de voir le temps qui a t pass sur lex-
quipes de Microsoft ont en effet travaill avec Ainsi, lensemble des plugins et composants cution de chaque ligne de code (ou entre
Miguel De Icaza et les quipes du projet Mono disponibles sur Internet ou dans la galerie de plusieurs points darrt): Fig.3.
afin de mettre disposition une implmentation Visual Studio (accessible ici: https://visualstudio- Ct Framework, il y a eu l aussi des nouveau-
de .NET pour Windows, Linux et OS X. gallery.msdn.microsoft.com) peuvent tre tlchar- ts. Ainsi, dans .NET 4.6 (la prochane version
gs et installs dans Visual Studio Community majeure du Framework .NET), le Framework
Visual Studio 2013. Cest le cas, par exemple, de Resharper WPF (Windows Presentation Foundation, qui
Community 2013: (https://www.jetbrains.com/resharper/), de lexcel- permet de crer des applications Windows utili-
Visual Studio, lIDE de Microsoft, existe lheu- lent plugin Visual Studio Tools for Unity sant le XAML comme langage de description
re actuelle en diffrentes version: de la version (https://visualstudiogallery.msdn.microsoft. dinterfaces) a connu des volutions. Lui, que
simple (et gratuite) la version Ultimate, int- com/20b80b8c-659b-45ef-96c1-437828fe7cf2) ou beaucoup pensaient abandonn ( tort!), se
grant toutes les fonctionnalits possibles (Code du bien connu plugin Web Essentials for Visual voit enrichi, entre autres, du support pour les
Lens, IntelliTrace, etc.). Linconvnient de la Studio (http://vswebessentials.com) : Fig.1. fentres transparentes. La Roadmap pour WPF
a t annonce par les quipes de dveloppe-
ment la suite de la confrence et, la lecture
de cette Roadmap (accessible ici:
http://blogs.msdn.com/b/dotnet/archive/2014/11/12/t
he-roadmap-for-wpf.aspx), il est clairement pos-
sible daffirmer que WPF est tout sauf mort, loin
de l! Et cela, cest sans parler des outils,
inclus dans Visual Studio 2015, dont le but est
de faciliter le dveloppement WPF: un outil de
diagnostic visuel, un autre permettant danaly-
ser les performances et mme un nouveau
Blend, intgrant lui aussi tout un ensemble de
Fig.1 nouvelles fonctionnalits (telle que la modifica-
tion de code XAML durant le dbogage, etc.)!
Fig.3

Fig.2 2014
Dcembre > Programmez! 15
014_016_180 17/11/14 22:46 Page16

La partie Cross-Plateforme nest pas en reste


hot news

dans cette nouvelle mouture. Ainsi, une collabo-


ration de plus en plus proche entre Microsoft et
Xamarin a t dvoile aujourdhui. En plus de
lintervention de Miguel De Icaza, lors de la Key-
note de la confrence Connect(), en binme
avec Scott Hanselman, cette collaboration
passe par 3 grandes tapes:
w Une rduction plus importante pour Xamarin
(Business ou Entreprise), pour les abonns
MSDN (https://xamarin.com/msdn)
w Une intgration plus pousse entre Xamarin et
Visual Studio, grce la possibilit dinstaller
Fig.4
Xamarin depuis Visual Studio, ainsi que la mise
disposition de modles de projets/dl-
ments pour Xamarin dans Visual Studio.
w Le support de Visual Studio dans loffre Star-
ter de Xamarin (jusqu maintenant, il fallait
disposer de la version Business pour pouvoir
dvelopper des applications Xamarin dans
Visual Studio) Fig.4.
Pour complter cet aspect cross-plateforme,
Microsoft a annonc la mise disposition, dans
Visual Studio 2015, dun mulateur pour
Android! Bas sur une architecture x86, celui-ci
se veut disposer de performances optimales,
tout en proposant des fonctionnalits telles que
lacclromtre, la position de lutilisateur, etc.
Techniquement, il sagit dune image Hyper-V, Fig.5
et, si on lance lmulateur, on constate
dailleurs que cet mulateur ressemble norm-
ment celui de Windows Phone (dun point de
vue visuel): Fig.5.
Pour le moment, seules 2 images Hyper-V sont
disponibles (une pour cibler un priphrique de
type Tablette et lautre permettant didentifier
un priphrique de type Tlphone).
Cet mulateur sera utilisable avec les projets
Xamarin et les applications Apache Cordova
qui, dans Visual Studio 2015, se voit dot dun
support intgr permettant de dvelopper,
debugger, analyser, packager et dployer des
applications iOS, Android et Windows. A noter
que cette nouvelle version des Visual Studio
Tools for Cordova inclut le support pour Win-
dows 8.1 et les applications Universelles, ainsi Fig.6
que le dbogage iOS directement dans Visual
Studio: Fig.6. qui ont t annonces. Ainsi, .NET 2015 intgre- deviennent plus autonomes: il nest plus nces-
Enfin, avec Visual Studio 2015, Microsoft met ra ASP.NET 5, permettant de dvelopper des saire de disposer dun serveur Web pour faire
disposition des dveloppeurs une suite compl- applications pour le Web et pour le Cloud. Si tourner les applications!
te permettant de dvelopper des applications ASP.NET vNext a dj t explicit un grand Lvnement Connect() a permis Microsoft de
mobiles cross-plateformes en C++! Cela nombre de fois (comme, par exemple, par Scott montrer aux dveloppeurs un aperu du travail
inclut le support pour le compilateur Clang et Hansleman: sur lequel les quipes de dveloppement ont
LLVM, ciblant Android pour le moment (mais le http://www.hanselman.com/blog/Introducin- travaill depuis quelques temps dj. Certes, il
support diOS a dj t annonc par Micro- gASPNETVNext.aspx), la dcouverte ici a t sagit l de versions prliminaires et donc
soft). Techniquement, cela vous permet dditer dapprendre quASP.NET 5 sera cross-platefor- devant tre testes afin de dtecter et remonter
et de dboguer un seul et mme code C++, afin me, open-source et, surtout, que les applica- des bugs. Cependant, ces premires versions
de faire en sorte que celui-ci fonctionne pour tions ASP.NET pourront sexcuter en side by sont plus quintressantes afin davoir un aper-
iOS, Android et Windows. side avec des versions diffrentes du Frame- u de ce que nous rserve Microsoft pour lan-
Cot Web, il y a galement eu des nouveauts work. De plus, les applications ASP.NET 5 ne 2015! u

16 Programmez! < Dcembre 2014


017_022_180 17/11/14 22:48 Page17

Dveloppez avec Wordpress 2e partie

je dbute avec...
Maintenant que vous matrisez parfaitement loutil administration de Wordpress (Programmez!
179) nous allons nous occuper de la plomberie de ce fabuleux CMS. Wordpress est entirement
customisable et propose un large panel doutils qui vous permettront de donner une personnalit
(avec les thmes) et des fonctionnalits (les plugins) uniques votre site.
Freddy Hebrard Toutes les donnes lies aux utilisateurs sont stockes dans ces 2 tables.
Responsable SI Centre de Ressources Rgional Lorraine w wp_usermeta
MCTS/MCPD Microsoft w wp_users
freddyhebrard@hotmail.com
@fredhebrard Comprendre larborescence du
dossier Wordpress
Je vous conseille de jeter un petit coup dil la bible de WordPress: le Quand vous naviguez sur votre systme de fichier, dans le rpertoire
codex, que vous trouverez cette adresse: http://codex.wordpress.org. dinstallation de Wordpress, vous pouvez voir un certain nombre de
Ce fameux codex est le rfrentiel de lensemble des fonctionnalits de choses quil est utile de comprendre.
Wordpress ainsi que de laide au dveloppement. Une fonction vous Les fichiers la racine de ce dossier sont pour la majeure partie des
chappe, un petit tour cot codex ;) fichiers de configuration (comme wp-config.php) ou des fichiers directe-
ment appels lutilisation du site (par exemple le fichier index.php qui est
WORDPRESS LA STRUCTURE notre fichier de base.)
Dj 11 ans Regardons de plus prs, les 3 dossiers importants la racine. Le dossier
Comme vous avez pu le lire dans notre introduction du mois dernier, la dinstallation des thmes et des plug-ins, lintrieur il y a deux autres
premire version de Wordpress est sortie en 2003,. Cela une grande dossiers respectivement appels thme et plugins:
importance dans notre code, le code dorigine WORDPRESS est compl- w Wp-content
tement procdural, sans aucune trace de POO. Avec les volutions de La base, le moteur, les fonctionnalits de Wordpress sont stockes dans
PHP et de WORDPRESS, les nouvelles versions et nouveaux outils de la ce dossier:
plateforme se sont dvelopps de plus en plus en POO. w Wp-includes
Dans la version actuelle de notre CMS, afin de garder une rtrocompatibi- L'interface de ladministration et les diffrentes fonctionnalits lies :
lit importante, dans les entrailles de la bte, nous avonsdu code proc- w Wp-admin
dural et du code objet; ceci a son importance quand vous dvelopperez, Ce que nous comprenons en regardant cette structure, cest que notre
car il y aura jongler avec les deux dans certains cas. dveloppement de thme et de fonctionnalit sera dans un endroit prcis
et compltement dtachable du reste de Wordpress.
Les Bases de donnes. Il est donc inutile quand vous dvelopperez vos plugins et vos thmes de
Souvenez-vous sur larticle du mois dernier, lors de linstallation, Word- toucher autres choses lextrieur des dossiers thmes et plugins
press nous proposait de choisir le prfixe des tables, par dfaut cest contenus dans le dossier wp-content, cela est mme vivement dcon-
wp, nous partons du postulat que vous navez rien chang. seill.
Il existe nativement avec Wordpress 4.0, lors de linstallation, 11 bases de
donnes. Lensemble des commentaires du site, rattachs aux articles LES BASES DU DVELOPPEMENT
par exemple sont contenus sur ces 2 tables: WORDPRESS AVEC LA CRATION
w wp_commentmeta DUN THME
w wp_comments Vous avez vu dans la premire partie de ce dossier comme installer un
Lensemble des paramtres du site, titre, slogan et autres joyeusets, thme, nous ne reviendrons pas dessus, nous allons pouvoir entrer tout
sont stocks ici: de suite dans le vif du sujet.
w wp_options
Pour la rtrocompatibilit avec les anciennes versions de WP, une table Cration et structure dun thme
note depracated dans le codex permettait de stocker les informa- Avant tout, il faut crer un dossier au nom du thme, dans le dossier
tions relatives aux liens entrs dans la fonction Link de Wordpress. thme, dans le dossier wp-content .
w wp_link Mais que doit contenir ce dossier pour rendre le thme viable? Simple-
Les contenus des publications du site se trouvent dans ces 2 tables : ment 2 fichiers:
articles, pages, menus Dans WordPress chaque article et page sont sou- 1 fichier de styleet un fichier modle:
mis au versionning, il existe donc plusieurs versions dans ces tables. w style.css
w wp_postmeta w index.php
w wp_post
Les informations lies aux tags, liens avec les diffrents articles du site, Le fichier style.css:
catgories sont stockes directement dans ces tables. Ce fichier doit avoir une entte bien particulire pour fournir des informa-
w wp_term_relationships tions particulires aux gestionnaires des thmes, ces informations sont
w wp_term_taxonomy visibles sur la page de gestion des thmes dans ladministration de Word-
w wp_terms press :

Dcembre 2014 > Programmez! 17


017_022_180 17/11/14 22:48 Page18

Exempledes lments de base :


je dbute avec...

/*
Theme Name: Programmez !
Fig.1
Theme URI: http://wordpress.org/
Description: Premier theme by PROGRAMMEZ
Version: 1 Fig.3
Author: Programmez
Author URI: http://www.programmez.com
Tags: theme, wordpress, dveloppement.
*/

Le fichier index.php:
Si le fichier modle est non existant WORDPRESS vous le signalera en
vous indiquant que le thme est endommag, dans ladministration de
WORDPRESS (slection du thme) Fig.1.

Structure dun Template


Dans un Template vous trouverez gnralement 3 lments essentiels:
w Les feuilles de style
w Les images
w Les template
Un Template est un fichier qui permet de structurer les donnes rcu-
pres en utilisant un modle dfini par le dveloppeur et rutilisable.
Il est important de porter un focus tout particulier sur le systme de Hi-
rarchie de Template de Wordpress.

Fallbacket Hirarchie Template


Wordpress utilise un mcanisme appel le Fallback, ce qui veut dire
que quand il ne trouve pas un fichier particulier modle (Template), il sur un fichier par dfaut. Le fichier par dfaut le plus bas est index.php,
utilise un fichier modle de niveau infrieur, plus gnrique, il retombe ce qui explique sa prsence obligatoire dans le dossier du thme. Ce sys-
tme est utile et permet dtre rapidement ractif sur le
dveloppement, en effet vous ne dveloppez que les
Templates qui vous sont ncessaires; s'il ny pas besoin
de Template prcis dans une situation donne, alors on
laisse le traitement par le Template plus bas, ce qui per-
met la mutualisation du code pour des affichages simi-
laires. Par dfinition, le Template le plus bas doit tre
structur avec le code le plus gnrique possible pour
toute situation.
Schma de hirarchie de Template de Wordpress: Fig.2

Exemple de Template:
Le fichier modle category.php permet de dfinir un
affichage gnrique pour lensemble des catgories
darticles. Concrtement, si vous avez utilis un lien vers
une catgorie dans votre menu principal, par exemple
une catgorie programmez, le lien cherchera afficher
le fichier modle ( Template ) category-
programmez.php, qui dtermine la structure daffichage
pour cette catgorie prcise; s'il ne trouve pas alors il
retombera vers le fichier gnrique category.php qui
permettra de lister les articles en utilisant la structure
HTML, avec vos stylesCSS et vos effets JavaScript que
vous avez dcids en amont.
Si il ne trouve pas le fichier category.php, grce au mca-
nisme de fallback, il appellera un fichier modle de niveau
infrieur, et en dernier recours index.php.
Concrtement:
w Lutilisateur clique sur la catgorie programmez dans
Fig.2 son menu

18 Programmez! < Dcembre 2014


19 abonne-180_180 18/11/14 00:11 Page17

Bienvenue
dans l'univers
du code avec

08-22-13 esenkartal
1 an 11 numros

49
tudiant
Spcial

(*)
39
1 an 11 numros
seulement (*)

2 ans 22 numros

79
ABONNEZ-VOUS ! seulement (*)

(*) Tarifs France mtropolitaine

Toutes nos offres sur www.programmez.com

Oui, je mabonne ABONNEMENT retourner avec votre rglement


Service Abonnements PROGRAMMEZ, 4 Rue de Mouchy, 60438 Noailles Cedex.

n Abonnement 1 an au magazine : 49 (au lieu de 65,45 , prix au numro) Offre spciale : abonnement + cl USB Programmez!
n 1 an (11 numros) + cl USB : 60
n Abonnement 2 ans au magazine : 79 (au lieu de 130,9 , prix au numro) n 2 ans (22 numros) + cl USB : 90
n Abonnement spcial tudiant 1 ans au magazine : 39 Cl USB contenant tous les numros de Programmez! depuis le n100, valeur : 29,90
Photocopie de la carte d'tudiant joindre
Tarifs France mtropolitaine Tarifs France mtropolitaine

n M. n Mme n Mlle Entreprise : I___I___I___I___I___I___I___I___I Fonction : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I


PROG 180
Offre limite, valable jusquau 31 dcembre 2014

Prnom : I___I___I___I___I___I___I___I___I___I___I___I___I___I Nom :I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Adresse : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Code postal : I___I___I___I___I___I Ville : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Tl : I___I___I___I___I___I___I___I___I___I___I___I___I (Attention, e-mail indispensable pour les archives sur internet)


E-mail : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I @ I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I
n Je joins mon rglement par chque lordre de Programmez ! n Je souhaite rgler rception de facture * Tarifs France mtropolitaine
017_022_180 18/11/14 00:15 Page20

w Wordpress cherche category-programmez.php et le renvoie sil le trouve. $event_wordpress : nom de lvnement lancer.
je dbute avec...

w Autrement, Il renvoie category.php ,$arga,$argb[] : srie darguments (s'il y a) passer en paramtres


w Sil ne trouve pas il renvoie index.php des fonctions accroches et spares par des virgules.
Exemple de structure systme de fichier pour un thme existant dans
Wordpress: Fig.3. Un exemple bien prcis de lutilisation des actions dans Wordpress:
Nous pouvons voir un ensemble de fichiers (dont index.php); il existe Si vous avez lu le premier article sur ladministration et linstallation de
plusieurs types de modles que vous pouvez crer, on a vu Wordpress, on a parl rapidement des widgets que lon peut rajouter dans
category.php , mais aussi content.php qui dtermine laffichage certaines zones de notre page (dtermines par le dveloppeur)
gnrique dun contenu (article/page), footer.php qui reprsente la Linitialisation de ces widgets, au chargement de la page, se passe grce
structure dun pied de page, header.php la structure de la partie haute au dclenchement de lvnement widget_init. Concrtement, un ajout
de votre page, 404.php inutile de la prsenter, etc. dune zone de widget se passe grce aux actions.
Voici un exemple que vous trouverez directement dans le fichier func-
Le fichier functions.php tions.php du thme par dfaut twentythirteen de Wordpress:
Il existe un fichier qui attire notre attention dans le rpertoire de notre
thme : functions.php . Il permet de dfinir un ensemble de fonc- function twentythirteen_widgets_init() {
tions, dactions, de paramtres propres au thme utilis. Il est charg register_sidebar( array(
automatiquement par le moteur de Wordpress lorsquil se trouve la raci- 'name' => __( 'Main Widget Area', 'twentythirteen' ),
ne du dossier de thme. Cest pour cela que beaucoup dlments sont 'id' => 'sidebar-1',
initialiss dans ce fichier. 'description' => __( 'Appears in the footer section of
Bonne pratique: Ce fichier peut faire appel dautres fichiers de fonction, the site.', 'twentythirteen' ),
afin de rendre le code plus lisible et plus clair (bonne pratique) afin dviter 'before_widget' => '<aside id="%1$s" class="widget %2$s">',
de se retrouver avec une page functions.php regroupant toutes les fonc- 'after_widget' => '</aside>',
tions de votre thme les unes avec les autres. a devient rapidement illi- 'before_title' => '<h3 class="widget-title">',
sible. 'after_title' => '</h3>',
Exemple de code dans functions.php (thme par dfaut twentythirteen) ) );
Fig.4.
register_sidebar( array(
Les hooks: les actions et les filtres 'name' => __( 'Secondary Widget Area', 'twentythirteen' ),
Les hooks sont des outils de WordPress qui permettent dintercepter 'id' => 'sidebar-2',
des vnements de WordPress (ou dappeler des moments prcis 'description' => __( 'Appears on posts and pages in
une/des fonctions) afin de modifier un comportement ou des donnes. the sidebar.', 'twentythirteen' ),
Il existe deux types de Hooks: les actions et les filtres. 'before_widget' => '<aside id="%1$s" class="widget %2$s">',
'after_widget' => '</aside>',
Les actions: 'before_title' => '<h3 class="widget-title">',
Les actions sont des fonctions particulires qui sont appeles lors dun 'after_title' => '</h3>',
dclenchement dvnement dans WordPress. ) );
Un vnement peut tre observ par plusieurs fonctions, elles sont ratta- }
ches cet vnement, il peut tre observ par un nombre indfini de add_action( 'widgets_init', 'twentythirteen_widgets_init' );
fonctions.
Quand un vnement est dclench, lensemble des fonctions rattaches Dans ce code nous avons:
sont excutes dans un ordre dfinissable par le dveloppeur. w Une fonction (twentythirteen_widgets_init()) qui nous permet dinitialiser
Laction sajoute par lutilisation de la fonction add_action(): 2 zones de widgets, grce la mthode denregistrement
register_sidebar(); qui prend en paramtre un tableau de paramtre
add_action($event_wordpress,$nom_de_ma_fonction_a_appeler,
de notre zone.
$priorite) ;
w Lenregistrement lobservation de lvnement widgets_init de notre
$event_wordpress : nom de lvnement observer fonction grce laction add_action().
$nom_de_ma_fonction_a_appeler : nom de la fonction rattacher, A lappel de la fonction do_action(widgets_init,) ; la fonction twenty-
sans parenthse. thirteen_widgets_init()) sera excute.
$priorit : priorit dexcution de la fonction par rapport aux autres
observants, la valeur par dfaut tant 10. (plus le niveau est faible plus elle Les filtres:
est prioritaire). Ils servent modifier du texte ou des types laffichage navigateur ou sur
Dclencher un vnementavec la fonction do_action(): votre BDD; nous aborderons ce sujet plus en dtails avec la cration des
plugins/widget.
do_action($event_wordpress,$arga,$argb[] ) ;

Template tags.
Comprendre le dveloppement avec Wordpress passe par cette tape
cruciale de lutilisation des Template Tags.
Les Template Tags sont des fonctions de bases fournies par Wordpress
que nous pouvons appeler dans nos dveloppements pour restituer du
Fig.4 contenu comme:

20 Programmez! < Dcembre 2014


017_022_180 18/11/14 00:15 Page21

w Un article: son titre, son contenu

je dbute avec...
w Les informations du site: slogan, titre, adresse.
w Des outils pratiques.
Exemple de Template tags:
w the_title(): qui nous donne le titre dun article ou dune page.
w the_content(): qui nous donne le contenu dun article ou dune page.
w the_permalink(): le permalien de larticle ou de la page.
w Etc
Mais aussi des outils:
w get_calendar(): rcupere le calendrier.
w wp_loginout(): permet dafficher le login / logout.
w Etc..
Ou encore les infos sur le site:
w bloginfo(name): titre du blog
w bloginfo(charset): le charset utilis
w etc
Ou des portions compltes de code:
w get_header(): permet de rcuperer lentte contenue dans le fichier hea- Fig.5
der.php
w get_footer() : permet de rcuprer le pied de page contenu dans le
fichier footer.php
w comments_template(): inclue le fichier comments.php qui est le Templa-
te des commentaires dune publication. Ce Template tag est fournir
Fig.6
dans la boucle, que nous voyons tout de suite aprs.
Lutilisation de ces deux Template tags ncessite de bien concevoir com-
ment on va construire ses pages:
Exemple dans le fichier index.php dun de nos thmes par dfaut dans liste darticles contenus dans la catgorie na pas t compltement par-
Wordpress (code volontairement tronqu) : Fig.5. courue Fig.6.
Toutes les balises ouvrantes <html> <body> etc devront se trouver dans Le Template tag the_post() permet de rcuprer larticle point,
le fichier header.php insr par lappel du template tag get_header() the_title(), le titre de larticle,et the_content(), son contenu.
et des balises fermantes de ces mme lments dans le fichier
footer.php. Dans le fichier index.php, on aura insr nos deux tem- La boucle toutes les sauces, mme pour une page:
plate tags et entre les deux notre contenu. a marche videment avec La boucle est utilise pour lister un ensemble darticles comme ici, mais
nimporte quel Template autre que index.php aussi pour rcuprer le contenu dune seule page ou dun seul article!
De part sa hierarchie de template, l'criture du code devra tre la plus
Le contenu: comprendre la boucle! gnrique possible au fur et mesure que l'on se rapproche de
Nous avons maintenant le minimum pour crer un thme dans Word- l'index.php..
press: la structure dun thme dans le systme de fichiers, les hooks, la
comprhension synthtique de la hirarchie de Template, les Template Le cas particulier, cest un blog, comment afficher les
tags. commentaires?
Cependant quand vous lancez votre page, rien ne se passe, cest le vide Dans les exemples de template tag, je vous ai parl rapidement de com-
complet! En effet il ny a aucun code dans votre index.php, je vous propo- ments_template() qui nous permet lintgration du template com-
se ici de comprendre llment fondamental dans la restitution de don- ment.php.
nes: la boucle. Dans ce fichier il suffit dappeler un autre template tag qui permet le listing
La boucle est loutil, dans Wordpress, qui nous permet de parcourir len- des commentaires: wp_list_comments(), sans paramtre de base entre
semble dun contenu. Un contenu peut tre bas sur les donnes dune deux balises <ol>, une ouverte et une autre fermante.
page, dun article, dune catgorie darticles, dun tag darticles etc. Lutili- Il prend aussi un tableau de paramtres, pour dfinir son affichage:
sation de la boucle passe par lutilisation dun Template tag :
have_posts() dans une boucle. wp_list_comments( array( 'style' => 'ol',
Exemple: 'short_ping' => true,
'avatar_size'=> 34,
while (have_posts()) : ) );
[****** mon code ******]
endwhile; Ajouter des zones de fonctionnalits nos
templates.
Simple non ? Le Template tag have_posts() renvoie un boolen Nous savons ajouter le contenu dans nos templates en utilisant la boucle,
(true/false) afin de dterminer s'il reste des objets parcourir. mais nous avons besoin dune navigation pour notre site et nous souhai-
Je vous donne un exemple simple; jai cr un fichier Template catego- tons aussi pouvoir intgrer des Widgets facilement sur notre page sans
ry.php de base gnrique qui permet dafficher lensemble des articles passer chaque fois par le code, cest ce que nous allons dcouvrir dans
pour une catgorie donne, have_posts() me renverra true tant que la cette section.

Dcembre 2014 > Programmez! 21


017_022_180 18/11/14 00:15 Page22

Zone de navigation / menu:


je dbute avec...
the site.', 'twentythirteen' ),
Lajout dune zone de menu par deux tapes importantes: 'before_widget' => '<aside id="%1$s" class="widget %2$s">',
w Observation de lvnement init et enregistrement par 'after_widget' => '</aside>',
register_nav_menu() 'before_title' => '<h3 class="widget-title">',
w Intgration HTML dans le Template. 'after_title' => '</h3>',
Il existe une action pour accrocher une fonction un vnement de ) );
manire pouvoir lobserver.
Lvnement observable est init, la fonction rattache doit imprative- Liste des paramtres:
ment appeler la fonction denregistrement de notre menu w name: correspond au nom qui sera affich dans la zone cot administra-
register_nav_menu(). tion (ex: barre latrale principale).
Voici en dtail les paramtres de cette fonction: w description: texte qui saffiche dans ladministration des widgets pour
dcrire le contenu de cette zone ou autre (ex: Barre Latrale principale
register_nav_menu($identifiant, $nom_afficher); qui apparait gauche).
w id: id unique de notre zone.
$identifiant : identifiant unique de notre zone de menu. w before_widget : balise et autres code HTML quon affiche avant
$nom_afficher : le nom quon affiche dans la personnalisation de CHAQUE widget.
notre site, dans ladministration. w after_widget: la mme, mais aprs CHAQUE widget.
Bonne pratique: ce code doit se trouver dans le fichier functions.php ou w before_title : balises et autres code HTML quon doit afficher avant
un fichier inclus dedans. chaque titre de widget.
w after_title: idem que le before mais aprs les titres.
Et lintgration HTML? Bonne pratique: ce code est placer de prfrence dans functions.php
Rien de plus simple elle passe par le template tag wp_nav_menu() ou dans un fichier spar appel dans functions.php Fig.7.
intgrer dans le/les templates o vous dsirez voir apparatre cette zone
de navigation. Comment afficher notre zone?
Cette fonction prend plusieurs paramtres sous forme dun array, dont 1 Simplement en intgrant dans le Template qui intgre la zone:
obligatoire: lidentifiant.
<div><?php dynamic_sidebar('id_de_la_zone');?></div>
<?php
wp_nav_menu(array( Conclusion
'theme_location' => 'main_menu', Maintenant, vous avez les clefs pour btir dj pas mal de choses avec
[] Wordpress 4.0 et les thmes. Vous matrisez les concepts de boucle, Tem-
)); plate tags, actions, filtres, hooks, hirarchie Templates, Templates, et
?> vous savez mettre en uvre une structure de Template rutilisable et
exportable dans le CMS. Comment aller plus loin? En lisant l'article du
Liste des parametres: mois prochain o nous parcourrons ensemble la cration dun plugin et
w theme_location: identifiant de la zone de menu insrer. widget, linternationalisation, une revue sur les filtres. Entretemps nhsi-
w menu_class: class CSS pour cette zone de menu appliquer. tez pas un faire un tour du ct du codex. u
w before: contenu HTML intgrer avant la zone.
w after: contenu HTML intgrer aprs la zone.
w container: permet de dfinir la balise contenant la zone de navigation,
par dfaut cest une <div>.

Zone de widget:
Lajout dune zone de widgets est simple et passe par deux tapes impor-
tantes:
w Observation de lvenement widgets_init et enregistrement par
register_sidebar().
w Integration HTML dans le template.
Nous lavons entrevu un peu plus haut dans notre article, il existe une
action pour a: observer lvnement widgets_init;. Dans notre fonc-
tion rattache, nous devons appeler une autre fonction: register_side-
bar() qui prend en paramtre un array() de paramtres pour
lenregistrement de notre zone de widgets.
Regardons en dtail le contenu des paramtresque nous avons dans le
fichier functions.php de nos templates par dfaut de Wordpress :

register_sidebar( array(
'name' => __( 'Main Widget Area', 'twentythirteen' ),
'id' => 'sidebar-1',
'description' => __( 'Appears in the footer section of Fig.7

22 Programmez! < Dcembre 2014


023_031_180 18/11/14 00:17 Page23

SWIFT: le nouveau langage

langage
pour OS X et iOS
Ce nouveau langage destination des plateformes de la marque la pomme (tout du moins pour
linstant), est prsent comme plus simple, plus moderne, plus flexible et plus drle que
ses anctres C et Objective-C.
Stphane Cordonnier let anInteger = 70
Directeur Technique Bliz (Spcialiste Microsoft .NET, let aDouble = 70.0
SharePoint, Mobilit) let aString = "Hello world"
http://www.bliz.fr
Si le dveloppeur souhaite malgr tout spcifier lui-mme quel type de
Le but nest pas de proposer un nouveau langage de dveloppement donne il souhaite utiliser pour la dclaration dune variable et/ou
juste pour le plaisir. Au lieu de cela, prenez ce qui se fait de mieux sur constante, il peut le faire de la manire suivante:
toutes les plateformes existantes ce jour (C, Objective-C, C#, Java,
let anInteger: Int = 70
Ruby, Python, JavaScript, etc) et regroupez le tout afin de permettre aux
let aDouble: Double = 70
dveloppeurs de crer des applications plus stables et plus puissantes de
let aString: String = Hello world
manire plus rapide et plus efficace que ce quils connaissent jusquici.
Une des particularits de Swift par rapport Objective-C, concerne le fait
TOUR DHORIZON DU LANGAGE SWIFT que le langage est fortement typ. Cela signifie quaucune conversion de
Le premier programme crit par les dveloppeurs consiste afficher le type ne sera effectue par lapplication sans que le dveloppeur lait expli-
texte Hello world au sein dune application. Pour cela rien de plus citement demand. Si le dveloppeur souhaite combiner des types diff-
simple, et une seule ligne de code suffit: rents, il est de sa responsabilit de convertir correctement les donnes :

println ("Hello world") let aString = "The integer value is "


let anInteger = 70
Nul besoin de dfinir un point dentre son application comme cela est le
let integerString = aString + String(anInteger)
cas dans dautres langages. Avec Swift, tout code crit un niveau global
est utilis comme point dentre de lapplication. Lorsque lon souhaite manipuler des chanes de caractres comme dans
On remarque galement quil nest pas ncessaire de mettre un point-vir- lexemple prcdent, il existe toutefois une syntaxe simplifie afin darri-
gule la fin de la ligne afin dindiquer que les instructions sont termines. ver au mme rsultat :
Chaque retour la ligne est considr comme la fin dune instruction. Il est
let anInteger = 70
bien videmment possible de contrler plus finement le flux dexcution
let integerString = "La valeur est gale \(anInteger)"
des instructions comme nous le verrons ultrieurement.
Parmi les types de donnes rgulirement utiliss en dveloppement, on
Variables/constantes utilisant des types simples retrouve galement les tableaux et dictionnaires de donnes. Leur dcla-
La dclaration de variables et/ou de constantes est gnralement le point ration seffectue en respectant la syntaxe suivante:
suivant auquel tout dveloppeur aura recours pour raliser son applica-
var stringArray = ["Value1", "Value2", "Value3", "Value4"]
tion. Pour cela il suffit dutiliser la syntaxe ci-dessous:
var stringDictionary = [
var anInteger = 42 "Key1": "Value1",
anInteger = 50 "Key2": "Value2",
let integerConstant = 42 ]

Comme on peut le voir ici, Swift utilise deux mots cls pour diffrencier les Si lon souhaite crer des tableaux et/ou dictionnaires vides, il est nces-
variables (var) des constantes (let). Cette distinction syntaxique permet en saire de prciser le type de donnes qui sera stock lintrieur comme
un coup dil de comprendre la volont du dveloppeur de vouloir dcla- on peut le voir ci-dessous:
rer une variable pouvant tre modifie ultrieurement (la variable nomme let stringArray = [String]()
anInteger ci-dessus). Cette distinction permet galement au compilateur let stringDictionary = [String: String]()
de pouvoir gnrer une erreur avant mme lexcution du programme,
notamment si le dveloppeur crivait quelque chose comme: Contrler le flux dexcution
Dans toutes les applications, il est ncessaire de pouvoir contrler le flux
integerConstant = 50 dexcution en fonction des valeurs des variables/constantes. Pour cela,
On constate galement dans la dclaration des variables et constantes, Swift utilise la syntaxe if-else que lon retrouve dans de trs nombreux lan-
que la notion de type de donnes napparat pas. Les types de donnes gages.
sont dtermins automatiquement par le langage au moment de la compi-
lation de lapplication. let anInteger = 42
Pour cela le langage utilise la notion dinfrence de types. Afin de typer dif- if anInteger > 50 {
fremment les donnes lors de la dclaration, il suffit dutiliser la syntaxe prinln("La valeur est suprieure 50")
adquate comme on peut le voir ci-dessous: } else {

Dcembre 2014 > Programmez! 23


023_031_180 18/11/14 00:17 Page24

langage
prinln("La valeur est infrieure ou gale 50")
} Comment bien dmarrer avec Swift ?
Pour les cas contenant plus que deux possibilits comme ci-dessus, il est Deux ouvrages trs complets ont t rendus disponibles depuis le
possible dutiliser la syntaxe switch-case, qui permet de grer des cas premier jour sur iBooks Store, accessible depuis tous les Macs,
plus ou moins complexes: iPhone et iPad. Ces ouvrages ont t mis jour plusieurs reprises
depuis lannonce de Swift en Juin dernier.
let aColor = "Rouge Fonc" Le premier nomm tout simplement Welcome to Swift contient
switch aColor { prs de 450 pages permettant de dcouvrir le langage tout dabord
case "Noir": de manire rapide. Si vous souhaitez ensuite aller plus loin, il reprend
println("La couleur est noire") en dtail chacun des aspects du langage avec de nombreux
case "Bleu", "Blanc": exemples lappui pour mettre tout cela en application.
println("La couleur est bleu ou blanc") Le second ouvrage nomm Using Swift with Cocoa and Objective-
case let x where x.hasSuffix("Fonc"):
C sattarde plus prcisment sur linteroprabilit entre les lan-
gages et avec le framework dApple. Sont galement abords dans
println("La couleur est fonce")
ce livre les aspects de migration de son code Objective-C vers Swift
default:
et les impacts prendre en considration.
println("La couleur est indtermine") On retrouve au sein de Xcode, toute la documentation associe au
} langage ainsi que la dclaration de toutes les classes, proprits,
Lorsque lon souhaite itrer plusieurs fois de suite (ex: parcourir les don- mthodes, numrations, etc disponibles grce la compatibilit
assure entre Foundation et Swift. Afin de vous faire gagner du
nes dun tableau), il est possible dutiliser diffrents types de boucles
temps dans votre apprentissage de Swift, voici quelques-uns des
tels que for, for-in, while et do-while :
liens les plus utiles afin de dcouvrir le langage en allant du dbutant
var stringArray = ["Value1", "Value2", "Value3", "Value4"] voulant simplement dcouvrir de quoi il sagit, lexpert voulant
for aString in stringArray { pousser le langage dans ses derniers retranchement :
println(aString) Swift Blog https://developer.apple.com/swift/blog
} Awesome Swift - https://swift.zeef.com/robin.eggenkamp
Fonctions, paramtres et valeur de retour Ray Wenderlich Tutorials - http://www.raywenderlich.com/tutorials
Afin de structurer de manire optimale le code dune application, il est NSHipster - http://nshipster.com/
ncessaire dorganiser celui-ci en blocs rpondant des besoins mtiers 180+ Swift Language Tutorials
particuliers (ex : effectuer un calcul, afficher des donnes, etc). Swift https://www.youtube.com/playlist?list=PLxwBNxx9j4PUpjCEVwjqFvNecNvQ6Dj6G
offre cette possibilit via la cration de fonctions qui peuvent (ou pas)
prendre des paramtres, et peuvent (ou pas) retourner des valeurs. permet de dfinir que la fonction peut prendre un nombre indtermin de
La dclaration et lappel dune fonction simple seffectuent de la manire valeurs lors de lappel de celle-ci. Cest notamment ce que lon voit avec
suivante: les deux appels successifs o le premier ne fournit pas de valeurs la
fonction, tandis que le second fournit trois valeurs cette mme fonction.
func helloWorld() {

Dfinition de classes et manipulation dobjets


println("Hello world")
}
La programmation objet est un standard du march depuis trs long-
helloWorld()
temps et Swift est bien videmment en pleine ligne avec cette approche
Si le comportement de la fonction ncessite lutilisation de paramtres, et permet donc de retrouver tout ce que lon est en droit dattendre quand
ceux-ci peuvent tre spcifis entre les parenthses comme ceci: on parle de POO (hritage, agrgation, surcharge, instanciation).
Pour dclarer un objet, rien de plus simple que dutiliser tous les lments
func helloWorld(name: String) {
voqus prcdemment et de les englober dans une classe comme on le
println("Hello \(name)")
fait dans quasiment tous les autres langages orients objets:
}
helloWorld("Stphane") class Car {
var numberOfDoors = 3
De la mme manire, si la fonction est cense retourner une valeur lis-
func carDescription() -> String {
sue de son excution, cela peut tre fait comme indiqu ci-dessous:
return "La voiture possde \(numberOfDoors) portires."
}
func sumOfIntegers(numbers: Int...) -> Int {
}
var sum = 0
for number in numbers { Pour manipuler lobjet dfini, il est ncessaire de crer une instance de
sum += number celui-ci afin de pouvoir manipuler ses proprits et mthodes:
}
var aCar = Car()
return sum
car.numberOfDoors = 5
}
println(car.carDescription())
sumOfIntegers()
sumOfIntegers(10, 20, 30) Si vous souhaitez matriser ce qui se passe durant la phase dinstancia-
tion dun objet par exemple pour effectuer des traitements complmen-
Vous aurez probablement not dans lexemple prcdent, les trois petits taires, il suffit de dfinir une fonction nomme init qui prendra (ou pas) les
points dans la dclaration des paramtres de la fonction. Cette syntaxe arguments ncessaires linstanciation de lobjet.

24 Programmez! < Dcembre 2014


023_031_180 18/11/14 00:17 Page25

class Car { println("Ouest")

langage
var numberOfDoors = 3 }
var brandName: String
Maintenant que nous avons abord les grands principes du langage et de
init(brandName: String) {
la syntaxe de celui-ci, voyons quelques-unes des nouveauts et particu-
self.brandName = brandName
larits de celui-ci, notamment pour les dveloppeurs Objective-C qui se
}
demandent pourquoi ils devraient utiliser ce nouveau langage.
func carDescription() -> String {
return "La voiture possde \(numberOfDoors) portires."
Les nouveauts/spcificits du langage pour
}
les dveloppeurs Objective-C
}
Tuples
Lutilisation du mot-cl self dans la fonction init, permet de lever lambi- Il arrive de temps autre, notamment dans le cadre dune fonction, que
gut qui peut exister entre le nom de proprit brandName de lobjet de le dveloppeur souhaite retourner plus dune seule valeur. Ceci peut tre
la variable brandName passe en argument de la mthode init. ralis en retournant un tableau/dictionnaire mais nest pas trs pratique
Lorsque lon utilise les principes dhritage en programmation objet, il est et peut tre source derreur. Swift offre aux dveloppeurs la possibilit de
ncessaire de pouvoir dfinir de quelle classe parente hrite un objet, et manipuler des Tuples de valeurs, afin de permettre de grer plusieurs
de pouvoir surcharger les fonctions/mthodes dfinies dans la classe valeurs comme un ensemble de donnes facilement manipulable.
parente. Pour mettre en uvre ces mcanismes, il suffit dcrire ceci: La dclaration dun Tuple se fait de la manire suivante:

class Ferrari : Car { let internalException = (1234567890, "Internal Exception")


override func carDescription() -> String { Une fois un tuple dfini, celui-ci peut tre manipul de manire simple
return "Cette Ferrari possde \(numberOfDoors) portires comme on peut le voir ici:
mais surtout un trs gros moteur."
let (errorCode, errorMessage) = internalException
}
println("Le code de lerreur est \(errorCode)")
}
println("Le message de lerreur est \(errorMessage)")

Enumrations Optionals
Afin de rendre le code plus lisible, les dveloppeurs souhaitent gnrale- Ce concept permet de dfinir quune variable peut avoir ou ne pas avoir
ment regrouper des valeurs associes au sein dune syntaxe explicite, de valeur. Cela nexiste pas en Objective-C mme si un principe sen
plutt que de stocker des valeurs de type 1, 2, 3, 4, etc approche fortement savoir lutilisation de la valeur nil, que lon va
Pour cela, Swift offre la possibilit de crer des numrations. La cration dailleurs retrouver avec Swift pour grer ce cas.
dune numration se fait de manire trs simple comme on peut le Lorsque lon dclare une variable en Swift, celle-ci doit obligatoirement
constater ici: tre initialise sous peine davoir une erreur de compilation. Le fait de
dclarer une variable comme tant optionnelle, permet de rpondre au
enum CompassPoint {
besoin que la variable puisse ne pas avoir de valeur lors de son initialisa-
case North
tion ou mme ultrieurement.
case South
case East var aString : String // Erreur de compilation
case West var anotherString : String ?// Dclaration dune variable optionnelle
}
Pour manipuler une variable optionnelle par la suite, il est ncessaire de
Une fois une numration dfinie, il est possible de lutiliser pour dclarer demander Swift de forcer la lecture de la valeur, en ajoutant un point
des variables du type en question, et daffecter les valeurs aux variables dexclamation aprs la variable, si lon est sr que celle-ci contient une
de manire relativement simple. valeur. Si la variable ne contient pas de valeur, une erreur dexcution se
produit et lapplication se terminera instantanment.
var aPoint = CompassPoint.North
aPoint = .West var aString : String ?
if aString != nil {
Comme on peut le voir, une fois le type de donnes de la variable dter-
println("La valeur de la variable est \(aString!)")
mine par le compilateur (grce linfrence des types), il nest pas
}
ncessaire de prciser le nom de lnumration lors de laffectation dune
println("La valeur de la variable est \(aString!)")
valeur la variable.
// Erreur dexcution si la variable est nil
Ce principe fonctionne de la mme manire si lon souhaite tester les dif-
frentes valeurs dune variable au sein dun bloc switch-case: Generics
Il arrive souvent lorsque lon crit une application, de se rendre compte
switch aPoint {
que des portions de code effectuent les mmes traitements mais avec
case .North:
des types de donnes diffrents (ex : faire une somme de nombres
println("Nord")
entiers et faire une somme de nombres flottants). Afin de rduire la quan-
case .South:
tit de code crite lorsque les traitements sont identiques, Swift offre la
println("Sud")
possibilit de dfinir des lments comme gnriques, cest--dire dont
case .East:
les types ne sont pas figs lavance comme le ncessitent gnrale-
println("Est")
ment les langages fortement typs. Pour reprendre lexemple prcdent
case .West:
dajout de nombres entiers et de nombres flottants, cela se traduirait par

Dcembre 2014 > Programmez! 25


023_031_180 18/11/14 00:17 Page26

lcriture de fonctions distinctes bien que le traitement soit le mme. Une fois le protocole dfini, son adoption par un lment se fait de la
langage

manire suivante:
func addInteger(a: Int, b: Int) -> Int {
return a + b class Human : Person {
} var firstName : String
func addFloat(a: Float, b: Float) -> Float { var lastName : String
return a + b func sendMessage(message: String) {
} println("Envoi du message : \(message)")
}
Lutilisation des gnriques, permet de simplifier le code et de navoir
}
quune seule et mme mthode pour rpondre ces deux cas:
Par dfaut, toutes les informations dfinies dans un protocole doivent tre
func addNumber<T>(a: T, b: T) -> T {
implmentes dans les lments qui adoptent ce protocole. Si toutes les
return a + b
informations contenues ne sont pas obliges dtre implmentes, il est
}
possible de dfinir certaines dentre elles comme optionnelles.
Ces principes de gnricit de code sappliquent galement aux classes
protocol Person {
afin de rendre celles-ci moins dpendantes des types de donnes
var firstName : String { get set }
quelles manipulent.
optional func sendMessage(message: String)
}
Closures
Les Closures sont des blocs de code, permettant dimplmenter une fonc- Extensions
tionnalit mtier, et qui peuvent tre appels ou passs en tant que para- Les extensions permettent denrichir les classes, numrations ou struc-
mtres des fonctions. Ce concept est trs proche de la notion de Blocks tures existantes laide de nouvelles proprits et/ou mthodes. Ce
que lon trouve en Objective-C ou des Lambdas prsentes dans dautres mcanisme est trs utile, notamment concernant les classes, lorsque lon
langages. Pour voir un exemple dutilisation des Closures, prenons la fonc- souhaite ajouter des informations celles-ci sans avoir implmenter
tion sorted prsente dans la bibliothque standard de Swift qui permet de dhritage. La cration dune extension se fait dune manire trs simple:
trier un tableau de donnes. Cette fonction prend deux arguments qui per-
extension Human {
mettent de spcifier le tableau de donnes trier, et une Closure permet-
var fullName: String { return firstName + " " + lastName }
tant de dfinir la rgle de tri de donnes. Lutilisation telle quon pourrait la
}
retrouver dans nimporte quel langage serait celle-ci:
Property Observers
let cities = ["Paris", "Rouen", "Meudon", "Lille", "Le Havre"]
Les Property Observers permettent de pouvoir intercepter les change-
func backwards(s1 : String, s2 : String) -> Bool [
ments de valeur dune proprit afin deffectuer des traitements particu-
return s1 > s2
liers, avant ou aprs que la valeur ne soit rellement modifie.
}
Pour mettre ce mcanisme en place, il suffit dajouter la syntaxe suivante
var sortedCities = sorted(cities, backwards)
au sein des proprits devant tirer parti de cette possibilit:
Bien que fonctionnelle, cette syntaxe peut tre longue crire car nces-
class Human {
sitant de crer une fonction qui est ensuite appele dans le code. Le prin-
var age: Int = 0 {
cipe des Closures permet dcrire le code suivant:
willSet(newAge) {
let cities = ["Paris", "Rouen", "Meudon", "Lille", "Le Havre"] println("Lge aprs modification sera de \(newAge)")
var sortedCities = sorted(cities, { (s1: String, s2: String) -> Bool in }
return s1 > s2 didSet {
}) println("Avant modification, lge tait de \(oldValue)")
Surprise de la dernire et traditionnelle Worldwide Developer
Certains trouveront ce code moins lisible que la premire version prsen-
Conference (WWDC 2014) organise tous les ans par Apple, le
te. Dautres trouveront quelle a le mrite dtre plus concise et plus
langage Swift dbarque sur iOS et OS X sans crier gare.
simple comprendre, car lintgralit du fonctionnement du tri de notre
}
tableau de noms de villes, est situ au mme endroit dans le code.
}
}
Protocols
Les Protocols permettent de dfinir un modle comprenant un certain nombre La partie willSet est appele juste avant la modification de la valeur, tandis
de proprits et de mthodes qui devront tre implmentes au sein des l- que la partie didSet est appele juste aprs la modification. A noter que ces
ments (classes, structures, numrations) souhaitant se conformer ce pro- mthodes ne sont pas appeles lors de la phase dinitialisation dun objet.
tocole. Ce concept est similaire la notion dinterfaces que lon retrouve dans
dautres langages. La dclaration dun protocole se fait de la manire suivante: Access Control
En Objective-C, et de par son hritage du C qui faisait que la dclaration
protocol Person { des classes (entre autres) tait effectue dans un fichier en-tte (.H) dis-
var firstName : String { get set } tinct de limplmentation de celles-ci (.M), il tait assez simple de dfinir
var lastName : String { get set } quelles proprits et mthodes taient accessibles ou non un dvelop-
func sendMessage(message: String) peur. Swift ne fait plus la distinction entre dfinition et implmentation
} dun objet. Toutes les informations sont contenues au sein du mme

26 Programmez! < Dcembre 2014


023_031_180 18/11/14 00:17 Page27

fichier (.SWIFT). Il fallait donc trouver un moyen pour dfinir la visibilit. nouveau langage de dveloppement que vous dcouvrez, vous allez faire

langage
Les crateurs de Swift ont donc introduit des mots-cls ddis cet effet des erreurs dans la syntaxe du code que vous crirez, vous ferez des
dans le langage. Pour cela, trois mots sont disposition des dvelop- erreurs de logique dans la construction de vos algorithmes, vous voudrez
peurs savoir internal, private et public. Ces mots doivent tre position- voir quoi ressemble le rsultat de telle ou telle portion de code ind-
ns devant un lment (classe, structure, numration, protocole) afin pendamment du reste, etc
de dfinir le niveau de visibilit de celui-ci. Playgrounds vous fournit un bac sable dans lequel vous pourrez
effectuer tous les tests que vous dsirez, sans avoir la lourdeur de tout ce
public class Human {
qui entoure une vritable application comme la construction dune inter-
public var firstName: String
face graphique, la compilation du code, lexcution et le dbogage avec
public var lastName: String
des outils compliqus, etc
internal var age: Int
Outre la possibilit de vous permettre dexprimenter votre code Swift,
private var address: String
Playgrounds possde de nombreux outils vous permettant de mieux
}
apprhender le fonctionnement de ce que vous crivez en proposant des
La valeur public indique que llment est visible partout au sein de lap- outils visuels pour rpondre vos besoins.
plication et mme en dehors (ex: si la classe est dfinie dans un frame- Ainsi il est possible de positionner ct de lditeur de code, une
work). La valeur private indique que llment nest visible quau sein de Timeline qui vous permettra par exemple de voir lvolution des
llment o il a t dclar (ex: dans un fichier, dans une classe). valeurs de vos variables dans le temps. Cette fonctionnalit est trs int-
La valeur internal indique que llment est visible partout au sein de lap- ressante lorsque lon dveloppe des algorithmes mathmatiques bass
plication o il a t dclar. sur une notion temporelle.
Si ces attributs ne sont pas prciss lors de la dclaration dun lment, De la mme manire que la Timeline, il est possible davoir un rendu visuel
cest la valeur internal qui est implicitement utilise par Swift. des lments que vous manipulez par programmation. Si par exemple
vous chargez des images et que vous souhaitez avoir un rendu de ces
MES PREMIERS lments chaque tape dexcution de votre code, vous pouvez
DVELOPPEMENTS AVEC SWIFT demander lditeur du Playground dafficher les lments que vous
Voyons maintenant comment mettre tout cela en pratique en ralisant nos dsirez suivre.
premiers dveloppements laide de Swift. Si vous tes amens dvelopper des scnes animes pour la ralisation
de jeux par exemple, vous pourrez voir ces mmes scnes fonctionner au
Dveloppement Swift avec Xcode 6 sein de votre bac sable sans avoir crer toute lapplication qui va
Il faut tout dabord noter quil est obligatoire davoir install Xcode 6 pour autour. Cest notamment cet exemple quApple a prsent lors de la
utiliser Swift. Comme leur habitude, les quipes Apple introduisent sys- WWDC 2014. Comme tous les systmes de bac sable qui existent sur
tmatiquement les nouveauts dans les dernires versions de leurs OS et dautres plateformes, cette fonctionnalit possde des limitations parmi
de leurs outils et nassurent que rarement la compatibilit avec les ver- lesquelles limpossibilit dinteragir avec lutilisateur pour quil saisisse
sions antrieures. Pour vous procurer Xcode 6, il suffit de vous rendre sur des donnes ou utilise une interface graphique, lexcution du code saisi
le Mac App Store puis de tlcharger et dinstaller lenvironnement de dans le bac sable sur un iPhone/iPad, lutilisation de frameworks tiers,
dveloppement commun toutes les plateformes Apple. Une fois celui-ci etc Ces limitations seront certainement leves au fur et mesure des
install sur votre ordinateur, il suffit de lexcuter pour pouvoir commen- versions qui sortiront dans les prochains mois et les prochaines annes
cer utiliser Swift. car Playgrounds nen est qu sa toute premire version qui est dj trs
Pour commencer crire du code avec Swift, deux possibilits soffrent aboutie mais surtout pleine de promesses.
vous selon ce que vous souhaitez faire. La premire dont nous reparle-
rons consiste crer une application (iOS ou OS X) et dans ce cas vous Les diffrents types de projets
demanderez de crer un nouveau projet Xcode. Outre lutilisation de Playgrounds pour dvelopper avec Swift au sein de
La deuxime possibilit qui soffre vous, qui est une des grandes nou- Xcode 6, il existe dautres typologies de projets permettant de pouvoir
veauts de Xcode 6, concerne la possibilit de crer un Playground mettre en pratique le nouveau langage cr par Apple.
qui vous permettra de pouvoir utiliser le langage Swift des fins de tests Commenons par voquer les projets ddis la cration dapplications
mais de manire interactive. iOS. Xcode 6 propose dsormais cinq modles de projets fournissant
chacun une base de dpart pour raliser des applications destination de
Prsentation de Playgrounds la plateforme mobile: Master-Detail Application, Page-Based Application,
Lorsque vous excutez Xcode 6 et que vous slectionnez loption Get Single View Application, Tabbed Application et Game. Tous ces modles
started with a Playground dans la bote de dialogue qui est affiche par de projets permettent de pouvoir utiliser au choix Objective-C et/ou Swift
dfaut au lancement, vous tes guid pour crer un fichier portant lex-
tension .PLAYGROUND.
Ce fichier un peu particulier vous permet, une fois cr et ouvert dans
Xcode, de pouvoir commencer taper du code Swift, puis dexcuter
celui-ci, et de voir instantanment le rsultat de chaque ligne sans avoir
compiler puis lancer une application.
Certains parmi vous vont certainement se demander quoi peut bien ser-
vir de taper du code si ce nest pour crer une vraie application qui pour-
ra ensuite tre excute sans avoir recours Xcode.
Eh bien en fait cette fonctionnalit est trs utile bien des gards, au pre-
mier rang duquel lapprentissage de Swift. En effet, comme avec tout

Dcembre 2014 > Programmez! 27


023_031_180 18/11/14 00:17 Page28

comme langage de dveloppement. Nous disons bien Objective-C et/ou AppDelegate.swift, celui-ci commence par importer le framework UIKit
langage

Swift car il est tout fait possible de mixer les deux langages au sein afin de pouvoir manipuler les classes se trouvant lintrieur
dune mme application afin de faciliter la phase de transition dun langa- (UIApplication, UIWindow, UIView).
ge vers lautre. Transition car il semble clair quApple mise normment Une classe est ensuite dfinie, et dclare comme point dentre de lap-
sur Swift pour les annes venir mais lcosystme Objective-C tant tel- plication laide de lattribut @UIApplicationMain positionn juste devant.
lement important, il serait compliqu de faire comprendre aux dvelop- Cet attribut remplace le fichier Main.m qui existe dans les projets crits
peurs ayant mis sur ce langage depuis de nombreuses annes, que tout Objective-C.
soit remis en cause ds aujourdhui. La classe dfinie dans ce fichier hrite de la classe de base UIResponder
Outre les modles dapplications iOS, un autre modle de projet permet et indique se conformer au protocole UIApplicationDelegate qui sert
de sadonner aux joies de Swift. Ce modle est une nouveaut de Xcode intercepter les vnements applicatifs voqus prcdemment.
6 visible dans la section Framework & Library. Sont ensuite dclares et implmentes toutes les fonctions que nous
Il est dsormais possible de crer des Cocoa Touch Framework alors que souhaitons utiliser et dfinir au sein du protocole UIApplicationDelegate.
prcdemment, seules les Cocoa Touch Static Library taient dispo-
import UIKit
nibles. Il tait possible de crer des frameworks au sein de Xcode 5 mais
@UIApplicationMain
uniquement pour OS X.
class AppDelegate: UIResponder, UIApplicationDelegate {
La particularit des frameworks par rapport aux librairies, concerne le fait
var window: UIWindow?
de pouvoir intgrer autre chose que du code lintrieur. Parmi les l-
func application(application: UIApplication, didFinishLaunching
ments que lon retrouve souvent au sein des frameworks, nous pouvons
WithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
citer des ressources comme les listes de chanes de caractres traduites
return true
dans diffrentes langues ou bien encore des images, icnes et autres
}
fichiers sonores.
func applicationWillResignActive(application: UIApplication) {
Comme pour les modles dapplications iOS, il est possible de mlanger
}
Objective-C et Swift au sein des frameworks Cocoa Touch. Une bonne
func applicationDidEnterBackground(application: UIApplication) {
chose pour les personnes qui dveloppent ce type de composants et qui
}
taient jusqu'ici limites par les librairies.
func applicationWillEnterForeground(application: UIApplication) {
Concernant les librairies justement, elles ne permettent pas ce jour de
}
pouvoir utiliser Swift comme langage de dveloppement. Celles-ci sont
func applicationDidBecomeActive(application: UIApplication) {
donc pour linstant toujours cantonnes lutilisation dObjective-C, et il
}
nest pas sr que cette situation change dans le futur vu que les frame-
func applicationWillTerminate(application: UIApplication) {
works rpondent au mme besoin en proposant plus de souplesse/pos-
}
sibilits.
}

Ma premire application iOS en Swift Le fichier ViewController.swift contient pour sa part la structure basique
Afin de voir en pratique comment utiliser Swift pour raliser une applica- dun contrleur, savoir une classe hritant de la classe de base
tion, nous allons crer un projet iOS. Pour cela nous allons partir du mod- UIViewController ainsi que la surcharge des deux mthodes viewDidLoad
le de projet Single View Application, et voir comment enrichir celui-ci avec et didReceiveMemoryWarning.
une des fonctionnalits les plus rpandues dans les applications iOS,
import UIKit
savoir, lutilisation dune vue d'une liste de donnes (UITableView) comme
class ViewController: UIViewController {
on peut en retrouver dans lapplication de messagerie fournie en standard
override func viewDidLoad() {
depuis la toute premire version diOS.
super.viewDidLoad()
Nous ne dtaillerons pas toutes les tapes de cration de lapplication,
}
notamment comment utiliser lditeur dinterface graphique de Xcode.
override func didReceiveMemoryWarning() {
Nous nexpliquerons pas non plus toute la mcanique de fonctionnement
super.didReceiveMemoryWarning()
dune application iOS qui reste identique entre Objective-C et Swift (de
}
trs nombreux tutoriaux existent en Objective-C traitant de ce sujet).
}
Nous nous concentrerons sur ce qui nous intresse au premier plan
savoir le code Swift ncessaire au bon fonctionnement de lapplication. Nous avons ajout au sein du contrleur cr par dfaut avec lapplica-
Une fois le projet cr, en spcifiant bien dutiliser Swift comme langage tion, une liste de donnes (UITableView) que nous avons paramtre de
de dveloppement, nous retrouvons dans Xcode 6 un projet avec une telle manire que la source de donnes et le dlgu soient le contrleur.
structure identique celle-ci. Reste maintenant crire le code Swift permettant notre liste dafficher
La premire chose que nous constatons et comme voqu prcdem- des donnes. Cela commence par modifier la dclaration du contrleur
ment, il nexiste plus de distinction entre fichiers en-tte (.H) et fichiers afin que celui-ci soit conforme aux protocoles UITableViewDataSource et
dimplmentation (.M). Dans les projets utilisant Swift, la dclaration dun UITableViewDelegate et que notre liste de donnes soit associe une
type et son implmentation se trouvent dans un seul et unique fichier variable nous permettant de pouvoir la manipuler.
(.SWIFT). Dans le projet que nous avons cr, il existe deux fichiers por-
tant cette extension: AppDelegate.swift et ViewController.swift. Le pre- class ViewController: UIViewController, UITableViewDataSource,
mier concerne le dlgu de notre application qui est appel lors de UITableViewDelegate {
divers vnements (lancement de lapplication, suspension de lapplica- @IBOutlet weak var myTableView: UITableView!
tion, arrt de lapplication). Le second concerne le contrleur de la vue }
principale de lapplication. Si nous regardons le contenu du fichier Lattribut @IBOutlet permet de faire le lien avec le concepteur graphique

28 Programmez! < Dcembre 2014


023_031_180 18/11/14 00:17 Page29

de Xcode. Lattribut weak a la mme particularit quen Objective-C et taxe spcifique Swift diffre mais fonctionnellement, les applications

langage
nous aborderons celui-ci ultrieurement dans la section traitant de linter- sont capables de reproduire les mmes comportements.
oprabilit entre Objective-C et Swift. Afin de pouvoir crer des cellules
de donnes dans notre liste, nous devons dfinir partir de quel type ces Utilisation du framework Foundation
cellules seront instancies ultrieurement. Pour cela nous modifions la Comme nous venons de le voir avec la ralisation dune premire appli-
mthode viewDidLoad pour enregistrer des cellules classiques cation iOS, lutilisation dUIKit qui lorigine a t ralise pour tre utili-
(UITableViewCell). Vous constaterez que pour identifier la classe associe se en Objective-C, ne pose pas de souci particulier lors de son utilisation
un type de donnes, nous utilisons la syntaxe UITableViewCell.self. avec Swift. Mais quen est-il du framework Foundation, dont la plupart
Lquivalent de cette syntaxe en Objective-C est [UITableViewCell class]. des classes sont utilises pour raliser bon nombre doprations telles
On remarque galement que la particularit dObjective-C dans lappel que les communications rseaux, le stockage dinformations dans des
des mthodes, avec des paramtres nomms (forCellReuseIdentifier), a bases de donnes, la manipulation du systme de fichiers, lexcution de
t conserve sur Swift. tches de manire asynchrone, etc?
Le but de cette syntaxe tant de rendre le code plus comprhensible au Eh bien on peut dire quApple a fait les choses correctement car lint-
lieu de simplement se baser sur lordre des paramtres dans lappel dune gralit des classes dfinies dans Foundation peuvent tre utilises avec
mthode comme le font dautres langages. Swift. On peut notamment voir cela en lisant la documentation disponible
dans Xcode dans laquelle on se rend compte que systmatiquement les
override func viewDidLoad() {
dclarations des classes, proprits, mthodes, etc sont disponibles en
super.viewDidLoad()
Objective-C et en Swift.
myTableView.registerClass(UITableViewCell.self, forCellReuse
Prenons lexemple des classes permettant deffectuer des requtes vers
Identifier: "MyCell")
des serveurs Web (NSURLSession). La documentation laisse apparatre
}
ceci pour instancier cette classe:
Pour que notre liste de donnes puisse afficher des donnes, et pour
Objective-C
nous conformer au protocole UITableViewDataSource, nous devons
+ (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration
implmenter les deux mthodes suivantes. La premire permet de dfinir
*)configuration
combien de lignes possdera la liste. La deuxime permet de crer cha-
cune des cellules en fonction des paramtres qui lui sont passs. Swift
On notera tout particulirement dans la deuxime mthode, lutilisation init(configuration configuration: NSURLSessionConfiguration)
du point dinterrogation derrire la proprit textLabel de la variable cell. -> NSURLSession
Cette syntaxe permet de tester, pour les proprits dfinies comme Mais sans aller jusqu des choses aussi pousses, il en est de mme par
optional, si elles possdent ou non une valeur. Si elles ne possdent pas exemple pour les mthodes de la classe NSString. Le type String qui exis-
de valeur, le traitement du code ne va pas plus loin afin dviter de dclen- te avec Swift possde en quelque sorte un pont vers son quivalent
cher des exceptions lexcution puis passe la ligne de code suivante. Foundation. Toutes les mthodes disponibles sur la classe NSString,
sappliquent au type String.
func tableView(tableView: UITableView, numberOfRowsInSection
section: Int) -> Int { Objective-C
return 10 - (NSString *)substringFromIndex:(NSUInteger)anIndex
} Swift
func tableView(tableView: UITableView, cellForRowAtIndexPath func substringFromIndex(_ anIndex: Int) -> String
indexPath: NSIndexPath) -> UITableViewCell {
La possibilit dutiliser lintgralit de Foundation au sein de son code
var cell: UITableViewCell = tableView.dequeueReusableCell
Swift, permet dores et dj doffrir une grande richesse fonctionnelle un
WithIdentifier("MyCell", forIndexPath: indexPath) as UITable
langage qui est encore trs jeune et qui ne couvre pas lensemble des
ViewCell
besoins des dveloppeurs.
cell.textLabel?.text = "Cellule n \(indexPath.row)"
En effet, et comme nous le verrons ultrieurement, la bibliothque des
return cell
fonctions standard de Swift est encore assez pauvre. Si vous souhaitez
}
par exemple effectuer des requtes vers un serveur HTTP afin de rcu-
Reste ensuite implmenter la mthode du protocole prer un flux JSON/XML pour ensuite parser celui-ci en vue de son trai-
UITableViewDelegate permettant de dterminer quelle ligne lutilisateur a tement, aucune classe nest disponible pour lheure dans Swift afin de
slectionn sur la liste. rpondre ce besoin.
En revanche, ces classes tant offertes par Foundation, vous avez la pos-
func tableView(tableView: UITableView, didSelectRowAtIndex
sibilit de les utiliser au sein de vos applications Swift afin de raliser tout
Path indexPath: NSIndexPath) {
ce dont vous avez besoin.
println("Vous avez slectionn la cellule n\(indexPath.row)")

Guide dutilisation de Swift


}

Nous possdons dsormais une application pleinement fonctionnelle, Interoprabilit entre Swift et Objective-C
contenant une liste de donnes affichant 10 lignes, chaque ligne affichant Il est possible de faire cohabiter Objective-C et le nouveau langage. Cela
un texte. Lorsque lutilisateur slectionne une ligne, un message est affi- est valable dans les deux sens, savoir, utiliser du code Swift dans des
ch dans la console de dbogage de Xcode. applications Objective-C ou bien utiliser des librairies Objective-C au sein
Lutilisation des objets dfinis au sein dUIKit et plus gnralement des dapplications Swift.
frameworks fournis par Apple avec iOS, se fait de manire similaire si Mais bien videmment tout nest pas magique et certains concepts
nous comparons ce code son quivalent en Objective-C. Seule la syn- propres chaque langage doivent tre respects afin que la cohabitation

Dcembre 2014 > Programmez! 29


023_031_180 18/11/14 00:17 Page30

se passe sans soucis. Toutefois mme en respectant toutes les rgles, c possde toujours une valeur (weak acceptant les valeurs nil). Dans ce
langage

tout nest pas possible en fonction de ce que vous souhaitez faire. cas il est possible de modifier les dclarations des classes comme suit:
Par exemple, et pour ne citer que quelques cas, si vous utilisez certaines
des nouveauts de Swift telles que les Generics, les Tuples, les alias de class Person {
types ou les types imbriqus, votre code ne pourra tre utilis au sein var apartment: Apartment?
dapplications Objective-C car ces fonctionnalits nont pas dquivalent }
dans ce langage. class Apartment {
Dautres lments sont prendre en considration, et nous allons abor- unowned var tenant: Person
der certains des facteurs importants qui facilitent linteroprabilit. }
On voit que la classe Apartment possde une rfrence vers Person mais
Automatic Reference Counting (ARC) que cette valeur ne peut tre nil, la proprit ntant plus marque comme
Le systme ARC a t introduit il y a plusieurs annes, au sein optional via le point dinterrogation aprs le type de donne.
dObjective-C afin de simplifier la vie des dveloppeurs en ce qui concer-
ne toute la partie gestion mmoire. Dans sa conception interne, Swift a Donnes de type id
t bas sur ce mme mcanisme afin de grer, la place du dvelop- Contrairement Swift, Objective-C nest pas un langage typage fort.
peur, la libration de la mmoire lorsquune donne nest plus utilise. Le Cela signifie quil est possible dassigner un type de donne indtermin
fonctionnement dARC est normalement bien connu des dveloppeurs aux variables. Cela se fait via lutilisation du mot cl id qui permet de stoc-
Objective-C mais un peu moins des dveloppeurs qui dcouvriraient ker un pointeur vers nimporte quelle typologie dinformation.
Swift. Globalement ARC fonctionne sur le principe du comptage de rf- Swift tant un langage typage fort, Apple a d trouver une solution afin
rences dobjets pour dterminer si la mmoire alloue une donne peut de permettre aux deux langages de pouvoir cohabiter lorsque des
tre libre ou non. Si un objet est utilis par deux autres objets, le pre- variables taient dclares comme id. Pour ce faire, un type de donne
mier considre quil a deux rfrences pointant sur lui. Tant que ce comp- particulier existe avec Swift savoir le type AnyObject.
te nest pas redescendu zro, ARC considre que la mmoire ne doit Ainsi attendez-vous, lorsque vous manipulerez avec Swift des donnes
pas tre libre car elle reste utilise. provenant de librairies crites en Objective-C, ce que le type de donne
L o cela se complexifie, cest lorsque les objets ont des rfrences renvoy soit AnyObject quand ces librairies nutilisent pas de typage fort.
mutuelles, ce qui peut amener des fuites mmoire, car une rfrence Charge au dveloppeur ensuite de connatre le type de donne manipul
cyclique est cre et la mmoire nest jamais libre. Cela amne gn- et de faire les oprations de casting ncessaires.
ralement ce que lapplication plante un moment donn, faute de
mmoire disponible sur lordinateur qui excute celle-ci. Afin de rsoudre Exposer une classe Swift Objective-C
cela, des mots cls tels que strong et weak ont t introduits dans Lorsque vous dclarez des classes au sein dune application ou dune
Objective-C afin que le dveloppeur puisse aider ARC dterminer qui librairie crite avec Swift, celle-ci est directement manipulable en
dtient une rfrence forte (lobjet rfrenceur originel) et qui dtient une Objective-C sans avoir quoi que ce soit de particulier faire pour que cela
rfrence faible (lobjet rfrenc). On retrouve ces mmes principes au fonctionne. Toutefois lorsque lon se penche plus en dtail sur le fonc-
sein de Swift. Par dfaut, et si un objet en rfrence un autre, celle-ci est tionnement de ces classes dans du code Objective-C, on se rend comp-
considre comme une rfrence forte (strong). Cet exemple se traduit te que tout nest pas si simple que cela. Cest notamment le cas lorsque
lorsque lon dclare des classes par quelque chose ressemblant ceci. lon utilise le runtime Objective-C, qui permet, entre-autres, de pouvoir
effectuer des oprations dintrospection (galement nomm reflection
class Person {
dans dautres langages). Prenons lexemple dune classe dclare de
var apartment: Apartment?
telle manire au sein dune application:
}
class Apartment {
var tenant: Person? public class SwiftObject {
} public func demoSwift() { }
}
Si le dveloppeur ne fait pas attention la manire dont son code fonc-
tionne, ce cas peut engendrer des fuites mmoire selon la manire dont Si lon souhaite pouvoir utiliser cette classe au sein dune application
les objets sont librs lorsquils ne sont plus utiliss. Afin de laisser ARC Objective-C, il est ncessaire de la rfrencer en utilisant une convention
grer la mmoire, on peut modifier la dclaration de la manire suivante: de nommage du type ModuleName.ClassName (o ModuleName repr-
sente le nom de votre application/librairie).
class Person {
Cela nest pas trs pratique, surtout lorsque lon est habitu utiliser uni-
var apartment: Apartment?
quement le nom de la classe pour crer une instance du type en question.
}
On peut aussi vouloir que le nom de la classe, le nom des proprits ou
class Apartment {
des mthodes, soient diffrents en Objective-C et en Swift pour, par
weak var tenant: Person?
exemple, viter des conflits de noms entre du code existant et les nou-
}
veaux dveloppements crits laide de Swift.
Avec cette dclaration, lorsque lobjet Person est libr, et si aucune Apple a pens ces cas de figure et a rendu cela possible en ajoutant des
autre rfrence ne pointe dessus, lobjet Apartment associ celui-ci est attributs devant le nom de la classe, des proprits ou des mthodes
automatiquement et instantanment libr par ARC. Cela amliore vi- comme on peut le voir ci-dessous:
demment la performance globale du systme puisque vous rendez au
@objc(MySwiftObject)
systme dexploitation la mmoire dont vous navez plus besoin.
public class SwiftObject {
Un autre mot cl a t introduit avec Swift pour les cas o lobjet rfren-

30 Programmez! < Dcembre 2014


023_031_180 18/11/14 00:17 Page31

@objc(mySwiftMethod) abs(signedNumber)

langage
public func demoSwift() { } Retourner la valeur absolue dun nombre
} abs(-1) == 1
abs(-42) == 42
Les exemples cits ici ne sont que quelques cas prendre en considration abs(42) == 42
quand on parle dinteroprabilit entre Swift et Objective-C car beaucoup
contains(sequence, element)
dautres sujets tels que la comparaison dobjets, lextension de classes, lin-
Retourne True si llment est contenu dans la squence (tel quun tableau)
tgration avec lenvironnement Xcode, lutilisation de framework comme
var languages = ["Swift", "Objective-C"]
CoreData, le transtySurprise de la dernire et traditionnelle Worldwide
contains(languages, "Swift") == true
Developer Conference (WWDC 2014) organise tous les ans par Apple, le
contains(languages, "Java") == false
langage Swift dbarque sur iOS et OS X sans crier gare. page de donnes,
etc sont des sujets vastes qui pourraient faire lobjet darticles entiers pour countElements(collection)
les aborder en dtail. Retourne le nombre dlments contenu dans la collection
countElements("Swift") == 5
Passage en revue de fonctions find(sequence, element)
de la bibliothque standard Swift Retourne lindex de llment au sein de la squence ou nil si non trouv
Parmi les choses qui font le succs dun nouveau langage de dveloppe- var languages = ["Swift", "Objective-C"]
ment, la bibliothque des fonctions offertes en standard au sein de celui- find(languages, "Objective-C") == 1
ci est sans nul doute un lment important. Comme nous lavons voqu find(languages, "Java") == nil
prcdemment, Apple se repose en grande partie sur le framework
map(sequence, transformClosure)
Foundation pour apporter de trs nombreuses fonctionnalits Swift telles
Retourne une nouvelle squence en appliquant chaque lment de
que les communications rseaux, parser des flux JSON/XML, interagir
celle-ci le code contenu dans la Closure passe en paramtre
avec le systme de fichiers, manipuler les chanes de caractres, etc
map(1...3, { $0 * 5 }) == [5, 10, 15]
Toutefois, ce nest pas pour autant que Swift noffre aucune fonction
propre ce nouveau langage. Mme si celles-ci ne sont pas toutes pr- reduce(sequence, initial, combineClosure)
sentes dans la documentation disponible avec Xcode, de nombreuses Retourne une valeur unique en rduisant les lments laide de la
fonctions (prs dune centaine) sont disposition des dveloppeurs pour Closure passe en paramtre
effectuer certaines tches couramment utilises dans le dveloppement var languages = ["Swift", "Objective-C"]
dapplications. Afin den avoir la liste exhaustive, il est possible dans reduce(languages, "", { $0 + $1 }) == "SwiftObjective-C"
Xcode dutiliser le raccourci Cmd+Clic sur le nom dune fonction pour reverse(sequence)
accder la dclaration de toutes les fonctions contenues dans le mme Retourne une squence dans lordre inverse de la squence initiale
module (la mme librairie) que celle contenant la fonction sur laquelle vous reverse([1, 2, 3]) == [3, 2, 1]
avez cliqu. Voyons quelques-unes dentre elles ainsi que leur syntaxe: u

obscur mettre en uvre. La noir pour autant, bien au


Mon verdict sur Swift bibliothque de fonctions offertes
par Swift est encore pauvre
contraire. Avoir dans Swift des
concepts tels les generics, les
La question, que se posent surcharger des mthodes, etc cause de la jeunesse du langage. optionals, les lambdas,
beaucoup de dveloppeurs et Passs les premiers tests Apple rpond cela en linfrence des types, etc
celle que je me suis videmment basiques, jai commenc prconisant dutiliser Foundation apporte ce nouveau langage ce
pose quand un nouveau vouloir pousser le langage un peu / Cocoa / Cocoa Touch, qui, il que les dveloppeurs Objective-
langage est disponible, est: plus loin en ralisant de est vrai, permettent denrichir C rclamaient depuis des
dois-je my mettre, et quest-ce vritables applications qui Swift avec de nombreuses annes. Certes il aura fallu
que cela va mapporter de plus effectuent des traitements fonctionnalits. attendre un nouveau langage
que ce que jutilise dj (C#, asynchrones, se connectent La chose est encore plus vraie pour avoir tout cela disposition
Java, Python, JavaScript)? . des serveurs Web, manipulent lorsque lon a besoin de mais cest enfin l, et
En tant que dveloppeur ayant des flux JSON/XML, stockent concepts avancs. Jai certainement pour de
utilis de nombreux langages tels des informations dans une base notamment besoin dans certains nombreuses annes. Mme si
que C++, Delphi, Visual Basic en de donnes, etc cas (ex: dveloppement de tout nest pas parfait lheure
passant par C# et Objective-C, la Cest ce moment que lon frameworks) de pouvoir effectuer actuelle, Swift est un langage
premire chose que jai saperoit que le langage est de lintrospection (reflection). jeune (annonc il y a seulement 5
apprcie est que lon ne se sent encore rcent. Outre le manque Bien quun embryon de solution mois) mais prometteur. Il permet
pas perdu. Swift ayant t bti en de documentation avance, soit offert dans Swift, on atteint dores et dj de dvelopper des
reprenant les meilleurs concepts on se retrouve vite face des cas vite les limites du systme. Les applications iOS et OS X, tout en
de nombreux langages, on o ce qui parait simple et rapide API quivalentes du runtime alliant la puissance que lon
retrouve rapidement ses mettre en place dans dautres Objective-C qui peuvent tre retrouve dans les langages
habitudes quand il sagit de langages, car il existe des utilises, ne couvrent pas tous phares du march mais qui ont
manipuler des classes, dfinir classes/fonctions permettant de les cas de figures (ex: generics, pour la plupart 10 15 ans
des attributs privs/publics, rpondre au besoin, devient plus optionals...). Mais tout nest pas dexistence.

Dcembre 2014 > Programmez! 31


032_058-3c_180 18/11/14 16:10 Page32

DevOps : ce nest pas un outil,


devops

mais une philosophie

08-22-13 esenkartal
DevOps a les outils, les processus, les gens.
incontestablement su simposer, en DevOps ne se limite ni aux personnes ni
quelques annes, mme si sa aux outils. Cest une philosophie globale et
comprhension est parfois fausse ou organisationnelle.
approximative. Longtemps, dveloppeurs, Mais comme les mthodes agiles ou les
productions, mtiers taient des silos, approches ALM (gestion du cycle de vie des
avec peu dchanges. Le taux dchec applications), DevOps ne doit pas tre
des projets, en production ou avant la considr comme monolithique. Vous pouvez
livraison du binaire, tait ahurissant, les adopter des pratiques DevOps pour vous
tudes menes indiques de 75 aider au quotidien dans le dveloppement,
90%. la gestion projet, la notion de build, le travail
Nous nallons pas revenir sur les en quipe, les relations avec les autres
causes profondes des checs, des retards personnes (production, utilisateur, mtier,
des projets informatiques. Depuis lapparition Le Cloud Computing, les apps mobiles ont etc.). Nous pouvons appeler cela le DevOps
des Google, Facebook, Twitter, Netflix, etc., dj modifi les mthodes de travail: toujours la demande ou DevOps la carte.
les mthodes de dveloppement et la manire plus souple, toujours plus vite, au risque, Vous laurez compris, il faut agir plusieurs
de dployer les nouveaux codes/fonctions (la daller trop vite et de couper dans les leviers la fois. Mme quand on travaille seul
fameuse release) ont t radicalement fondamentaux de la programmation, comme ou dans une petite quipe, vous pouvez
transformes. On parle de dveloppement la scurit, la structure et la propret du code. mettre en place des lments DevOps comme
continu, dintgration continue. Bref, la notion DevOps est un pont entre le dveloppeur et les outils et des processus de fonctionnement
mme de version est dpasse. Bien entendu, loprationnel/la production. Il faut alors agir plus fluides. Mais il faut un volontarisme des
cette approche radicale du dveloppement ne sur trois lments (en rfrence la rflexion diffrentes personnes. On peut parler dun
peut pas tre adopte par tous les de Patrick Debois, crateur du mot DevOps): ADN DevOps injecter.
dveloppeurs, toutes les applications. Dans ce dossier, nous allons revenir sur la
Mais on peut sinspirer de cette mthode DevOps est rel, mais ne croyez pas notion mme de DevOps [bonnes pratiques,
pour fluidifier le dveloppement et les outils, mise en uvre] et voir des cas concrets
que cest juste en achetant un outil.
notions de builds. Et faciliter le dusage que vous pouvez reproduire et
dploiement de lapplication. (Luke Kanies (Puppet Labs) adapter.

32 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:10 Page33

Quelques rappels

devops
Depuis peu, le principe de devops se fait de plus en plus une place dans les entreprises. On
entend aussi parler d'ingnieurs fullstack. D'o viennent ces principes? Quels sont les rles
de ces nouveaux postes ?
Steven Pojer,
Responsable systme
et rseau
ETNA

Dveloppeur vs adminsys
Souvent, les dveloppeurs et les
administrateurs systme sont spars, voir
cloisonns. Une frontire se place toujours
un moment sur la chane de la cration d'une
solution. Pourtant, pour la plupart des projets,
les deux doivent coexister, s'entraider, afin que
chacun connaisse les besoins de lautre. Mais
o peut on dfinir la limite des deux rles?
Doit-il toujours y avoir cette sparation avec amne l'ide que la frontire entre les dev et faciliter la gestion de son infrastructure, un
les volutions technologiques d'aujourd'hui? les ops ne devrait pas exister. On entend administrateur systme se doit d'utiliser des
souvent dire qu'un bon dveloppeur sait faire technologies plus ou moins complexes afin
L're du Cloud et volution de l'administration systme et qu'un bon d'automatiser la cration et la configuration de
technologique administrateur systme sait dvelopper, ce qui ces serveurs. Script shell, Chef, Puppet, et
Le Cloud Computing a apport une nouvelle est vrai la plupart du temps. d'autres encore, amnent un administrateur
faon de concevoir l'infrastructure. De Bien sr, dans les grosses structures, o "coder son infrastructure". D'autre part un
quelques serveurs multitches, on passe chacun a un rle bien prcis, il sera difficile de dveloppeur, afin de pouvoir s'assurer de la
plusieurs services cloisonns et optimiss. s'carter de son scope originel et qui force bonne mise en oeuvre de son logiciel, se doit
L'lasticit de la gestion des serveurs, privs tablir des limites. de connatre les diffrents services et
ou publics, demande une gestion de plus en Mais il est intressant de faire travailler toutes technologies existants. Pour ce dernier
plus complexe. L'automatisation de la gestion les ressources humaines ensemble sur un exemple, on peut parler d'ingnierie fullstack.
des services est donc plus sophistique et projet, en fonction des comptences de
amne des connaissances en dveloppement chacun, ce qui permet de promouvoir l'agilit Fullstack
non ngligeables. de l'quipe. Un ingnieur fullstack a connaissance de
toutes les couches qui composent un projet.
L'volution technologique apporte de plus en Le principe devops repose sur une quipe Cette personne se doit de tout connatre afin
plus de solutions pour rpondre une mais aussi sur une personne. En effet, afin de de choisir les bonnes solutions et de les
problmatique. Les langages, assembler afin de composer un
les frameworks, les bases de projet. De l'administration systme
donnes SQL ou NoSQL, ou jusqu'au client en passant par la
d'autres services imposent au gestion des donnes et
dveloppeur d'avoir une l'application, le but est d'avoir une
meilleure connaissance de vue complte du projet afin de
son projet, qui ne se limite garantir les bonnes connexions
plus son code. La entre les diffrentes couches.
connaissance de plusieurs
technologies, de la manire A lETNA, le mouvement devops est
dont elles sont gres et dont bien prsent et fait prendre
elles fonctionnent prend une conscience du fait qu'un projet,
place importante dans la mme s'il est compos de plusieurs
ralisation du projet. tapes diffrentes, se doit d'tre
conu par une quipe qui a
DevOps plusieurs rles, et non par plusieurs
DevOps, dev- pour quipes avec des rles spcifiques.
dveloppement et -ops pour
operations (exploitation), u

Dcembre 2014 > Programmez! 33


032_058-3c_180 18/11/14 16:10 Page34

Introduction IBM Bluemix et IBM DevOps


devops

Services dans un exemple avec Node.js


Bluemix est une nouvelle solution dIBM qui permet de construire, de dployer et de grer tout type
dapplications (mobile, smart devices, Internet des objets, web, big data, analytics).

Philippe THOMAS
IBM Bluemix Architect
La Gaude IBM Innovation
Center | Ecosystem
Development
Email: thomas1@fr.ibm.com
La solution est base sur les standards ouverts
du march (Cloud Foundry) et il utilise une
plate-forme Cloud (SoftLayer) pour dployer
ces nouvelles applications. Parmi la longue
liste de fonctionnalits de Bluemix, on notera
la capacit de construire des back-end appli-
catifs pour les applications mobiles, le monito-
ring et lanalyse des performances intgrs
ainsi que le dispositif de scalabilit automa- Fig.1
tique qui peut tre ajout toute application
pour lui permettre dabsorber une charge plus
importante. Bluemix est une plate-forme ouver-
te car en plus des services IBM proposs (plus
de 40), elle intgre galement les services des
partenaires ainsi que ceux de la communaut
Open Source. Lun des avantages principaux
de Bluemix est de permettre la construction et
le dploiement trs rapide dune application et
de ses services associs (base de donnes
SQL ou non, file dattentes, envoi de SMS,
rcupration de tweets, analytics, Watson
Q&A, ). Dans cet article, nous allons crer et
dployer une application simple dveloppe en Fig.2
JavaScript (avec Node.js).
Tout dabord, il faut senregistrer pour obtenir
un compte Bluemix. Cette opration est assez
simple. Elle seffectue partir de la page dac-
cueil sur http:/ibm.biz/bluemixeurope, en cliquant
sur SIGN UP ou bien en cliquant sur le bouton
central Sign Up for a free. Un email vous sera
ensuite envoy afin de valider votre inscription.
Si vous disposez dj dun compte Bluemix,
vous pouvez vous connecter en cliquant sur
LOG IN en haut droite Fig.1.
Une fois connect au site, Bluemix vous offre
une quantit importante de renseignements en
cliquant sur Docs dans le menu en haut de
lcran. Nous vous conseillons les sujets sui- Fig.3
vantspour un apprentissage rapide:
w Bluemix Overview
w Creating Apps
Nous allons maintenant crer et dployer notre
premire application.
La premire chose que nous voyons, cest le
Dashboard de Bluemix: Fig.2.
Ce tableau de bord nous donne une vision glo- Fig.4

34 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:10 Page35

bale de lespace actif de notre organisation. Par le Dashboard lorsquelle passe au vert (Your met ainsi de la dployer dans Bluemix.

devops
dfaut, lespace sappelle dev et notre organi- app is running) Fig.4. Il est alors possible de Nous allons donc utiliser notre exemple prc-
sation porte le nom de notre adresse email. Si cliquer sur lURL associe ROUTES et cela dent et lintgrer dans Git. Cliquez sur ADD
vous crez diffrents espaces dans Bluemix, vous emmne directement dans une nouvelle GIT pour pousser le code de notre application
par exemple prod, cela vous permettra de dis- fentre du navigateur sur cette nouvelle appli- dans GIT. Un simple clic cre un repository Git
socier vos applications en court de dveloppe- cation Fig.5. A ce point, nous avons construit charg avec notre code applicatif Fig.6.
ment (dev) de celles en production (prod). et dploy une application simple parfaitement Vous devrez sans doute saisir votre mot de
Cliquez sur CREATE AN APP afin de choisir utilisable par quiconque depuis nimporte quel passe pour vous assurer que DevOps Services
parmi plusieurs runtimes (tels que Java ou navigateur via Internet. peut agir votre place et cliquer Sign In Fig.7.
Ruby), des services (tels que IBM DataCache Note : La premire fois que vous utilisez
ou MongoDB), et des boilerplates, qui sont en INTGRATION DANS GIT IBM DevOps Services, il se peut que vous
fait des exemples dapplications prconfigurs. ET DVELOPPEMENT soyez oblig de crer un identifiant (JAZZ
Dans notre cas, nous allons choisir le boilerpla- ID) et que vous lassociiez votre identifiant
te Node.js Cache Web Starter; vous pouvez au
AVEC IBM DEVOPS IBM ID (le mme que celui utilis pour
passage revoir sa description. Lapplication est SERVICES Bluemix) Fig.8.
assez simple et utilise un serveur Node.js qui Comment charger du code dans cette platefor- Assurez-vous que la case Populate the Git
intgre du code JavaScript, un service IBM me et surtout comment mettre jour ce code. repository est bien coche et cliquez sur
DataCache (stockage et persistance de paires Pour travailler avec Bluemix, vous avez plu- CONTINUE Fig.9. En quelques clics, vous avez
cl/valeur) et un service de monitoring de notre sieurs possibilits pour diter et dvelopper donc cr un repository Git charg avec le
application (ce service de monitoring sinscrit votre application: il est possible dutiliser votre code source de notre exemple. Pour voir le
parfaitement dans le contexte DevOps car les diteur favori, un simple Notepad, Eclipse, code, cliquer sur EDIT CODE droite de lURL
dveloppeurs pourront ainsi contrler les Visual Studio ou encore un IDE Web. DevOps GIT Fig.10. DevOps Services souvrira dans une
temps de rponse et lutilisation des res- Services est un parfait exemple denvironne- nouvelle fentre de votre navigateur. Cette
sources par leur toute nouvelle application). A ment de dveloppement collaboratif compre- page contient des informations que nous rever-
ce stade, vous tes juste un clic de faire tour- nant un IDE Web qui permet de dvelopper rons par la suite. Pour valider ltat de votre
ner cette application: une application depuis un repository Git et per- application, cliquer sur BUILD & DEPLOY en
w Remplir avec prcaution le nom de lapplica-
tion et surtout le champ Host. Le nom du
Host doit tre unique dans le rseau Bluemix
pour vous permettre daccder votre appli-
cation (utiliser vos initiales et quelques
chiffres en plus du nom de lapplication par
exemple).
w Cliquer sur CREATE Fig.3.
Cela ne prendra que quelques secondes pour
crer un conteneur (dans une VM existante de
Bluemix) puis de charger le code JavaScript
dans ce conteneur et enfin de lier cette appli-
cation aux services associs. Ensuite Node.js
est lanc avec cette application et nous pou-
vons voir que lapplication est dmarre dans Fig.11

Fig.6

Fig.10

Fig.9

Fig.5 Fig.7 Fig.8

Dcembre 2014 > Programmez! 35


032_058-3c_180 18/11/14 16:10 Page36

haut droite. Fig.11. Une page souvre et vous w Un mode Continuous delivery pour adap- suivantes : Cocher le champ Select All afin de
devops

pouvez ainsi voir et configurer votre projet. ts Bluemix, pousser les fichiers modifis puis entrer un
Fig.12. Notez le message davertissement en w Un mode auto-deployment qui dploie message dans la zone de saisie (Enter the
haut de la page qui indique que des change- automatiquement les mises jour. commit message) et enfin, cliquer sur COM-
ments sont survenus (il sagit de ceux qui pro- Cliquer sur le bouton EDIT CODE pour acc- MIT en haut droite : Fig.16. Puis pousser les
viennent de la cration et du chargement du der lditeur Web (bas sur le projet Open- changements en cliquant sur PUSH (Force
repository Git). Pour changer les paramtres source Eclipse Orion). Votre projet estprt Push All) Fig.17. Pour voir les changements
de dploiement, cliquer sur CONFIGURE. Pour tre dit(vous pouvez cliquer sur le program- dans lapplication, cliquer sur BUILD &
appliquer un changement, on utilisera me principal app.js) : Fig.13. DEPLOY et attendre que lapplication soit
REQUEST DEPLOY. Depuis cet environnement, vous pouvez diter redploye. Pour accder lapplication et
vos fichiers sources avec la vrification de syn- constater le changement, cliquer sur lURL
DPLOYER DES MISES taxe (pour un grand nombre de langages ct de Deploy to Fig.18.
JOURS EN UTILISANT comme HTML, CSS, JavaScript, Ruby, Python
DEVOPS SERVICES et bien dautres). Pour certains langages Conclusion
comme JavaScript, lditeur propose gale- Dans cet exercice, nous avons effectu un
DevOps Services fournit un grand nombre de ment la compltion du code. Cela est vrai pour simple dploiement avec Bluemix et DevOps
fonctionnalits trs pratiques pour le dvelop- le langage lui-mme et pour les extensions Services. Pour plus de contrle sur le dploie-
peur dont certaines sont mentionnes ci-des- fournies par Bluemix (utiliser Ctrl + espace ment, vous pourrez utiliser les options de
sous (ou sur https://hub.jazz.net/learn): pour visualiser lassistant) : Fig.14. dploiement avances: il existe un dispositif
w La prise en charge de projets publics, Nous allons faire une modification dans le dauto-dploiement qui permet de dployer
w La gestion de plusieurs repositories de code source, code HTML de lapplication (dans le titre de automatiquement le code de votre repository
w Support de dveloppement agile, lapplication). Cliquer sur le crayon en haut Git (mme en cas de dveloppement en qui-
w Des possibilits de personnalisation pour gauche pour venir sur la page de lditeur puis pe). Bluemix est bas sur Cloud Foundry. Il per-
Bluemix, utiliser la navigation gauche pour trouver le met de dployer nativement les applications
fichier: depuis des diteurs comme DevOps Service,
views/index.ejs. Eclipse ( laide du plugin Bluemix) ou en utili-
Faire un changement sant la commande en ligne (CLI) de Cloud
dans le titre de lappli- Foundry. Bluemix propose galement un add-on
cation (ligne 8) Fig.15. permettant un dveloppement sans program-
Pousser ensuite le mation appel RapidApps qui permet de faire
changement dans Git du dveloppement rapidement en utilisant du
et suivre les tapes glisser-dposer avec de nombreux outils. u
Fig.18

Fig.12 Fig.13

Fig.14 Fig.15

Fig.16

Fig.17
36 Programmez! < Dcembre 2014
032_058-3c_180 18/11/14 16:10 Page37

DevOps: dveloppement & production

devops
A travers ce dossier, Xebia vous guide afin que DevOps ne soit pas un buzzword de
plus pour vous.
Depuis quelques annes, lagilit connat un
essor grandissant dans les DSI. Aujourdhui,
lventail de mthodologies est large et
adaptable tous les contextes. Les valeurs
cls de lagilit sont la collaboration, la
transparence, la culture de la qualit,
ladaptation et la simplicit. De lquipe Scrum
la Feature Team, les transformations agiles
ont convaincu de nombreuses directions de SI
par leur efficacit au sein des quipes de
dveloppement. Lagilit, quand elle nest
applique quau dveloppement, se trouve
nanmoins freine par les tches dexploitation
qui surviennent aprs chaque livraison.
Le but du mouvement DevOps est dabattre
cette frontire en crant une synergie entre les
quipes dexploitation (Ops) et les quipes de

Illustration Xebia
dveloppement (Devs). Traditionnellement, Ops
et Devs ont des objectifs antagonistes : les uns
sont les garants de la stabilit et de la
disponibilit des systmes, l o les autres sont COOPRER matrielles ou une mise jour provoquant
employs lvolution de ces derniers. Cela La culture et lorganisation de votre entreprise une instabilit du systme. Les Ops sont
cre un clivage entre ces quipes, appeles sont un pilier de votre transformation vers familiers de la gestion de crise, avec ses
travailler ensemble et tendre vers un mme DevOps. Les leitmotifs de DevOps peuvent horaires rallonge et ses diagnostics parfois
objectif : dlivrer le meilleur logiciel aux clients nanmoins paratre galvauds : qui ne se laborieux. Les bureaux dOps rsonnent
de lentreprise. De plus, il est courant que les targue pas de vouloir travailler de manire dhistoires croustillantes sur ces Devs
Ops aient des notions de dveloppement, et collaborative et en toute transparence ? De ce totalement inconscients qui mettent la
les Devs, dexploitation. Cela entrane fait, quelles sont les implications concrtes sur production en pril avec des dploiements de
immanquablement des conflits. Quelles soient lorganisation dun dpartement exploitation binaires hasardeux. Lun des premiers axes de
bloquantes ou non, ces frictions dgradent la derrire le mouvement DevOps ? Est-ce une progrs est donc de restaurer la confiance
productivit. Plusieurs symptmes sont relle rupture ou un simple effet de mode ? dans un contexte de defiance mutuelle. Pour
rvlateurs de ces problmes : Les organisations de type You build it, you ce faire, deux outils sont votre disposition.
w En cas de crise, combien de temps faut-il run it sont sans compromis et semblent un Dune part, la conclusion dune mise en
pour lever une alerte, rcuprer les logs, les objectif utopique atteindre pour beaucoup. production doit tre lobjet dune runion de
analyser puis identifier la dfaillance ? Voyons ici quelques axes de travail et les outils retour dexprience (appele rtrospective)
Combien de temps pour livrer un correctif en que vous pouvez utiliser pour dmarrer entre Devs et Ops afin de capitaliser sur les
production ? La rapidit dexcution de ces rapidement une dmarche DevOps sans avoir bonnes pratiques et identifier les points
actions est fortement lie la qualit de la rvolutionner votre organisation. damlioration. Une pratique rgulire des
coopration entre quipes. rtrospectives devrait diminuer sensiblement le
w La frquence et la simplicit des mises en Restaurer la confiance nombre de crises et restaurer la confiance
production sont galement des indices L'activit des Ops est jalonne de nombreuses entre ces deux protagonistes.
rvlateurs. Les Ops sont rarement impliqus crises. Quelles soient lies des pannes
au dmarrage des projets. Il sensuit des Concevoir des produits
dlais allongs entre la livraison des Ops-ready
applications et celle des machines qui Les projets agiles manquent souvent dune
serviront de socle. Cela aboutit souvent vision Ops trs tt dans la conception du
une dtection de problmes en pr- produit. Ce manque est induit par le fait que le
production, seul environnement Product Owner, propritaire du backlog, a une
suffisamment proche de la production pour vision mtier centre sur les fonctionnalits
une validation. Les open spaces grouillent dlivrer lutilisateur. La dimension Ops sera,
danecdotes du mme acabit. Nous allons au mieux sous-estime, au pire passe sous
vous guider dans notre vision dune silence. Les Ops sont des parties prenantes
Illustration Xebia

dmarche damlioration, pour pallier ces dont le PO doit tenir compte. Il est essentiel de
problmes efficacement. les impliquer ds la constitution du Product

Dcembre 2014 > Programmez! 37


032_058-3c_180 18/11/14 16:11 Page38

Backlog. Le Product Backlog reprsente tout Si vous souhaitez pousser lintgration


devops

ce qui apporte de la valeur au produit. Des continue produire des paquets systmes
exigences non fonctionnelles comme certificat Linux (des .deb ou des .rpm par exemple), il
apportent de la valeur, elles doivent apparatre faudra alors adopter le mode de distribution
dans le backlog. Dautres besoins Ops se ad-hoc.
traduiront par des critres dacceptation des Dans tous les cas, lessentiel est davoir au
user stories. Par exemple, PCA ou scurit. moins lquivalent dun serveur FTP, ou vous
stockerez les artefacts en les rangeant

Illustration Xebia
Anticiper lactivit ops correctement par numros de version.
Une autre difficult pour les Ops est danticiper
les demandes des Devs et les livraisons de merge en intgrant leur code au tronc Infrastructure
nouveaux binaires. Il nest pas rare de voir des commun. La mise en place de linfrastructure doit passer
Devs se plaindre du manque de ractivit des Il doit tre possible pour nimporte quel par des outils de provisionnement
Ops, et des Ops se plaindre du manque dveloppeur de crer de nouveaux dpts automatique, comme VMWare Cloud Template
dorganisation des Devs qui ne savent pas simplement. Pour cela, des outils comme ou AWS CloudFormation. Cela implique bien
anticiper leurs besoins. Quelles quen soient GitLab, GitBlit ou RhodeCode vous offriront sur davoir un socle de virtualisation qui
les raisons, les changes sont souvent tendus une interface Web de gestion des utilisateurs permette de scripter le dmarrage des
et les urgences sont la norme, plus que et des dpts de code. ressources.
lexception. Il suffit parfois de partager un w La virtualisation des diffrents
simple outil de management visuel pour crer Un serveur dintgration continue environnements, du dveloppement la
de la transparence sur les travaux en cours Jenkins, de par sa simplicit dusage et ses production, garantit :
cote Devs et permettre aux Ops danticiper les nombreux plugins, est tres populaire. Vous w Une bonne ractivit dans le provisionning,
demandes. Il est galement possible dinviter pourriez galement regarder TeamCity ou w La reproductibilit totale de linstallation des
des Ops dans des revues de sprint afin quils Bamboo pour dterminer quel outil vous plateformes,
sapproprient le produit avant de voir arriver le convient le mieux. Tous ces outils sont w La possibilit dobtenir moindre cout de
livrable pour mise en production. Cette galement disponibles en Service Cloud pour llasticit sur la plateforme de production,
dernire pratique est utiliser avec parcimonie vous viter de les mettre en place en interne et w La possibilit de recrer la demande une
car les Ops sont, en gnral, peu intresss gagner en vitesse de mise en place. plateforme depuis zro (pour les disaster
par le contenu fonctionnel dun sprint. recovery ou bien les tests de charge par
Un dpt dartefact exemple).
FLUIDIFIER En fin de build, les artefacts produits doivent En utilisant cette approche depuis la phase de
Maintenant quune vritable coopration entre tre stockes pour servir aux processus de dveloppement, et en considrant que les Ops
quipes sest installe, les crmonies agiles dploiement. L, le choix est extensif en participent lquipe, on obtiendra une
mlant Devs et Ops sont prolifiques. Chacun fonction de votre approche : infrastructure versionne, dployable la
coute les problmes de lautre. Cela donne Si votre intgration continue dlivre des demande dans les environnements choisis
loccasion dharmoniser lensemble : fichiers WAR ou un autre artefact type Java, un (dveloppement, recette ou production) en
w Dvelopper en accord avec la cible quest dpt Maven tel que Archiva ou Nexus est restant isoproduction. La mise en place de
lenvironnement de production. conseiller. rpartiteurs de charge, de groupes de scaling
w Adapter, dans la mesure du possible, le SI
aux besoins des dveloppeurs.
De plus en plus de structures ont russi cette
transition. Du rapprochement entre les quipes
sont ns de nombreux outils dautomatisation.
Le but de ces outils, que nous allons voir plus
en dtail, est de transformer le SI en un self-
service pour dveloppeurs, gr par les Ops.

Usine logicielle
Premire tape de tout projet : la mise en
place des outils de dveloppements. Il faudra
une quipe :

Un dpt de code versionn


Git ou Mercurial rempliront le job sans
difficult. Ils permettent tous deux de faire des
commits locaux aux machines des
dveloppeurs avant denvoyer leur travail par
paquet au dpt central. Cela leur donnera la
Illustration Xebia

possibilit de faire des commits plus petits et


donc, de rduire grandement les problmes de

38 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page39

automatiques et de groupes de scurit doit avons slectionn un outil open source, de savoir exploiter les logs gnrs par un

devops
galement faire partie de ce provisionning et baptise Graphite, qui : grand nombre de machines, travers tout le
tre rdige par toute lquipe, pour repartir la w Est facilement clusterisable, donc pourvu SI. Sans stratgie de collecte et darchivage
connaissance. dun stockage virtuellement extensible centralise, vos quipes vont devoir
linfini, commencer par dterminer sur quelle machine
Gestion de configuration w Peut conserver un trs grand nombre de un problme a eu lieu, avant mme de pouvoir
Avant mme de songer centraliser les points sous forme de sries temporelles, et commencer lanalyser.
fichiers de configuration des serveurs, il faut les agrger lorsquune granularit fine nest Pour parer cela, il convient de mettre en
que lapplication dveloppe soit apte plus ncessaire, place sur chaque machine un agent de
recevoir de la configuration externe. Toutes les w Permet dappliquer sur ces points des collecte qui enverra les logs mis par une
valeurs ncessaires doivent pouvoir tre formules mathmatiques avances. machine sur un serveur central pour tri,
surcharges. Une discussion entre Devs et Ce logiciel est un simple collecteur, il est non- archivage et indexation. De cette faon,
Ops est essentielle pour dterminer si intrusif vis vis des applications de nimporte quel membre dquipe saura
lapplication est suffisamment configurable. production. De nombreux plugins Graphite immdiatement venir consulter les logs et les
la charge des Devs de rdiger la configuration sont disponibles : ces plugins vont du traage mtriques de monitoring, collectes depuis
correspondant leur environnement de des valeurs systme linterception de trappe toutes les instances de serveur.
validation. Nagios. Coupl avec un autre outil open Une solution technique puissante, qui vitera
Une fois cette analyse faite, il faudra intgrer source, JmxTrans, il devient tres facile de davoir faire des recherches exactes dans
un systme de centralisation de configuration, grapher des variables exposes par JMX, le des fichiers de log de plusieurs Go, est le
tel Ansible, Chef, Puppet ou CFEngine. Ces systme prfrentiel pour exposer des triptyque LogStash, ElasticSearch, Kibana :
outils sont bases sur un systme de serveur mesures en Java. w LogStash vous fournira les agents locaux et
central pilotant la configuration des serveurs On ne peut videmment pas rester toute la la collecte centralise,
clients. Ils peuvent galement servir piloter journe les yeux rives sur les compteurs, cest w ElasticSearch est un moteur dindexation et
de faon uniforme un ensemble de machines pourquoi il est bon davoir un systme dalerte de recherche full-text qui servira de
pour effectuer par exemple, une mise jour. efficace. Classiquement, on dclenche des stockage,
Tous ces outils sont de tres bonne qualit et alertes sur des passages de seuils, comme le w Kibana est une interface Web pour requter
utilises par des acteurs majeurs du Web; CPU de telle machine dpasse 90 %. Avec un sur lensemble des logs collectes et
vous de consulter la littrature pour voir lequel couple Graphite-JmxTrans, il est maintenant construire des tableaux de bords clairs.
vous appelle. possible de mettre en place des alertes sur
des tendances, comme le CPU de telle La mesure de la performance
Le monitoring et lalerting machine dpasse en moyenne les 90 % depuis Il est assez courant de rencontrer, dans un SI,
Lexprience de mise en place des mthodes plus de 10 minutes. Comme la collecte des des applications clates, rparties sur
agiles au sein des quipes Devs a montr que mtriques est centralise, il est mme possible diffrents serveurs, ou des actions utilisateurs
laugmentation de la visibilit sur lavancement de croiser plusieurs sources dinformation pour mettant en jeu plusieurs applications. Dans ce
du travail induit des progrs diffrents dclencher des alertes tres cibles, comme genre de cas, le monitoring de chaque
niveaux : sur les 10 dernires minutes, le CPU dpasse machine, mme avec une consultation
w Afficher les rsultats des tests automatises et en moyenne les 90%, le pool daccs aux centralise, ne suffit plus travailler
les indicateurs de qualit de code sur les services externes est sature et le temps de efficacement. Lanalyse du comportement du
crans dun open space responsabilise les parcours client au moment du paiement est systme complexe que devient alors le SI
dveloppeurs. suprieur de 50% au temps moyen constate ncessite un outillage plus puissant.
w Certaines quipes oprationnelles barrent, en fonctionnement normal . Si cette dernire Deux approches complmentaires permettent
sur un gigantesque calendrier, les jours sans alerte se dclenche, alors il est temps davertir de lutter contre leffet Works for me qui peut
incident notable afin dapporter un feedback mon partenaire paiement que son service est apparaitre :
positif lquipe sur son travail. dgrad. Cet alerting peut se faire via des w Pratiquer des tests de charge continus,
w Certaines startups affichent, sur de grands outils classiques comme Nagios ou, bien sur, w Mesurer les performances relles en
crans, des lentre de leurs locaux, les un logiciel open source ddi tel Seyren. production.
chiffres de vente du jour. Cest un moyen de Ce monitoring technique et fonctionnel a un
focaliser lattention de lensemble de autre effet bnfique : il fait entrer lentreprise Value stream map
lentreprise sur le but final, qui est le dans la culture de la mesure, qui se rsume Tous les outils et mthodes que nous venons
fonctionnement du groupe et non dune cette phrase : Vous ne pouvez amliorer que de passer en revue vont donner beaucoup plus
quipe isole. ce que vous pouvez mesurer . de pouvoir vos quipes sur votre SI. Ils
Pour tre efficace, ces outils de supervision seront en mesure dobserver, de comprendre,
doivent pouvoir accueillir un nombre illimit de Analyse dincident de diagnostiquer et de rparer au plus vite. On
mesures : Devs et Ops doivent pouvoir Le monitoring est galement utile au-del de la peut nanmoins aller plus loin encore. Un autre
exposer autant de mtriques quils le visualisation de donnes mtier. Les logs outil permet danalyser le fonctionnement de
souhaitent, sans mettre en pril la production gnrs par les briques de votre SI doivent vos quipes plutt que celui de votre SI : la
et sans tre freins par des considrations de tre traits avec une attention particulire. Ils Value Stream Map. Cet outil issu du Lean
cot ou de matriel. Il faut donc faciliter la sont le matriau de base de toute analyse Management permet de calculer lefficience de
mise en place de nouvelles sondes au sein dincident. Le problme technique qui se pose votre processus et didentifier les points
du systme. Parmi diverses solutions, nous rapidement (et qui enlise de nombreux SI) est damlioration avec une vue densemble. Dans

Dcembre 2014 > Programmez! 39


032_058-3c_180 18/11/14 16:11 Page40

un contexte DevOps, il sagira didentifier modifications sont rapatries sur la branche A/B Testing
devops

prcisment toutes les tapes ncessaires au principale pour livraison en production. Une fois la technique du Toggle Feature
dploiement dun binaire en production depuis Pattern matrise par vos quipes, il est
sa livraison par les Devs. Nous associons Plasticit applicative possible de lutiliser, non plus seulement pour
chaque tape sa dure de travail effectif et le Toggle Feature Pattern masquer une fonctionnalit instable, mais aussi
temps de latence constate avec ltape Le Toggle Feature pattern est un outil de pour proposer aux utilisateurs diffrentes
prcdente. Le ratio entre le cumul des temps conception logicielle. Les Devs peuvent versions dune mme fonctionnalit.
de travail effectifs et le cumul des temps positionner des interrupteurs dans le code de En effet, de plus en plus dentreprises
dattente vous donne votre efficience globale. lapplication pour encapsuler des procdent des tests grandeur nature, en
Il sagira ensuite de cibler votre effort fonctionnalits entires. Ces derniers doivent production, par chantillonnage. Par exemple,
damlioration pour augmenter ce ratio. tre activables par configuration et via la mise en place dun A/B testing : 2 pages
manipulables chaud par les Ops pour daccueil, au design diffrent, sont proposes
LIVRER modifier le comportement de lapplication. de manire alatoire 2 populations
Maintenant que Devs et Ops sont quips En protgeant les fonctionnalits en cours de dinternautes. Le monitoring permet de
doutils efficaces et ont confiance en leur mise rdaction par le biais de ce mcanisme, il est dgager des tendances indiquant la page la
en production, ils nattendent plus quune possible de maintenir le rythme et de dployer plus pertinente.
chose : des binaires. Jusquici, nous avons li des fonctionnalits, mme si dautres sont Le principe du A/B Testing nest pas limit 2
Devs et Ops autour de la connaissance du encore en chantier. options et il est toujours possible de jouer sur
systme au sens large. diffrentes nuances dergonomie, de simplicit
Si les quipes arrivent ce stade de de parcours, etc.
maturit, elles vont commencer rellement La pertinence du A/B Testing doit se mesurer
partager un processus bout en bout. Une en valeur mtier. Typiquement, pour un site
mme quipe aura les connaissances et les marchand, on attribuera le taux de
outils pour dvelopper une fonctionnalit et la transformation en vente dune version de
mettre en production. Cest ici la terre promise lapplication. La meilleure version devient la
du Dploiement Continu. Voyons ensemble norme et on tente dautres alternatives sur
quelques bonnes pratiques et stratgies de cette nouvelle base pour amliorer encore
dploiement considrer pour exploiter votre lexprience utilisateur.
nouveau SI et vos quipes dopes la
DevOps-amine. Dark Launch
Autre pratique corollaire du Toggle Feature et
Illustration Xebia

Mise en place du de lA/B Testing : le Dark Launch, qui permet


dploiement continu de tester des fonctionnalits alternatives
Il est important que vos quipes dfinissent considres comme risques. On va alors
leur stratgie de gestion de branche dans le Circuit Breaker Pattern activer une fonctionnalit une frange des
code source. Il faut quelles soient conscientes Outre la sgrgation des fonctionnalits non utilisateurs, en se basant sur des certains
quil y aura des patchs faire sur la version de termines, toute fonctionnalit reposant sur critres (peu dutilisateurs, leur type de
production et quelles doivent pouvoir mettre des services externes doit pouvoir tre active compte, leur nationalit, leurs prfrences,
temporairement de cote leur travail en cours ou dsactive chaud, sans stopper etc.). Une fonctionnalit typiquement
pour rsoudre un problme. Deux stratgies lensemble de lapplication. considre comme risque est la modification
ont aujourdhui fait leurs preuves. Le monitoring peut avertir les Ops quun du parcours de paiement pour un site
service est indisponible, mais il est galement marchand. Comme cest cette tape que se
Simple Branching possible dintgrer, directement dans les concentre la majorit des abandons dachat, il
Le Simple Branching est, comme son nom applications, des mcanismes de protection est tres dlicat de dcider de la modifier.
lindique, la stratgie la plus simple. On garde contre les pannes externes. Lutilisation dun Dark Launch pour confirmer
une branche dont le code est la version Le principe du pattern Circuit Breaker est de la pertinence dune modification avant de la
dploye en production. On cre galement conditionner les accs vers des composants gnraliser est ici approprie.
une branche de dveloppement dans laquelle externes par des interrupteurs logiques qui
une nouvelle version de lapplication est en dtectent les appels en erreur. Quand un seuil Stratgies de dploiement
cours de ralisation. (configurable) derreurs conscutives est Votre projet sappuie maintenant sur un
atteint, lapplication passe en mode dgrad et processus de dploiement bien rod, au sein
Feature Branching nassure plus la fonctionnalit qui dpend du duquel lensemble des tapes de build, de
Le Feature branching consiste, quant lui, service en panne. Pendant que lapplication tests et de provisioning sont automatises.
avoir une branche principale contenant la est en mode dgrad, elle envoie une alerte au Vous tes capable de livrer votre application
version actuellement en production et monitoring et dclenche une procdure pour en continu mais le dploiement en production
plusieurs branches de dveloppement. Pour vrifier rgulirement si le service est revenu. ncessite toujours un Go/NoGo. Ltape
chaque fonctionnalit en cours de Ds que cette procdure dtecte un retour du suivante consiste automatiser le dploiement
dveloppement, une nouvelle branche est service, lapplication repasse en mode en production en tant quaction finale de la
cre. Lorsque son implmentation est standard et assure de nouveau la chaine de production.
termine et valide par le mtier, les fonctionnalit. Comme il nest pas acceptable quune

40 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page41

compte intuitivement les

devops
besoins spcifiques des
Ops et vice versa. Dautre
part, les outils
dautomatisation mis en
place simplifient les tches
ncessaires au delivery de
bout en bout. terme, le
temps perdu entre les
dveloppements et la mise
en production diminue
Circuit Breaker Pattern rgulirement. La value
Stream Map permet de
modification du code aboutisse des instances durant le dploiement, soit en constater cette amlioration ditration en
coupures de service chaque mise en mettant jour un ensemble restreint itration.
production automatique, il faut mettre en place dinstances existantes. Dans tous les cas, il Linnovation et la veille technologique se
une stratgie de dploiement sans interruption faut tre capable de maitriser quelle proportion dveloppent dans la DSI. Dun point de vue
de service. Diffrentes techniques peuvent tre de votre trafic va tre dirige vers ces managrial, le planning des releases obtient
considres afin de russir diminuer les instances avec la nouvelle version de votre des niveaux de confiance ingals jusqualors.
risques et dpasser les craintes lies un tel application. Vous devrez porter une attention Un rythme sest install, les mises en
bouleversement dans la manire de livrer une particulire ces instances pour valider que la productions sont rgulires et scurises, les
application en production. Le but est de nouvelle version peut tre gnralise. En cas interventions durgence se rarfient.
transformer le dploiement en un non- de problme, il vous suffira de couper le trafic Attention, il ne sagit pas d'une recette miracle!
vnement, quelque chose de standard. entrant sur ces instances pour arrter de Le changement dorganisation sest
perturber vos utilisateurs. Une fois votre accompagn de nombreuses difficults, la
Blue/Green Deployment stratgie choisie, vous allez avoir besoin dun rsistance au changement est toujours forte,
Cette technique de dploiement sans outil pour grer le dploiement proprement Nous avons prsent un grand nombre doutils
interruption de service repose sur un systme parler de lapplicatif. destins aux Devs comme aux Ops, qui
de double run. On maintient 2 environnements peuvent aussi trouver leur utilit dans les
de production pleinement fonctionnels. Tous CONCLUSION quipes mtiers. Tous ces systmes ne
les accs utilisateurs passent par un routeur Grce une implication forte des quipes de serviront nanmoins que tres peu sans une
qui permet la bascule vers lun ou lautre de dveloppements et des quipes doprations, coopration forte entre les quipes et une
ces environnements. La version vers laquelle le suivi de lavancement des projets est assur adhsion aux principes du DevOps.
pointe le routeur est lenvironnement Green, de manire transverse fournissant ainsi une Merci aux auteurs et aux contributeurs du
tandis que la partie en stand-by est appele le vision globale et non plus spcifique chaque TechTrends #2 DevOps de Xebia ayant
Blue. La technique consiste dployer la quipe. La richesse des changes vient permis la rdaction de cette partie.
nouvelle version sur le Blue, faire toutes les amliorer, du point de vue de tous, les Retrouvez ce document dans son intgralit
vrifications utiles pour valider le dploiement, solutions finales. Les Devs prennent en sur http://techtrends.xebia.fr/. u
puis basculer le trafic du routeur.
Une fois le trafic bascul, lenvironnement
nouvelle version devient le Green, et on peut
sereinement mettre jour le second
dploiement pour maintenir lquilibre entre
Blue et Green.
Xebia est un cabinet de conseil xebians de trouver un sens leur conseiller les grandes entreprises
Canary releasing technologique agile comptant 450 travail en poursuivant le but que comme les startup dans
Ds que votre infrastructure de production collaborateurs dans le monde lentreprise sest assign, davoir l'adoption de cette culture.
commence prendre de lampleur, il peut (Paris, Amsterdam et New Delhi) une grande transparence de la Retrouvez-les sur leur blog, ou
devenir problmatique de rester dans une Chez Xebia, les employs part de la Direction installant une suivez-les sur Twitter, Google+ et
approche Blue/Green Deployment. partagent au quotidien des vritable dmocratie de pense, Linkedin.
Redonder une grappe de serveurs frontaux, un valeurs qui ont permis son succs : mais surtout de ponctuer la vie de
nuage de middleware et plusieurs bases de People First, Partage de lentreprise par des moments plus Merci Clment Rochas,
donnes peut rapidement couter tres cher. connaissance, Qualit sans festifs et moins formels. Consultant agile chez Xebia,
Vous pourriez alors tre tente par une stratgie compromis et Intimit client. Les xebians ont trs vite emboit @crochas
nomme Canary Releasing. Cest dans ce cadre que le le pas des initiateurs du
Cela consiste dployer la nouvelle version de cabinet de conseil a t class mouvement DevOps en 2009, les
son application sur un sous-ensemble des dans le palmars de Great Place comptences acquises sur des
noeuds qui composent votre environnement To Work 2014. Les cls de son missions d'envergures leurs
de production. Cela peut se faire soit en succs sont de permettre aux permettent aujourd'hui de
augmentant lgrement le nombre de vos

Dcembre 2014 > Programmez! 41


032_058-3c_180 18/11/14 16:11 Page42

Analyse oriente business de vos logs applicatifs


devops

Dans cet article, nous allons voir comment mettre profit nos logs applicatifs afin de
faire de lanalyse oriente "business" grce ElasticSearch, Logstash et Kibana.
Vincent Spiewak Lentre standard est utilise comme input, la sortie standard est
Consultant Java et agile chez Xebia utilise comme output (A noter que nous utilisons le codec
@vspiewak rubydebug afin que le json soit format).
Nous pouvons lancer ensuite lagent Logstash avec cette configuration,
A la tte dun site de vente en ligne fictif, nous essayerons notamment de et crire un message dans lentre standard : Fig.3.
monitorer lactivit de nos clients, et de rpondre aux questions suivantes: Logstash a ainsi transform notre message en un JSON format.
w Quel est le taux de conversion (ratio recherches / ventes) ? Logstash ajoute automatiquement les champs @version, @timestamp et
w Quels sont les produits les plus consults ? host. A noter que le champ @timestamp contient la date de rception
w O nous situons-nous par rapport nos objectifs de ventes ? du message par Logstash.
Le premier travail va consister parser nos logs laide du filtre grok
A faire chez vous
Lensemble de la dmonstration a t automatise sur une VM Vagrant Filtre Grok
disponible sur GitHub : https://github.com/vspiewak/elk-programmez-2014.git Le filtre Grok nous permet, laide dexpressions rgulires, de
Vous devez installer uniquement VirtualBox et Vagrant (disponible dcouper nos logs et leur donner de la smantique. Logstash vient avec
gratuitement pour Windows, Linux et OS X). Vous trouverez le script plus dune centaine dexpressions rgulires prdfinies (disponibles ici :
dinstallation ainsi que lensemble des fichiers de configuration. https://github.com/logstash/logstash/tree/master/patterns)
Par exemple, le pattern "COMBINEDAPACHELOG" du fichier grok-
Format des logs patterns permet de parser les lignes de logs dun serveur Apache.
Ce paragraphe vous prsente le format des logs que nous allons Vous pouvez utiliser 2 syntaxes :
exploiter Fig.1. Notre application gnre deux types de logs, w %{SYNTAX:SEMANTIC} ou %{SYNTAX:SEMANTIC:TYPE}
reprsentant respectivement une recherche ou un achat dans notre w (?<field_name>the pattern here)
magasin de vente en ligne. Un log de vente contient ladresse IP et le La premire syntaxe utilise un pattern Logstash prdfini (ex: INT,
User-Agent de lacheteur, son sexe, ainsi que les informations sur le NOTSPACE, LOGLEVEL, ), SEMANTIC tant le nom du champ
produit achet (marque, modle, catgorie, options et prix). mapper. Vous pouvez prciser le type du champ (integer, float, string)
Un log de recherche contient ladresse IP et le User-Agent du visiteur, et via le paramtre TYPE. La deuxime syntaxe vous permet de dfinir un
quelques informations sur le produit recherch (parfois la catgorie, pattern customis avec ou sans laide de plusieurs patterns Logstash.
parfois la catgorie et la marque, etc). Pour nos logs, nous utiliserons le filtre Grok suivant :

Logstash filter {
Logstash est un ETL lger permettant de collecter, transformer et grok {
charger des logs laide de connecteurs dentres, de filtres et de match => ["message","(?<log_date>%{MONTHDAY}-%{MONTHNUM}
connecteurs de sorties. Cest un vritable couteau suisse qui, en version -%{YEAR} %{HOUR}:%{MINUTE}:%{SECOND}.[0-9]{3}) \[%{NOTSPACE:
1.4.2, vous fournit 41 entres, 50 filtres, et 55 sorties diffrentes. thread}\] %{LOGLEVEL:log_level} %{NOTSPACE:classname} - %{GREEDY
Nous allons voir comment transformer nos lignes de logs illisibles en DATA:log_msg}"]
documents JSON structurs, et les enrichir au passage de prcieuses }
informations (golocalisation, version du navigateur, etc). }

Premiers pas Avec le filtre Grok, logstash dcoupe nos lignes de log correctement,
Un agent Logstash a besoin dun fichier de configuration pour tre ajoutant les champs log_date, thread, log_level, classname et log_msg :
excut. Voici un exemple de configuration minimaliste : Fig.2. Fig.4.

Fig.1
Filtre date
Le filtre date va permettre de dater notre message correctement. En
effet, par dfaut logstash valorise le champ @timestamp avec la date
courante. Dans le cas de nos logs, nous voulons utiliser la date du log
(champ log_date). Nous utiliserons un pattern au format JodaTime (voir :

Fig.3 Fig.2

42 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page43

Split dun champ en tableau

devops
http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html)
Pour finir avec le filtre mutate, nous allons splitter notre champ "options"
date { afin davoir un tableau doptions :
match => ["log_date","dd-MM-YYYY HH:mm:ss.SSS"]
} mutate {
split => [ "options", "|" ]
Filtre KV }
Le filtre KV est trs utile pour dcouper un champ au format
cle1=valeur2&cle2=valeur2 (paramtres dune requte http notamment) Filtre GeoIP
Nous allons utiliser ce filtre pour dcouper le champ log_msg: Le filtre GeoIP permet dajouter des informations de golocalisation via
une adresse IP (coordonnes gps, ville et pays notamment). Logstash
kv { utilise la base de donnes GeoLite de Maxmind sous license CCA-
field_split => "&" ShareAlike 3.0.
source => "log_msg"
} filter {
geoip {
Filtre mutate source => "ip"
Ajout dun tag }
Le filtre mutate est un filtre couteau suisse permettant diffrentes }
modifications sur les champs. Nous allons ajouter un tag afin de
diffrencier nos recherches de nos ventes : Filtre UserAgent
Le filtre UserAgent permet de parser automatiquement un User Agent et
if [classname] =~ /SellRequest$/ { dajouter des informations comme la version du systme dexploitation
mutate { add_tag => "sell" } ou du navigateur :
} else if [classname] =~ /SearchRequest$/ {
mutate { add_tag => "search" } useragent {
} source => ua
target => useragent
Conversion de type remove_field => [ ua]
Nous allons convertir les champs id et price respectivement en entier et }
nombre virgule flottant :
Sortie Elasticsearch
mutate { Une fois notre log pars, nous voulons que Logstash lenvoie
convert => [ "id", "integer" ] Elasticsearch. Rien de plus simple avec la sortie Elasticsearch, puisquil
} suffit simplement de dclarer :
mutate {
convert => [ "price", "float" ] output {
} elasticsearch {}
}
Suppression dun champ
Toujours avec le filtre mutate, nous allons supprimer le champ log_msg Note: la sortie est configure pour se connecter sur lElasticsearch
que nous avons re-dcoup laide du filtre KV : locale, avec un mode de transport de type node par dfaut. Il ny a
donc rien paramtrer. Logstash nous permet de collecter nos logs, les
mutate { structurer, les enrichir et enfin de les envoyer Elasticsearch : Fig.5.
remove_field => [ "log_msg" ]
}

Fig.4 Fig.5

Dcembre 2014 > Programmez! 43


032_058-3c_180 18/11/14 16:11 Page44

Elasticsearch Il existe plusieurs types de panels ajouter et configurer (recherche,


devops

Elasticsearch est une base de donnes full-text oriente document, priode de temps, histogramme, camembert, carte, Markdown, )
distribue et offrant de la haute disponibilit notamment. Licne i, disponible sur chaque panel, permet de visualiser la requte
Logstash enverra nos logs dans des indices nomms "logstash-YYYY- Elasticsearch.
MM-DD" (quivalent des tables dans le monde SQL traditionnel)
Pour installer Elasticsearch et le plugin head (offrant une interface Cration dun dashboard Kibana
web), rien de plus simple : Partez dun Dashboard vierge en cliquant sur le lien "Blank Dashboard".
Noubliez pas de le sauvegarder avant de rafrachir la page de votre
$ curl -O https://download.elasticsearch.org/elasticsearch/ navigateur ! Fig.8.
elasticsearch/elasticsearch-1.3.4.tar.gz Ouvrez la fentre modale "Dashboard settings" en cliquant sur la roue
$ tar xvzf elasticsearch-1.3.4.tar.gz crante dans le coin suprieur droit :
$ cd elasticsearch-1.3.4 w Onglet "General" : choisissez un titre et le thme ("dark" ou "light"),
$ bin/plugin --install mobz/elasticsearch-head w Onglet "Index" : slectionnez "day" pour le champ "Timestamping",
$ bin/elasticsearch w Onglet "Controls" : cochez toutes les cases afin de vous donner le
maximum doptions,
Vous pouvez surveiller ltat de sant dElasticsearch ladresse : w Fermez la fentre modale en cliquant sur save.
http://localhost:9200/_plugin/head Fig.6. Vous pouvez slectionner une priode de temps afficher dans le menu
Time filter (exemple: TimeFilter > Last 15m, TimeFilter > Auto-Refresh >
Kibana 5s). La barre de recherche utilise le format Lucene Query ou une
Kibana est une application de type Single Page App utilisant expression rgulire.
notamment la stack technique HTML 5, Angular JS et Twitter Bootstrap. En cliquant sur le bouton "+" du champ recherche, crez 3 barres de
Dans notre exemple, nous utiliserons NGiNX, mais tout autre serveur recherche contenant les requtes suivantes :
Web capable de servir des fichiers statiques est possible : w*
w tags:search
curl -O https://download.elasticsearch.org/kibana/kibana/ w tags:sell
kibana-3.1.1.tar.gz Vous pouvez pingler des recherches et leur attribuer un alias.
tar xvzf kibana-3.1.1.tar.gz
sudo mv kibana-3.0.0milestone4 /usr/share/nginx/www/kibana

Vous pouvez dsormais accder Kibana lurl : http://localhost/kibana.


Fig.7. La page daccueil de Kibana dispose dun menu en haut droite
permettant de charger, sauvegarder et partager vos dashboards via :
w Fichier JSON
w ElasticSearch
w Gist
w Permalien
Kibana offre 4 dashboards par dfaut :
w Un dashboard gnrique Logstash (cf. photo),
w Un dashboard gnrique Elasticsearch,
w Un dashboard non configur,
w Un dashboard vide.

Un dashboard se "branche" sur tous les index de votre cluster


Elasticsearch, un index spcifique, ou les index dont le nom matche un
pattern (cas de Logstash notamment). Fig.7
Linterface reprend le systme de grille de Twitter Bootstrap,
dcomposant les lignes en 12 colonnes, contenant des panels.

Fig.6 Fig.8

44 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page45

Cliquez sur chaque rond de couleur et sauvegardez les alias suivants : w Un panel terms, field name.raw, length 5, taille 2

devops
w All w Un panel terms, field geoip.city_name.raw, length 5, taille 2
w Search w Un panel terms, field useragent.device.raw, length 5, taille 2
w Sell w Un panel terms, field useragent.name.raw, length 5, taille 2

Ligne 1 - Objectifs, Histogramme et Carte Ligne 3 - Donnes


Ajoutez une ligne en cliquant sur le bouton Add row, puis : Ajoutez une dernire ligne contenant uniquement un panel table de
w Un panel Histogram de taille 7 taille 12.
w Un panel Bettermap de taille 5
Drill down
Ligne 2 - Terms En cliquant sur les diffrents lments des deux dernires lignes, vous
Ajoutez une nouvelle ligne contenant: crez des filtres dynamiquement (icnes en forme de loupe ou de croix).
w Un panel terms, field tags, taille 2 Vous retrouverez ces filtres en dessous des barres de recherches, vous
w Un panel terms, field brand.raw, length 5, taille 2 permettant de les diter ou les dsactiver. Fig.9. u

Fig.9

Toute l'actualit des technologies


et du dveloppement
sur www.programmez.com

Dcembre 2014 > Programmez! 45


032_058-3c_180 18/11/14 16:11 Page46

Test Driven Infrastructure avec Chef


devops

Chef est un outil de gestion de configuration permettant de dcrire dans un langage clair et
comprhensible l'ensemble de son infrastructure ("Infrastructure as code"). Chef permet ainsi
d'installer et de maintenir l'ensemble des serveurs et cela de manire automatique.

Emmanel Sciara Matthieu Nantern


Consultant agile chez Xebia Consultant chez Xebia
@esciara @mNantern

Ce tutoriel montre, travers l'installation de lighttpd qui servira une page Nous allons utiliser le mme processus pour tous les autres gems et
comprenant le texte Wonderstuff Design is a boutique graphics design outils de ce tutoriel.
agency. , un cas d'utilisation simple de Chef. Mais comme tout code il
$ vim Gemfile
est trs important de le tester afin de s'assurer de sa maintenabilit et
de son volutivit. w Ajouter le contenu suivant :
Cet exemple montre pas pas comment monter un environnement pour
source 'https://rubygems.org'
faire du Test Driven Infrastructure avec loutil de provisioning Chef, en
suivant lexemple du livre Test-Driven Infrastructure with Chef, 2nd
gem 'berkshelf', '3.1.3'
Edition by Stephen Nelson-Smith.
Ce cas pratique est destin aux dveloppeurs dbutants ou w Nous allons ensuite utiliser Test-Kitchen (version 1.2.1, http://kitchen.ci/)
expriments dans la cration de cookbooks Chef. Il faut minima une qui permet de crer les VM avec Vagrant et lancer les tests
comprhension des concepts introduits par Chef. automatiquement. Nous utiliserons son plugin kitchen-vagrant (version
En temps normal, il faut sassurer que les tests crs ne passent pas 0.15.0) permettant Test-Kitchen de piloter le cycle de vie des VM en
avant dcrire le code qui va les faire passer. utilisant Vagrant. Ajouter Test-Kitchen au Gemfile ainsi que son plugin
Les outils utiliss dans cet article sont (par ordre dapparition) : kitchen-vagrant :
w Ruby 1.9.x
gem 'test-kitchen', '1.2.1'
w Bundler
gem 'kitchen-vagrant', '0.15.0'
w VirtualBox
w Vagrant w Il ne reste plus qu installer tous les composants avec Bundler :
w Berkshelf
$ bundle install
w Test-Kitchen
w ServerSpec Cration du squelette de cookbook
w ChefSpec Crer le fichier metadata.rb dans le rpertoire racine :

PRPARER SON ENVIRONNEMENT DE $ vim metadata.rb

DVELOPPEMENT Contenu de metadata.rb :


Installation name "wonderstuff"
L'installation complte de l'environnement de dveloppement se droule
version "0.1.0"
en 7 tapes :
w La premire tape pour installer un environnement sain pour le Crer le squelette de cookbook avec berks init (ne pas craser le
dveloppement de cookbooks est d'installer Ruby. Pour cela suivez Gemfile que nous venons de crer) :
larticle trs complet : http://misheska.com/blog/2013/12/26/set-up-a-sane-
$ bundle exec berks init
ruby-cookbook-authoring-environment-for-chef/ . Nous allons ici travailler
sur OS X. Terminer le squelette :
w Installer ensuite VirtualBox en tlchargant lapplication sur
$ mkdir recipes
https://www.virtualbox.org/wiki/Downloads (version utilise : 4.3.10)
$ touch recipes/default.rb
w Installer Vagrant en tlchargant lapplication sur
http://www.vagrantup.com/downloads.html (version utilise : 1.5.3). Vagrant
permettra, avec l'aide de Virtualbox, de lancer automatiquement des LANCER DES TESTS L'INTRIEUR
machines virtuelles afin d'excuter nos tests d'intgration. D'UN NOEUD AVEC BUSSER
w Les dpendances entre les diffrents cookbooks seront gres avec Busser est un framework de setup et d'excution de tests sur les nuds
Berkshelf (version 3.1.3). Pour plus d'information voir crs par Test-Kitchen. Il utilise une architecture de plugin permettant
http://berkshelf.com/. Ajouter Berkshelf au fichier Gemfile que vous d'ajouter le support de diffrents outils/stratgies de test tels que
devez crer dans le rpertoire racine du cookbook. Berkshelf sera MiniTest, Cucumber, Bash, etc.
alors automatiquement install par Bundler lors d'un bundle install. L'installation de Busser sur le nud et l'excution des tests sont

46 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page47

compltement prises en charge par Test-Kitchen. Par dfaut, Test-

devops
it 'should install the lighttpd package' do
Kitchen va regarder dans le rpertoire test/integration pour trouver les
expect(package 'lighttpd').to be_installed
fichiers de test lancer. Ce rpertoire est organis comme suit :
end
w Directement sous test/intgration se trouveront des rpertoires dont
les noms dfiniront les suites de tests. Les suites de tests lancer
it 'should enable and start the lighttpd service' do
sont dclares dans le .kitchen.yml sous suites: - name: <nom de la
expect(service 'lighttpd').to be_enabled
suite>. Pour plus d'informations sur .kitchen.yml se rfrer
expect(service 'lighttpd').to be_running
http://docs.opscode.com/config_yml_kitchen.html.
end
w Sous chaque rpertoire de suites de tests se trouveront des
rpertoires dont les noms sont ceux des plugins Busser utiliss.
it 'should render the Wonderstuff Design web page' do
w Sous chaque rpertoire de plugin Busser se trouveront les fichiers de
expect(file('/var/www/index.html')).to be_file
tests lancer sur les nuds.
expect(file('/var/www/index.html')).to contain 'Wonderstuff
Organisation des rpertoires de suites de tests lancer par Busser :
Design is a boutique graphics design agency.'
end
test/integratio
|_ do_something <-- suite name (more on this later)
end
|_ cucumber <-- busser (AKA the "tester")
|_ my_test_files <-- a test Vous pouvez vrifier que les tests se lancent et chouent en lanant la
commande :
Pour plus d'informations sur Busser, se rfrer https://github.com/test-
$ bundle exec kitchen verify ubuntu
kitchen/test-kitchen/wiki/Getting-Started#structure.

ECRITURE DUN TEST DINTGRATION ECRITURE DUN TEST UNITAIRE


UTILISANT SPECSERVER CHEFSPEC
Introduction ServerSpec Introduction ChefSpec
ServerSpec permet dcrire des tests RSpec permettant de tester que ChefSpec est un framework de tests unitaires permettant de tester des
vos serveurs sont correctement configurs. cookbooks Chef. Il simplifie lcriture de tests permettant dobtenir un
ServerSpec teste ltat des serveurs par accs SSH. Pas besoin dy feedback rapide sur les changements de cookbooks sans avoir besoin
installer un agent. De plus, Busser se charge entirement de tout le de machine virtuelle ni de serveurs dans le Cloud.
cycle dexcution des tests sur les noeuds crs par Test-Kitchen. ChefSpec est une extension de Rspec. Il lance votre cookbook
Plus dinformations disponibles sur http://serverspec.org/. localement en utilisant Chef Solo sans avoir besoin de faire converger
un noeud. Cela a deux avantages principaux :
Configuration de ServerSpec w Cest trs rapide !
ServerSpec a besoin de savoir le type d'OS sur lequel il va effectuer les w Vos tests peuvent faire varier les attributs des noeuds, OS, les
tests avant de lancer ces derniers. Pour cela, crons un fichier de rsultats de recherche pour vrifier le comportement des cookbooks
support spec_helper.rb qui fera ce travail. Il servira de rfrence ensuite dans diverses conditions.
dans tous les fichiers de tests effectus : Plus dinformation disponible sur https://github.com/sethvargo/chefspec ou
encore http://docs.opscode.com/chefspec.html.
$ mkdir test/integration/default/serverspec

Installation de ChefSpec
$ vim test/integration/default/serverspec/spec_helper.rb

Contenu de spec_helper.rb : Ajouter ChefSpec au Gemfile :

# encoding: UTF-8 gem 'chefspec', '4.0.1'


require 'serverspec'
Lancer l'installation du Gem :
require 'pathname'
$ bundle update

Configuration de ChefSpec
set :backend, :exec

Ecriture du test ServerSpec Les tests ChefSpec se trouvent dans le rpertoire spec. On peut dire
Crez les rpertoires qui vont permettre la prise en charge des tests par ChefSpec de faire les tests en simulant un OS spcifique. Nous allons
Busser et crez le fichier contenant le test. faire cela dans cet exemple particulier en nous cantonnant Ubuntu
12.04. Pour cela, nous allons spcifier l'OS de manire globale en
$ mkdir test/integration/default/serverspec/localhost
utilisant le fichier de support spec_helper.rb. Il est galement possible
$ vim test/integration/default/serverspec/localhost/readable
de lancer les tests en simulant diffrents OS grce Rake. Pour plus
_services_spec.rb
d'information sur la spcification de l'OS cible de ChefSpec, se rfrer
Contenu de fichier readable_services_spec.rb : https://github.com/sethvargo/chefspec#configuration .
Crez le rpertoire spec et le fichier spec_helper.rb :
# encoding: UTF-8
require 'spec_helper' $ mkdir spec
$ vim spec/spec_helper.rb
describe 'Wonderstuff Design' do
Contenu de spec_helper.rb :

Dcembre 2014 > Programmez! 47


032_058-3c_180 18/11/14 16:11 Page48

devops
# encoding: UTF-8 #
require 'chefspec' # Cookbook Name:: wonderstuff
require 'chefspec/berkshelf' # Recipe:: default
#
RSpec.configure do |config| # Copyright (C) 2014 Emmanuel Sciara
config.platform = 'ubuntu' #
config.version = '12.04' # All rights reserved - Do Not Redistribute
end #

Ecriture du test ChefSpec package 'lighttpd'


Crez les rpertoires et le fichier contenant le test.

$ mkdir -p spec/unit/recipes/ service 'lighttpd' do


$ vim spec/unit/recipes/default_spec.rb action [:enable, :start]
end
Contenu de fichier default_spec.rb :
cookbook_file '/var/www/index.html' do
# encoding: UTF-8 source 'wonderstuff.html'
require 'spec_helper' end

describe 'wonderstuff::default' do Cette recette utilise un fichier html comme ressource quil copie sur le
let(:chef_run) do serveur.
runner = ChefSpec::Runner.new(
$ mkdir -p files/default/
log_level: :error
$ vim files/default/wonderstuff.html
)
Chef::Config.force_logger true Contenu de fichier wonderstuff.html :
runner.converge('recipe[wonderstuff::default]')
<html>
end
<body>
<p>Wonderstuff Design is a boutique graphics design agency.</p>
it 'installs the lighttpd package' do
</body>
expect(chef_run).to install_package('lighttpd')
</html>
end
Donnez une adresse IP prive votre VM vagrant afin de pouvoir
it 'creates a webpage to be served' do accder la page html du serveur. Pour cela modifier le fichier
expect(chef_run).to render_file('/var/www/index.html'). .kitchen.yml :
with_content('Wonderstuff Design is a boutique graphics
$ vim .kitchen.yml
design agency.')
end Remplacez la portion du fichier .kitchen.yml comme ci-dessous :

suites:
it 'starts the lighttpd service' do
- name: default
expect(chef_run).to start_service('lighttpd')
driver:
end
network:
- ["private_network", {ip: "192.168.33.40"}]
it 'enables the lighttpd service' do
run_list:
expect(chef_run).to enable_service('lighttpd')
- recipe[wonderstuff::default]
end
attributes:
end
Dtruisez la VM existante pour que le changement d'IP soit pris en
Vrifiez que les tests se lancent et chouent en lanant la commande : compte :

$ bundle exec rspec -fd $ bundle exec kitchen destroy ubuntu

Et voil ! Voyez les tests serverspec passer en lanant la commande


ECRITURE suivante :
DU COOKBOOK
$ bundle exec kitchen verify ubuntu
Maintenant que tous les tests sont en place, il ne reste plus qu crire
le cookbook. et les tests chefspec avec la commande :

$ vim recipes/default.rb $ bundle exec rspec -fd

Contenu de fichier default.rb : Vous pouvez voir la page sur http://192.168.33.40/

# encoding: UTF-8
u

48 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page49

Premiers pas avec XL Deploy

devops
XL Deploy est une solution dite par XebiaLabs destine aux Devs et aux Ops. Elle permet de
prendre en charge la phase dlicate du dploiement de lapplication et de sa
configuration dans les diffrents environnements.
Benoit Moussaud monde Unix et WinRM dans le monde Windows). Il nest donc pas
Technical Director Southern Europe - XebiaLabs ncessaire dinstaller et de configurer un agent propritaire sur
@bmoussaud lensemble du parc de serveurs. Nous allons maintenant dcrire les
diffrentes actions raliser pour dployer une application Java (une
La premire spcificit de la solution XL Deploy est quelle est base sur application Microsoft, par exemple .NET, suivra les mmes principes).
le modle UDM (Unified Deployment Model). Ce modle stipule que
pour avoir une application dploye (DeployedApplication), il faut crer Cration dun package
un dploiement qui prend en entre : Tout dabord il faut crer le package de notre application. Nous allons
w Un package sous la responsabilit des Devs. Il regroupe lensemble partir dune application Java classique. Elle est compose de 2 fichiers
des lments qui constituent une version dune application. Ces War (PetClinic.war et PetClinic-Backend.war) type jee.War, une
lments sont : dfinition dune DataSource - type tomcat.DataSourceSpec et dun
- Des artefacts, les fichiers ou les rpertoires de fichiers : .exe, .war, rpertoire qui contient des fichiers de configuration type
fichiers SQL, fichier de configuration .properties etc. tomcat.ConfigurationFolder. Le fichier Manifest correspondant cette
- Des ressources, les lments de configuration tels que les description est le suivant :
datasources, virtualhost etc.
- Des mta-donnes telles le nom de lapplication et sa version. <?xml version="1.0" encoding="UTF-8"?>
Note: Le package doit toujours tre complet, avec lensemble des <udm.DeploymentPackage version="1.0-20140829-182124" application
lments. ="xldeploy-petclinic-tomcat">
w Un environnement sous la responsabilit des Ops. Il est caractris par : <deployables>
- Un ensemble decontainers,des lments dinfrastructure ou de <jee.War name="petclinic" file="PetClinic.war" />
middleware dcrits du point de vue du dploiement (machine, <jee.War name="petclinic-backend" file="PetClinic-Backend.war" />
serveur dapplication, serveur web, base de donnes...) sur lesquels <tomcat.DataSourceSpec name="petclinicDS">
on va dployer lapplication, <jndiName>jndi/pet</jndiName>
- Un ensemble dedictionnairesqui dcrivent la configuration <username>{{DATABASE_USERNAME}}</username>
appliquer. Exemple : username, password, rpertoire, ports, <driverClassName>com.mysql.jdbc.Driver</driverClassName>
placeholders remplacer dans les fichiers de configuration. <password>{{DATABASE_PASSWORD}}</password>
La seconde spcificit de XL Deploy est la gnration automatique des <url>{{DATABASE_URL}}</url>
plans de dploiement. Bas sur la spcification de ce dploiement (un </tomcat.DataSourceSpec>
package, un environnement, des dictionnaires), sur ltat initial (comme <tomcat.ConfigurationFolder name="configuration" file="config" />
une prcdente version dj dploye), et ltat cible (je veux dployer </deployables>
cette version sur cet environnement avec cette configuration), le moteur </udm.DeploymentPackage>
Autoflow de XL Deploy calcule et applique les diffrentes tapes
effectuer sur les diffrents middlewares afin de reflter le nouvel tat. La Le package doit tre indpendant de lenvironnement cible. Les
connaissance des actions effectuer est dfinie dans le serveur XL lments paramtrables sont dclars en utilisant un placeholder avec
Deploy sous forme de rgles de dploiement qui seront appliques quel le format mustache {{..}}. Dans lexemple ci-dessus le username, le
que soit lenvironnement (lensemble des quipes partage donc les password et lurl de la datasource sont respectivement grs par les
mmes rgles de dploiement). Une rgle sexprime de la faon placeholder DATABASE_USERNAME, DATABASE_PASSWORD et
suivante: si un lment du package est cr (modifi ou supprim) alors DATABASE_URL. En revanche le nom JNDI est le mme quel que soit
il faut effectuer les actions suivantes. lenvironnement; il peut donc y tre dclar dans le Manifest du
Exemple: si un fichier WAR cibl sur un serveur Tomcat est modifi, package.
alors il faut La structure du package est donc la suivante:
w Arrter le serveur Tomcat,
w Supprimer lancienne version du fichier WAR, PetClinic-Backend.war
w Dposer le nouveau fichier WAR, PetClinic.war
w Dmarrer le serveur Tomcat. configuration
XebiaLabs propose des ensembles des rgles prtes lemploi pour les config
principaux middleware Java (IBM WebSphere, Oracle Weblogic, Apache log4j.properties
Tomcat,RedHat JBoss), le monde Microsoft (IIS, BizTalk, Services petclinic-backend.properties
Windows), les serveurs Web, les bases de donnes, des ESB petclinic.properties
(WebSphere MQ, Oracle Service Bus, Tibco) et les load-balancers (F5, deployit-manifest.xml
NetScaler).
La dernire spcificit dXL Deploy est sa capacit se connecter aux Ce rpertoire est ensuite transform en une archive (.dar) et import
machines distantes en utilisant les protocoles standard (SSH dans le dans XL Deploy pour y tre stock dans son rfrentiel. Fig.1.

Dcembre 2014 > Programmez! 49


032_058-3c_180 18/11/14 16:11 Page50

Lapplication xldeploy-petclinic-tomcat version 1.0-20140829-182124 est analyser les lments modifis (par exemple un seul des 2 wars) et
devops

importe. Afin de faciliter la cration des packages et leur import dans gnrer le plan suivant.
XL Deploy, XebiaLabs propose des intgrations avec les outils de build Si en mme temps, le username de la datasource a t modifi dans le
tels que Maven ou MS-Build et les serveurs dintgration continue dictionnaire, XL Deploy va le dtecter et inclure la re-cration de la
comme Jenkins ou TFS. datasource dans le plan de dploiement Fig.6.
Lexcution de ces tches par le moteur XL Deploy consiste pour
Dfinition dun environnement chacune des tapes (Step) se connecter sur la machine distante en
Avant de dfinir lenvironnement cible, il faut dabord dcrire utilisant Ssh ou WinRM et excuter la commande comme le ferait un
linfrastructure (du point de vue du dploiement). Elle sera compose oprateur.
dun host test-machine type overthere.SshHost sur lequel est
install un serveur Tomcat tomcat.test type tomcat.Server et son Et mon intgration continue?
host virtuel par dfaut tomcat.test.vh type tomcat.VirtualHost Fig.2. Quel que soit le moteur dintgration continue choisi (Jenkins, Bamboo,
Ensuite il faut dfinir un dictionnaire qui portera les valeurs de TFS), les quipes ont la plupart du temps intgr une partie dploiement
configuration pour cet environnement. - appele la suite de la tche de Build- via lutilisation de script
Pour les donnes sensibles, XL Deploy propose un autre type de custom ou de plugins. Si effectivement cela remplit la fonction de
dictionnaire de type udm.EncryptedDictionary dans lequel le mot de dploiement, celle-ci nest pas utilise par lensemble des acteurs de la
passe de la datasource sera dfini. chane (de Dev Ops) et elle nintgre pas les spcificits des diffrents
Lenvironnement Test sera donc compos des 3 containers et des 2 environnements (changement de topologies) ou les besoins propres aux
dictionnaires qui viennent dtre crs. plateformes de production (exemple intgration de fonction de
sauvegarde ou de gestion des load-balancers). XL Deploy propose une
Dploiement dune application intgration avec les diffrents serveurs dintgration continue en
Le dploiement est la mise en relation entre une version dune proposant les fonctions suivantes: constitution du package de
application (xldeploy-petclinic-tomcat/1.0-20140829-182124) et un dploiement, import du package, et dclenchement du dploiement sur
environnement (Test). La phase de mapping va associer chaque lment lenvironnement idoine. Rapidement les quipes mettent en place du
du package sur un ou plusieurs containers de lenvironnement Fig.4. dploiement continu: le dveloppeur committe son code,
lintgration continue se dclenche et construit lapplication, lance les
Remarque: cette modlisation montre que le dploiement tests unitaires et dploie lapplication. De cette manire, la procdure de
concerne un artefact de type jee.War sur un container de type dploiement est teste plusieurs fois par jour cot Devs et elle est
tomcat.VirtualHost bien loin dune vision infrastructure o le fichier rendue plus robuste pour les quipes Ops qui dclencheront leurs
petclinic.war serait associ une machine test-machine. dploiements avec linterface graphique ou linterface ligne de
commande (CLI) via le mme outil.
Les proprits Url, Username et Password de la datasource XL Deploy est une solution transverse qui prend non seulement en
petclinicDS sont entirement configures avec les diffrentes valeurs charge le dlicat sujet du dploiement des applications mais permet
proposes par les 2 dictionnaires. galement aux quipes Devs & Ops de partager un vocabulaire commun
Bas sur cette spcification, XL (Environnement, Application, Version et Configuration avec les
Deploy va gnrer la tche de dictionnaires) et ainsi de crer entre les deux quipes une coopration
dploiement initiale suivante: efficace, qui est souvent une des
Fig.5. Lors dune mise jour avec cls de lapproche DevOps!
une nouvelle version, XL Deploy va u
Fig.2
Dfinition de l'infrastructure

Fig.5 Fig.1
Tache de dploiement initial Import d'un package dans XL Deploy

Fig.6
Tache de dploiement (War et Datasource modifis) Fig.3 Fig.4
Figure 3 Dfinition des dictionnaires
50 Programmez! < Dcembre 2014
032_058-3c_180 18/11/14 16:11 Page51

Mettez vos builds dans le Cloud

devops
avec Visual Studio Online
Visual Studio Online (Team Foundation Server en mode SAAS) prend de plus en plus ses
marques auprs des socits et des dveloppeurs indpendants. Sa "gratuit", sa facilit de
mise en place en font une solution de choix dans bien des contextes.
Jeremy LANDON install manuellement,
Fig.1
infinitesquare et donc ce mme
serveur sollicite une
Visual Studio Online offre entre autres: un machine. Pour une
contrle de source, un gestionnaire de projet, entreprise, le
un gestionnaire de test mais aussi un serveur problme peut ne pas
de build! Souvent dlaiss, le serveur de build se poser, mais pour
est devenu une plus-value norme lors de la un usage personnel,
ralisation dun projet informatique. Le but du limplmentation est
serveur de build? Permettre dautomatiser les tout de mme un peu
actions quaurait fait manuellement un lourde Avec Visual
dveloppeur, testeur et/ou oprationnel. Cela Studio Online ce
se traduit le plus souvent par de la gnration tracas est de lhistoire
dapplications (avec lancement des tests) ou ancienne.
du dploiement. Concrtement pour
chaque compte Visual
Des bnfices immdiats Studio Online ouvert Microsoft offre 60min de directement via Visual Studio, via du
Les builds peuvent tre lances manuellement, build gratuit par mois! On dispose d'un PowerShell en utilisant le SDK Azure, ou plus
frquence rgulire (pour du dploiement en serveur de build dans Azure qui nous simplement en ralisant une build! Chaque
environnement de dev par exemple?) ou en permettra de gnrer nos applications. 60min site Web Azure peut tre li un contrleur de
intgration continue ( chaque envoi de source par mois pour un indpendant a peut tre source (Visual Studio Online, GitHub,
sur le serveur par un dveloppeur), cette suffisant. Pour une entreprise, cela ne couvre BitBucket) Fig.1.
dernire devrait tre aujourdhui prsente sur la plupart du temps mme pas les besoins A quoi cela sert-il? En prenant le cas de Visual
la quasi-totalit des projets ! La mise en place journaliers! En effet les builds sont des Studio Online, il suffira de slectionner le projet
est simple, elle vrifie que lapplication ressources dites partages: cela signifie que le du site Web, et, automatiquement, Azure nous
compile, rpond aux exigences et dtecte les temps de build est consomm par lensemble crera une buildqui apparatra quelques
rgressions en lanant les tests et des dveloppeurs. Aprs les 60min, trois secondes plus tard dans la liste des builds du
potentiellement dploie directement dans un possibilits soffrent nous: projet. Cette build sera :
environnement de test! La plus-value est w Attendre le mois suivant pour raliser vos w En intgration continue,
colossale et au vu de la facilit builds, w Prconfigure,
dimplmentation dans un cadre de w Passer sur un serveur de build on-premise, w Prte lemploi! Fig.2
vrification, il serait vraiment dommage de sen w Passer en mode payant en tant factur la En bref, raliser une build pour un site sur
priver! minute de build pour s'adapter aux besoins Azure est dune simplicit enfantine, il y a
de chacun. dsormais aucune excuse pour ne pas en
Une solution On laura compris, cette solution offerte par faire!
adapte pour tous Visual Studio Online nest pas favorable dans
Aprs avoir compris lutilit davoir un serveur tous les cas. Heureusement Microsoft laisse Gagnez en efficacit
de build, il faut dsormais en possder un. De de la libert et cette machine de build reste Avec Visual Studio Online, Microsoft tend le
manire gnrale, le serveur de build est optionnelle, il est tout fait possible principe du SAAS son maximum
dutiliser son propre serveur de build (plac en nous offrant une machine de build dj
dans Azure par exemple?) qui sera mapp sur prte lemploi.
notre compte Visual Studio Online. Microsoft comme son habitude offre une
synergie maximale avec ses autres outils, et la
Dployer sur Azure naura gnration de build de dploiement pour les
jamais t aussi simple sites Web Azure est d'une efficacit
Azure nous propose de pouvoir se redoutable. Productivit, qualit et confort sont
provisionner de la ressource en quelques donc au rendez-vous facilement et surtout
minutes et selon nos besoins. Entre autres, il rapidement, alors aucune raison de sen
propose de fournir des sites Web directement priver!
Fig.2 prts lemploi. Il suffit de le dployer : u

Dcembre 2014 > Programmez! 51


032_058-3c_180 18/11/14 16:11 Page52

DevOps avec Visual Studio, Azure, TFS, VSO


devops

Les processus de dveloppement de logiciels voluent constamment pour sadapter aux nouvelles
contraintes de chacun. Ces volutions passent par des nouvelles mthodologies et des nouveaux
outils ayant pour but daider et amliorer la qualit et productivit des trois acteurs dun projet de
dveloppement logiciel savoir le mtier, le dveloppement et loprationnel.

Vivien FABING chaque composante dune organisation doit besoins de chacun: la rapidit pour le
Jrmy LANDON collaborer efficacement afin datteindre un dveloppement tout en maintenant une bonne
Consultants ALM mme objectif. La dmarche DevOps est stabilit. Pour ce faire trois piliers sont mis en
venue dun constat: la communication et la avant:
w Le mtier, dont le rle est dapporter une collaboration sont lune des cls de russite w Linfrastructure-as-code: le but est de coder
rponse une problmatique ou un besoin dun projet, et la sparation entre le la cration des infrastructures, cette
utilisateur, dveloppement et loprationnel tait souvent industrialisation permet dobtenir des tches
w Le dveloppementdont la mission est dans la source dchecs. rptables facilement (ex: cration dun
un premier temps de rpondre au plus vite DevOps est aujourdhui un mouvement, une environnement de test), d'amliorer la
aux demandes du mtier, tout en gardant culture et une extension des dmarches agiles productivit et la fiabilit.
une bonne qualit de livraison (fonctionnelle ayant pour objectif dobtenir une cohsion du w Livraison continue: pour apporter au plus
et technique). Cela passe par des livraisons systme dinformation sur les besoins de vite de la valeur ajoute aux produits et
frquentes de nouvelles fonctionnalits, lentreprise. Concrtement, l o les diminuer le Time-To-Repair (TTR: dlai de
w Enfin, les oprations, qui mettent en place le dmarches agiles tentent de concilier le mtier rparation dun dysfonctionnement) par un
dveloppement en production pour rpondre et le dveloppement vers un mme discours et principe simple: plus un bug est dcouvert
au besoin mtier initial; elles garantissent la objectif, DevOps a pour objectifs damliorer la tt, plus il sera simple corriger.
stabilit et la disponibilit du produit. communication et la collaboration entre le w Collaboration: donner accs chacun
La communication tant lune des cls de la dveloppement et loprationnel. Cet objectif diffrentes donnes qui leur seraient utiles.
russite dun projet informatique, ces trois est atteint par lutilisation de nouveaux outils, Ex: fournir rapidement et sur demande une
acteurs sont (ou devraient tre) en d'une meilleure communication et infrastructure de test tout en matrisant les
communication permanente. Malheureusement collaboration. cots, ou encore accder facilement aux
avec trois quipes compltement diffrentes et rapports derreurs pour dveloppement.
trois langages propres et parfois uniques, des Dveloppement/Oprationnel: Tout comme la dmarche Agile, la dmarche
frontires naturelles se crent empchant une un objectif final commun, mais DevOps repose sur diffrents outils, mais
bonne communication et une bonne des cultures diffrentes. surtout sur une acceptation aux changements
comprhension des besoins de chacun. Le problme de collaboration et de des diffrents acteurs. Il peut tre compliqu
Les consquencessont multiples et parfois communication entre le dveloppement et et couteux de faire une chane DevOps par soi-
dsastreuses dans un projet informatique: loprationnel est connu et rcurrent, mais mme.
w Un dveloppement qui ne rpond plus au finalement logique. La gamme Visual Studio ALM propose dj
besoin du mtier, Le rle du dveloppement est de livrer de beaucoup doutils depuis 2005, notamment
w Un dveloppement qui se soucie peu de la nouvelles fonctionnalits, maximiser le pour fluidifier la communication Mtier >
production, changement et innover: pour ce faire la dveloppeurs > testeurs. En 2014, voici les
w Des retours des oprations rarement rponse aux exigences et souvent faites par la nouveauts pour mettre en place rapidement
complets pour le dveloppement, production dun livrable qui na pas et efficacement une dmarche DevOps!
w Une vraie difficult crer des cycles de connaissance des contraintes oprationnelles.
dveloppement fluides, Loprationnel cherchera quant lui plutt DevOps et lAgilit
w Une mise en production tardive ou bancale obtenir une stabilit et limiter les risques (toute De nos jours, lorsque lon est confront au
La liste est malheureusement encore longue. nouveaut est un risque prendre en compte). dveloppement dun logiciel informatique, il est
Pour pallier en partie ces problmes, les Les deux cultures sont opposes et crent des devenu quasi impossible de ne pas avoir
dsormais trs populaires mthodes agiles conflits: si le dveloppement ralise des entendu parler des mthodes agiles.
sont apparues. Celles-ci permettent, entre changements, loprationnel tentera de les DevOps est quant lui un terme plus rcent,
autres, une meilleure communication entre le minimiser pour limiter le risque dinstabilit. Un mais qui commence petit petit se faire sa
mtier et le dveloppement, mais pour la conflit d la volont de combler les besoins place parmi les concepts fondamentaux
communication entre le dveloppement et de chacun, mais qui, au final, empche le bon amliorant le cycle de vie du dveloppement
loprationnel il y a DevOps! droulement de lobjectif commun. Car dune application.
finalement dveloppement et oprationnel Inutile de tergiverser indfiniment, ces 2
QUEST-CE QUE partagent le mme objectif: fournir une concepts sont loin dtre incompatibles et lon
DEVOPS? solution stable et fonctionnelle, le tout dans un pourrait mme dire quils sont deux des
Le terme DevOps (contraction des mots dlai imparti. En bref, satisfaisante et chanons dune suite logique visant amliorer
Dveloppement et Oprations) est apparu en rpondant au mieux au besoin du client final. la qualit dun logiciel.
2009. Cest avant tout une ide selon laquelle DevOps a pour objectif de rpondre aux

52 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page53

Dans la continuit de lAgilit production. Que faire lorsquun incident arrive pertinents pour les dveloppeurs Fig.2.

devops
Lagilit sefforce de mettre tout en uvre en production? Quelles informations Grace lintgration de TFS dans SCOM,
dans un seul et unique but: la satisfaction du possdent les dveloppeurs? Et comment Microsoft offre un moyen de communication
client. dtecter lincident? Microsoft apporte une entre le dveloppement et loprationnel
Pour cela, lexprience montre que ladoption solution pour rpondre ces questions: simple et efficace. Cette fonctionnalit est
de cycles de dveloppement courts permet de System Center Operations Manager et aussi disponible pour les applications Java.
rduire le dlai entre le moment o une Application Insights. Avec SCOM, les bugs sont dtects plus vite,
fonctionnalit est dveloppe, et le moment o signals tout aussi rapidement; le
le client constate son bon fonctionnement. La System Center Operations dveloppement profite de la signalisation
rduction de ce dlai vite le malheureusement Manager (SCOM) : la rapide pour corriger le bug plus facilement,
bien connu effet tunnel qui prend souvent la communication entre IT et loprationnel profite de cette remonte pour
forme dune priode de dveloppement de dveloppeurs avoir une application toujours plus stable. En
plusieurs mois voire annes, aboutissant SCOM est un outil destin aux IT offrant une bref tout le monde profite de SCOM et de sa
gnralement un cart entre ce que lquipe surveillance de performance et dvnements synergie parfaite avec TFS. Dans la mme
de dveloppement aura construit et ce que le de systmes Windows. Gce SCOM, lIT optique Microsoft a sorti en Novembre 2013
client imaginait initialement. peut savoir tout moment quand une Application Insights (uniquement pour Visual
Cependant, ladoption de ces cycles de application subi un dysfonctionnement et Studio Online).
dveloppement courts augmente galement la suivre diffrentes donnes de performance sur
frquence dexcution de phases qui celle-ci Fig.1. Application Insights: tracer
auparavant ne ncessitaient dtre excutes Le point fort des solutions Microsoft est la son application pour une
quune ou deux fois: La phase de recette synergie quelles apportent les unes aux meilleure ractivit
(tests), et la phase de mise en production autres. A la dtection dun dysfonctionnement, SCOM est capable de tracer les diffrents
(dploiement). lIT peut en quelques clics envoyer directement incidents de notre application, mais la
Ces deux phases taient ralises un rapport (Work Item de type Operationnal dpendance loprationnel est forte.
manuellement, gnralement par une poigne Issue) aux dveloppeurs via Team Foundation Comment avoir un suivi temps rel des
de personnes ddies voire une petite quipe. Server (de faon totalement transparente)! Le incidents en environnement de production
Dans le cas de la phase de dploiement, Work Item cr contiendra entre autresun sans impacter les performances?
loprateur devait bien souvent suivre un rapport derreurs auto gnr (exception, Cette tche nest pas simple mettre en place
processus dtaill sous forme de heure, application cible ect.) mais surtout sans outils appropris.
documentation. Cette opration savre bien lIntellitrace! Pour rappel, lintellitrace permet Bien sr chaque projet est accompagn (ou
souvent longue, fastidieuse et conduit de de rcolter diffrentes informations durant devrait tre accompagn) de son log applicatif,
nombreuses erreurs (erreurs manuelles, lexcution dun programme dont lhistorique faut-il encore pouvoir accder simplement
changement de processus de livraison non dexcution, permettant ainsi au dveloppeur ces logs qui sont trs gnralement dans un
notifi aux oprateurs, etc.). de se retrouver dans le mme contexte (valeur environnement accessible seulement par
Dans un contexte Agile o il faut drouler cette des diffrentes variables, liste des exceptions, loprationnel, et disposer dun contexte de
phase toutes les 2 semaines voire toutes les call stack dtaille) que lors de la leve de reproduction simple.
semaines, comment rduire le temps de lexception. Application Insights a pour objectif de mettre
dploiement et les risques dus au caractre Nanmoins la collecte dinformation par disposition les incidents de production, mais
manuel de laction? Une seule solution: Intellitrace a un cot non ngligeable sur les cette fois-ci directement aux dveloppeurs.
lautomatisation. Cest particulirement sur performances dune application, cest Des solutions existent pourtant dj, lune des
cette plateforme commune dautomatisation pourquoi cette fonctionnalit est dsactivable: plus populaires tant BugSense.
que vont pouvoir se retrouver dveloppeurs et Monitoring -> Tasks -> Start/Stop Intellitrace L o Application Insights se dmarque, c'est
oprateurs: automatisation de la remonte Collection, permettant ainsi de reproduire un quil ne se contente pas dun simple log
dinformations, automatisation du processus bug dans un laps de temps rduit afin de ne derreur, mais il peut tout aussi bien fournir
de dploiement, etc. pas affecter tous les utilisateurs. Lenvoi du lIntellitrace !
rapport de bugs ajoute le suivi dtat des En dehors de a, Application Insights propose
DU SUIVI POUR alertes, lIT devient (sans sen rendre compte) galement dautres fonctionnalits
PLUS DE MATRISE dsormais un
Le principal manque defficacit dans la signaleur de
collaboration entre le dveloppement et dysfonctionnement
loprationnel est li la rcolte dincidents de des plus efficaces et

Fig.1

Fig.2
Dcembre 2014 > Programmez! 53
032_058-3c_180 18/11/14 16:11 Page54

intressantes qui taient jusque-l manquantes Server, Ubuntu, CentOS, Oracle et mme LIT Pro charg de grer un abonnement va
devops

dans loutillage Microsoft telles que les des machines avec Visual Studio 2014 (pour donc faire le ncessaire pour simplifier la
analyses de disponibilit ou les statistiques tester le nouveau Visual Studio sur sa tablette cration et la reproduction denvironnements
dutilisation. par exemple?). Un gros avantage galement de dveloppement, test, production, souvent
Pour les analyses de disponibilit, il est est que Microsoft offre avec tout abonnement en crant ses propres scripts. Les ressources
possible en quelques clics de configurer MSDN de 75 (MSDN Premium) 115 informatiques pour faire tourner les
Application Insights pour surveillerune (MSDN Ultimate) de crdit sur Azure. De quoi applications devenant ainsi une simple
application Web. Application Insights va ainsi, raliser sans restriction plusieurs tests. Une configuration.
intervalles rguliers, effectuer plusieurs charge en moins pour loprationnel et un Un des piliers de DevOps tant linfrastructure-
requtes sur lapplicatif et enregistrer le temps bonheur pour les dveloppeurs qui ont un as-code, il devient trs intressant de raliser
de rponse, proposant ainsi dans le temps des environnement sans aucune connaissance IT du scripting pour des tches redondantes, ou
graphiques danalyses de performances. et en un claquement de doigt. voues tre automatises. Microsoft fournit
Application Insights est disponible pour les Pour le dveloppeur, lutilisation du Cloud est un SDK PowerShell permettant de jouer avec
applications .NET (Asp.net, Windows 8, de plus en plus simplifie, avec une gestion toutes les fonctionnalits du service.Le SDK
Windows Phone) et Java! des ressources Azure directement depuis est disponible sur azure.microsoft.com, un
Pour les statistiques dutilisation, Application Visual Studio, sans jamais se connecter sur le petit dexemple dutilisation avec la cration
Insights propose un SDK qui permet dintgrer portail Azure et avec des connaissances trs dune machine virtuelle: Fig.3.
des marqueurs dans un applicatif Web, une rduites sur Azure. Simple, court, comprhensible facilement,
application Windows 8 ou une application Par exemple, dployer un applicatif Web cest tout ce quon demande un bon SDK.
Windows Phone. Ces marqueurs soccupent sur un serveur de dveloppement IIS dans Grace Azure, lIT se retrouve facilement avec
danalyser dans le dtail lutilisation de Azure peut seffectuer en quelques clics une charge en moins sur les paules, et la
lapplicatif et de proposer des informations depuis Visual Studio 2013/2014 grce la puissance et la flexibilit dAzure leur facilite
dtailles dans linterface danalyse centrale. notion de Website Azure. grandement la gestion de leurs
Par exemple, pour une application mobile, les Azure nest pas rserv quaux dveloppeurs, environnements.
informations rcoltes sont trs nombreuses: lIT y trouve aussi un grand avantage: besoin
nombre dutilisateurs, dtail des pages vues, dun environnement de test pour dployer en Release Management:
chemin de navigation des utilisateurs, intgration continue, sans pour autant acheter lorchestrateur de livraison
fidlisation des utilisateurs (combien de temps une nouvelle machine? Un administrateur Lun des principaux buts du mouvement
avant quun utilisateur revienne sur systme a la possibilit de provisionner la DevOps est lindustrialisation du processus de
lapplication), type, langue et version du demande, en quelques minutes, un nouvel livraison pour permettre de gagner en
tlphone utilis, mode de connexion (Wifi, environnement compos dune ou plusieurs productivit et en qualit. Auparavant, il
GSM, offline car les traqueurs fonctionnent VM. Avec un peu de scripting, cet nexistait pas de solution Microsoft pour
en offline et consolident la dcouverte du environnement peut mme tre configur pour rpondre ce besoin, dsormais il y a Release
rseau). ne rester actif que dans les priodes de temps Management! Mais avant de parler du produit,
pour lesquelles lquipe lutilise, et tre par quest-ce que Release Management?
Azure: plus de souplesse exemple teint automatiquement la nuit, le Release Management est la gestion des mises
pour tous week-end et tout simplement quand le projet en production, il a pour but de planifier les
DevOps, cest aussi la possibilit de disposer est termin. dploiements dapplication tant sur le plan
plus simplement et plus rapidement Enfin, besoin de reproduire temporairement un matriel que logiciel. Release Management
denvironnements de dveloppement ou de environnement de pr-production compos de peut tre quelque chose de vaste et complexe
tests pour reproduire la production, ou nombreuses machines pour reproduire un mettre en place sans outil.
simplement pour dvelopper. incident de production? Azure et le Cloud Heureusement des solutions existent et
Aujourdhui, disposer rapidement dun permet de disposer de ressources illimites de gagnent en maturit danne en anne.
environnement de dveloppement ou de test manire phmre, sans doubler son Release Management nest pas quun outil, il
nest pas une mince affaire. Sauf quelques investissement initial en termes de machines implique aussi une nouvelle faon de grer la
exceptions, les dlais IT pour commander et physiques. livraison de son projet informatique. Qui est
mettre en place un environnement de
dveloppement sont souvent consquents. Fig.3
Cela est normal, le dveloppement a besoin
dune machine phmre, et lIT a besoin de
rationnaliser et matriser les cots.
Cest l o le Cloud, apporte de la souplesse Fig.4
intressante au dveloppement et
loprationnel.
Besoin dune machine virtuelle pour tester une
fonctionnalit sur un serveur SharePoint?
Azure est capable de fournir ce genre de
ressource en lespace de quelques minutes
voir secondes. Azure propose, de base,
diffrentes images de machine: Biztalk, SQL

54 Programmez! < Dcembre 2014


032_058-3c_180 18/11/14 16:11 Page55

concern par Release Management? La logicielle et permettra coup sr damliorer la qui sadresse cet outil?

devops
rponse est : tout le monde. qualit de vos processus de dploiement avec La quasi-totalit des applications sont
Exemple avec un cas simple, mais pourtant simplicit et efficacit. concernes par les besoins auxquels rpond
trs frquent,compos dun environnement de Release Management fonctionne avec Team Release Management. Toute application a
dveloppement, un autre de Quality Foundation Server 2010, 2012 et 2013; il besoin de tests, dtre valide par plusieurs
Assurance, et, enfin un dernier de production. permet de faon simple et entirement intervenants, des intervenants avec diffrents
Chacun de ces environnements possde ses personnalisable demodliser et raliser les profils, le tout bien orchestr et suivi
propres contraintes de dploiement. processus de livraison, ainsi que deffectuer pour viter les erreurs humaines et avoir
Lenvironnement de dveloppement naura des suivis dapprobation adapts chaque du reporting.
que peu de contraintes sur le systme de phase de livraison. Release Management est aujourdhui une
backup mis en place, contrairement Ces processus sont semblables au Workflow valeur sre pour grandement amliorer la
lenvironnement de production. standard, et sont donc faciles prendre en collaboration et la fluidit du dploiement des
Par ailleurs, un systme permettant de garder main. Avec Release Management il est donc applications.
une disponibilit doit tre mis en place lors de ais dadapter son processus de dploiement
la migration sur la production. en fonction de lenvironnement cible (backup, Conclusion:
Toutes ces tapes dans la livraison possdent chaines de connexions, plateforme de Dans la pratique,
leurs contraintes et leur propre workflow de dploiement etc.). Le but final tant est-ce que DevOps
dploiement. dautomatiser au maximum le processus de va rvolutionner ma vie?
Elles possdent aussi leurs propres critres de livraison afin de gagner en productivit et en Aprs lAgile, DevOps. Derrire ce mouvement,
validation et leurs propres validateurs. Il y a fiabilit. toujours le mme objectif : gagner en
donc beaucoup de contraintes et de variables La solution Release Management est collaboration et en communication pour fournir
pour assurer une bonne automatisation dcompose en 3 modules distincts savoir: toujours plus de qualit. Le mouvement
de la livraison. w Un agent de dploiement: Release DevOps est encore jeune, mais a dj ces
Un orchestrateur devient donc vite Management Agent, principes bien ancrs.
indispensable pour fournir une livraison stable w Un client WPF pour modliser les processus Joignant processus et outillage, DevOps tend
et surtout modulable et volutive Fig.4. de livraison via un systme trs proche de la devenir un standard dans la ralisation des
Release Management est issu du produit ralisation de Workflow. Et une interface Web projets informatiques.
InRelease, une solution dveloppe par la pour interagir avec la requte dapprobation Nanmoins, tout comme lAgile, loutillage ne
socit InCycle. La solution a t rachete par mise en place: Release Management Client, fait pas tout; il est mme inutile sans un
Microsoft courant 2013 afin den faire son w Le point central de Release Management, changement de mentalit et de faon de
produit de rfrence pour la mise en uvre contenant la base de donnes SQL exposant travailler.
des scnarios de livraison. diffrents services utiliss par les autres Aujourdhui les outils sont disposition:
Disponible depuis lanne dernire, le nouvel composants: Release Management Server. complets, simples et abordables. Le DevOps
outil Release Management for Visual Studio a Chacun des modules tant indpendant, la est porte de main! Lancez-vous!
probablement sa place dans votre usine nouvelle solution de Microsoft se veut flexible. u

Pr-requis pour russir la mise en oeuvre


dun processus de Continuous Delivery
Cyrille Le Clerc, continuous delivery sont infiniment plus contraintes rglementaires et oprationnelles, il
Product Manager, CloudBees importants. Aux yeux de la plupart des existe aujourdhui un certain nombre de
entreprises, le continuous delivery ne ncessite bonnes pratiques permettant de progresser
que ladaptation et lextension des processus dans des conditions optimales.
Actuellement, les entreprises se montrent de de dveloppement logiciel existants. Or, les Voici donc 7 prrequis que les entreprises
plus en plus sduites par la mthodologie de rles, les relations et les responsabilits des devraient prendre en compte pour russir leur
continuous delivery (livraison continue) qui individus de lentreprise peuvent tre transition vers le continuous delivery.
permet de disposer de manire immdiate de impacts. Les outils utiliss pour livrer, mettre
logiciels de qualit. Le continuous delivery, jour et maintenir les logiciels doivent tre Sassurer que les quipes
dont la particularit est de maintenir
constamment le logiciel prt la mise en
production, peut tre considr comme une
capables de supporter parfaitement
lautomatisation et la collaboration, tout en
rduisant au minimum les dlais et assurant la
1 de dveloppement,
dassurance qualit et de
production communiquent
volution naturelle des pratiques dintgration diffusion de cycles de feedback rigoureux au entre elles et ont dfini des
continue et de dveloppement logiciel agile; sein de lentreprise. Mme si de tels objectifs communs
cependant, les enjeux culturels et changements peuvent constituer un enjeu de Alors que lintgration continue ne concerne
oprationnels lis la mise en uvre du taille pour les entreprises soumises des que les dveloppeurs, le continuous delivery

Dcembre 2014 > Programmez! 55


032_058-3c_180 18/11/14 16:11 Page56

adresse les phases de test ralises par les dautomatisation devraient tre grs dans des restauration de snapshots des donnes),
devops

responsables dassurance qualit et les rfrentiels de code source partags, de w La possibilit de lire, rechercher et crer des
dploiements vers les environnements de manire ce que chaque quipe alertes sur les logs des applications.
prproduction et de production grs par les dveloppement, assurance qualit et Les plateformes de Cloud public, et en particulier
responsables oprationnels de production. production puisse amliorer les outils et les les plates-formes IaaS et PaaS sont des
Ceci constitue une volution majeure du procdures. Les mcanismes tels que les Pull exemples de plates-formes project friendly.
dveloppement logiciel et, pour russir la Requests (c. f. GitHub) peuvent aider la
transformation dune plate-forme dintgration gouvernance de ces outils et scripts partags. Garantir que les versions
continue en plate-forme de continuous
delivery, il est essentiel dassocier sa Rendre les applications 7 dapplications sont prtes
entrer en production
gouvernance les quipes dassurance qualit
et les quipes de production autant que les
dveloppeurs. La collaboration et la
5 production friendly pour
les quipes dexploitation:
pour des dploiements sans stress
Lun des principaux objectifs du continuous
delivery est de permettre au product owner de
dcider de dployer en production toute
communication sont aujourdhui des Les procdures de dploiement et de rollback version de lapplication qui a pass avec
composantes essentielles dun dveloppement des applications devraient tre simplifies de succs le processus de continuous delivery
logiciel russi et dans un environnement de manire ce que le dploiement en production et pas uniquement les versions livres la fin
continuous delivery, elles jouent un rle devienne un non-vnement. Une tape-cl de chaque itration, identifie par un numro
central. pour y parvenir est de rduire le nombre de de version lisible par les humains. Atteindre
composants et de paramtres de configuration cet objectif ncessite un certain nombre de
Implmenter lintgration dploys. La facilit des rollbacks est changements dans la manire dont

2 continue avant dentamer la


phase de continuous
delivery
essentielle pour que les quipes soient plus
audacieuses dans leur dploiement de
nouvelles fonctionnalits; en cas de problme,
lapplication est conue:
w Les fonctionnalits nayant pas encore t
valides par les quipes dassurance qualit
Le continuous delivery est une extension de il suffit de revenir en arrire. Les feature ne devraient pas tre montres aux
lintgration continue. Ainsi un prrequis pour toggles activation de fonctionnalits par utilisateurs finaux. Les patterns de feature
aborder le continuous delivery consiste configuration aident dcoupler le toggles et de feature branches sont deux
sassurer que lintgration continue est dj en dploiement de binaires de lactivation des moyens de le faire.
place et oprationnelle, avec la gestion du fonctionnalits: un rollback peut alors w Les outils de build devraient voluer pour
contrle de source, les builds automatiss et simplement tre ralis par la dsactivation passer du concept de versions smantiques
les tests unitaires du logiciel. dune fonctionnalit, grce un paramtre de (e.g. 1.3.6) spares par des versions
configuration. Il est important de bien matriser snapshot intermdiaires non identifies (e.g.
Automatiser tout ce qui les volutions des schmas de bases de 1.3.7-SNAPSHOT) un concept flot de

3 peut ltre
Le continuous delivery implique la
rptition automatique de nombreuses tches
donnes, car ceci peut rendre les
dploiements et les rollbacks beaucoup plus
complexes. Le modle de design schema-less
versions non smantiques, mais chacune
uniquement identifie pour permettre de
dployer en production nimporte laquelle de
telles que la cration dapplications et de des bases de donnes NoSQL offre une ces versions. Subversion aide mettre en
packages, le dploiement des applications et grande flexibilit en transfrant la uvre ce concept grce ses numros de
des configurations, la rinitialisation des responsabilit du schma de la base de versions ordonns. Git rend la tche plus
environnements et des bases de donnes. donnes vers le code. Ce concept peut aussi complexe cause de ses hashs de commit
Avec le continuous delivery, toutes ces tches tre appliqu aux bases de donnes non ordonns; un outillage peut aider rendre
devraient tre automatises avec des outils et relationnelles traditionnelles. ces identifiants de version plus
des scripts et gres sous gestion de version lisibles pour les humains.
permettant que chaque tape puisse tre Rendre linfrastructure
audite et reproduite.

Faire partager les outils et


6 project friendly:
responsabiliser les individus
et les quipes
Conclusion
De tout ce qui prcde, on comprend que
continuous delivery est bien plus quun simple

4 les procdures par toutes


les quipes
Le continuous delivery vise valider les
Les infrastructures devraient fournir tout
loutillage (les GUIs interfaces graphiques),
les APIs (interfaces de programmation
ensemble doutils en fait, cest un processus
qui a un impact sur les individus et sur la
culture de lentreprise.
procdures et lautomatisation du dploiement dapplications) et les SDK (kits de La technologie, les individus et les processus
utilises dans lenvironnement de production. dveloppement logiciel) ainsi que la doivent saccorder pour que la mise en uvre
Pour atteindre cet objectif, ces procdures et documentation ncessaire pour responsabiliser du continuous delivery russisse dans une
ces automatisations doivent tre utilises le les quipes de dveloppement et dassurance entreprise, une approche collaborative tant
plus tt possible, de manire ce quelles qualit, et leur permettre ainsi de travailler en lune des conditions essentielles du succs.
aient t testes fond lorsquelles seront toute autonomie. Parmi ces tches figurent: Ces sept prrequis constituent de bonnes
utilises pour dployer le logiciel en w Le dploiement de la version de lapplication pratiques qui vous conduiront avec succs sur
production. La plupart du temps, les mmes de leur choix dans un environnement Donn, la voie du continous delivery.
outils peuvent tre utiliss dans tous les w La gestion des paramtres de configuration
environnements, cest--dire lintgration, la (lecture, modification, export, import),
prproduction et la production. Les scripts w La gestion des bases de donnes (cration et u

56 Programmez! < Dcembre 2014


57 abonne2-180_180 18/11/14 08:47 Page57

j
T j
Offre Spciale Ftes
c 1 an de Programmez! (11 n) i
d+ Cl USB Programmez!
T c
d
(tous les n depuis le n100)

+ Accs aux archives


+ Les anciens numros papier disponibles

TOUT pour

112,90*

79**
08-22-13 esenkartal

* prix selon les stocks des


numros disponibles
** tarif valable uniquement
Offre spciale valable
pour la France mtropolitaine jusqu'au 31 janvier 2015.

Toutes nos offres sur www.programmez.com


ABONNEMENT retourner avec votre rglement

Oui, je profite de l'offre Spciale Ftes Service Abonnements PROGRAMMEZ,


4 Rue de Mouchy, 60438 Noailles Cedex.

n Abonnement 1 an au magazine + Cl USB + Accs aux archives + Les anciens numros papier disponibles

n M. n Mme n Mlle
Offre limite, valable jusquau 31 janvier 2015

Entreprise : I___I___I___I___I___I___I___I___I Fonction : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I


PROG 180

Prnom : I___I___I___I___I___I___I___I___I___I___I___I___I___I Nom :I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Adresse : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Code postal : I___I___I___I___I___I Ville : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Tl : I___I___I___I___I___I___I___I___I___I___I___I___I (Attention, e-mail indispensable pour les archives sur internet)


E-mail : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I @ I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I
n Je joins mon rglement par chque lordre de Programmez ! n Je souhaite rgler rception de facture * Tarifs France mtropolitaine
032_058-3c_180 18/11/14 08:50 Page58

Epilogue :
devops

entre syndrome push to prod et DevOps ma tuer


syndrome et ne plus forcment envoyer en (cellule qualit, testeurs). Lacclration de la
Le DevOps peut tre vu comme
dploiement / production le projet dun coup. publication des logiciels et des diffrentes
une ultime volution des Mais au contraire, tre sur une approche au versions bouleverse le modle traditionnel de
mthodes agiles, de la gestion du fil de leau, bref en mode continu. Fini les dveloppement (que ce soit le dveloppement
cycle de vie et en cherchant frontires tanches entre le dveloppement, le en V ou en agile). Le dveloppeur, cause du
dploiement, la production. Fini (ou presque) la rythme toujours plus lev et des agendas de
rapprocher le dveloppeur, de
notion de release. Pour arriver cette plus en plus serrs, assume de plus en plus de
lexcution, du dveloppement extrmit, la notion de DevOps, de rles(dveloppeur, qualit logicielle,
continu, du dploiement continu dveloppement continu doit tre pouss responsable de release / version). Jeff
et de la fin de la version. Mais lextrme comme on peut lavoir dans des rapproche cette frnsie de charger la barque
projets cloud, Netflix, Facebook, Twitter, etc. des responsabilits du dveloppeur la notion
comme vous lavez lu dans ce
Ce sont des centaines de releases de code de dveloppeur full-stack qui fait tout! Les
dossier, pour atteindre le Graal du qui sont faites chaque anne gants du web, les startups ont favoris
DevOps, il faut lADN. Mais tous DevOps peut donc tre un moyen dviter le lapparition de ce dveloppeur full-stack. Mais
les niveaux, que vous soyez seul syndrome push to prod (dautres mthodes le contexte nest pas le mme. Dans une
le permettent aussi, comme dit plus haut). startup, les ressources sont souvent limites.
ou en quipe, il est possible de
Mais faut-il faire de mme dans les grandes
mettre en uvre du DevOps, DevOps va-t-il tuer quipes? Pas sr. Jeff conclut ainsi: laissez
aussi bien dans les mthodes que le dveloppeur? les dveloppeurs crire du code!
les outils. Mais attention aussi ne Le dveloppeur doit rester dveloppeur. Donc, Que lon soit daccord ou non, notamment sur
il doit continuer coder, faire ce quil sait les arguments avancs, avec Jeff, cette
pas tomber dans le DevOps
faire. Il peut intgrer dautres comptences et rflexion est importante. Il faut pouvoir trouver
marketing et de mettre du DevOps profils en dehors de la technique mais ces un juste milieu. Mais il ne faut pas croire que
sur tout et nimporte quoi. lments ne doivent pas supplanter le code. DevOps va tout rsoudre et quil est adapt
Par contre, oui, connatre les processus de tout. Le risque (rel) est que les entreprises,
Utilisez-vous des pratiques dploiements, de productions sont des plus les SSII, etc. ne jurent que par DevOps et
DevOps? et tre ainsi plus ractif et comprendre ce quil limposent partout, pour tout, au risque de
Chaque jour ou presque: 28 % se passe aprs le codage. surcharger le dveloppeur qui passera de
Uniquement quelques outils: 10 % Jeff Knupp, dveloppeur python, a publi un moins en moins de temps coder.
Cest quoi?: 62 % post trs intressant sur son blog DevOps ne doit pas tre une obsession ni un
(sondage express Programmez! / novembre 2014, 100 votes) (http://goo.gl/fuVWV9). DevOps est loccasion de objectif absolu. Il peut cependant vous aider
rapprocher dveloppeur, les responsables des mieux structurer les dveloppements, le cycle
Si le terme DevOps est partout, la preuve en 1 oprations (dploiement, production de vie des applications, amliorer les
an, nous avons publi deux dossiers et un livre notamment), et les responsables qualits pratiques en quipe. u
blanc sur ce sujet, ce nest pas pour autant
que le dveloppeur le comprend ou lutilise. DevOps a besoin de devenir une bonne pratique dans votre
Vous tes 62 % vous demander ce que cest entreprise si vous voulez russir dans la nouvelle conomie
et ce quil y a derrire ce mot. Mais comme oriente application
DevOps a une approche trs modulaire, vous Voil une phrase choc du rapport How to survive and thrive in the application economy,
pouvez faire du DevOps (tout du moins une publi en septembre 2014 par lditeur CA. Selon ce rapport, DevOps acclre la
approche la DevOps) sans le savoir disponibilit (des applications), amliore la qualit des applications. Selon cette tude, les
rellement. Il y a un dcalage important entre entreprises franaises sont en retard dans lconomie des applications. Cette tude voque
les entreprises et les quipes techniques et de un chiffre tonnant 95 % des entreprises franaises planifient actuellement la mise en
production qui lutilisent et les autres (PME, application de lapproche DevOps afin dacclrer la livraison dapplications. Nuanons ce
indpendants, tudiants, etc.). rsultat car ltude porte sur 13 pays dont la France et 1425 personnes interroges
(responsables informatiques et mtiers). Dautre part, nous ne croyons pas que 95 % des
Et si on dpassait le syndro- entreprises savent ce quest DevOps et nombre dentre elles ne savent mme pas que cela
me push to prod existe. Peut-on dire que DevOps est la mode comme leXtreme Programming ou Scrumm
En tant que dveloppeur,vous avez sans ltait il y a quelques annes?
doute dj vcu cette peur quand il sagit de Lisez cet article trs pertinent chez OVH et comment DevOps est utilis au quotidien:
dployer, de passer le projet que vous avez https://www.ovh.com/fr/a1075.devops-profil-pointu-poste-ovh
cod, en production Ah le push to prod. Quelques lments cls de cet article:
DevOps, lintgration continue, le DevOps est cheval entre ces deux mondes (dveloppeurs, sysadmins)
dveloppement continu, le dploiement Un devops est capable de dvelopper et dadministrer. Cest un dveloppeur oprationnel.
continu doivent justement viter ce

58 Programmez! < Dcembre 2014


059_060_180 18/11/14 01:06 Page59

Les Frameworks Front-End Web 2ere partie

web
Hugo Carnicelli
Consultant chez SoftFluent
Pour lhorloge l encore, il faut ajouter une colonne vide afin de raliser
Utiliser un Framework Front End lors dun dveloppement web permet de gagner une marge. Pour le reste, limplmentation est sans surprise:
un temps considrable sur la mise en place dune interface utilisateur. Une foule de
composants rutilisables sont la plupart du temps dj disponibles. <div class="column-group middle">
<div class="all-10">&nbsp;</div>
Ink prsent comme lOutSider <div class="all-80 clock">
Le Template de base est un peu plus complexe que les autres concur- <div class="column-group clock-inner">
rents. On remarquedeux feuilles de style et quatre fichiers JavaScript. On <div class="all-50 degree">
notera la prsence de Font Awsome, lune des plus exhaustives des 12&deg;
polices dicnes. De plus, on retrouve une div de classe ink-grid qui </div>
fait office de conteneur de grille responsive : <div class="all-50 align-right">
<i class="fa fa-cloud weather"></i>
<!DOCTYPE html>
</div>
<html lang="en">
</div>
<head>
<div class="column-group clock-inner">
<meta charset="utf-8">
<div class="all-50">
<meta name="viewport" content="width=device-width, initial
10/01/2015
-scale=1.0, maximum-scale=1.0, user-scalable=0">
</div>
<title>Horloge m&eacute;t&eacute;o</title>
<div class="all-50 align-right">
<link rel="stylesheet" type="text/css" href="css/ink-flex.
10:42
min.css">
</div>
<link rel="stylesheet" type="text/css" href="css/font-awesome.
</div>
min.css">
</div>
</head>
</div>
<body>
<div class="ink-grid ink-form">
<!-- SUITE DU CONTENU A INSERER ICI -->
</div>
<script type="text/javascript" src="js/modernizr.js"></script>
Le bouton A propos, reprsent sous la forme dun a orn dune clas-
<script type="text/javascript" src="js/holder.js"></script>
se ink-button, est align droite grce la classe push-right. Quant
<script type="text/javascript" src="js/ink-all.min.js"></script>
la pop-up, elle nest ni la plus complexe ni la plus simple des trois. Elle offre
<script type="text/javascript" src="js/autoload.js"></script>
visiblement tout autant de possibilits que ses concurrentes. Point intres-
</body>
sant, la mise en page de celle-ci se situe entre Bootstrap et Foundation du
</html>
point de vue de loverlay. Elle saffiche pratiquement pleine page, laissant
Ds la ralisation du bloc de recherche, on saperoit dun dfaut majeur: entrevoir loverlay, et ce tout autant du point de vue classique que mobile :
il nest pas prvu dajouter des marges afin de centrer le contenu de la
<div class="column-group first">
grille comme cest le cas pour Bootstrap et Foundation. La seule parade
<div class="all-10">&nbsp;</div>
possible est de placer deux colonnes de 10% via la classe all-10, pour
<div class="all-80">
la marge gauche, et 80% via la classe all-80, pour le contenu, afin de
<a href="#" id="aproposTrigger" class="ink-button push-right">
raliser une marge de chaque ct. La classe faisant office de ligne est
A propos</a>
cette fois column-group:
</div>
<div class="column-group first"> </div>
<div class="all-10">&nbsp;</div> <div class="ink-shade fade">
<div class="all-80"> <div id="apropos" class="ink-modal fade" data-trigger="#apropos
<div class="control-group"> Trigger">
<div class="control all-100 append-button"> <div class="modal-header">
<span> <button class="modal-close ink-dismiss"></button>
<input type="text" id="ville" value="Paris"></span> <h2>A propos</h2>
<button class="ink-button"><i class="fa fa-search"></i> </div>
</button> <div class="modal-body" id="modalContent">
</div> Horloge num&eacute;rique web pour le magazine Programmez.
</div> </div>
</div> </div>
</div> </div>

Dcembre 2014 > Programmez! 59


059_060_180 18/11/14 01:06 Page60

plus simple dutilisation et est conu afin dintgrer une charte graphique
web

ds les premires phases de conception. On notera cette phrase, issue de


la FAQ refltant parfaitement la ligne ditoriale se distinguant de Bootstrap:
Nous avons intentionnellement laiss nos styles spartiates. Nous ne vou-
lions pas nous retrouver dans un univers o tous les sites ressemblent
Foundation cest pour cela que nous avons mis de ct beaucoup de
styles complexes pour que vous puissiez ajouter les vtres facilement sans
avoir rcrire un ensemble de styles inclus. De plus, Foundation compte
quelques rfrences intressantes son actif comme le Store officiel HTC
En revanche, un clic sur loverlay ne permet pas de fermer la pop-up. Cela ou encore le site Pixar Projection. Je le recommande pour des projets de
peut savrer relativement perturbant puisque la plupart des plugins qui- type Front Office sans hsiter. Il ncessitera en revanche un travail plus
valents proposent cette fonctionnalit. Point noir cependant, il nexiste important lors de sa mise en place. Le petit dernier, Ink, est plus complet
pas de classe CSS permettant de mettre en valeur un bloc comme cela que ses concurrents sur plusieurs aspects importants tels que la compatibi-
tait le cas pour les deux autres. Nous allons donc ajouter aux classes lit navigateurs. Cela peut savrer tre un choix dterminant. Malgr cela, il
habituelles deux nouvelles classes afin de sy substituer : manque peut-tre encore de maturit et de rfrences pour pouvoir tre
recommand au mme titre que les deux autres. Il peut toutefois tre un
<style type="text/css">
choix intressant en cas dutilisation de Node.js ou pour un projet qui
.first {
ncessite des composants JavaScript plus pousss et plus nombreux. Il
margin-top: 10px;
reste un Framework trs prometteur surveiller de prs. Pour aller plus loin,
}
nhsitez pas consulter les documentations des diffrents Framework:
.middle {
http://getbootstrap.com/
margin-top: 20px;
http://foundation.zurb.com
}
http://ink.sapo.pt/
.clock {
Vous trouverez galement des tableaux de compatibilit avec les diff-
border: 1px solid #DDD;
rents navigateurs:
background: #f0f0f0;
http://getbootstrap.com/getting-started/#support
}
http://foundation.zurb.com/docs/compatibility.html
.clock-inner {
http://ink.sapo.pt/ui-elements/
margin: 16px 8px;
}
u
.degree {
font-size: 40px; Bootstrap Foundation Ink
} Poids gzip 49.3 KB + 32.9 KB* 48.6 KB + 29.6 KB* 412 KB
.weather { + 35.6 KB**
font-size: 56px; Affichage 330 ms 290 ms 490 ms
} Police dicne 200 icones 283 icnes externes 369 icones
</style> Grille Complte Complte, ne ncessite Sans possibilit
pas de conteneur doffset
Le rsultat final au format mobile ressemble cela: Popup Largeur limite Pleine page Overlay non ractif
au format mobile (voir partie B tape 6)
Composants JS 12 18 22
Pr-processseur
CSS LESS / SASS SASS SASS
Compatibilit
navigateurs
8+ 9+ 8+

ordinateur + mobile ordinateur + mobile ordinateur + mobile


Conclusion
Voici un tableau visant comparer de manire littrale diffrents aspects
des Framework exposs ci-contre. Bootstrap a t trs utilis dernire-
ment, trop si lon peut dire. Selon le site trends.builtwith.com, environ 1 site ordinateur ordinateur + mobile ordinateur + mobile
sur 30 utilise Bootstrap. Il est devenu ais de reconnaitre ce Framework
comme brique graphique au sein dun site web. Ce dfaut est gnralement
un point ngatif dans la mise en uvre dune identit graphique. De plus, il ordinateur + mobile ordinateur + mobile ordinateur + mobile
nest pas le meilleur concernant la plupart des critres cits ci-dessus. Res-
tant cependant une valeur sure, je peux recommander sans rserve lutilisa-
tion de ce Framework pour des projets de type Back Office. Il comporte un
ordinateur ordinateur + mobile ordinateur + mobile
ensemble de composants cl en main rpondant la plupart des besoins
lors de la conception dune interface dadministration. Foundation se veut *jQuery 1.11 et 2.1 **Zurb Icon Fonts 3

60 Programmez! < Dcembre 2014


061_065v2_180 18/11/14 00:53 Page61

Connectez vos objets Arduino, Spark.IO, .NET

IoT
Microframework, Galileo Microsoft Azure 2 partie e

LInternet des objets (Internet of Things, ou IoT) est en plein boom. Entre les cots des processeurs
et les cots des composants lectroniques vraiment trs faibles, plus une faible consommation
lectrique, il est devenu possible de crer de nombreux objets plus ou moins intelligents. Ajoutez
cela des connexions devenues possibles grce du Bluetooth Low Energy BLE, des composants
Wifi ou GPRS prix rduits, ces nouveaux objets peuvent se connecter Internet ou entre eux.
Laurent Ellerbach
Audience Marketing - Microsoft EMEA - DX String writeJsonWind(struct wind wd) {
// Cration d'un JSON simple;
String datastring = "{\"sensorID\":";
Cloud et infrastructure datastring += String(wd.ID);
Pour le stockage des donnes, je me suis naturellement tourn vers datastring += ",\"channel\":";
Azure. De nombreux lments penchent en sa faveur: gratuit pour le stoc- datastring += String(wd.channel);
kage des donnes jusqu 20Mo, gratuit pour la publication de donnes datastring += ",\"instSpeed\":";
travers les Mobile Services, 10 sites web gratuits que ce soit en APS.NET datastring += String(wd.instantSpeed);
ou PHP ou autre framework pour une consultation des donnes postes. datastring += ",\"averSpeed\":";
Cela rpond donc parfaitement mon besoin de hobbyiste. Azure poss- datastring += String(wd.averageSpeed);
de pour des besoins plus avancs galement tout ce qui est ncessaire datastring += ",\"direction\":";
pour une infrastructure IoT comme de lanalyse et prdiction de donnes datastring += String(wd.direction);
avec le Machine Learning, un service spcialement ddi pour les datastring += ",\"batterylife\":";
volumes de donnes intensifs par de nombreux objets. Le tout avec un datastring += String(wd.bat);
cot trs avantageux. Azure est interoprable, supporte la plupart des datastring += "}";
technologies telles que Linux, Windows, ASP.NET, PHP, Node.JS, Java et return (datastring);
bien dautres. A noter que mme pour laccs aux services gratuits de }
Azure, il est ncessaire de rentrer lors de linscription une carte bancaire.
Cette carte nest utilise que pour la vrification de lidentit. Si vous vou- void sendData(String thisData) {
lez accder des services payants, elle sera alors utilise. // Cre un connexion sur le port 80
Une fois enregistr, le paramtrage des Azure Mobile Services se fait // L'adresse IP est celle du service Mobile Services
assez simplement. if (client.connect(AzureServer, 80))
Etape 1: crer un Mobile Service Fig.6. {
Etape 2: crer une table Fig.7. //Serial.println("Connected to Azure Server");
Lintrt de ces mobiles services est leur grande flexibilit. Pas besoin de // Crer la requte REST en POST
crer la structure de la base de donnes, cela se fait automatiquement. // Nomdelatable reprsente le nom de votre table
Tous les accs Azure se font sur des protocoles standards ouverts. client.print("POST /tables/nomdelatable/");
Ajouter un enregistrement se fait galement trs simplement en HTTP ou
HTTPS avec des API REST. Fig.7
Pour accder Azure, il est donc ncessaire davoir une pile IP et des soc-
kets dans le framework de son objet. Voici le code ncessaire pour crire
dans mon service Azure depuis mon Arduino ou quivalent:

TCPClient client;
byte AzureServer[] = { 12, 34, 56, 78 };

Fig.6

Dcembre 2014 > Programmez! 61


061_065v2_180 18/11/14 00:53 Page62

Aprs lentte assez longue mais contenant toutes les informations


IoT
client.println(" HTTP/1.1");
// la cl est la cl de l'application ncessaires sur la transaction, les donnes sont renvoyes en JSON avec
client.println("X-ZUMO-APPLICATION: 123456789abcdef12345 lID de lenregistrement. Dans notre cas, nous avons juste besoin de
6789abcdef12"); savoir si lenregistrement a bien t effectu et navons pas besoin de
// le host est le nom du service Azure stocker lID. A noter quil est ncessaire de lire lensemble des informa-
client.println("Host: nomdumobileservice.azure-mobile.net"); tions retournes pour que la transaction ct Mobile Services soit valide.
client.print("Content-Length: "); Il est possible doptimiser ce que lon envoie en modifiant le comporte-
client.println(thisData.length()); ment du Mobile Service Azure. En effet, comme http est au format texte, il
client.println("Connection: close"); est assez bavard et utilise de la bande passante. En mme temps, les res-
client.println(); sources des processeurs embarqus sont limites et il est trs coteux
// et les donnes dactiver de la compression de donnes. Il faut donc essayer denvoyer un
client.println(thisData); minimum de donnes et den recevoir galement un minimum.
} Une faon simple dans un premier temps est de modifier la fonction insert
else { // En cas d'erreur clt la connexion: du Mobile Service. Au lieu de renvoyer lensemble des donnes, je vais
client.stop(); me contenter de renvoyer uniquement un OK (code 200) ou mauvaise
} } requtes (code 400). Voici le codeen javascript:

// L'envoi des donnes se fait ensuite simplement function insert(item, user, request) {
// en crant le JSON et en postant les donnes request.execute({
String dataString = writeJsonWind(myWind); success: function(results) {
sendData(dataString); request.respond(statusCodes.OK); },
error: function(results) {
Une fois un socket ouvert sur un port (ici 80), il est possible de communi- request.respond(statusCodes.BAD_REQUEST); } }); }
quer, ici en HTTP. Le protocole http est trs simple, il consiste en une ent-
te au format texte suivi dun contenu au format texte (ou compress). A noter quil est galement possible dcrire ses propres API REST soit en
HTTPS est quivalent mais avec un cryptage en plus. Dans mon cas, ce Javascript soit en .NET. Cela permettrait par exemple denvoyer les don-
qui est envoy va donc ressembler cela: nes avec des noms plus courts de colonnes, deffectuer le mapping sur
des noms plus long et lisibles dans la base, denvoyer plusieurs enregis-
POST /tables/nomdelatable/ HTTP/1.1 trement en mme temps, effectuer des validations. La fonction insert de
X-ZUMO-APPLICATION: 123456789abcdef123456789abcdef12 base ne supporte lajout que dun seul enregistrement. Nous le verrons
Host: nomduservice.azure-mobile.net plus loin pour la boucle de retour des donnes
Content-Length: 88 Attention, dans notre cas, la scurit est ici vraiment minimale. Le proto-
Connection: close cole utilis est HTTP, tout passe en clair, pas dauthentification mme
{"sensorID":22, "channel":5, "instSpeed":12,"averSpeed":5, simple. La seule chose qui est ici utilise est la cl de lapplication Azure.
"direction":2,"batterylife":90} Dans un projet plus complexe, il est impratif de pouvoir y ajouter un peu
plus de scurit par lutilisation de HTTPS si le board le permet, de lau-
Ce qui est envoy dans ce cas est un JSON qui a lavantage dtre moins thentification plus forte ou de crypter un minimum les donnes envoyes
bavard que du XML tout en restant lisible par un humain. La cration de la si elles sont sensibles.
chane est assez simple faire laide dun string dans le framework Nous voici mi-chemin dans notre projet dIoT. Nous avons donc vu com-
Arduino. Il est un peu consommateur en ressources mais simplifie la vie. ment connecter des objets qui ne le sont pas, ici mes sondes Oregon
La mme chose peut tre faite avec un simple tableau de char bien Scientific, crer des objets de toute pice et les connecter au Cloud.
entendu. Ce qui est renvoy ressemble cela: Comme vous avez pu le constater, partir du moment o vous avez accs
des sockets, il est possible de poster nimporte quel type dinformation
HTTP/1.1 201 Created dans Azure. La partie la plus complique est de pouvoir connecter des
Cache-Control: no-cache objets. Cela devient encore plus compliqu quand il sagit de connecter
Content-Length: 133 des objets qui communiquent dj entre eux avec leur propre protocole
Content-Type: application/json
Location: https://nomduservice.azure-mobile.net/tables/weather Fig.8
//931CFDDE-AB7F-4480-BA28-F1D5C611398B
Server: Microsoft-IIS/8.0
x-zumo-version: Zumo.master.0.1.6.3803.Runtime
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=da4a9f7437a690e3c1a799d3a6c3ddf3ee0c
bb9f5a67008d3c919f0149f34ee3;Path=/;Domain= nomduservice.azure
-mobile.net
Date: Sun, 31 Aug 2014 15:40:12 GMT
Connection: close

{"sensorID":22,"channel":5,"instSpeed":12,"averSpeed":5,"direction"
:2,"batterylife":90,"id":"931CFDDE-AB7F-4480-BA28-F1D5C611398B"}

62 Programmez! < Dcembre 2014


061_065v2_180 18/11/14 00:53 Page63

propritaire ou qui ne communiquent pas encore. Dans mon exemple, il teur et le mot de passe suivants et de rentrer ceux de la base de don-

IoT
ma t assez facile de dcrypter le protocole utilis par les sondes car il nes. Aprs avoir enlev les colonnes qui ne sont pas utiles, crer des
nest pas crypt et assez simple. Cest souvent loin dtre le cas. colonnes calcules pour faire des filtres facilement, crer des graphiques,
on peut obtenir quelque chose qui ressemble a: Fig.11.
Lintrt dExcel est de pouvoir rapidement et simplement visualiser des
Rappels donnes et prototyper des graphiques, ajouter des validations de don-
Dans le prcdent numro, nous avons vu comment crer des objets et nes pour tester des modles. Lexemple est celui de lanmomtre et de
les connecter Microsoft Azure. Le projet que jutilise permet de rcup- la direction du vent. Nous avons donc vu dans cette tape comment pos-
rer des informations de temprature et humidit de sondes Oregon Scien- ter des informations dans Azure, partir du moment o notre objet a une
tific que je possde dj. Jai en plus cr base dATMEL ATmega328 pile IP et des sokets. Ltape suivante est de pouvoir exposer les donnes
mes propres capteurs notamment un anmomtre, un capteur dhumidit pour pouvoir les analyser. Dans mon cas, ce sera travers un site Web
du sol, densoleillement. Ce projet dInternet des objets me permet de galement hberg dans Azure travers les Azure Web Sites. Le choix
couvrir lensemble des tapes dun projet IoT. offert pour le site que ce soit en PHP, Java ou ASP.NET est trs large. Je
Jai donc dj ralis la publication des donnes de mes objets et leur vais donc plutt opter pour un site en ASP.NET. Je vais raliser mon site
stockage. Nous allons voir comment les consommer et les analyser. Enfin, en utilisant Modele View Controller (MVC), en utilisant Entity Framework
nous terminerons par le retour dinformation pour impacter les objets et pour laccs aux donnes. Lintrt est de pouvoir gagner beaucoup de
leur environnement. Dans mon exemple, ce sera mon arrosage automa- temps avec une gnration dynamique de code pour laccs aux donnes
tique. Mon arrosage automatique est lui-mme un objet connect. Il est directement depuis le modle de la base de donnes. Il est quand mme
bas sur une architecture de processeur ATMEL AT91SAM7X512 et fait ncessaire davoir une base dont le design ne va pas trop changer avant
tourner .NET Microframework (NETMF). NETMF est une implmentation de se lancer dans les dveloppements. Mon site ne contient pas de relle
de .NET qui tourne directement sur des chipsets sans OS en dessous. Ma intelligence ni danalyse de donnes. Il se contente de les exposer et de
carte possde une carte rseau qui lui permet donc dtre relie au reste laisser lhumain le soin de les analyser Fig.12.
du monde. Et cest elle qui ira chercher les informations dhumidit pour Lobjet de cet article nest pas de rentrer dans le dtail de cette partie. Je
dcider si elle doit arroser ou non. ne la dtaillerai donc pas. La ralisation des graphiques est faite laide
du composant Chart prsent dans le framework MVC. Je navais pas
Analyse des donnes fait de dveloppement Web depuis de nombreuses annes et jai t trs
Mes capteurs vont remplir au fur et mesure ma base de donnes et une agrablement surpris par la facilit dutilisation du trio APS.NET + MVC +
base SQL Azure. Il sagit dune vraie base SQL et il est donc possible de Entity Framework. Mention spciale aux lambda expressions pour les
consommer les donnes comme on le fait habituellement. Une faon trs requtes dans les donnes, trs puissant et la fois trs simple manipu-
simple pour commencer et vrifier que tout se passe bien est de les ler Fig.13 et 14.
consommer avec Excel. Pour cela il faut suivre les tapes suivantes:
w Dans le portail Azure, rcuprer le nom de la base de donnes, le port Intelligence et retour dinformation
daccs, le nom dutilisateur de la base de donnes et le mot de passe Pour complter lexemple, maintenant que jai ralis une chane compl-
(accessibles dans les paramtres de la base de donne) Fig.8. te du capteur jusqu lintelligence et lanalyse des donnes, je vais donc
w Penser ajouter lIP du PC sur lequel vous vous connectez dans la liste implmenter la chane retour qui est donc la modification du comporte-
des IP acceptes Fig.9. ment de certains objets en fonction des donnes remontes. Mon arrosa-
w Dans Excel, ajouter la connexion une base de donnes SQL Server Fig.10. Fig.10
Attention, de bien slectionner dans lassistant utiliser le nom dutilisa-

Fig.9

Fig.11

Dcembre 2014 > Programmez! 63


061_065v2_180 18/11/14 00:53 Page64

ge automatique viendra rgulirement vrifier sil doit arroser ou pas. Pour


IoT
89abcd\r\n";
cela, jai cr une API REST personnalise dans Mobile Services. De myRequest += "Host: nomduservice.azure-mobile.net\r\n";
faon trs simple, je vrifie quelle est lhumidit du sol, et en fonction dun myRequest += "Connection: Close\r\n";
niveau que jai dtermin, je dcide quil faut arroser ou non. Ici le modle myRequest += "\r\n";
est trs simple mais peut trs facilement utiliser le modle de prdiction HTTP_Client.HTTP_Response response = myClient._DoRequest(myRequest);
des Azure Machine Learning. if (response.ResponseCode == 200) {
Voici le code de lAPI personnalise en javascript: // Recherche la valeur dhumidit et dcide quoi faire
}

Comme pour lArduino, le code est trs similaire, lentte http avec la cl
de lapplication, le nom de lAPI est envoy, la rponse ressemble cela
(ici brute):
"HTTP/1.1 200 OK\r\nCache-Control: no-cache\r\nContent-Length: 18\r\nContent-
Type: application/json; charset=utf-8\r\nServer: Microsoft-IIS/8.0\r\nx-zumo-ver-
sion: Zumo.master.0.1.6.3711.Runtime\r\nX-Powered-By: ASP.NET\r\nSet-Cookie:
ARRAffinity=09482d5b42db702a74aa7bd65eb9fb93fe0f43210a649f6bd3c1738
6ab00447d;Path=/;Domain=arrosage.azure-mobile.net\r\nDate: Sat, 16 Aug 2014
Je fais donc une simple requte SQL dans la table qui stocke les informa- 17:09:52 GMT\r\nConnection: close\r\n\r\n[{\"soilhumid\":38}]"
tions contenant lhumidit du sol. Je rcupre la dernire donnes Une fois lentte analyse, il reste les donnes [{\"soilhumid\":38}]. A
(__createdAt est un timestamp automatiquement cr lors de la cration moi ensuite dans le code de mon arrosage automatique de dcider de la
de la ligne dans la base). Je renvoie donc OK (code 200) si tout est bon valeur seuil minimum pour arroser Fig.15.
ainsi que la donne soilhumid et la valeur.
Sa consommation se fait exactement comme lors de lenvoi des donnes
dans Mobile Services. Il est donc ncessaire de faire une requte en HTTP
en passant ou non des arguments.
Mon board contenant larrosage automatique tant en .NET Microframe-
work, voici le code ncessaire pour rcuprer les donnes, ici en C#:

// http_Client est une classe de client http trs simple


// IntegratedSocket est une classe facilitant lusage des sockets
// Mme sans ces classes,lusage reste simple
HTTP_Client myClient = new HTTP_Client(new IntegratedSocket
("nomduservice.azure-mobile.net", 80));
String myRequest = "GET http://nomduservice.azure-mobile.net/
api/nomAPI";
// nomduservice et nomAPI sont les noms du service et de lAPI
myRequest += " HTTP/1.1\r\n";
myRequest += "Accept: application/json\r\n";
// la cl utiliser est celle de lapplication
myRequest += "X-ZUMO-APPLICATION: 123456789abcdefghij1234567

Fig.13
Page daffichage des graphiques des sondes dhumidit et de temprature sur cran large

Fig.15

Fig.12 Fig.14 La mme vue mais sur lcran dun Windows


Phone. ASP.NET + MVC permet facilement
Cration dynamique de graphiques reprsentant la force du vent et la direction principale dadapter laffichage au type de priphrique.

64 Programmez! < Dcembre 2014


061_065v2_180 18/11/14 00:54 Page65

Interface web du Netduino en .NET Microframework grant larrosage concret et que jutilise en production depuis cet t lensemble des pro-

IoT
automatique. Lhumidit est directement rcupre depuis lAPI REST. blmatiques de lInternet des objets. Tout projet dIoT est un projet qui est
Je nappelle cette API quune seule fois par jour en mode automatique. donc rapidement assez complexe et ncessite de mettre en uvre de
Jai laiss la possibilit den plus pouvoir continuer effectuer mes nombreuses technologies, de crer une architecture de communication
propres arrosages et affiche donc cette information quand la page est affi- entre les objets, de faire attention la scurit notamment.
che. Mme si un projet dIoT est complexe, il reste la porte de tout passion-
n. Il faut juste avoir de bonnes ides et un peu de temps devant soi. Au-
Rsum del de mettre en uvre de nombreuses technologies pour illustrer un
Voil donc un exemple o jai connect des objets existants (les sondes projet rel, mon projet mest vraiment utile et je lutilise rellement. Javais
Oregon Scientific), cr de nouveaux objets ( laide dATmega328, langa- dj ralis le pilotage de mon arrosage automatique il y a quelques
ge C++), ralis une architecture de collecte sur protocole propritaire annes mais je navais pas intgr un mode automatique. Je pourrais bien
(433MHz, protocole Oregon Scientific) laide de Spark.IO (architecture sr ajouter une simple sonde dhumidit plutt que de me connecter au
Arduino avec connection wifi, langage C++), publi les donnes de ces Cloud pour rcuprer cette information dun autre capteur.
capteurs dans le Cloud laide de Azure et les mobile services ( travers Ou mme plus simplement, la rcuprer de ce capteur en local. Mais la
HTTP en API REST personnalis en javascript), analys ces donnes publication de ces donnes mtorologiques maide galement mieux
(hberges dans Azure Web Sites en ASP.NET + MVC + Entity Framework, grer lnergie chez moi, prvoir quand il faut allumer le chauffage, des-
langage C#), les ai exposs avec ma propre API REST (cre en javas- cendre les stores, garder les volets ferms, arroser mes plantes dint-
cript), ai consomm ces donnes dans dautres objets intelligents ( tra- rieur. En dplacement ou en voyage, cela me permet galement de vrifier
vers .NET Microframework en C#) pour influencer le comportement de si tout se passe bien chez moi.
mon arrosage automatique. Jespre avoir pu montrer avec cet exemple u

1 an 11 numros

Abonnez-vous ! 49 seulement (*)


EZ.COM
PROGRAMM

2014
8 - Octobre
Mensuel n17
2 ans 22 numros
mputing
Cloud Co
n e urs
t e
79
EZ.COM

Le s c o n
PROGRAMM

sance du Docker
re 2014
9 - Novemb
Mensuel n17

is
Toute la pu
d C o m p u t in g seulement (*)

Clo u Azure / He
roku DX

Drupaanlc:e
Microsoft le Cloud Platform
Goog s
eb Service tudiant

Spcial
Amazon W


Web
(re)dcouvr
Wordpress
programmati
on av ez
39
1 an 11 numros
5000

ique
3 Henrik

cologoffres
Inok
02-14-07

Offre rserve la France


Un code +
: 07-25-1

Toutes + efcac
e nos sur www.programmez.com Mtropolitaine
- intrieur

= un code
frankpeters

sseur
one es du proce
dows PshSDK Nokia : les origin
3 07-17-1

peur ?

Oui, je mabonne X-Files le dvelop


nuage :

Ws apinps universelles, le re : quel sa


laire pourABONNEMENT retourner avec votre rglement
Carri
6,45
UE - BELGIQUE Surf 6,90
- Imprim en
le Printed in EU - DOM
BOURG 6,45 MAROC 50 DH

ChromeService
FS - LUXEM 940 XPF -

s apps pour
SUISSE 12
Abonnements PROGRAMMEZ, 4 Rue de Mouchy, 60438 Noailles Cedex.
Canada 8,95
$ CAN - TOM

- F: 5,95 E

Crer de
- RD

ects / IoT 3:HIKONB=^UZ^Z]:?k@b@h@s@a";


3:HIKONB=^UZ^Z]:?k@b@r@j@a";

s lambda !
UE - BELGIQUE Surf 6,90

M 04319 - 178
BOURG 6,45 MAROC 50 DH
6,45

s co nn ili se r de
- RD

O bj et ript : ut
- DOM

s iBeacon er Kit IoT


anager ?
- F: 5,95 E

Les borne lileo 2 / Start ndes votre porte JavaSc


n
940 XPF -

s Int el Ga M
Abonnement ux kit
Les nouvea ernative1 annoau
s : les uveaux mo
magazine : 49 (auKs
lieuakde 65,45
o un Prog ,raprix
m au numro) Offre spciale : abonnement + cl USB Programmez!
- Imprim en

$ CAN - TOM


M 04319 - 179

Les ralit
s alt
n 1 an (11 numros) + cl USB : 60
FS - LUXEM

n Abonnement 2Sans ory


Success St ile
Printed in EU

: 79
ob (au lieu de 130,9 , prix au numro)
Canada 8,95

curit au magazine
Android Magma M
SUISSE 12

Antiquit Occultez n 2 ans (22 numros) + cl USB : 90


n Abonnement
Les mythiqu
chines Am
es
strad
spcial source
votre code tudiant 1 ans au magazine : 39
Cl USB contenant tous les numros de Programmez! depuis le n100, valeur : 29,90
ma
Photocopie de la carte d'tudiant joindre
Tarifs France mtropolitaine
Offre limite, valable jusquau 31 dcembre 2014

n M. n Mme n Mlle Entreprise : I___I___I___I___I___I___I___I___I Fonction : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I


PROG 180

Prnom : I___I___I___I___I___I___I___I___I___I___I___I___I___I Nom :I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Adresse : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Code postal : I___I___I___I___I___I Ville : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I

Tl : I___I___I___I___I___I___I___I___I___I___I___I___I (Attention, e-mail indispensable pour les archives sur internet)


E-mail : I___I___I___I___I___I___I___I___I___I___I___I___I___I___I @ I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I
n Je joins mon rglement par chque lordre de Programmez ! n Je souhaite rgler rception de facture * Tarifs France mtropolitaine

Dcembre 2014 > Programmez! 65


066_069_180 18/11/14 01:08 Page66

Volley: la bibliothque qui facilite les


java

appels rseaux sous Android


Au sein dun monde tendant lhyper connexion avec des rseaux mobiles toujours plus puissants, les
applications sur smartphones utilisent massivement le rseau pour changer des donnes avec des
serveurs. Sappuyant sur la bibliothque Apache HTTP Client depuis ses dbuts, la plateforme Android ne
propose pas de solutions haut niveau facilitant la gestion des appels rseaux. Prsente lors du Google
I/O dition 2013, la bibliothque Volley se veut tre la solution rpondant aux problmes rencontrs par les
dveloppeurs lors de la ralisation de ces appels. Tour dhorizon dune solution prometteuse.
Sylvain SAUREL srie et il est ncessaire de raliser un paramtrage si lon souhaite une
Ingnieur dEtudes Java / Java EE excution en parallle. En sus, la rotation de lcran entrane un rechar-
sylvain.saurel@gmail.com gement complet depuis le rseau avec cration dune nouvelle
AsyncTask alors que bien souvent le dveloppeur oublie que la destruc-
Problmatique centrale de la majorit des applications mobiles, les tion des AsyncTasks en cours dexcution lui incombe lors de cette rota-
appels rseaux ne bnficient pas sous Android de solution haut niveau tion. Si cela nest pas fait, elles continuent tourner provoquant bien sou-
simplifiant les changes avec le serveur. En standard, le framework pro- vent un crash applicatif puisque, par exemple, tentant de mettre jour
pose 2 voies pour raliser ces changes: des vues dj recycles. Lobligation de manipuler un cache la main
w La classe HttpURLConnection, solution lgre mais souffrant de plu- tant galement un manque important pour obtenir une API de plus haut
sieurs bugs sur danciennes versions de lOS, niveau. Enfin, elles connaissent de srieux problmes sur danciennes
w LAPI HTTP Client dApache intgre dans le SDK qui se rvle puis- versions dAndroid (Froyo par exemple).
sante mais porteuse elle aussi dun certain nombre de bugs difficile-
ment corrigibles sans toucher la rtro compatibilit de lOS Volley la rescousse
En dpit de bugs, ces solutions restent fonctionnelles et sont utilises en Afin dadresser ces problmatiques et de fournir la communaut Android
production. Le vrai problme vient plutt du fait quelles soient bas une solution robuste de plus haut niveau pour la gestion des changes
niveau, laissant la charge du dveloppeur la gestion des threads au sein rseaux, les quipes de Google ont mis au point la bibliothque Volley.
desquels elles seront employes. Lutilisation dun thread diffrent de lUI Lgre et facile daccs, elle prsente un certain nombre davantages:
Thread ayant vocation viter le blocage de linterface utilisateur durant w Gestion de lensemble des demandes rseaux,
les changes rseaux. Dans un souci de faciliter cette gestion des w Base sur un mcanisme de thread pool configurable,
threads, la classe AsyncTask a rapidement fait son apparition. Elle permet w Gestion automatise du cache des requtes,
dexcuter du code dans un thread diffrent de lUI Thread tout en grant w Annulation aise des requtes en cours, unitairement ou par scope,
les changes avec celui-ci des fins de mise jour IHM. Ainsi, le charge- w Priorisation des requtes au sein dune file dattente,
ment dune image depuis le rseau via une AsyncTask se fait comme suit: w Support natif JSON, images et texte avec possibilits dextension pour
dautres formats,
private class LoadImageTask extends AsyncTask<URL, Void, Bitmap> { w Implmentation aise de mcanismes de retry,
w Outils de dbug et de tracing intgrs.
private ImageView imageView; Volley tant open source, il est facile pour quiconque de modifier sou-
hait la bibliothque pour la personnaliser encore plus, bien que son exten-
public LoadImageTask(ImageView imageView) { sibilit permette dviter le recours ces modifications. Avec lAPI haut
this.imageView = imageView; niveau de Volley, le dveloppeur va enfin dire adieu aux AsyncTasks en
} voyant son travail simplifi avec une gestion du cache automatise et un
support natif du format dchange JSON. En outre, la bibliothque est
protected Bitmap doInBackground(URL... params) { compatible Android 2.2 ce qui couvre quasiment la totalit des smart-
HttpURLConnection conn = (HttpURLConnection) params[0].open phones Android du march.
Connection(); Au coeur de larchitecture de Volley (figure 1) se trouve la classe
InputStream input = conn.getInputStream(); RequestQueue modlisant le pool de thread associ au framework. Ce
return BitmapFactory.decodeStream(input); dernier doit tre initialis une seule fois dans une application, de prf-
} rence un endroit o il sera facilement accessible par la suite. Pour rali-
ser des appels rseaux, lAPI propose la classe abstraite Request sup-
protected void onPostExecute(Bitmap result) { portant des implmentations pour le chargement des donnes JSON
imageView.setImageBitmap(result); avec JsonRequest et ses sous-classes, pour les donnes textuelles avec
} StringRequest ou encore les images avec ImageRequest. Bien entendu,
} cette classe est extensible pour sadapter aux besoins spcifiques des
applications. Les rponses rseaux sont gres au sein des interfaces
Las, les AsyncTasks prsentent un certain nombre de particularits indui- Listener et ErrorListener dfinies dans lobjet Response. Dautre part,
sant une mauvaise utilisation au sein des applications. Ainsi, contraire- lAPI propose une interface Cache dfinissant les fonctionnalits dun
ment la croyance populaire, les AsyncTasks sexcutent par dfaut en cache sous Volley. Quelques implmentations sont fournies avec

66 Programmez! < Dcembre 2014


066_069_180 18/11/14 01:08 Page67

java
public class SampleApplication extends Application {

private RequestQueue requestQueue;


private ImageLoader imageLoader;

@Override
public void onCreate() {
super.onCreate();
init();
}

Figure 1 : Architecture simplifie de Volley @Override


public void onTerminate() {
DiskBasedCache par exemple. Enfin, un certain nombre de classes sup- requestQueue.stop();
plmentaires sont prsentes facilitant la gestion des erreurs, du retry ou super.onTerminate();
encore du dbuggage. }

Installation private void init() {


Pour rcuprer Volley, il faut passer directement par les sources qui sont requestQueue = Volley.newRequestQueue(this);
mises disposition sur un dpt Git de Google. Une fois celles-ci rcu- int memClass = ((ActivityManager) getSystemService(Context.
pres, il reste excuter 2 commandes pour construire la bibliothque ACTIVITY_SERVICE)).getMemoryClass();
et obtenir larchive volley.jar qui sera ajouter aux dpendances de lap- int cacheSize = 1024 * 1024 * memClass / 8;
plication souhaitant utiliser Volley. Linstallation se rsume aux com- imageLoader = new ImageLoader(requestQueue, new BitmapLru
mandes suivantes: Cache(cacheSize));
}
git clone https://android.googlesource.com/platform/frameworks/volley
cd volley
public RequestQueue getRequestQueue() {
android update project -p .
return requestQueue;
ant jar
}
La bonne excution de ces commandes prsuppose que lutilisateur pos-
sde sur son poste de travail Git, le SDK Android et galement loutil de public ImageLoader getImageLoader() {
build Ant. Le JAR gnr est rcuprable au sein du dossier bin/ du rper- return imageLoader;
toire o les sources de Volley ont t tlcharges. }
}
Cration du projet
Dans le cadre de la mise en oeuvre de Volley, nous allons raliser une Ici, on note limportance de stopper le thread pool la fermeture de lap-
application compose dune activit affichant une liste dimages avec un plication via lappel la mthode stop du RequestQueue. Avantage par
titre associ chaque image. Lintrt de lapplication rsidant dans la rapport aux AsyncTasks, lappel cette mthode garantit larrt de len-
mthode de peuplement de cette liste puisque les images seront requ- semble des appels rseaux en file dattente.
tes depuis lAPI REST du service dimages Picasa de Google. Dautre part, on remarque linstanciation de la classe BitmapLruCache et
Lapplication ainsi dveloppe permettra de valider que les diffrents son association avec lImageLoader. Ici, nous implmentons linterface
appels rseaux sont bien effectus en parallle via le thread pool de ImageCache, ddie au cache dimages, avec un cache LRU pour bit-
Volley et sa RequestQueue. Enfin, le chargement des images se fera par maps:
pages de taille dfinie afin de complter la liste au fur et mesure du
scroll sur celle-ci. public class BitmapLruCache extends LruCache<String, Bitmap>
Dans Eclipse, il faut crer un projet de type Application Android en choi- implements ImageCache {
sissant la dernire version du SDK comme cible. Le projet ainsi cr, il
faut configurer le manifest de lapplication en rajoutant lactivit principa- public BitmapLruCache(int maxSize) {
le MainActivity, la permission android.permission.INTERNET pour pouvoir super(maxSize);
effectuer les appels rseaux ainsi que lobjet SampleApplication au sein }
duquel la RequestQueue sera initialise au lancement de lapplication.
@Override
Cration de la RequestQueue protected int sizeOf(String key, Bitmap value) {
La premire tape pour utiliser Volley consiste crer son thread pool via return value.getRowBytes() * value.getHeight();
lobjet RequestQueue. Ce dernier ayant vocation ntre cr quune fois }
et tre accessible par lensemble des classes de lapplication, il est perti-
nent de raliser son instanciation au sein de la classe SampleApplication @Override
appele au dmarrage de lapplication. Hritant dApplication, elle cr public Bitmap getBitmap(String url) {
galement lobjet ImageLoader utilis par la suite pour le chargement des return get(url);
images: }

Dcembre 2014 > Programmez! 67


066_069_180 18/11/14 01:08 Page68

java

@Override title.setText(entry.getTitle());
public void putBitmap(String url, Bitmap bitmap) {
put(url, bitmap); return v;
} }
} }

Cette implmentation de cache est minimaliste et il est tout fait pos- Le layout row.xml utilis pour afficher chaque lment de la liste est sim-
sible de raliser des implmentations plus complexes pour des besoins plement compos dun NetworkImageView et dun TextView.
particuliers.
Appel rseau
Prparation du modle Lactivit principale de lapplication affiche un ListView quelle va remplir
Lapplication devant manipuler une liste de donnes issues de lAPI REST suite au retour de lappel rseau vers Picasa. Pour remplir la liste, nous
de Picasa, il est intressant de modliser les lments retourns par la ralisons un chargement par pages avec une taille de page dfinie. Au
service au sein dun POJO PicasaEntry. Concrtement, il sagit dune lancement de lactivit, la premire page est donc charge alors que le
classe stockant le titre et lURL de limage. En sus, il est ncessaire de chargement des pages suivantes est ralis au fur et mesure du scroll
dfinir lAdapter qui sera utilis pour la gestion des donnes de la liste. vers le bas de la liste. Lidal tant danticiper la demande de chargement
Devant manipuler une collection dobjets de type PicasaEntry, notre de nouvelles images un peu avant datteindre la fin des lments de la
Adapter tend ArrayAdapter et prendre lImageLoader de lapplication en liste. Le chargement dune page sappuie sur JsonObjectRequest puis-
entre. quun objet JSON est requt depuis le service REST de Picasa:
Au sein de la mthode getView de ladapter, la seule spcificit rside
dans la manipulation de limage associe aux lments de la liste. Pour private void loadPage() {
faciliter le chargement de ces images, lAPI Volley propose la vue RequestQueue queue = application.getRequestQueue();
NetworkImageView. Ainsi, si une URL est prsente pour un objet int startIndex = 1 + picEntries.size();
PicasaEntry, il suffit dappeler la mthode setImageUrl avec en entre JsonObjectRequest myReq = new JsonObjectRequest(Method.GET,
lURL de limage et lImageLoader. Dans le cas o aucune URL nest dfi- "https://picasaweb.google.com/data/feed/api/all?q=android+robot
nie, on appelle simplement la mthode setImageResource pour position- +png&max-results="
ner une image donne. Le code de lAdapter est donc le suivant: + RESULTS_PAGE_SIZE
+ "&thumbsize=160&alt=json"
public class PicasaArrayAdapter extends ArrayAdapter<PicasaEntry> { + "&start-index="
+ startIndex, null, createReqSuccessListener(), createReq
private ImageLoader imageLoader; ErrorListener());
queue.add(myReq);
public PicasaArrayAdapter(Context context, int textViewResourceId, }
List<PicasaEntry> objects, ImageLoader imageLoader) {
super(context, textViewResourceId, objects); Ici, on cherche les images associes droid le petit robot de la platefor-
this.imageLoader = imageLoader; me Android. La requte est de type GET et est ajoute la RequestQueue
} de Volley pour excution. Lindex de dpart est dtermin partir du
nombre de dlments dj chargs dans la liste. Les mthodes
@Override createReqSuccessListener et createReqErrorListener servent quant
public View getView(int position, View convertView, View elle crer les listeners de rponse pour lappel rseau. Si lobjet
Group parent) { Response.ErrorListener se contente dafficher une bote de dialogue affi-
View v = convertView; chant un message derreur, lobjet Response.Listener est plus intressant
puisque parsant lobjet JSON rcupr et mettant jour la liste des
if (v == null) { images:
LayoutInflater vi = (LayoutInflater) this.getContext().get
SystemService(Context.LAYOUT_INFLATER_SERVICE); private Response.Listener<JSONObject> createReqSuccessListener() {
v = vi.inflate(R.layout.row, null); return new Response.Listener<JSONObject>() {
} @Override
public void onResponse(JSONObject response) {
NetworkImageView image = (NetworkImageView) v.findViewBy try {
Id(R.id.thumb); JSONObject feed = response.getJSONObject("feed");
TextView title = (TextView) v.findViewById(R.id.title); JSONArray entries = feed.getJSONArray("entry");
PicasaEntry entry = getItem(position);
for (int i = 0; i < entries.length(); i++) {
if (entry.getThumbnailUrl() != null) { JSONObject entry = entries.getJSONObject(i);
image.setImageUrl(entry.getThumbnailUrl(), imageLoader); String url = null;
} else { JSONObject media = entry.getJSONObject("media$group");
image.setImageResource(R.drawable.no_image);
} if (media != null && media.has("media$thumbnail")) {

68 Programmez! < Dcembre 2014


066_069_180 18/11/14 01:08 Page69

java
JSONArray thumbs = media.getJSONArray("media$thumbnail"); loadPage();
loading = true;
if (thumbs != null && thumbs.length() > 0) { }
url = thumbs.getJSONObject(0).getString("url"); }
}
} @Override
public void onScrollStateChanged(AbsListView view, int scroll
picEntries.add(new PicasaEntry(entry.getJSONObject("title"). State) {
getString("$t"), url)); }
}
public int getCurrentPage() {
mAdapter.notifyDataSetChanged(); return currentPage;
} catch (JSONException e) { }
showErrorDialog(); }
}
} Test de lapplication
}; Le test de lapplication consiste
} dans un premier temps vrifier
que la liste dimages requtes
LArrayAdapter de la liste ayant t cr avec en entre lobjet picEntries saffiche bien et dans un second
contenant les lments PicasaEntry rcuprs depuis le rseau, il suffit temps que les diffrentes images
de notifier que la liste doit tre mise jour via lappel la mthode charges le sont bien en parallle.
notifyDataSetChanged lorsque lon ajoute de nouveaux lments la col- La dernire partie du test servant
lection picEntries. quant elle valider le chargement
diffr des lments de la liste lors
Chargement diffr du scroll vertical vers le bas. La
Le dernier point en suspens concerne le chargement diffr de la liste figure 2 prsente le rsultat du test
dimages lors du scroll sur la ListView. Pour implmenter ce comporte- de lapplication dveloppe.
ment, il faut placer un OnScrollListener sur la liste qui permet de connatre Une rotation de lcran montre clai-
le nombre ditems affichs et en rserve afin de procder ou non au char- rement que les images dj tl-
gement de la page suivante de rsultats. Le seuil partir duquel ce char- charges ont t mises en cache
gement est opr tant arbitraire. Lobjet EndlessScrollListener a lallure compte tenu de la vitesse laquel-
suivante: le elles se raffichent. Dautre part,
Screenshot de l'application Fig.2
pour dboguer et tracer le compor-
public class EndlessScrollListener implements OnScrollListener { tement de Volley de manire pousse, il suffit dactiver la proprit sui-
private int visibleThreshold = 5; vante:
private int currentPage = 0;
private int previousTotal = 0; adb shell setprop log.tag.Volley VERBOSE
private boolean loading = true;
Bien entendu, lapplication ncessiterait plusieurs amliorations afin
public EndlessScrollListener() { dtre oprationnelle en production avec par exemple une gestion plus
} fine de la rotation de lcran, laffichage dun indicateur de progression
lors du chargement ou encore la vrification de fin des enregistrements
public EndlessScrollListener(int visibleThreshold) { retourns par la service Web.
this.visibleThreshold = visibleThreshold;
} Conclusion
Au travers de lexemple du chargement dune liste dimages depuis un
@Override service REST, cet article aura mis en exergue la puissance allie la sim-
public void onScroll(AbsListView view, int firstVisibleItem, plicit de la bibliothque Volley. Conue pour grer tous les types dop-
int visibleItemCount, int totalItemCount) { rations RPC, elle se rvle tre une solution de haut niveau simplifiant
if (loading) { grandement les appels rseaux au sein des applications Android. En
if (totalItemCount > previousTotal) { outre, le support dun certain nombre de types de donnes en standard
loading = false; amne un gain de temps indniable tout comme son extensibilit puisque
previousTotal = totalItemCount; Volley pourra, par exemple, facilement grer le XML. Dj utilis, dans
currentPage++; bon nombre dapplications Android de Google, Volley sannonce comme
} la solution du futur rpondant la plupart des problmatiques rseaux
} sous Android. Attention toutefois lutiliser bon escient et ne pas lem-
ployer dans des contextes inappropris puisquil est notamment dcon-
if (!loading && (totalItemCount - visibleItemCount) <= (first seill dy recourir pour le chargement de gros volumes de donnes.
VisibleItem + visibleThreshold)) { u

Dcembre 2014 > Programmez! 69


070_072_180 18/11/14 01:10 Page70

ASP.NET vNext : quoi de neuf ?


vnext

ASP.NET vNext correspond la prochaine version des technologies Web de Microsoft savoir
ASP.NET MVC, Web API, Web Pages and SignalR. Cette nouvelle mouture amne des
changements profonds dans la faon dont Microsoft exploite ces technologies. Nous allons faire ici
un tour dhorizon de ces volutions.
Eric Galiano Pierre-Henri Gache
Consultant chez Cellenza Consultant Senior chez Cellenza
Cellenza - Software Development Done Right Cellenza - Software Development Done Right
Blog : http://blog.cellenza.com/ Blog : http://www.pierrehenrigache.com/

VISUAL STUDIO 2014 Crer votre premier projet


Les quipes qui ont travaill sur cette nouvelle version ont cherch Avec la nouvelle version de Visual Studio, vous pouvez dsormais crer,
rendre ASP.NET plus ouvert et plus flexible. Cest pourquoi ASP.NET en plus des traditionnels sites ASP.Net MVC, des sites ASP vNext.
vNext n'est plus li Visual Studio : il est possible de coder avec votre di- Lorsque que vous aurez cr un projet partir de ces nouveaux Tem-
teur favori. En effet, la compilation seffectuant la vole et les rfrences plates, deux choses peuvent tre remarques. La premire est la dispari-
projets sajoutant directement dans un fichier JSON, il est tout fait envi- tion des fichiers Global.asax et Web.config. La seconde est lie aux
sageable de le faire sans Visual Studio. Cela permet galement, dans un rfrences du projet qui font toutes appel des packages NuGet. De plus,
environnement restreint comme un serveur Web, de pouvoir modifier son si vous faites un clic droit sur les rfrences du projet, vous verrez quil ny
application avec un simple diteur de texte. Cela peut tre trs utile a aucun moyen den ajouter de nouvelles avec Visual Studio. Voyons
notamment lors de la mise au point de son application. Malgr tout, Visual maintenant tout cela dun peu plus prs.
Studio reste l'outil le plus adapt pour dvelopper son application Web au Pour bien comprendre ces diffrences, crons un nouveau projet bas sur
vu de ltendue des fonctionnalits quil propose. le template ASP.NET vNext Empty Web Application. En consultant lex-
plorateur de solution, vous pourrez constater que seulement deux fichiers
Roslyn Compiler ont t crs: Startup.cs et project.json. Le premier fichier contient
Voil une innovation qui en ravira beaucoup : il est maintenant possible le code permettant dinitialiser lapplication. Nous allons maintenant voir
d'diter son code C# et de visualiser le changement dans le navigateur quoi sert le deuxime fichier et en quoi son apparition change radicale-
sans avoir recompiler le projet. ment le paramtrage du projet par rapport ce que lon avait auparavant.
Cette nouveaut est possible grce l'utilisation du compilateur .NET
Roslyn (nous n'allons pas voir ici tout ce dont est capable ce compilateur, Fichier Project.json
mais nous vous invitons regarder de plus prs cette nouvelle mouture du Ce fichier est lun des plus importants car il permet de centraliser la confi-
compilateur de Microsoft). Concrtement, chaque modification du code guration du projet et la gestion des dpendances. Pour cela, on retrouve
source, le serveur Web de dveloppement est arrt et lors de lappel plusieurs sections dans ce fichier comme le montre lexemple ci-dessous.
une page, Roslyn va recompiler lensemble du code source et fournir ainsi Intressons-nous maintenant chacune dentre elles.
la dernire version du site. Un point intressant noter est que si vous
consultez le contenu du rpertoire bin qui se trouve dans votre projet, il {
sera vide. La compilation tant effectue en mmoire, aucune dll ni pdb "dependencies": {
nest dpose sur le disque. "EntityFramework.SqlServer": "7.0.0-alpha3",
Ce processus peut tre un peu droutant au dbut, cest pourquoi il faut "Microsoft.AspNet.Mvc": "6.0.0-alpha3",
bien avoir conscience de son fonctionnement. "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-alpha3",
"Microsoft.AspNet.Identity.Authentication": "3.0.0-alpha3",
Framework optimis pour le Cloud "Microsoft.AspNet.Security.Cookies": "1.0.0-alpha3",
Jusqu prsent, lors du dveloppement dun site Web ou bien dune API "Microsoft.AspNet.Server.IIS": "1.0.0-alpha3",
REST, nimporte quelle application utilisait le Framework .Net. Ce dernier "Microsoft.AspNet.Server.WebListener": "1.0.0-alpha3",
fournit lensemble des lments pour ces types de projets, mais gale- "Microsoft.AspNet.StaticFiles": "1.0.0-alpha3",
ment tout ce qui est li aux autres types dapplications (Winforms, WPF "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-alpha3",
par exemple). Afin doptimiser le dploiement de sites dans le Cloud, il est "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0-alpha2"
dsormais possible dutiliser un sous ensemble du Framework .Net: le K },
Runtime. De plus, labandon de System.Web.dll permet de construire des "commands": {
applications plus modulables, car on peut choisir les librairies que l'on /* Change the port number when you are self hosting this
souhaite intgrer notre projet. application */
"web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.
Open Source et Cross Platform Server.WebListener --server.urls http://localhost:5000"
Un autre point qui mrite dtre soulign est la disponibilit des sources },
sur GitHub. Il s'agit d'une relle volution dans la manire dont Microsoft "frameworks": {
souhaite vivre sa solution. De plus grce Mono, il est possible de faire "net451" : { },
tourner son application sur dautres plateformes que Windows. "k10" : { }

70 Programmez! < Dcembre 2014


070_072_180 18/11/14 01:10 Page71

vnext
}
}

References
La premire section nomme dependencies regroupe la liste des pac- Pour lancer l'application, placez-vous sur le rpertoire contenant le fichier
kages NuGet qui seront utiliss dans le projet. Comme voqu prcdem- project.json et lancez la commande "k web". L'application est maintenant
ment, inutile de chercher un autre moyen pour diter cette partie, il ny en excute avec la version spcifie. Ici "web" correspond la cl de la par-
a pas. Toutefois, lIntelliSense de Visual Studio est prsente pour vous tie "commands" du fichier "project.json" que nous avons vu avant.
aider notamment dans le choix des numros de version. Pour lancer l'application avec une autre version du Framework, il suffit
Ces derniers sont dailleurs optionnels. Si rien nest spcifi, cest la der- d'ouvrir une nouvelle fentre de commande et d'excuter la commande
nire version qui sera utilise. "kvm use" en spcifiant une autre version, puis de lancer l'application.
Ds lors que lon a compris comment fonctionne la gestion des dpen- Cette fonctionnalit un rel sens dans au moins deux cas de figure: la
dances, on peut se demander pourquoi elles ne sont plus dans le fichier monte de version du Framework et la migration de lapplication. Dans le
csproj. premier cas, en admettant que vous souhaitiez upgrader le Framework
La raison est simpleet a dj t voque : pouvoir diter son projet en se .Net utilis par votre application, vous pourrez installer deux versions de
passant de Visual Studio. Cest pourquoi dsormais le fichier csproj votre site. Lun tournera avec la version actuelle et lautre avec la nouvelle
sert uniquement rfrencer les diffrents fichiers. version. Lorsque lensemble des tests de non rgression aura t effec-
tu, vous pourrez diriger vos utilisateurs vers la nouvelle instance. En cas
Commandes dimprvu, le basculement vers lancienne version sera des plus faciles
Cette section permet de dfinir des commandes pour dmarrer son site. car les deux seront disponibles sur votre serveur. Dans le second cas,
Dans notre exemple, elle permet de lancer le serveur sur le port 5000. celui de la migration, vous pourrez galement tirer avantage de cette fonc-
Pour cela, il suffit dinitier une invite de commande puis de se placer dans tionnalit en migrant par morceau votre application. Les nouveaux
le rpertoire du projet et de saisir linstruction suivante : k web . Un modules utiliseront le Framework K tandis que les anciens continueront
point intressant remarquer est la commande qui commence par le dutiliser la version classique. Cette cohabitation vous permettra de
namespace Microsoft.AspNet.Hosting. Ce dernier est contenu dans la migrer facilement.
seule dll du rpertoire bin du projet. Elle sert amorcer le lancement du
site. Inutile de dire que cette dll ne devra pas tre supprime, auquel cas Injection de dpendance
la commande prcdente chouera. Une autre fonctionnalit intressante de cette version dASP.NET est la
mise disposition dun outil dinjection de dpendances. La configuration
Frameworks du conteneur seffectue au niveau de la mthode Configure du fichier
Cette dernire section permet de dfinir la liste des Frameworks dispo- Startup.cs . Comme le montre lexemple ci-dessous, il est possible
nibles: le Framework 4.5.1 traditionnel et celui qui est optimis pour le denregistrer, par exemple, un service:
Cloud : le "K runtime".
public void Configure(IBuilder app)
Side by side {
Hier, si vous excutiez plusieurs sites sur votre serveur IIS, ils auraient // Ajout de services
tous utilis la mme version du Framework, savoir celle qui est installe. app.UseServices(services =>
Avec ASP.Net vNext et lintroduction du side by side, cest diffrent. Il est {
possible d'excuter son application de manire autonome et de lui asso- services.AddScoped(typeof(IMonService), typeof(MonService));
cier une version spcifique du Framework K. });
Pour cela un nouvel outil est disponible: K Version Manager (KVM). Il per- }
met de lister et de choisir la version du Framework associer notre
application. Nous allons maintenant voir comment faire tourner deux Ensuite si vous dsirez lutiliser, dans un contrleur par exemple, il suffira
applications Web utilisant deux versions diffrentes. La premire tape dajouter au constructeur de ce dernier un paramtre du type de votre ser-
consiste donc linstaller: vice. Lors du Runtime, une instance de votre service sera injecte et pour-
ra ensuite tre utilise. Bien que cette fonctionnalit soit fournie de faon
@powershell -NoProfile -ExecutionPolicy unrestricted -Command standard, il est tout de mme possible dutiliser nimporte quel autre Fra-
"iex ((new-object net.webclient).DownloadString('https://raw. mework dinjection de dpendance.
githubusercontent.com/aspnet/Home/master/kvminstall.ps1'))"
Publication
En utilisant la commande "kvm list", il est possible de visualiser les diff- La fonctionnalit de publication a elle aussi volu. En effet, lors de la
rentes versions disponibles. publication de votre site, deux choix soffrent vous : soit publier vers
Azure, soit publier vers le disque. Cest la deuxime option qui mrite un
peu dattention. Avec lutilisation des packages NuGet en guise de dpen-
dances et avec la mise en place du Framework optimis pour le Cloud, il
est possible davoir une fonction de publication qui package lensemble
de ces lments pour avoir un tout cohrent.
Pour slectionner une version, la commande utiliser est "kvm use [nom Ainsi, si on lance une publication via loption Publish, puis que lon exa-
de la version]". On remarque ensuite un astrisque dans la colonne "Acti- mine le contenu du rpertoire de sortie, on peut constater plusieurs
ve" indiquant la version slectionne. points. Premirement, chaque commands du fichier project.json va

Dcembre 2014 > Programmez! 71


070_072_180 18/11/14 01:11 Page72

donner lieu un fichier cmd portant le mme nom. Ensuite, vous trouverez Identity. Nous pouvons maintenant valider la cration du site ainsi que la
vnext

deux rpertoires: approot et wwwroot. Le premier contient len- publication. Visual Studio va automatiquement dployer le site sur Azure
semble des packages NuGet ncessaires ainsi que les sources du projet. et ouvrir le navigateur par dfaut pour visualiser le site frachement
Le second, quant lui, contient la structure du projet avec toutes les vues. dploy.
Ainsi, si vous lancez lun des fichiers cmd gnrs, vous pourrez acc-
der votre site. Vous pouvez galement effectuer la mme opration sur CONCLUSION
un poste dpourvu denvironnement de dveloppement ou encore grce Avec cette nouvelle version dASP.NET, Microsoft nous apporte de vri-
Mono sur un Mac ou Linux. tables changements sur la manire de construire et dexploiter un site. Il
ne sagit pas simplement dune modification de quelques APIs, mais bien
Dploiement sur Azure dune refonte en profondeur. En utilisant les dernires technologies telles
L'intgration d'Azure a t amliore: il est dsormais plus facile de que le compilateur Roslyn, vous pourrez dsormais construire des appli-
dployer son site Web sur le Cloud de Microsoft. En cliquant droit sur le cations modulables et capables de sadapter nimporte quel environne-
projet et en cliquant sur "Publish", l'option "Microsoft Azure Websites" ment quil soit on- premise ou dans le Cloud. De plus, louverture vers les
apparat. Une fentre s'ouvre nous permettant de choisir, soit de dployer systmes Linux et Mac via Mono permet denvisager de nombreux scna-
sur un site existant, soit de crer un nouveau site. Ici, nous allons crer un rios de dploiement. Enfin, la disponibilit des sources sur GitHub permet
nouveau site en cliquant sur "New...". Il nous est maintenant demand de tout moment dimplmenter ses propres fonctionnalits au sein mme
rentrer le nom du site Web, une zone gographique dans laquelle sera des librairies ou bien encore de dcouvrir et de comprendre le fonctionne-
hberg le site. Il nous est aussi possible de crer et lier notre site une ment de chaque partie du systme.
base de donnes afin d'utiliser, entre autres, les fonctionnalits dASP.Net u

168 169 170 171 172

Compltez
votre collection
PUIS PUIS PUIS PUIS PUIS

voir bon de commande page 57

173 174 175 176 177 178 179


PROGRAMMEZ
PROGRAMMEZ

PROGRAMMEZ.COM

PROGRAMMEZ.COM
Mensuel n178 - Octobre 2014 Mensuel n179 - Novembre 2014

Cahier DRUPAL
100
PAGES
Cloud Computing Toute la puissance du
Un code Les conteneurs
pour les gouverner tous Installation / Conguration / Mon 1er site / Drupal 8

Docker
Cloud Computing
100% mobile avec : Coding Microsoft Azure / Heroku D
Xamarin, Nokia X, Windows Phone 8.1, Firefox OS
la plage Google Cloud Platform
Amazon Web Service

PUIS
Java Djeune

PUIS PUIS
Lessentiel de Web
Devoxx France 2014 intelligent Que faire de son Raspberry Pi,
Arduino et Galileo cet t ? Drupal : (re)dcouvre

nuage : 07-17-13 frankpeters - intrieur : 07-25-13 Henrik5000


Commitstrip

Osez Wordpress
DITES-LE Brow
Bag Lun
AVEC DES API
Deezer, Skype,
cologie :
lcoconception programmation avance
Lync, Yammer Linformatiqu logicielle :
cest maintenant !
quantiqu
Crer Un code + cologique
Windo ws Phone
Lultime frontire Les nouveauts
et grer de MariaDB = un code + efcace
un projet universelles, les SDK Nokia
les apps
Open Optimiser les
X-Files : les origines du processeur Objets connects / IoT
3:HIKONB=^UZ^Z]:?a@l@r@g@a";

performances
Source La rvolution Les bornes iBeacon
M 04319 - 176 - F: 5,95 E - RD
Mensuel n176 - Juillet-Aot 2014

de Google Maps
Carrire : quel salaire pour le dveloppeur ?

E 12 FS - LUXEMBOURG 6,45 - DOM Surf 6,90


nada 8,95 $ CAN - TOM 940 XPF - MAROC 50 DH

HIKONB=^UZ^Z]:?k@b@r@j@a"
inted in EU - Imprim en UE - BELGIQUE 6,45
du maker faire Les nouveaux kits Intel Galileo 2 / Starter Kit IoT

M 04319 - 179 - F: 5,95 E - RD


08-06-13 whanwhanai (usine)

Et aussi : Les ralits alternatives : les nouveaux mondes votre porte


Mensuel n175 - Juin 2014
      E  
Le langage SWIFT Crer des apps pour Chrome Printed in EU - Imprim en UE - BELGIQUE 6,45
Visual Studio 2014 SUISSE 12 FS - LUXEMBOURG 6,45 - DOM Surf

3:HIKONB=^UZ^Z]:?a@b@r@p JavaScript : utiliser des lambda !


Canada 8,95 $ CAN - TOM 940 XPF - MAROC 50

M 04319 - 178 - F: 5,95 E - RD


Antiquit Scurit Android Success Story
Coding4Fun
:HIKONB=^UZ^Z]:?k@b@h@s Les mythiques Occultez Magma Mobile
Printed in EU - Imprim en UE - BELGIQUE 6,45 SUISSE 12 FS - LUXEMBOURG 6,45 DOM Surf 6,90 Canada 8,95 $ CAN - TOM 940 XPF - MAROC 50 DH

K k ?
Printed in EU - Imprim en UE - BELGIQUE 6,45
Raspberry Pi : plus fort que jamais P M

Prix unitaire : 6 (Frais postaux inclus) France mtropolitaine uniquement.

nouveau

Tout Programmez! 29,90 *


sur une cl USB
Tous les numros de Programmez! depuis le n100.
Cl USB 2 Go.
Test sur Linux, OS X,
Windows. Les magazines
sont au format PDF.
* tarif pour l'Europe uniquement. Pour les autres pays, voir la boutique en ligne

Vous pouvez aussi commander directement sur notre site internet : www.programmez.com
72 Programmez! < Dcembre 2014
073_076_180 18/11/14 01:12 Page73

Parse.com kezako ?

facebook
Parse est une plateforme de dveloppement hberge dans le Cloud, qui permet de dvelopper des
applications mobiles facilement dans une infrastructure back-end info gre en SAAS. Cette
plateforme rachete en avril 2013 par Facebook, renforce la position de ce dernier sur le mobile et
ses dveloppeurs. Tout d'abord ce service est GRATUIT, une offre payante existe mais est
principalement destine aux applications fort trafic.
GIACOPINO Cyril & MORICEAU Mathieu
Studio YMAGYN
www.ymagyn.com

Parse propose une gamme de produits indpendants et complmen-


taires regroups en 3 catgories. Parse Core contient Parse Data, Parse
social, Parse Cloud code, et Parse background Jobs. Parse Push per-
Fig.1
met de grer lenvoi de push sur les populations profiles par canaux et
par golocalisation. Enfin Parse Analytics offre le tracking comporte-
mental, et le monitoring de campagnes push.
Concernant les kits de dveloppements fournis par Parse, ils couvrent
Fig.2
toutes les technologies mobiles existantes, Objective C, Java, .NET et
Javascript. De plus, Parse ne permet pas seulement de la programma- Vous avez donc une offre complte, trs simple dutilisation, scalable et
tion client mobile. Il sadresse aussi aux dveloppeurs Web ct serveur scurise.
incluant depuis fin juillet un SDK PHP. Par ailleurs, gardez lesprit que cest Facebook et ses 2 milliards duti-
lisateurs derrire ce produit. En tant que dveloppeur, cest lassurance
Parse.com cest smart mais a mapporte quoi ? que mes dveloppements reposent sur quelque chose de solide.
Rapidit de dveloppement En parlant de Facebook, quen est-il des donnes hberges et des
Comme tout dveloppeur mobile, ce dernier se concentre sur lUI et lin- informations relatives votre vie prive ? Il faut savoir que sur Parse vos
tgration des donnes externes fournies par un autre dveloppeur, donnes sont et resterons vos donnes ! Certes vous tes hberg sur
gnralement dune autre quipe ou mme d'une autre socit. Parse le rseau Facebook, mais aucune donne de qualification ou d'enrichis-
permet de rompre ces frontires. sement de votre profil nest transmise la socit mre.
Le schma actuel Fig.1. Le schma Parse Fig.2.
Le dveloppeur devient matre de lUI et peut facilement intervenir sur le Parse.com est gratuit, cest donc le messie ?
fonctionnel sans mme sortir de son langage de prdilection, la Moi-mme je me suis pos la question. Parse offre un service gratuit,
connexion la source de donnes se faisant intra app; si lon veut vul- avec des ressources serveurs, un support, des SDK quune quipe
gariser, nous dirons que le client mobile se connecte directement la ddie corrige et maintien, et aucune donne nest collectes par
source de donnes sans passer par un serveur distant tiers. Facebook, il y a forcment un loup !
En fait non. Lorsque lon prend de la hauteur et que lon analyse la
Scalable chose, on peroit la stratgie de Facebook dans lacquisition de
Quand vous tes responsable de larchitecture machine, il est de votre Parse.com. Facebook arriv sur le tard, a dores et dj perdu la bataille
responsabilit que tout fonctionne sans bugs (ce nest dj pas facile du Web sur la publicit (car Facebook vit grce la pub) face au gant
avouez-le !) et que votre applicatif supporte la monte en charge en cas Google. Facebook a donc massivement investi dans le mobile afin den
de nombreuses connexions utilisateurs. devenir le leader. Cest aujourdhui le premier et la socit compte bien
Aujourdhui provisionner son serveur ddi nest plus envisageable car assurer cette position.
avec la mobilit, la monte en charge peut atteindre des pics extrme- En dfinitive, pour Facebook, plus dapplications mobiles sont dvelop-
ment vite. La solution est donc dhberger son applicatif sur du Cloud pes, plus la compagnie renforcera sa place dominante sur le march.
permettant dtre scalable trs rapidement. Azure ou Heroku sont ceux Pour accentuer cela Facebook souhaite dmocratiser la cration dappli-
que jutilise principalement. cations mobiles et Parse en est loutil. Pas folle la gupe !
Une fois lapplicatif dploy, vous avez besoin dutiliser une source de Trves de bavardages, entrons maintenant dans loutil lui-mme, cest
donnes comme MongoDB, chez MongoLab 200 par mois TTC, finalement tout ce qui nous intresse.
profitant ainsi dun serveur matre et dune escale ainsi que dun arbitre 1 - 2 - 3 Parsez !
faisant le load-balancing.
Great ! Nous avons maintenant une infrastructure digne de ce nom pou- Parse Core
vant supporter une monte en charge avec un cot mensuel moyen de Parse Data
300 euros TTC par mois ! De mon temps (oui jai 32 ans dont 16 ans de dveloppement, ce nest
pas vieux finalement), le traitement des donnes passait par des SDGB,
Et si maintenant jutilise Parse, comment cela se passe? je travaillais principalement sur MySQL. Sur MySQL nous devions crer
Je me connecte sur parse.com avec mon compte Facebook, je cre notre modle de donnes donc nos tables et nos colonnes pour pouvoir
mon application et . et cest tout ! Et cela pour la modique somme de stocker nos donnes.
zro TTC. La programmation objet nous a incit travailler avec une couche

Dcembre 2014 > Programmez! 73


073_076_180 18/11/14 01:12 Page74

dabstraction supplmentaire permettant de manipuler des objets, des Parse Social


facebook

instances de classes, et de les stocker dans une base de donnes, cest Aujourdhui, lintgration des rseaux sociaux est devenue un must-have
ce que lon appelle un O.R.M. (Mapping Objet Relationnel). dans les applications mobiles. Exit lidentification avec un e-mail et un
Puis vinrent les bases de donnes sur du NoSQL; il devenait possible de mot de passe, exit la page dinscription, dsormais cest votre compte
stocker des donnes et de les requter sans passer par un modle de Facebook et Twitter qui vous identifient dans une application mobile !
donnes fixe. Cela devenait trs rapide de stocker des donnes car plus Et si je vous disais que Parse vous offre un fonctionnement natif au sys-
de schma dfinir, je venais directement stocker mes objets. tme de connexion de ces deux rseaux sociaux ?
Toutefois, le fait de ne pas avoir de modle posait dautres problmes Inscription traditionnelle de lutilisateur : Fig.7.
en dveloppement. Par exemple, une mme proprit (colonne en Inscription de lutilisateur avec Parse : Fig.8.
MYSQL) nomme Amount pouvait dsormais contenir un number, Comme vous pouvez le voir, les diffrentes actions effectues, mais
mais aussi ventuellement une string ou mme des objets complexes aussi les diffrents services appels sont bien moindre avec Parse.
type Array ou Date. Enfin, dun document lautre, la proprit pou- Et si nous connections un utilisateur Facebook ? Facile !
vait ne mme pas exister Eh bien Parse Data dans tout cela cest CONNEXION A FACEBOOK : Fig.9.
quoi? Cest simplement le meilleur des deux mondes !
Vous crez une instance de classe Product avec une proprit Parse Cloud
Amount de type int que vous stockez sur Parse directement. Le sys- Pour Parse, un dveloppeur doit pouvoir dvelopper une application
tme va automatiquement crer le modle partir de ce qui est stock mobile sans aucune architecture serveur. Certaines applications
la premire fois; la proprit sur Amount sera type Number et cela requierent un traitement spcifique sur votre serveur, et cest l
sera immuable. Si daventure vous y stockez une valeur pour Amount quintervient le Parse Cloud. Vous ntes pas familier avec le
de type string ou array, Parse vous criera dessus et renverra une dveloppement dapplication mobile ? Ce nest pas grave ! Le Cloud
erreur. Voyons un exemple sur Parse pour linsertion dun objet dans Code fonctionne grce au SDK Javascript de Parse !
une classe : EXEMPLE CODE PARSE EN OBJECTIVE C : Fig.3. Parse Cloud se divise en trois parties, les Cloud Functions, les
Voyons le code quivalent quil aurait fallu pour raliser la mme chose Webhooks et les Background Job.
sur une architecture maison hors de Parse. Voyons un exemple sur Les Webhooks vous permettent dinitialiser un serveur Express qui vous
Parse pour linsertion dun objet dans une classe : EXEMPLE CODE EN permet de recevoir vos datas sous diffrents formats linstar des
OBJECTIVE C APPEL REST : Fig.4. EXEMPLE CODE COTE SERVEUR Cloud functions qui, elles, ne peuvent recevoir que du JSON.
POUR STOCKER SUR MONGO : Fig.5. EXEMPLE CLOUD CODE WEBHOOK] : Fig.10.
Vous allez aussi me dire que les SGDB permettent, comme leur nom lin-
dique, de grer des relations entre les donnes stockes, et que le
NoSQL ne le permet pas. Que Neni, Parse vous permet de grer des
Pointer (rfrence un objet dune autre classe, One To One) et des
Relations (les relations One To Many ou Many To Many).
Voyons un exemple sur Parse pour linsertion dun objet dans une classe
en utilisant le vaisseau prcdemment cr : EXEMPLE CODE PARSE
EN OBJECTIVE C : Fig.6.
Attention tout de mme ne pas abuser des requtes incluant des rela-
tions ct client car le traitement de ces requtes peuvent tre parfois
Fig.7
coteux en terme de temps. Mais des solutions toutes simples existent
pour palier ce problme, cest soit dutiliser des Cloud Functions, soit
des Background Jobs qui seront prsents un peu plus loin dans cet
article. Soyez patient (jaime entretenir le suspens).

Fig.8

Fig.3

Fig.9
Fig.4

Fig.5

Fig.6 Fig.10

74 Programmez! < Dcembre 2014


073_076_180 18/11/14 01:12 Page75

Ici nous crons simplement un objet Message avec une variable `text` Il vous faut donc prvoir:

facebook
que nous rcuprons du body de la requte. w Un systme de communication avec ces diffrents services
Les Cloud Functions vous permettent d'excuter une logique serveur w Un dashboard pour administrer l'envoi de push et toutes les options
sans avoir lappliquer sur votre mobile et sans obligation de possder lies ce dernier (channels, push golocalis, push cibl)
une architecture machine derrire. Ou encore de diviser le code crire. w Un serveur de donnes pour stocker toutes les informations lies aux
Par exemple, si vous avez deux traitements identiques raliser sur vos pushs.
applications, pourquoi ne pas le faire directement sur le Cloud ? Vous w Une architecture machine pour grer l'envoi de ces derniers.
devez faire une moyenne mais le traitement in-app serait lourd et occu- Chez Parse, encore une fois, on vous fait gagner du temps et de largent
perait beaucoup de bande passante, alors utilisons le Cloud ! pour vos dveloppements. INSCRIPTION DEVICE UTILISATEUR : Fig.13.
AVERAGESTARS PARSE CLOUD : Fig.11. Et voil, avec ces quelques lignes votre utilisateur est dsormais inscrit
Ici nous rcuprons la moyenne des notes reues par le film dont le titre dans votre base et vous pouvez d'ores et dj lui envoyer des notifica-
est envoy en paramtre la Cloud Function. tions grce au Dashboard de Parse ! Mais ne nous arrtons pas en si
Mais ce nest pas tout, les Cloud Functions vous offrent un ventail de bon chemin, disons que notre utilisateur est mordu des actualits de
fonctions disponibles pour vos objets telles que beforeSave, afterSave, lOGC Nice; il nous suffit de linscrire sur le channel correspondant, ce
beforeDelete et afterDelete qui, comme leurs noms lindiquent, sont qui nous permettra denvoyer les notifications lies au club Niois uni-
des fonctions excutes avant ou aprs la suppression ou lajout dun quement aux personnes inscrites ce channel. OBJ-C INSCRIPTION
objet. CHANNEL PUSH : Fig.14.
Attention toutefois, votre fonction doit respecter quelques conditions:
w elle doit s'excuter en un maximum de 15 secondes. Parse Analytics
w Les hooks beforeSave, afterSave, beforeDelete et afterDelete doivent Si je vous dis Analytics ? Vous me remontez forcement le mot
s'excuter en 3 secondes. Google avec Mais ici nous parlons mobile !
w Si une autre Cloud function est appele dans une autre Cloud func- Aujourdhui Parse vous offre des outils faciles dutilisation et cl en main
tion, elle sera limite sur le temps par rapport au temps restant de la pour remonter nimporte quel type de donnes utilisateur pour vous per-
fonction qui appelle cette dernire. mettre dappliquer une stratgie Marketing de qualit !
Last but not least, les Background Jobs. Ces derniers fonctionnent Vous voulez remonter des donnes dmographiques, le taux de
comme les Cloud functions sauf que vous en programmez lexcution. rebonds, le % de nouvelles sessions ainsi que la langue de lutilisateur,
Disons que si vous vouliez excuter un script de migration qui vous per- son ge, son sexe et ses centres d'intrts, les recherches effectues ?
mette dajouter un champ plan sur chaque Parse.User, votre code serait Pas de problmes, en une ligne remontez facilement tout cela :
semblable cela : BACKGROUND JOB USER MIGRATION : Fig.12. OBJ-C CREATE PARSE EVENT : Fig.15.
Maintenant, mettez Parse Analytics et Parse Social ensemble et deve-
Parse Push nez le roi du monde, ou du moins, celui des retours de donnes et de la
La mise en place dun service de push peut vite devenir une stratgie Marketing.
usine gaz et requiert de passer par plusieurs plateformes:
w iOS: Apple Push Notification Service (APNS) Parse PHP
w Android: Google Cloud Messaging (GCM) Aprs le mobile, si on utilisait Parse ct serveur ? Comme vu
w Windows Phone: Microsoft Push Notification Service (MPNS) plus haut, exit les bases de donnes avec Parse. Et mme si vous
ntes pas sur mobile, toutes les fonctionnalits de Parse sont dispo-
nibles avec le SDK PHP. Aujourdhui, dployer un projet bas sur Mysql
peut savrer tre fastidieux pour la mise en place de la scurisation des
champs et les diffrents CRUD pour vos classes. Comme vous le savez
Parse vous permet deffectuer du relationnel One-To-One, One-To-Many,
Many-To-Many : finis les ennuis avec vos foreign_keys, les deletes en
cascade, les jointures de tables, avec le service de Facebook on fait des
pointeurs !
Et si nous faisions le tour des fonctionnalits disponibles sur le SDK
Fig.11 PHP ? SAUVEGARDE OBJET PHP : Fig.16.

Fig.13

Fig.14

Fig.15

Fig.12 Fig.16

Dcembre 2014 > Programmez! 75


073_076_180 18/11/14 01:12 Page76

Nous avons aussi la notion de Subclass, il sagit de faire hriter une vrez une erreur ParseError.OBJECT_NOT_FOUND.
facebook

classe par ParseObject pour en faire une classe Parse. PHP ACL FROM USER : Fig.23.
PHP SUBCLASS: Fig.17. Ici notre objet Message sera disponible en lecture et criture pour lutili-
Comme nous somme ct serveur, peut tre que vous voulez remonter sateur actuellement connect (renvoy par ParseUser::getCurrentUser),
des informations (events). Encore une fois, facile ! et en lecture pour tous les autres utilisateurs.
PHP TRACK EVENTS : Fig.18. Quand votre application devient de plus en plus grosse, il va devenir dif-
Et voil, vous avez dsormais un vnement gnr pour chaque appel ficile de maintenir les droits sur chacun des objets pour chaque utilisa-
cette fonction. teur; Parse la bien compris et vous permet de dfinir des Rles qui vont
Parse vous offre galement le moyen de stocker des fichiers dans sa englober plusieurs utilisateurs, ces mme utilisateurs vont eux hriter
base de donnes tout en vous donnant un lien pour tlcharger ce der- des droits qui seront dfinis sur le rle auquel ils appartiennent.
nier. PHP CREATE FILE PARSE : Fig.19. Un rle peut contenir des utilisateurs mais aussi dautre rles, sur le
Vous pouvez galement charger un fichier local pour lenvoyer sur Parse mme principe que les utilisateurs, les rles contenus dans le rle
avec cette fonction : PHP LOAD LOCAL FILE. parent vont hriter des droits du parent.
Et si nous envoyions des pushs nos applications mobiles ? PHP PARSE CREATE ROLE : Fig.24.
PHP SEND PUSH : Fig.20. Ici nous avons cr un rle avec des droits uniquement en lecture sur ce
Nous avons donc envoy lalerte Victoire du aux personnes abon- dernier lexception pour lutilisateur courant qui lui a aussi les droits en
nes aux channels RCT et LAR. criture. Sachez que si vous ne mettez pas le rle avec des droits dcri-
Nous avions vu plus haut que nous pouvions exporter des traitements ture limits, nimporte quel utilisateur pourra modifier ce dernier.
sur le Cloud, sachez quil est galement possible dappeler une Cloud Et si nous donnions ce rle un droit dcriture sur lun de nos objets ?
Function avec le SDK PHP : PHP CLOUD FUNCTION : Fig.21. PHP PARSE OBJECT ROLE ACL : Fig.25. Et voil, nous disposons main-
Finalement nous allons voir les ACL (Access Control List). Derrire ce tenant dun objet Message auquel seuls les membres du rle
nom barbare se cache un systme de scurisation de vos donnes qui Administrateur ont les droits dcriture tandis que les autres nont, eux,
permet de dfinir des droits sur vos objets Parse ou Utilisateurs. que les droits de lecture.
Par dfaut les utilisateurs ont dj une scurit qui empche toutes
modifications par un autre utilisateur (ParseUser). Les objets Pour en terminer
(ParseObject) ont, eux, besoin quon leur dfinisse les droits globaux ou Sesame Street, Emporio Armani, Cisco, Swisscom, Zynga, Yo, ces noms
pour chaque utilisateur. vous disent peut tre quelque chose ? Un point commun entre tous: ils
PHP PARSE ACL PUBLIC ACCESS : Fig.22. Ici lobjet Message sera dis- utilisent Parse ! Le service de Facebook est en phase de devenir le plus
ponible uniquement en lecture; si vous essayez de le modifier vous rece- performant fournisseur de back-end en plus davoir la meilleure docu-
mentation disponible actuellement. Rapide, simple dutilisation et gra-
tuit, il vous fera gagner un temps de dveloppement consquent pour
vous permettre de vous focaliser sur le plus important: votre applica-
tion. Chez Studio Ymagyn, nous avons dj embot le pas et nous
nutilisons plus que Parse pour nos applications.
Vive le mobile, vive les apps, vive Parse !
u

Fig.22

Fig.17

Fig.18
Fig.23

Fig.19
Fig.24
Fig.20

Fig.21 Fig.25

76 Programmez! < Dcembre 2014


077_080_180 18/11/14 01:19 Page77

Fig.1

Partager du contenu

drupal
entre applications Drupal
De nos jours, les entreprises ne voient plus leur site Internet comme une
application isole mais comme une pice centrale du puzzle quest leur Fig.2
systme d'informations. De nombreux modules Drupal sont disponibles sur
Drupal.org afin de rendre Drupal interoprable avec tous les outils majeurs
(analytics, marketing, CRM, ), quils soient open source ou propritaires.
vous permettre de rcuprer vos
Raphal Khaat
Solution Architect chez Acquia. nodes distants via leur UUID (figure
3). Et voil, vous avez maintenant un
Web service activ et configur !
Un exemple moins courant est d'intgrer un site Drupal un autre. Il existe
de nombreux cas d'utilisation pour une telle solution (environnement de Rcuprer votre
staging(1), partage de contenu, headless Drupal(2), etc). Le but de cet premier node Fig.3
article est de vous montrer tape par tape comment partager du contenu Vrifiez dabord que la configuration
entre sites Drupal via de simples appels Web services. est correcte. Pour cela, 2 mthodes :
Il existe de nombreux clients HTTP
Installation rapide php permettant de consommer des
Tout dabord, vous avez besoin de 2 sites Drupal installs et opration- services REST, comme par exemple
nels. Un site local sur lequel vous crerez du contenu et un site distant la fonction (trs limite) de Drupal,
qui recevra ce contenu. Le plus rapide est dutiliser drush(3) : Drupal_http_request.
Jai choisi dutiliser GuzzleHttp(7) pour sa flexibilit (il sagit presque dun
drush dl Drupal-7.x
Framework pour vos appels http) mais aussi parce qu'il est inclus par
drush site-install standard --account-name=admin --account-pass
dfaut dans Drupal 8. Dans cet article, nous nutiliserons que cette librai-
=password --db-url=mysql://mysqlUser:mysqlPass@localhost/MysqlDb
rie. Tout dabord, installez la librairie dans un rpertoire de test :

CREZ VOTRE php composer require guzzlehttp/guzzle:~4


PREMIER WEB SERVICE REST Ensuite, crez un fichier index.php avec le code suivant :
Module Services, premier round <?php
Installer via drush le module services sur le site distant.
require 'vendor/autoload.php';
drush dl services uuid use GuzzleHttp\Client;
drush en -y services uuid rest_server uuid_services
$url = "http://www.domain.tld/api/v1";
Sur la page du module Services(4), il est inscrit: [Services is] a standar-
dized solution of integrating external applications with Drupal [] . En
$client = new Client();
d'autre terme, il va vous permettre de crer votre propre API.
$response = $client->get($url);

Configuration if (200 == $response->getStatusCode()) {


echo $response->getBody();
La documentation est peu fournie sur Drupal.org(5) mais la documenta-
}
tion de lAPI est consultable sur drupanium(6). Pour configurer le module,
allez sur la page admin/structure/services et cliquez sur add Changez la variable $url puis excutez le script via la commande php
pour crer votre Web service. Donnez-lui un nom et choisissez REST index.php. Vous devez obtenir :
pour le Server. Un endpoint est le chemin vers votre Web service.
Services Endpoint "first_Drupal_ws" has been setup successfully.
Pour www.domain.tld/api/v1/<actions>, mettez api/v1/. Pensez
activer le mode debug, il peut toujours vous tre utile :). Votre configura- En un mot, ce script va effectuer une requte de type GET sur lurl de base
tion doit ressembler la figure 1. Sur la page daccueil du module, utilisez de votre API. Le module services lui rpond que le Web service (appel ici
la liste droulante de votre service et cliquez sur edit server. first_Drupal_ws) est correctement configur. Pour plus dinformations,
Slectionnez json comme Response formatters et application/json consultez la documentation de Guzzle(8). Bon, notre Web service fonc-
comme Request Parsing (voir figure 2). Continuer en cliquant sur lon- tionne, essayons maintenant de rcuprer du contenu. Crez tout dabord
glet resources afin dactiver certains Web services inclus par dfaut. un node simple sur votre site distant (celui o est configur service).
Cliquez sur la flche ct de node et cochez retrieve. Ce service va Publiez-le afin quil puisse tre accessible anonymement! Rcuprez

(1) https://groups.Drupal.org/large-scale-Drupal-lsd-projects-and-plans/content-staging (5) https://www.Drupal.org/documentation/modules/services


(2) https://groups.Drupal.org/headless-Drupal (6) http://drupanium.org/api
(3) http://drush.ws (7) http://guzzlephp.org/
(4) https://www.Drupal.org/project/services (8) http://guzzle.readthedocs.org/en/latest/

Dcembre 2014 > Programmez! 77


077_080_180 18/11/14 01:19 Page78

l'UUID du node (via devel en accdant lurl node/<nid>/devel ou via loption Selected by default. Les champs dans la partie Authorization
drupal

la bdd dans la table node). Editez le fichier index.php et changez lurl en options sont facultatifs dans notre cas.
lui ajoutant /node/<uuid>. Par exemple : http://www.domain.tld/api/v1/ Sur longlet authentication (admin/structure/services/list/
node/4f8862b1-4bc7-4948-94b2-c3aeae9dabab <webservice_name>/authentication), slectionnez le contexte
Excutez nouveau ce code. Vous devriez recevoir du json (comme que vous venez de crer ainsi que Consumer key, also known as 2-legged
configur prcdemment) reprsentant le node. Changez nouveau le OAuth pour le Default required authentication. Sauvegardez, puis choi-
fichier index.php en changeant echo $response->getBody(); par sissez le niveau dautorisation que vous avez cr pour ce contexte (voir
print_r($response->json()); et relancez le script. Vous avez figure 5). Pour finir, il vous faut configurer la ressource de votre Web services
maintenant votre node reprsent sous forme de tableau. afin de la scuriser par OAuth. Allez sur longlet resources et slectionnez
Bravo! Vous venez de crer et configurer un Web service avec Drupal (et pour laction node -> retrieve Consumer key pour required authentica-
le module services) afin de rcuprer des nodes publis. La prochaine tion et laissez default pour le niveau dautorisation (voir figure 6).
tape est de pouvoir rcuprer des nodes non publis :-).
Rles et permissions
Requte authentifie Crez un utilisateur ddi vos appels Web service et attribuez lui un rle lui
Pour rcuprer des contenus (entits, files, taxonomies, ) non publis permettant de crer et modifier des nodes. Les prochaines requtes seront
ou pour modifier des contenus, il vous faudra soit autoriser ces actions faites via OAuth comme tant faites par cet utilisateur. Si votre utilisateur na
pour les utilisateurs anonymes (par piti, non!) ou authentifier vos pas les bonnes permissions, vous recevrez un code retour 503. Une fois votre
requtes pour scuriser votre application. Plusieurs mthodes existent utilisateur cr avec les bons rles/permissions, cliquez sur longlet Oauth
telles que lauthentification classique par login / password, lauthentifi- consumers de sa page de profil (ou lurl user/<uid>/oauth/consu-
cation via OAuth (2-legged-oauth ou 3-legged-oauth), etc. Dans cet mer). Cliquez sur Add consumer, donnez un nom et slectionnez votre
article, nous allons utiliser OAuth. Je dconseille lutilisation simple de context. Laissez le champ callback url vide (utile que pour la mthode 3
login/mot de passe vu quil vous faudra stocker ces informations en clair. legged OAuth). Editez ce comsumer pour rcuprer la cl (key) et le jeton
Si vous souhaitez tout de mme essayer, il vous faudra regarder du ct secret (token) que nous utiliserons dans notre prochain code.
de lutilisation de cookie via Guzzle(9). Un exemple est disponible sur le
repo git de cet article. Requte scurise via OAuth
Maintenant que la configuration du module services est complte, le pr-
Le protocole OAuth(10) cdent script devrait vous afficher lerreur 401 suivante :
Pourquoi ?
[status code] 401 [reason phrase] Unauthorized : The request
Pour paraphraser wikipedia(11), OAuth est un protocole libre [ permet-
must be signed'
tant] d'autoriser un site Web utiliser l'API scurise d'un autre site Web
pour le compte d'un utilisateur.. Deux versions de ce protocole existent. Avant de modifier votre code, il vous faut installer GuzzleHttp OAuth sub-
GuzzleHttp ne supporte pas encore la version 2 mais une pull request scriber(14) via composer :
est en attente sur github au moment o jcris cet article(12). Dans notre
composer require gul guzzlehttp/oauth-subscriber:0.1.*
cas, il sagit simplement de transmettre des donnes dun client un ser-
veur, cest pourquoi nous utiliserons la mthode dite 2 legged OAuth Modifiez votre fichier index.php comme suit :
(pas daction ncessaire par utilisateur). Je vous conseille de lire le dtail
<?php
de ces diffrentes solutions :).
require vendor/autoload.php;
Installation
use GuzzleHttp\Client;
Tlcharger et installer les modules ncessaires :
use GuzzleHttp\Subscriber\Oauth\Oauth1;
drush dl oauth
drush en -y oauth_common services_oauth oauth_common_providerui

Module services, 2me round


Retournez sur la page de configuration du service (/admin/structu-
re/services/list/<webservice_name>). Une nouvelle option est
disponible pour lauthentification : OAuth authentication. Cocher cette
case et sauvegarder. Il vous faut maintenant configurer le fournisseur OAuth
vous rendant sur admin/config/services/oauth. Slectionner lop-
tion Enable the oauth provider et laissez les autres valeurs qui ne concer-
nent que la mthode 3 legged OAuth. Ensuite, vous devez crer un
Fig.5
contexte OAuth avec les autorisations ncessaires. Chaque mthode de
notre Web service peut tre associe un niveau dautorisation diffrent.
Choisissez un nom machine, un titre et slectionnez uniquement HMAC-
SHA1(13) pour la signature. Ajoutez un niveau dautorisation et slectionnez

(9) http://guzzle.readthedocs.org/en/latest/clients.html?highlight=cookie#cookies
(10) http://oauth.net/
(11) https://fr.wikipedia.org/wiki/OAuth
(12) https://github.com/guzzle/oauth-subscriber/pull/20
(13) http://oauth.net/core/1.0/#anchor16
(14) https://github.com/guzzle/oauth-subscriber Fig.6

78 Programmez! < Dcembre 2014


077_080_180 18/11/14 01:19 Page79

drush dl uuid composer_manager

drupal
$uuid = '';
Maintenant, vous allez crer un module contenant votre code ainsi quun
$oauth_creds = array('consumer_key' => '', 'consumer_secret' => '');
fichier composer.json. Composer_manager cherche la racine de chaque
module l'existence dun fichier composer.json et se charge dinstaller toutes
$url = 'node/' . $uuid;
les librairies ncessaires en grant les numros de versions et les dpen-
$client = new Client(array(
dances dans sites/all/vendor. Commenons par crer les fichiers
'base_url' => 'http://www.domain.tld/api/v1/',
'defaults' => array( mkdir -p sites/all/modules/custom/remote_publish
'auth' => 'oauth', touch sites/all/modules/custom/remote_publish/remote_publish.
'debug' => true, {info,module}
) touch sites/all/modules/custom/remote_publish/composer.json
));
diter le fichier composer.json avec le contenu suivant :
$oauth = new Oauth1(array(
'consumer_key' => $oauth_creds['consumer_key'], {
'consumer_secret' => $oauth_creds['consumer_secret'], "require": {
)); "guzzlehttp/guzzle": "*",
$client->getEmitter()->attach($oauth); "guzzlehttp/oauth-subscriber": "*"
$response = $client->get($url); }
if (200 == $response->getStatusCode()) { }
print_r($response->json());
ditez le fichier remote_publish.info et indiquer composer_mana-
}
ger, entity, uuid comme dpendances.
Noubliez pas de changer les variables $uuid et $oauth_creds. Ensuite, utilisez drush pour installer votre module et ses dpendances :
Consumer_key et consumer_secret sont respectivement la cl et le
drush en -y remote_publish
jeton rcuprs prcdemment. Examinons ce nouveau code.
Linstanciation de notre client nest plus la mme. Nous lui passons un Il est important dutiliser drush pour que composer_manager sexcute
tableau de configuration avec une base_url (afin de ne pas la rpter en correctement. Vrifiez que vos librairies sont prsentes dans
cas de requte multiple) ainsi quune configuration par dfaut pour toutes sites/all/vendor.
nos requtes : mode debug activ et authentification par OAuth.
Ensuite nous crons avec la cl et le token une instance de Utilisez Guzzle dans Drupal
GuzzleHttp\Subscriber\Oauth\Oauth1 que nous attachons Ok, tout est install, yapluka comme on dit! Ouvrez le fichier remo-
notre client afin quil puisse modifier les requtes Guzzle pour intgrer les te_publish.module et placez la fonction ci-dessous :
headers OAuth. Et cest tout :). Lancer de nouveau le script et vous
devriez recevoir le node complet nouveau. Si vos logs sont activs function _remote_publish($uuid) {
(admin/reports/dblog ou via syslog), vous pouvez voir que services $oauth_creds = array('consumer_key' => '', 'consumer
a identifi la requte comme provenant de votre utilisateur grce OAuth. _secret' => '');
$url = 'node/' . $uuid;
PARTAGEZ DU CONTENU $client = new \GuzzleHttp\Client(array(
ENTRE DRUPAL 'base_url' => 'http://www.domain.tld/api/v1/',
Vous savez maintenant lancer des requtes authentifies via OAuth avec 'defaults' => array(
Guzzle. Vous saurez bientt crer votre premier node distance. Mais 'auth' => 'oauth',
dabord, il faut configurer une dernire fois le module services. 'debug' => true,

Fig.7
Module services, dernier round
Dernire modification de configuration du Drupal distant. ditez les
ressources de votre Web service et ajoutez les actions suivantes: node
CRUD operations -> update. Si vous souhaitez attacher des fichiers
votre node, il vous faudra aussi slectionner attach_file dans node ->
targeted actions (figure 7). Sur longlet server, cochez la case
application/x-www-form-urlencoded dans la partie
request_parsing afin que votre Web service accepte les headers pour
la soumission de formulaire(15). Votre site Drupal distant est prt :)!

Configuration du 2me Drupal


Cest lheure de configurer notre 2me site Drupal qui prenait la poussi-
re :). Cette configuration est beaucoup plus simple que la prcdente.
Ensuite, il vous faudra importer le code dans Drupal.

Installation des modules


Pour utiliser GuzzleHttp dans Drupal, le plus simple est dutiliser le modu- (15) https://en.wikipedia.org/wiki/Percent-encoding#The_application.2Fx-www-form-urlencoded_type
le Drupal composer_manager(16) : (16) https://www.Drupal.org/project/composer_manager

Dcembre 2014 > Programmez! 79


077_080_180 18/11/14 01:19 Page80

drupal
) }
)); catch(\Exception $e) {
$oauth = new \GuzzleHttp\Subscriber\Oauth\Oauth1(array( drush_log($e->getMessage(), 'error');
'consumer_key' => $oauth_creds['consumer_key'], }
'consumer_secret' => $oauth_creds['consumer_secret'], if ($response && 200 == $response->getStatusCode()) {
)); return $response->json();
$client->getEmitter()->attach($oauth); }
$response = $client->get($url);
if (200 == $response->getStatusCode()) { return FALSE;
return $response->json(); }
}
} Remarquez lutilisation de la mthode PUT la place de POST contraire-
ment la documentation. Cela cause du module uuid_service qui
Le mme code que prcdemment mais plac dans une fonction dans un modifie la ressource de services (via le hook_services_
module Drupal. La seule diffrence est que jinstancie lobjet avec son resources_alter) afin de permettre la cration / modification denti-
nom de classe complet. Vous pouvez tester votre fonction via drush: t en une seule mthode (PUT node/UUID). Pour plus dinformations,
drush php-eval "print_r(_remote_publish(<UUID>));" ouvrez le fichier uuid_services.module. En outre, le 2nd argument
Remplacer <UUID> par un uuid existant sur votre Drupal distant et vali- permet de prciser que les donnes seront envoyes au format json (cf la
dez! Si tout se passe bien, vous recevrez un tableau reprsentant le node configuration du service). Le node charg par Drupal (via entity_
sur le Drupal distant :). Tout est enfin en place, ne vous inquitez pas, uuid_load) est donc simplement converti au format JSON. Rien de trs
vous y tes presque! compliqu donc :).
Excutez nouveau la commande drush php-eval en passant
Partager du contenu, enfin! lUUID du node local cette fois ci. Si tout va bien, vous recevrez en retour
Crez un node via un appel Web service un tableau le reprsentant sur le site distant. Simple, nest-ce pas :) ?
Pour le moment, vous avez juste intgr le code du fichier index.php dans
un module Drupal. Cest lheure denvoyer un node dun Drupal un Troubleshooting :
autre. Mais avant, soyez sr davoir au moins un node partager et rcu- Voici une liste rapide derreurs communes que vous pourriez rencontrer
prez son uuid comme vu plus haut. Ensuite, modifiez la fonction durant vos tests :
_remote_publish comme suit : [status code] 403 [reason phrase] :Access denied for user oauth user:
Cette erreur indique que vous navez pas donn les bonnes permissions
function _remote_publish($uuid = null) { votre utilisateur OAuth.
if (!$uuid) { [status code] 406 [reason phrase] Not Acceptable: Unsupported request
return FALSE; content type application/x-www-form-urlencoded: Cela signifie que vous
} navez pas activ loption x-www-form-urlencoded pour le serveur de
$entities = entity_uuid_load('node', array($uuid)); votre service. [status code] 404 [reason phrase] Not found: Could not find
// Reset return the first element if it exists. the controller: Services indique ici quil na pas pu trouver un contrleur
$entity = (array)reset($entities); pour votre Web services. La raison la plus problable est que le nombre
darguments reu nest pas bon, ou que vous nutilisez pas le bon verbe
$oauth_creds = array('consumer_key' => '', 'consumer_ (ex: POST au lieu de PUT).
secret' => '');
$url = 'node/' . $uuid; Remarques sur les rfrences et les assets
$client = new \GuzzleHttp\Client(array( Lexemple ci-dessus est trs simple et la plupart du temps, vos types de
'base_url' => 'http://www.domain.tld/api/v1', contenus seront plus compliqus avec des rfrences des termes de
'defaults' => array( taxonomie ou des entits, ou bien des assets (fichiers, images) attachs.
'auth' => 'oauth', Le code tel que montr ne fonctionnera pas avec ces types de champs.
'debug' => TRUE,
) Conclusion
)); Dans cet article, vous avez appris configurer le module services afin de
$oauth = new \GuzzleHttp\Subscriber\Oauth\Oauth1(array( crer des Web services avec une authentification via OAuth. Le contenu
'consumer_key' => $oauth_creds['consumer_key'], partag tait assez simple et vous pouvez imaginer que dans des
'consumer_secret' => $oauth_creds['consumer_secret'], exemples complexes cela peut devenir beaucoup plus compliqu. En
)); outre, nous navons pas intgr ce code dans un vrai workflow Drupal (via
$client->getEmitter()->attach($oauth); hook la sauvegarde du node, via rules, etc.) mais au moins la configu-
ration de services est clair (du moins jespre :)). Il ne vous reste plus qu
$response = FALSE; coder pour faire de puissantes API :). Tous les morceaux de code pr-
try { sents dans cet article sont disponibles sur ma page github(17).
$response = $client->put(
$url, u
array('json' => $entity)
); (17) https://github.com/bacardi55/remote-publishing-article

80 Programmez! < Dcembre 2014


081_083_180 18/11/14 01:21 Page81

Crer une application Bootstrap

framework
avec le mkframework
Vous avez pu dcouvrir dans PROGRAMMEZ! (167, 170 et 173) un framework diffrent. Dans ce
tutoriel, je vous propose de crer votre premire application Bootstrap en toute simplicit avec ce
mme framework. Bootstrap est un framework css permettant davoir une application responsive.
Ce terme signifie que le site va sadapter lcran qui le consulte. Par exemple en mode
smartphone, le menu se minimise et affiche un bouton burger pour lafficher.
gnrer automatiquement partir de votre fichier de profils de connexion.
Michal Bertocchi
@dupot_org Cliquez sur crer la couche modle. Vous voyez lists les profils de votre
site, ici bootstrapDb (prcdemment renseign). Cliquez dessus. Le
builder vous liste les tables visibles via ce profil, dans notre cas les tables
Tlcharger et installer le framework note et member prcdemment cres. Validez avec le bouton gnrer.
Rendez-vous ladresse http://mkframework.com Il vous cre alors les fichiers model/model_note.php et
Copiez ce rpertoire zip dans votre rpertoire Web, et dsarchivez-le model/model_member.php qui contiennent les classes
Ouvrez votre navigateur sur http://localhost/mkframework_v4_XX_YY_rZZZ model_note/row_note et model_member/row_member.
en fonction de la version tlcharge Un exemple de classe model :

Crer la base de donnes <?php


class model_note extends abstract_model{
Dans votre base de donnes MySQL, nous allons crer une table
contact. Executez la requte SQL suivante :
protected $sClassRow='row_note';
CREATE TABLE `note` (
`id` int(11) NOT NULL auto_increment, protected $sTable='note';
`text` varchar(50) NOT NULL, protected $sConfig='bootstrapDb';
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`) protected $tId=array('id');
);
CREATE TABLE `member` ( public static function getInstance(){
`id` int(11) NOT NULL auto_increment, return self::_getInstance(__CLASS__);
`login` varchar(50) NOT NULL, }
`password` varchar(50) NOT NULL,
PRIMARY KEY (`id`) public function findById($uId){
); return $this->findOne('SELECT * FROM '.$this->sTable.' WHERE

Crons lapplication id=?',$uId );


}
Ouvrez le navigateur ladresse du framework Fig.1. Entrez le champ de
public function findAll(){
formulaire le nom de votre application, slectionnez Application compa-
return $this->findMany('SELECT * FROM '.$this->sTable);
tible bootstrap Le builder vous cre une application dans le rpertoire
}
data/genere du framework et vous redirige ensuite sur la page dadminis-
tration de celle-ci.

Modifiez les paramtres de connexion }

Cliquez sur le bouton explorer le projet, et ouvrez le rpertoire conf/ Un exemple de classe row :
Cliquez sur le fichier connexion.ini.php, puis sur le bouton EDITER EN <?php
ENTIER pour modifier vos profils de connexion. class row_note extends abstract_row{

Inscrivez votre profil mysql


protected $sClassModel='model_note';
;<?php die()?>
[db] Fig.1
bootstrapDb.dsn="mysql:dbname=bootDb;host=localhost"
bootstrapDb.sgbd=pdo_mysql
bootstrapDb.username=root
bootstrapDb.password=root

Gnrer la couche modle


Le framework utilise une structure MVC, il ncessite donc des classes
pour interagir avec la base de donnes. Le builder vous propose de les

Dcembre 2014 > Programmez! 81


081_083_180 18/11/14 01:21 Page82

temps. Validez avec le bouton crer, le builder crera un module note.


framework

/*exemple jointure Note: lorsque le builder gnre le CRUD, il affiche un lien permettant de
public function findAuteur(){ voir le module gnr. Voici quoi ressemble en partie le module note :
return model_auteur::getInstance()->findById($this->auteur_id);
} <?php
*/ class module_note extends abstract_module{
/*exemple test validation*/
private function getCheck(){ public function before(){
$oPluginValid=new plugin_valid($this->getTab()); $this->oLayout=new _layout('bootstrap');
/* renseigner vos check ici*/
$oPluginValid->isNotEmpty(text,'Le champ ne doit pas //assignez le menu l'emplacement menu
&ecirc;tre vide); $this->oLayout->addModule('menu','menu::index');
}
return $oPluginValid; public function _index(){
} //on considre que la page par dfaut est la page de listage
$this->_list();
public function isValid(){ }
return $this->getCheck()->isValid(); public function _list(){
}
public function getListError(){ $tNote=model_note::getInstance()->findAll();
return $this->getCheck()->getListError();
} //cration dun objet vue
public function save(){ $oView=new _view('note::list');
if(!$this->isValid()){ //assignation du tableau des notes la vue
return false; $oView->tNote=$tNote;
}
parent::save(); //on envoie lobjet vue lemplacement main du layout
return true; $this->oLayout->add('main',$oView);
}
}
} public function _new(){
$tMessage=$this->processSave();
Gnrer le module CRUD de la table note
CRUD signifie Create Read Update Delete. Ceci dsigne les pages $oNote=new row_note;
ncessaires pour administrer une table: un tableau listant les enregistre- $oNote=$this->fillRow($oNote);
ments, ainsi que les pages daffichage, dajout de modification et de sup-
pression. Cliquez sur crer un module CRUD bootstrap. $oView=new _view('note::new');
Le builder vous liste les classes modles disponibles : Fig.2. $oView->oNote=$oNote;
Cliquez sur la classe model_note.php. Linterface de gnration de
CRUD vous propose de nombreuses options pour vous faire gagner du $oPluginXsrf=new plugin_xsrf();
$oView->token=$oPluginXsrf->getToken();
$oView->tMessage=$tMessage;

$this->oLayout->add('main',$oView);
}
public function _edit(){
$tMessage=$this->processSave();

Fig.2 Fig.3

82 Programmez! < Dcembre 2014


081_083_180 18/11/14 01:21 Page83

framework
$oNote=model_note::getInstance()->findById( _root::getParam('id') ); Param('id',null) );
$oNote=$this->fillRow($oNote); }

$oView=new _view('note::edit'); $tId=model_note::getInstance()->getIdTab();


$oView->oNote=$oNote; $tColumn=array('text');
$oView->tId=model_note::getInstance()->getIdTab(); foreach($tColumn as $sColumn){
$oPluginUpload=new plugin_upload($sColumn);
$oPluginXsrf=new plugin_xsrf(); if($oPluginUpload->isValid()){
$oView->token=$oPluginXsrf->getToken(); $sNewFileName=_root::getConfigVar('path.upload')
$oView->tMessage=$tMessage; $sNewFileName.=$sColumn.'_'.date('Ymdhis');

$this->oLayout->add('main',$oView); $oPluginUpload->saveAs($sNewFileName);
} $oNote->$sColumn=$oPluginUpload->getPath();
private function fillRow($oNote){ continue;
//si ce n'est pas une requte POST on ne soumet pas }else if( _root::getParam($sColumn,null) === null ){
if(!_root::getRequest()->isPost() ){ continue;
return $oNote; }else if( in_array($sColumn,$tId)){
} continue;
//on remplit ici lobjet avec les paramtres du formulaire }
s'il est envoy
//pour ne pas perdre la saisie $oNote->$sColumn=_root::getParam($sColumn,null) ;
$tId=model_note::getInstance()->getIdTab(); }
$tColumn=model_note::getInstance()->getListColumn();
foreach($tColumn as $sColumn){ if($oNote->save()){
if( _root::getParam($sColumn,null) === null ){ //une fois enregistr on redirige (vers la page liste)
continue; _root::redirect('note::list');
}else if( in_array($sColumn,$tId)){ }else{
continue; return $oNote->getListError();
} }

$oNote->$sColumn=_root::getParam($sColumn,null) ; }
}
return $oNote; Crons un menu notre application
} Le builder vous permet galement simplement de gnrer un module
private function processSave(){ menu pour vous. Cliquez sur crer un module menu bootstrap Fig.3.
//si ce n'est pas une requte POST on ne soumet pas Vous voyez liste ici la liste des modules/actions disponibles dans votre
if(!_root::getRequest()->isPost() ){ application. Validez avec le bouton Gnrer le menu.
return null; Le builder vous indique quil a bien gnr le module menu et vous
} affiche le code pour linclure dans vos modules. Copiez ce code dans le
module note, fichier module/note/main.php (en fin de mthode before)
$oPluginXsrf=new plugin_xsrf();
<?php
//on vrifie que le token est valide
class module_note extends abstract_module{
if(!$oPluginXsrf->checkToken( _root::getParam('token') ) ){
return array('token'=>$oPluginXsrf->getMessage() );
public function before(){
}
$this->oLayout=new _layout('bootstrap');

$iId=_root::getParam('id',null);
//assignez le menu a l'emplacement menu
if($iId==null){
$this->oLayout->addModule('menu','menu::index');
$oNote=new row_note;
}
}else{
$oNote=model_note::getInstance()->findById( _root::get Et ainsi en retournant sur votre application vous voyez votre application
avec le menu Fig.4. Et en redimensionnant la fentre (simulant un smart-
phone).

Conclusion
Vous avez pu voir dans ce tutoriel comment crer une application boots-
trap. Le builder facilite la tche dans la cration dune application boots-
trap. Vous avez lexposant bootstrap pour vous indiquer les modules
adapts.
Fig.4 u

Dcembre 2014 > Programmez! 83


084_085_180 18/11/14 01:21 Page84

Premiers pas avec le framework AngularJS


web

AngularJS est un framework Javascript port par Google. C'est une infrastructure MVVM (Modle-
Vue-Vue/Modle) qui se positionne ct front-end. Sa finalit tant de construire des Web Apps en
opposition NodeJS qui se positionne ct serveur. Ce framework structure le code et impose une
architecture au projet. Il se base sur la librairie open source JQuery.
fichiers Javascript contenant les fractions de code tester se trouvent
Alice Barralon
Chef de projet mobilit dans le dossier [test/unit].
alice.barralon@gmail.com Une fois la commande lance, les tests sont excuts dans la fentre
du navigateur et les rsultats affichs dans la console. Karma coute
Pour commencer avec NodeJS, il est prconis de connatre les bases les fichiers de tests et ds quune ligne est modifie, les tests sont
fondamentales dHTML, CSS et Javascript. Des notions de tests automa- rejous automatiquement.
tiss (BDD : Behavior Driven Development et TDD : Test Driven Develop- Pour un dveloppeur, cest donc intressant davoir une console
ment) sont un plus. Il nest pas ncessaire dtre expert en JQuery et ouverte avec les tests sexcutant au fur et mesure que le code
autres langages Web. Cet article sappuie sur le tutoriel en anglais prsent volue.
sur le site officiel dAngularJS (https://docs.angularjs.org/tutorial). Tous w [npm run protractor]: dmarre les tests E2E (end to end)
les exemples cits peuvent y tre copis. Protractor. Les fichiers Javascript contenant les tests de linterface se
trouvent dans le dossier [test/e2e].
Les outils installer pour travailler Ces tests valident lapplication dans son ensemble. Il faut lancer deux
w GIT (http://msysgit.github.io/) consoles. Dans une premire console, dmarrer le serveur [npm
w Editeur de texte de type : SublimeText (http://www.sublimetext.com/) start] puis dans une seconde console lancer lexecution des tests
w Serveur Web local : NodeJS (http://nodejs.org/download/) [npm run protractor] .
Une fois NodeJS install, il est possible dinstaller les dpendances Une fois la commande lance, les tests sont excuts dans la fentre
avec la commande : du navigateur, les rsultats sont affichs dans la console. La fentre
[npm install]. La commande va procder linstallation dans le du navigateur est ferme la fin des tests.
rpertoire courant [node_modules] des outils suivants :
w Bower (code package manager ct client), Pattern MVC
w HttpServer (serveur local), Angular encourage lutilisation du pattern MVC (Model Vue Controller)
w Karma (test unitaire), pour rendre le code modulaire.
w Protractor (test end to end / E2E)
Elle va galement sauvegarder les dpendances installes dans le La Vue
fichier package.json. Lintrt tant que les autres dveloppeurs qui tra- La Vue est une projection du modle travers un template HTML. Par
vaillent sur le projet pourront rcuprer facilement toutes les dpen- consquent, lorsque le modle change, la vue est impacte directement
dances associes. travers le binding. Lappel dAngular se fait directement dans le fichier
HTML, par le biais de lajout de la directive <html ng-app> qui va
Larchitecture du projet informer le navigateur. Ajouter ensuite le tag dappel dans le header :
Fig.1 <script src="bower_components/angular/angular.js">
w App : le rpertoire de lapplication qui com- Lappel se fait via des accolades de la manire suivante :
prend les templates HTML, vues partielles, <p>1 + 2 = {{ 1 + 2 }}</p> Fig.2 .
CSS, images, js, etc.
w App/bower_components : les composants Le contrleur
angular (camera, animation, webcam, rou- Il tablit le data-binding entre le Modle et la Vue. Il instancie via un
ter, etc.), constructeur le modle de donnes. Le constructeur prend un $scope
w App/js : le ou les controleurs JS,
w Test/ unit : les fichiers JS de tests unitaires,
w Test/e2e : les scnarios de tests fonctionnels,
w Node_module : les commandes angular ins-
talles par le projet (karma, protractor,
bower, etc.)

Fig.1
Les principales commandes
Les commandes suivantes sont excuter
Vue de larchitecture du projet
depuis le rpertoire de travail courant :
w [npm start] : dmarre un serveur Web local qui coute sur le port
8080 : http://localhost:8000/app/index.html
w [npm test] : dmarre le test unitaire Karma. Le fichier de configu- Fig.2
ration est plac dans le dossier [test/karma.conf.js]. Les Dclaration des directives AngularJS

84 Programmez! < Dcembre 2014


084_085_180 18/11/14 01:21 Page85

en paramtre Fig.3. On retrouve dans cet exemple le module Remarque : la syntaxe du test ci-dessus ressemble fortement au test

web
phonecatApp dclar dans la balise <html> de la vue et la dclaration du contrleur crit avec Jasmine et discut prcdemment.
du contrleur prsente dans la balise <body>. Pour lancer le test : [npm run protractor]

Les tests Fonctionnalit AngularJS :


Le point fort dAngular est la programmation par les tests. La sparation ajout dune fonction de tri
de la vue et du contrleur facilite ainsi les tests unitaires. Dans cet En complment de la zone de recherche, nous allons ajouter la possibili-
exemple les tests sont crits avec la librairie Javascript Jasmine t de trier la liste de rsultats. Une nouvelle fois, les changements de
(http://jasmine.github.io/). Le fonctionnement est simple : on crit en code sont effectus dans le template HTML Fig.8. La partie recherche
langue naturelle les assertions et rsultats attendus Fig.4 et 5. textuelle prsente prcdemment reste inchange. Une nouvelle direc-
tive <select> est ajoute. Limpact au niveau du modle se fait avec
Remarque : pour relancer les tests, il suffit simplement de changer le la directive [orderBy]. Le contrleur est inchang
fichier javascript de tests ou la source, Karma repasse les tests auto-
matiquement (si la console de lancement est toujours active) sans En conclusion, la prise en main du framework AngularJS est assez facile
relancer la commande, ce qui est trs pratique. et rapide, les tutoriels sont nombreux et bien dtaills. Dautres techno-
logies sappuient sur AngularJS pour crer des applications mobiles
Fonctionnalits Angular : Web ou natives, par exemple le framework Ionic (http://ionicframe-
la recherche textuelle work.com/).
Si nous voulons pousser lexemple plus loin en ajoutant un moteur de u
recherche, inutile de changer le contrleur. Angular prvoit une directive
qui effectue de la recherche textuelle sur la liste modle : Zone de
recherche: <input ng-model="query">
Lapplication du filtre donn dans la text box est immdiate et filtre les
lments du modle en fonction du mot cl donn par la valeur [query]
phone in phones | filter:query Fig.6
Pour tester ce type de filtre qui impacte directement le DOM, les tests
unitaires ne sont pas idaux (rappelons que le contrleur na pas vo-
lu). Il est prfrable de mettre en place un scnario de test qui sera
jou dans le navigateur.
Le scnario prsent ci-dessous va simuler 2 requtes dans la zone de
recherche et sassurer que les rsultats filtrs sont au nombre attendu
Fig.7. Fig.6
Filtre sur une text-box

Fig.3
Controller et chargement du modle de donnes

Fig.7

Scnario pour tester le filtre sur le modle de donnes

Fig.4
Test du contrleur crit dans lexemple prcdent

Fig.5 Fig.8
Rsultats des tests Ajout dune fonction de tri

Dcembre 2014 > Programmez! 85


086_092_180 18/11/14 01:23 Page86

Les algorithmes de tri 1re partie


algorithmes

En passant la machine caf, vous avez sans doute dj crois des dveloppeurs. Vous avez sans
doute constat quils ont l'air passionns par leur mtier, ce qui rend leurs discussions animes. Et
vous les avez sans doute entendu prononcer des mots comme Bubble, Quicksort, logarithme
ou encore complexit, qui semblent provenir d'une autre langue. Ce sont pourtant des notions
primordiales en programmation. Dans cet article, nous allons tenter de dmystifier ce charabia.
Fig.1

Thierry Leriche-Dessirier
Architecte JEE freelance / Team leader / Professeur
lESIEA
http://www.icauda.com

Bubble, Quicksort, Insertion ou encore Fusion (pour ne citer


queux) sont les noms donns des algorithmes de tri clbres. Wikipedia

Puyo / Podcast Science


indique(1) quun algorithme est une suite finie et non ambige dopra-
tions ou d'instructions permettant de rsoudre un problme. Un algorith-
me de tri est donc la recette de cuisine permettant un logiciel de
ranger les lments dune liste.
On veut trier une liste lorsquon pense que ses lments sont dans le
dsordre, ou plus prcisment dans un ordre qui ne nous convient pas. Photo de classe.
Lobjectif du tri, en tant qualgorithme, est de mettre les lments dans le
bon ordre. Trier une liste suppose donc quon est capable dtablir une public interface Tri {
relation dordre entre ses lments (ce qui nest pas toujours simple et/ou void trier(final int[] tab);
possible). Par exemple, on peut dire si Nicolas est (objectivement) plus ...
petit que David. Quand je parle de plus petit, je fais instinctivement
rfrence la taille des personnes, mais on aurait tout aussi bien pu com- Il faut prciser quil existe des bons et des mauvais algorithmes de tri.
parer leurs poids, leurs quantits de cheveux, leurs notes au baccalau- Quand on trie une petite liste et quon le fait rarement, mme le plus mau-
rat, etc. Mais pour simplifier, disons juste quon se base sur le critre de vais des algorithmes fera laffaire. Par contre, quand on manipule des
la taille. Dans cet article, nous nallons traiter que des entiers pour simpli- listes consquentes et/ou quon les trie souvent, il faut choisir avec atten-
fier la discussion. La relation dordre sera donc tablie. tion lalgorithme qui sera le plus adapt au contexte.
Si ce sujet revient souvent chez les dveloppeurs, cest parce que le
besoin de trier des donnes est omniprsent dans les programmes infor- On teste en trois temps
matiques. Par habitude ou par inattention, on ne ralise pas quon mani- Avant dentrer dans le vif du sujet, nous allons crire des tests simples,
pule sans arrt des donnes tries. Par exemple, disons quon sintresse laide de la bibliothque JUnit, qui nous permettront de vrifier de manire
votre compte bancaire. Sur votre relev, les oprations sont tries par automatique que les programmes fonctionnent correctement. Cela sins-
date. Quand vous souscrivez loption Web, vous avez galement la pos- crit dans une dmarche qualit. Pour cela, nous allons employer la mtho-
sibilit de trier selon les enttes des colonnes (montant, date, numro de 3T (Tests en Trois Temps(3)) qui sinspire du TDD (Test Driven
dopration, bnficiaire, type, etc.), mais vous ne vous tes probable- Development). Durant lcriture de cet article, cette dmarche a permis
ment jamais dit quil y avait un algorithme efficace cach derrire cette didentifier des erreurs qui seraient trs certainement passes inaperues
fonctionnalit. sans. Tous les algorithmes doivent passer par la mme moulinette de tri.
On peut donc en crire une version abstract, comme suit, dont devront
il faut choisir lalgorithme adapt au contexte hriter toutes les classes de test:

En Java(2), on dispose de deux structures de donnes intressantes public abstract class AbstractTriTest {
trier: les listes et les tableaux. Les algorithmes base de listes sont plus protected Tri tri;
faciles programmer, mais sont gnralement moins performants. Les
tableaux demandent parfois de se retourner le cerveau pour coller les- @Test
prit de lalgorithme, mais le jeu en vaut la chandelle. Cest donc ces der- public void testTriTabVide() {
niers que nous allons nous intresser. Dans cet article, nous allons final int[] tab = {};
discuter dune poigne dalgorithmes. Pour que lensemble soit cohrent, doTestTri(tab);
je vous propose de crer linterface Tri qui dfinit la mthode trier(). }
Cette mthode ne renvoie rien. Elle prend un tableau en paramtre et le
trie sur place. @Test
public void testTriTabUnSeulElement() {
(1)
Algorithme sur Wikipedia : http://fr.wikipedia.org/wiki/Algorithme
(2)
On aurait pu crire le mme article dans un autre langage avec finalement assez peu de retouches. final int[] tab = { 1 };
(3)
3T: http://icauda.com/articles.php#3t doTestTri(tab);

86 Programmez! < Dcembre 2014


086_092_180 18/11/14 01:23 Page87

algorithmes
} tri.trier(tab);

@Test int temp = Integer.MIN_VALUE;


public void testTriTabDeuxElements() { for (final int elt : tab) {
final int[] tab = { 2, 1 }; Assert.assertTrue(temp <= elt);
doTestTri(tab); temp = elt;
} }
}
...
Ici, lide est de multiplier les cas de tests. Vous trouverez de nombreux
@Test autres tests dans le code source propos avec cet article sur le site Web de
public void testTriTabMelange() { Programmez. Un des tests (non prsent ici) a consist gnrer, selon
final int[] tab = { 8, 6, 3, 9, 2, 1, 4, 5, 7 }; diverses distributions (alatoire, croissante, dcroissante, quasi croissante,
doTestTri(tab); gaussienne, sinusodale, etc.), des fichiers (des petits et des gros, voire trs
} gros) contenant des listes trier. En entreprise, on entend souvent dire ( tort
ou raison) quil faut utiliser les fonctionnalits du langage pour trier des
@Test tableaux. Cela va donc nous fournir un premier algorithme de rfrence. On
public void testTriTabQuasiTrie() { commence bien entendu par la classe de test qui sera relativement simple:
final int[] tab = { 1, 2, 3, 4, 5, 6, 9, 8, 7 };
doTestTri(tab); public class JavaTriTest extends AbstractTriTest {
}
@Before
... public void doBefore() {
tri = new JavaTri();
protected void doTestTri(final int[] tab) { }

Fig.2 Fig.3

Dcembre 2014 > Programmez! 87


086_092_180 18/11/14 01:23 Page88

Dans la suite de cet article, les classes de test des autres algorithmes seront se. titre dillustration, disons quil y en a dix-huit (cf. dessins). Pour slec-
algorithmes

toujours calques sur ce modle. Elles ne seront donc pas prsentes. tionner le plus petit, le photographe doit donc passer en revue les 18

il faut utiliser les fonctionnalits du langage lves, ce qui ncessite de faire 17 comparaisons. Pour le deuxime, il
reste 17 lves comparer, ncessitant 16 comparaisons. Pour le troisi-
La classe qui met a en pratique sera galement trs simple puisquil suf- me il faudra faire 15 comparaisons, et ainsi de suite Au final, le photo-
fit de faire appel aux mthodes dj existantes: graphe va donc faire 17+16+15++1 comparaisons, ce qui est un peu
long calculer. Heureusement, on fait un peu de maths au lyce. a peut
public class JavaTri implements Tri { se factoriser laide de la formule n*(n-1)/2, ce qui donne 153 com-
paraisons pour une classe de dix-huit bambins.
@Override la fin de la journe, le photographe doit donc avoir un sacr mal de tte.
public void trier(final int[] tab) { Et encore, il sagit dune classe relativement peu charge. En cole ding-
Arrays.sort(tab); nieur, nous tions 150 dans ma promotion. Le photographe devrait donc
} faire plus de onze mille (11175) comparaisons pour prparer sa photo
laide du tri par slection: autant dire quil y passerait la journe. Sans
LES PREMIRES MANIRES QUI vendre la mche, on devine dj que le tri par slection nest pas rpu-
NOUS VIENNENT L'ESPRIT t pour tre trs efficace.
Tri par slection
Sans le savoir, ou sans sen rendre compte, on est confront trs jeune Tri par insertion
des algorithmes de tri. Je dirais que cela se produit au plus tard en petite Lorsquon est enfant, il y a un autre algorithme de tri quon apprend (ou
section de maternelle, vers lge de trois ans, loccasion du passage du dcouvre) assez vite. Cest celui que les joueurs de cartes utilisent pour
photographe scolaire. Pour bien composer sa photo, le photographe doit organiser leurs mains. Le joueur pioche la carte qui est en haut du tas et la
placer les enfants sur le banc en fonction de leurs tailles Fig.1. Pour cela, le place (linsre) la bonne position dans la main. Cet algorithme se nomme
photographe passe en revue les enfants la recherche du plus petit. Une le tri par insertion Fig.3.
fois trouv, il le place sur le banc. Il ritre cette opration sur les enfants En premire approche, le tri par insertion est donc linverse du tri par
restant en plaant chaque fois lenfant slectionn la prochaine place slection. Il est toutefois un peu plus efficace. Et, sans surprise, le code
disponible sur le banc. Lalgorithme se termine lorsquil ne reste plus den- du programme est trs proche de celui quon a dj vu:
fant. Si vous avez bien suivi, vous aurez compris que le dernier enfant
tre slectionn, et donc tre plac sur le banc, est mcaniquement le public class InsertionTri implements Tri {
plus grand Fig.2. Cet algorithme aurait pu sappeler le tri du photo-
graphe, mais on le trouve dans la littrature sous le nom de tri par slec- @Override
tion. Pour programmer ce tri sur un tableau, il suffit donc de le parcourir public void trier(final int[] tab) {
la recherche du plus petit lment (ou du plus grand, ce qui revient au int pos;
mme) et de le positionner au prochain emplacement disponible:
// On peut commencer 1 directement...
public class SelectionTri implements Tri { for (int i = 1; i < tab.length; i++) {
final int temp = tab[i];
@Override
public void trier(final int[] tab) { // recherche position
for (int i = 0; i < tab.length; i++) { for (pos = 0; pos < i; pos++) {
// Chercher la position (pos) du plus petit dans la zone restante if (temp < tab[pos]) {
int pos = i; break;
for (int j = i; j < tab.length; j++) { }
if (tab[j] < tab[pos]) { }
pos = j;
} // Dcaler
} for (int j = i; pos < j; j--) {
final int petit = tab[pos]; tab[j] = tab[j - 1];
}
// Delaler de i a pos
for (int j = pos; i < j; j--) { // Insertion
tab[j] = tab[j - 1]; tab[pos] = temp;
} }
}
// mettre le plus petit trouve la fin
tab[i] = petit; Si on accepte de chercher la bonne position en partant de la queue, on
} peut en profiter pour raliser le dcalage du mme coup.
}
for (int i = 1; i < tab.length; i++) {
Dans la suite, on notera n le nombre dlments dans la liste classer. final int temp = tab[i];
Dans lexemple, n correspond donc au nombre denfants dans la clas-

88 Programmez! < Dcembre 2014


086_092_180 18/11/14 01:23 Page89

titre dillustration, prenons le jeu de la Belote(4) dans lequel chaque

algorithmes
joueur reoit huit cartes. Ici n vaudra donc 8. Pour la premire carte,
il ny a rien faire puisque la main est vide. Pour la deuxime carte, il y a
une comparaison faire avec lunique carte dj en main pour savoir si
elle doit aller gauche ou droite. Pour la troisime carte, il y aura au
maximum deux comparaisons effectuer. Il est important de com-
prendre quon arrte de faire des comparaisons ds que la bonne position
est identifie. On fait ainsi tant quil reste des cartes piocher.
Au final, et dans le pire des cas, on fera donc 1+2++7 comparai-
sons, soit 28 au total. Cest la mme formule ( lenvers) de calcul que
pour le tri par slection et ce nest donc pas mieux. En revanche, dans
le meilleur des cas o le joueur pioche les cartes dans lordre idal (ie.
tries dans lordre croissant ou dcroissant selon quon insre par la tte
ou par la queue), il ny aura que 7 comparaisons. Et bien entendu, plus le
nombre n est grand et plus la diffrence est sensible.

Complexit
Comme vous lavez surement dj devin, le nombre total doprations
effectuer pour drouler un algorithme est un critre majeur pour dire si
lalgorithme est efficace. Cela permet surtout de comparer lefficacit de
deux algorithmes et de choisir le plus adapt.
Il est relativement simple de dnombrer prcisment le nombre
doprations ncessaires pour drouler un algorithme de tri lorsque le
nombre dlments n dans la liste est petit. Par exemple, on a vu quil
faudra raliser 153 comparaisons pour trier 18 enfants laide du
tri par slection. Le mme algorithme ncessite de raliser 11.175
comparaisons pour trier une classe de 150 lves, et 499.500 pour
trier les mille employs dune PME. Et si vous vouliez trier les 81.338
spectateurs dun match de foot au Stade de France, il faudrait
3.307.894.453 comparaisons.
Ces exemples mettent deux choses en vidence. Premirement, la quan-
tit doprations ncessaire au droulement du tri par slection crot
rapidement lorsque le nombre n dlments dans la liste augmente.
Deuximement, il nest pas ncessaire davoir une grande prcision sur
des chiffres aussi importants. Quand on ralise 3.307.894.453 compa-
raisons, on nest plus une comparaison prs, ni dix, ou cent, ou mme
cent millions. Dailleurs on aurait pu se contenter de dire quil fallait envi-
ron trois milliards doprations. Ce qui compte, avec des valeurs si
consquentes, cest davoir un ordre de grandeur, mme vague. Cest
ce quon va appeler la complexit dun algorithme.
Fig.4 En fait, il nest pas possible de discuter des tris sans parler de complexi-
t. Ce mot lui seul est synonyme de cauchemars pour bien des tu-
// Recherche et dcalage d'un seul coup diants en cole dinfo. Et pour ma part, je dois avouer que jai mis
for (pos = i; 0 < pos && temp < tab[pos - 1]; pos--) { longtemps en comprendre les tenants et les aboutissants. Je me propo-
tab[pos] = tab[pos - 1]; se donc de vous lexpliquer simplement, en prenant quelques raccourcis.
} Ne vous inquitez pas si tout nest pas clair, a va se clarifier au fur et
mesure.
// Insertion

}
tab[pos] = temp; discuter des tris impose daborder la complexit
La complexit dun tri de n lments se note avec un omicron: dites
Dcider si on lance la recherche partir de la tte ou de la queue nest pas grand O. Par exemple, la complexit du tri par slection sera en
anodin. Selon que la liste initiale est plutt croissante ou dcroissante, O(n*(n-1)/2), o n*(n-1)/2 est la formule quon avait utilise un peu
lune ou lautre des recherches sera plus efficace. Et puisqu'on en est se plus tt. Comme on sintresse des valeurs importantes et quon ne veut
demander dans quel sens parcourir la liste, on pourrait aussi dmarrer quun ordre de grandeur, on considrera que cette complexit peut
depuis la dernire position utilise. Il suffit ensuite de monter ou de des- se simplifier en O(n*(n-1)) , qui peut elle-mme se simplifier en
cendre le curseur selon le rsultat des comparaisons et de s'arrter O(n2). On dira que lalgorithme du tri par slection est de complexi-
lorsque a s'inverse. Cela permet d'optimiser en moyenne le traitement t quadratique en O(n2).
des sous-squences. Dans le pire des cas, cela sera quivalent la
recherche par une extrmit. (4)
La belote se joue 4 joueurs avec un paquet de 32 cartes, soit 8 pour chaque joueur.

Dcembre 2014 > Programmez! 89


086_092_180 18/11/14 01:23 Page90

Pour faire simple, quand vous multipliez par 10 le nombre n dl- ce, en fonction de la plateforme et du langage utiliss, mais je pense sin-
algorithmes

ments, vous multipliez par 100 le nombre doprations raliser crement que lessentiel y est pour linstant En plus de la question des
lorsque vous utilisez un algorithme de tri en O(n2). Dit comme a, ce performances, on a pris lhabitude de classer (cf. tableau rcapitulatif en
nest pas trs impressionnant alors essayons dassocier cela avec des fin darticle) les algorithmes de tri selon des caractristiques importantes,
dures pour voir quel point cest mauvais. Disons quune opration comme la stabilit ou le fait de pouvoir trier sur place, cest--dire quon
prenne une nanoseconde (ns) en moyenne (ce qui est trs optimiste). rarrange les lments directement dans la structure initiale. Un algorith-
me est dit stable lorsquil ne modifie pas lordre des lments de mme
Nombre Nombre doprations Dure pour un tri valeur. Enfin, une des principales contraintes concerne lespace mmoire.
dlments n pour un tri en O(n2) en O(n2) Plus spcifiquement, on se demande si on est capable de trier lensemble
10 100 100 ns
des donnes en mmoire centrale. On dira que le tri est interne si cest
100 10 000 10 us
possible, et externe sinon.
1 000 1 000 000 1 ms
10 000 100 000 000 100 ms
100 000 10 000 000 000 10 s Comment faire mieux?
1 000 000 1000000000 000 16 min 40 s On devine quil va falloir trouver comment faire mieux, notamment en utili-
10 000 000 100 000 000 000 000 27 heures sant des algorithmes beaucoup plus rapides. Rassurez-vous, je ne vais
100 000 000 10 000 000 000 000 000 115 jours pas vous prsenter tous les algorithmes de tri qui existent. Je vais me limi-
1 000 000 000 1 000 000 000 000 000 000 31 ans ter aux plus connus en insistant sur leurs points forts et leurs faiblesses.

Alors que le tri de 10 lments prendra seulement 100 nanose- Tri bulle (Bubble Sort)
condes laide dun algorithme en O(n2), il faudra 10 microsecondes Le tri bulle est certainement celui quon apprend programmer en pre-
pour une centaine dlments et carrment une milliseconde pour mille. Et mier en cole dinformatique, avant mme le tri par slection et le tri
ces temps augmentent encore quand le nombre dlments augmente. par insertion. Pour effectuer un tri bulle, il faut parcourir la liste en
Ca augmente mme trs vite. Pour un milliard dlments, ce qui reste rai- permutant les lments contigus qui ne sont pas dans le bon ordre. Par
sonnable pour un programme informatique, notamment dans le domaine exemple, si je trouve 9 dans la case 4 et seulement 2 dans la case
de la finance, on aura besoin dun tiers de sicle. Autant dire que les don- 5 , alors jchange leurs positions. Quand cest fini, llment le plus
nes seront primes depuis longtemps quand lalgorithme aura fini son grand se retrouve donc en queue de liste. Cet lment est arriv sa
travail. Lordinateur sera peut-tre mme dj pass la poubelle. Et je ne bonne position, mais le reste de la liste est encore potentiellement en
vous parle mme pas de la facture dlectricit quon aurait tendance dsordre. On recommence autant de fois quil y a dlments dans la liste,
oublier (cot en nergie, en ressource naturelle, en entretien et en Euro). ce qui fait donc chaque fois remonter le plus grand lment restant Fig.4.
Pour bien raliser ce que a reprsente, prenons un exemple plus Le nom du tri bulle vient du fait que les plus gros lments remontent
concret. Pour trier la population mondiale(5), soit un peu plus de sept mil- comme des bulles dans une flute de champagne. Dailleurs, on nutilise
liards de personnes (au dbut de lt 2014), il faudrait plus dun millier et jamais le tri bulle, car les bulles remontent trs lentement.
demi dannes (1655 ans environ). Pour que le tri soit fini au moment o
vous lisez cet article, il aurait donc fallu le commencer en lan 350 de notre public class BulleTri implements Tri {
re, soit plus dun sicle avant le dbut du moyen ge (476 1453).
On parle de complexit en se plaant dans la situation la plus dfavorable @Override
pour lalgorithme. a permet en quelque sorte de majorer. On peut aussi public void trier(final int[] tab) {
se placer dans le cas le plus favorable ou dans le cas moyen. Par exemple for (int i = 0; i < tab.length - 1; i++) {
et sans plus dexplications, le tri par insertion sera de complexit for (int j = 1; j < tab.length; j++) {
linaire en O(n) dans le cas le plus favorable et en O(n2) dans les if (tab[j] < tab[j - 1]) {
cas moyens et dfavorables. Bon, je ne vais pas vous embter plus que a // Permutation
avec cette histoire de complexit. Jai pass sous silence certains permuter(j, j - 1, tab);
aspects (gestion de la mmoire, dplacements, permutations, cration }
dobjets, flux, etc.) qui peuvent avoir un impact en termes de performan- }
}
}

public static void permuter(final int indexA, final int indexB,


final int[] tab) {
final int temp = tab[indexA];
tab[indexA] = tab[indexB];
tab[indexB] = temp;
}

Pour une liste dans laquelle le nombre dlments n est de 9, on fera


8 (ie. n-1) comparaisons pour mettre le plus grand lment sa
bonne position. Et on va rpter cela 8 fois galement, ce qui ncessi-
tera donc 64 comparaisons. La complexit associe au tri bulle

Fig.5 (5)
Population mondiale estime au 1er juillet 2014: 7 226 376025 personnes.

90 Programmez! < Dcembre 2014


086_092_180 18/11/14 01:23 Page91

sera donc en O((n-1)n) quon simplifiera en O(n2). On peut amliorer que des sous-listes de zro ou un lment. Pour finir, il suffit de rassem-

algorithmes
lalgorithme de base. En effet, chaque passage, un lment supplmen- bler les lments de toutes les sous-listes dans lordre gauche-droite
taire se retrouve sa place dfinitive. Il nest donc plus ncessaire de lin- Fig.5. Le principe du tri rapide est donc trs simple: tout se passe pen-
clure dans les comparaisons suivantes. dant la construction de larbre.
En revanche, il est rellement (trs) difficile de programmer cet algorithme
for (int i = 0; i < tab.length - 1; i++) { dans la version utilisant des tableaux. Plus prcisment, cest la spara-
for (int j = 1; j < tab.length - i; j++) { tion en fonction du pivot qui pose problme de nombreux dveloppeurs.
if (tab[j] < tab[j - 1]) { On trouve dailleurs de nombreux codes faux (qui ne passent pas mes
permuter(j, j - 1, tab); tests) sur Internet. Je vous propose donc de commencer en douceur avec
une version employant des listes.
On naura alors besoin que de (n-1)*n/2 comparaisons, soit 36 com-
paraisons pour une liste de 9 lments. La complexit restera toutefois public class RapideViaListeTri implements Tri {
en O(n2), le multiplicateur 1/2 ne changeant rien lhistoire pour les
grandes valeurs, comme on la dj vu. private List<Integer> trier(final List<Integer> liste) {
if (liste == null || liste.isEmpty()) {
accus dtre lent, le tri bulle cache bien son jeu }
return new ArrayList<>();

En outre, on peut stopper le droulement de lalgorithme ds lors quon


dtecte quaucune permutation na t ralise durant une boucle. Si la // Choix du pivot gauche
liste sy prte, cela peut devenir une srieuse optimisation. final int pivot = liste.get(0);
// pour ne pas traiter le pivot dans la boucle
public class RapideDemiBulleTri implements Tri { liste.remove(0);

@Override final List<Integer> listeGauche = new ArrayList<>();


public void trier(int[] tab) { final List<Integer> listeDroite = new ArrayList<>();
for (int i = 0; i < tab.length; i++) {
boolean permutation = false; // Sparation en deux sous listes
for (int j = 1; j < tab.length - i; j++) { for (final int elt : liste) {
if (tab[j] < tab[j - 1]) { if (elt < pivot) {
// Permutation listeGauche.add(elt);
permuter(j, j - 1, tab); } else {
permutation = true; listeDroite.add(elt);
} }
} }
if (!permutation) {
break; final List<Integer> result = new ArrayList<>();
}
} result.addAll(trier(listeGauche));
} result.add(pivot);
result.addAll(trier(listeDroite));
Le tri bulle est souvent accus dtre lent, mais comme vous pouvez
le voir, il cache bien son jeu. titre personnel, je dois avouer que jai beau- return result;
coup daffection pour cet algorithme, mme en sachant que ce nest pas }
le meilleur.
la lecture de ce code, vous avez sans doute repr plusieurs problmes
Tri rapide (Quick Sort) techniques. La mthode fonctionne correctement (elle passe tous mes
Sil y a un algorithme de tri dont vous avez forcment entendu parler la tests), mais elle est lente. Il y a fondamentalement trois erreurs .
machine caf, cest bien le Quick sort. Cest lun des algorithmes les Dabord de nombreuses listes sont cres et manipules durant le traite-
plus utiliss et certainement celui qui prsente le plus de variantes. Le ment, ce qui cote cher.
Quick Sort, aussi appel tri rapide, fait partie de la famille dalgo- Ensuite, lauto-unboxing ralis lors de litration sur la (sous) liste trier
rithmes dont le fonctionnement repose sur le principe diviser pour ajoute encore un peu laddition. Et lauto-boxing lors de lajout aux sous-
rgner. Pour raliser un tri rapide, on doit choisir un lment dans la listes finit de plomber la note.
liste, quon appelle pivot. On divise ensuite la liste en deux sous-listes. Cela peut se rsoudre en travaillant directement sur des objets, et donc
La premire, gauche, contient les lments infrieurs au pivot. La secon- sur des rfrences, en les comparant laide de compareTo() en lieu et
de, droite, contient les lments suprieurs au pivot. place de loprateur de comparaison.
Enfin, lalgorithme ne prend pas en compte la prsence (ventuelle) de
vous avez forcment entendu parler du Quick Sort plusieurs valeurs gales au pivot. Quitte avoir deux sous-listes, on peut
bien en grer une troisime pour ce cas spcifique. Le nombre total dl-
On reproduit alors rcursivement ce choix du pivot et la division sur les ments restera inchang et le cot du test supplmentaire sera largement
listes de gauche et de droite prcdemment construites jusqu navoir compens par le gain en nombre de rcursions.

Dcembre 2014 > Programmez! 91


086_092_180 18/11/14 01:23 Page92

algorithmes
public class RapideViaListe2Tri implements Tri { }
permuter(droite, positionPivot, tab);
private List<Integer> trier(final List<Integer> liste) {
if (liste == null || liste.isEmpty()) { // tri rcursif des sous-listes
return new ArrayList<>(); // Bien entendu on ne trie pas le pivot
} trier(tab, gauche, positionPivot - 1);
trier(tab, positionPivot + 1, droite);
// Pivot gauche }
final Integer pivot = liste.get(0);
Comme vous le constatez, cette premire version utilisant des tableaux
final List<Integer> listeGauche = new ArrayList<>(); est bien plus complexe. On arrive toutefois encore distinguer la forme de
final List<Integer> listeCentre = new ArrayList<>(); base de lalgorithme. Un des gros dfauts, difficiles corriger, de cette
final List<Integer> listeDroite = new ArrayList<>(); version est de devoir grer le dcalage dun grand nombre de cases. Pour
gagner encore un peu en vitesse, on va devoir passer par des fonctions de
// Sparation en deux sous listes System, qui font des manipulations de la mmoire de faon native.
for (final Integer elt : liste) {
final int comp = elt.compareTo(pivot); public class RapideTri2 implements Tri {
if (comp < 0) {
listeGauche.add(elt); @Override
} else if (comp == 0) { public void trier(final int[] tab) {
listeCentre.add(elt); if (tab.length < 2) {
} else { return;
listeDroite.add(elt); }
}
} int[] tab2 = new int[tab.length];
trier(tab, tab2, 0, tab.length);
liste.clear(); System.arraycopy(tab2, 0, tab, 0, tab.length);
}
liste.addAll(trier(listeGauche));
liste.addAll(listeCentre); private void trier(final int[] tab, final int[] tab2, final
liste.addAll(trier(listeDroite)); int gauche, final int droite) {
// Choix du pivot gauche
return liste; final int pivot = tab[gauche];
} int posGauche = gauche;
int posDroite = droite;
Voici maintenant une premire version utilisant des tableaux. Lintrt de
cette structure est de pouvoir effectuer le tri sur place, en manipulant // Sparation en deux sous listes
des primitifs. for (int index = gauche + 1; index < droite; index++) {
int elt = tab[index];
public class RapideTri implements Tri { if (elt < pivot) {
tab2[posGauche++] = elt;
@Override } else if (elt > pivot) {
public void trier(final int[] tab) { tab2[--posDroite] = elt;
trier(tab, 0, tab.length - 1); }
} }

private void trier(final int[] tab, final int gauche, final Arrays.fill(tab2, posGauche, posDroite, pivot);
int droite) {
if (droite <= gauche) { if (posGauche > gauche) {
return; trier(tab2, tab, gauche, posGauche);
} System.arraycopy(tab, gauche, tab2, gauche, posGauche - gauche);
}
// Pivot gauche if (posDroite < droite) {
int positionPivot = gauche; trier(tab2, tab, posDroite, droite);
permuter(positionPivot, droite, tab); System.arraycopy(tab, posDroite, tab2, posDroite, droite
- posDroite);
for (int i = gauche; i < droite; i++) { }
if (tab[i] <= tab[droite]) { }
permuter(i, positionPivot++, tab);
} Suite au prochain numro. u

92 Programmez! < Dcembre 2014


093_094_180 18/11/14 01:24 Page93

Le design One Page

design
Le dveloppement One Page
est un sujet simple aborder
et rapide, je vais commencer
par expliquer quoi a sert,
comment il fonctionne et
enfin pourquoi le faire.
Le but du dveloppement
One Page est un concept
simple comprendre : il sagit
dafficher toutes les
informations de votre site (ou
de vos sites si vous voulez en
faire plusieurs) sur une seule
et mme page avec une
navigation qui peut tre
verticale ou horizontale.
Nicolas Le Bot

Je parlerai aussi des avantages et des


contraintes autour de ce mode de dvelop-
pement, car il y a un peu des deux ; vous
verrez par vous-mme lors de votre dve-
loppement que cela peut tre une bonne ide comme une mauvaise, De nombreux templates (gratuits ou payants) sont disponibles.
tout dpend de ce que vous cherchez faire sur votre site.
Page rapidement, peu importe le contenu. Ensuite si on le souhaite (cela
Pourquoi faire un site One Page ? est toujours utile), il est assez facile via du PHP de faire un affichage multi-
Commenons dj par le fait que le One Page se passe surtout ct desi- lingue (via le PHP vous pourrez toujours faire la mise jour des contenus,
gn, car cest ce niveau-l que se joue le rle le plus important du dve- mais encore une fois ce nest pas le but direct dun site One Page).
loppement. Le but du dveloppement One Page est surtout de faire un Nous partirons donc sur lutilisation du HTML/CSS, avec du PHP pour les
site o toutes les informations seront sur la mme page avec la possibilit langues et le contenu.
de naviguer rapidement et facilement sur cette mme page.
Car si le but est de faire un site rapide, ce sera sur une dure limite; vous Les avantages dun site One Page
nallez probablement pas garder un site One Page pour votre site tout le En premier, nous allons partir du principe quil est simple raliser et ne
temps, sauf si bien sr cest par exemple pour un site vitrine o il faut juste devrait pas vous occuper pendant trs longtemps dans votre vie de dve-
des informations importantes pour les utilisateurs. loppeur. En second, lutilisation du HTML/CSS et lvolution des techno-
Maintenant il est important de comprendre quil faut faire une diffrence logies va vous permettre assez facilement de faire votre code de faon
entre une bonne et une mauvaise explication de ce concept; il ne s'agit pouvoir avoir votre site optimis aussi pour les navigateurs mobiles (ce
pas de faire un site One Page horrible qui ne donne pas du tout envie de le qui est de nos jours utile).
visiter ou mme de le parcourir. Enfin, en dernier lieu, la facilit dutilisation du PHP pour crer une version
Prenons par exemple ce site : http://friends.overblitz.com/ multilingue de votre site va pouvoir permettre louverture sur linternatio-
Comme vous pouvez le voir, il y a une scrollbar diffrente des sites habi- nal ainsi que la mise jour des contenus, cela si jamais vous en avez vrai-
tuels ainsi qu'un dveloppement intgral sur une seule page. ment besoin. Jallais oublier que le fait de faire votre site en One Page,
Pour la mise en prod de votre produit, c'est trs simple mettre en permettra une personne ayant de bonnes bases en CSS, de pouvoir
place, puisque comme tout site, vous pouvez le tester directement en faire des modifications assez simplement.
local ou bien sur votre serveur ! Les sites One Page fonctionnent sur tous Ce genre de site tant assez simplement modifiable et cest bien plus
les navigateurs (Sauf IE 6). simple pour un designer dailleurs de travailler sur un site One Page.

Comment faire un site One Page ? Les contraintes dun site One Page
Il faut dabord partir du principe qu'un site One Page est un site o les On va passer lune des parties les moins amusantes, les contraintes, car
contenus seront peu mis jour. Dans cet article, le but est de faire du One en effet il y a des contraintes. Je vais numrer quelques problmes aux-

Dcembre 2014 > Programmez! 93


093_094_180 18/11/14 01:24 Page94

quels je nai malheureusement pas forcment toutes les solutions. margin-left:40px;


design

w En premier, le souci de ce genre de site est le temps de chargement de overflow-y:scroll;

la page; certes de nos jours les connexions sont plutt excellentes mais float:left;

cela peut s'avrer parfois long quand on doit tout charger en mme }

temps. Du coup nous pouvons ventuellement prcharger les images si .content{

besoin (par exemple si votre site contient trop dimages, ou qu'elles sont height:450px;

trop lourdes) }
w En second, nous allons avoir le souci du rfrencement par les moteurs
de recherche; si vous voulez toujours avoir un minimum de rfrence- (Ceci est la scrollbar de base, cest pour le dbut !)
ment, le mieux sera daller jusqu donner des noms "physiques" aux Dans le CSS, on va maintenant changer la scrollbar et mettre ceci :
images (cela permettra si jamais vous nommez une image src=jaime la
#ex3::-webkit-scrollbar{
mousse au chocolat, dtre mieux rfrenc sur ce thme lorsque quel-
width:16px;
quun le cherchera sur son moteur de recherche.
background-color:#cccccc;
w Et enfin, (srement lun des plus importants), cest de faire quelque
}
chose de joli pour que la navigation de lutilisateur devienne un
moment dexception, pour qu'il prenne plaisir naviguer sur votre One Cela va nous faire une scrollbar de 16px avec un background-color:
Page. Du ct des exemples, vous pouvez par exemple refaire une #cccccc (gris donc)
scrollbar, ou encore faire votre propre scroll au moment du clic de bou- Dans la suite, nous allons mettre de la couleur notre barre, ce qui va la
tons (avec une descente particulire). Bref, cest au dveloppeur de faire rendre un peu plus jolie ! (ce nest pas encore parfait, mais a avance)
quelque chose de sympathique pour permettre lutilisateur dapprcier
#ex3::-webkit-scrollbar-thumb{
le site.
background-color:#B03C3F;
w Une dernire contrainte peut tre lie lutilisation des navigateurs. En
border-radius:10px;
effet, Internet Explorer pose souvent des souci aux devs car les versions
}
6 (essentiellement) ont t mal optimises; ne pas oublier du coup de
#ex3::-webkit-scrollbar-thumb:hover{
vrifier sur tous les navigateurs votre CSS !
background-color:#BF4649;
Il va falloir faire attention au dveloppement lors de la cration, il est un
border:1px solid #333333;
petit peu plus compliqu de faire du One Page que du dveloppement
}
normal (ce qui peut paratre logique mais pas toujours), il faut penser
#ex3::-webkit-scrollbar-thumb:active{
tout bien prendre en compte.
background-color:#A6393D;
On va probablement bientt attaquer la partie la plus agrable, celle du
border:1px solid #333333;
dveloppement avec quelques exemples de codes qui peuvent vous ser-
}
vir pour vos sites One Page.
Il ne faut pas oublier, que le dveloppement One Page concerne le CSS Aprs avoir fait ceci, nous allons dfinir le border de la barre pour un peu
surtout, donc il y faut un minimum de bases avant de se lancer dans ce plus d'esthtique.
genre de site, sinon a ne sera pas forcment une partie de plaisir (mme
#ex3::-webkit-scrollbar-track{
si dans le pire des cas, apprendre le CSS peut tre parfois amusant).
border:1px gray solid;
LE DVELOPPEMENT ONE PAGE border-radius:10px;
-webkit-box-shadow:0 0 6px gray inset;
Nous allons commencer par faire des petits trucs sympas en CSS,
}
comme la scrollbar !
Et voil, avec ceci, vous devriez avoir une scrollbar fort diffrente de celle
Dans le HTML nous allons avoir a : davant, rouge, et qui change quand vous cliquez dessus (avec la dlimita-
tion de la scrollbar).
<div class="scrollbar" id="ex3">
<div class="content">Example 3</div>
Conclusion
</div> Cet article se termine. Nous aurons vu ce quest le dveloppement One
Page Design, les avantages et les contraintes, ainsi qu'un exemple en
Et dans le CSS : CSS pour changer la Scrollbar, et, bien sr, pourquoi nous pouvons utili-
ser le dveloppement One Page. Il va sans dire que cest une solution trs
.scrollbar{
agrable utiliser, rapide et peu coteuse.
width:150px;
height:300px;
Trs prochainement la suite.
background-color:lightgray;
margin-top:40px;
u
PROGRAMMEZ.COM

Votre Abonnement PDF


2014
Mensuel n179 - Novembre

Toute la puissance du
Cloud Computing Microsoft Azure / Heroku
DX
Google Cloud Platform
Amazon Web Services

Web
(re)dcouvrez
Wordpress

pour seulement 30 par an


- intrieur : 07-25-13 Henrik5000
nuage : 07-17-13 frankpeters

Win dows Pho ne


les SDK Nokia

(soit 2,73 le numro)


apps universelles,
les

Objets connects / IoT


6,45 - DOM Surf 6,90

3:HIKONB=^UZ^Z]:?k@b@r@j@a";
940 XPF - MAROC 50 DH

Les bornes iBeacon


UE - BELGIQUE 6,45

Galileo 2 / Starter Kit IoT


M 04319 - 179 - F: 5,95 E - RD

Les nouveaux kits Intel votre porte


: les nouveaux mondes
Les ralits alternatives
SUISSE 12 FS - LUXEMBOURG

www.programmez.com
Printed in EU - Imprim en

Canada 8,95 $ CAN - TOM

Scurit Android Success Story


Antiquit Magma Mobile
Les mythiques Occultez
machines Amstrad votre code source
095_180 18/11/14 01:26 Page95

Open World Forum

hot news
rvle linnovation collaborative
Linnovation ouverte, une utopie? Pas pour les projets collaboratifs, soutenus par la Commission
Europenne, qui produisent des rsultats open source tangibles.
Olivier Bouzereau

Hlas, ces programmes restent encore sous-


utiliss car mconnus. Pourtant, ils sont
raliss par des groupes talentueux composs
dindustriels, de chercheurs et de PME
innovantes. Conus sur une priode de 24 36
mois, ils reprsentent ltat de lart scientifique
en termes de connaissances et de
programmation pour le Cloud Computing,
lInternet des objets ou encore lanalyse de
donnes massives.
Lors de lOpen World Forum de Paris, fin
octobre, sept projets invits par la
communaut OW2, spcialise dans les
logiciels dinfrastructure open source,
rpondaient des problmatiques actuelles ou
aux usages concrets dentreprises et de
collectivits.

1 La plateforme RISCOSS (riscoss.eu) fournit


une approche mthodologique visant
rduire les risques dinclure des composants
trentaine de solutions professionnelles dj. La
jeune pousse Cloud Orbit permet ainsi de btir
un Cloud hybride rpondant aux critres
comparaison de projets open source. Elle peut
galement assurer la surveillance et lanalyse
de la qualit des projets de dveloppement en
open source dans le dveloppement dun conomiques et techniques de chaque client. interne , explique Alessandra Bagnato,
nouveau produit ou service. En cours Les standards supports par CompatibleOne ingnieur chez Softeam R&D qui participe au
dintgration sur X-Wiki, elle runit des OCCI et WS Agreement facilitent projet.
algorithmes i*et des connaissances issues
dune corrlation dindicateurs sur les risques
juridiques, techniques et organisationnels lis
linteroprabilit entre les nuages dAmazon,
Google, Microsoft, OpenStack et VMware.
Lallocation automatique de ressources sur
6 ModaClouds est un projet de gestion
DevOps, autrement dit un outil
rassemblant les utilisateurs mtiers des
aux communauts produisant des logiciels des Clouds publics ou privs seffectue dveloppeurs et exploitants informatiques. Sa
open source. En amliorant la gestion des conformment aux seuils dtermins par le mission consiste rduire les performances
risques, les dveloppeurs pourront client, un suivi de la qualit de services et des imprvisibles dans le Cloud ainsi que le
implmenter des solutions open source plus engagements contractuels tant men en verrouillage impos par les fournisseurs
durables. tche de fond. dinfrastructures et dapplications distribues.

2 Pour mieux explorer les composants


open source destins au Cloud
Computing, le projet OCEAN (ocean-
4 Le projet BigFoot (bigfootproject.eu)
vient sur lcosystme Hadoop et
OpenStack. Il aide btir des fermes
ModaClouds cherche fournir un ensemble de
services lastiques, souples pour un
dploiement multi-cloud rapide. Des outils de
project.eu) fournit un catalogue raisonn et optimises pour lanalyse de grands volumes surveillance, de migration dapplications et
plusieurs outils de navigation. On peut ainsi de donnes. Sur un Cloud priv, BigFoot dautomatisation de la mise en production sont
dtecter des codes rcents issus de projets propose un planificateur de tches pour intgrs autour de mtriques unifies et de
FP7 soutenus par la commission europenne Hadoop et un dploiement automatique de rgles SLA dfinies par lutilisateur.
ou dinitiatives locales. Dvelopp sous le
portail CKAN trs apprci dans le domaine
de lopen data -, lOpen Cloud Directory facilite
traitements pr-configurs. La plateforme PaaS
(Platform-as-a-Service) sapprte donc grer
les interactions avec les donnes issues de
7 Enfin, ClouT (clout-project.eu) veut
apporter une architecture de rfrence
aux objets intelligents et aux villes connectes.
lexamen des documentations,architectures et Smart Grids ou de systmes de scurit par Runir Cloud et IoT (Internet of Things) permet
programmes open source, rapports de tests exemple. de collecter des informations en temps rel, de
inclus. Ce rfrentiel dcrit plus de 77 projets
et 157 actifs que lon peut dnicher par
arborescence, couches fonctionnelles ou
5 Avec OSSMeter, la mesure et lanalyse
des bugs prsents dans les logiciels open
source gagnent de nouveaux automatismes.
stocker et de traiter ces informations massives
avec fiabilit et souplessepuis de les
transmettre partir de mcanismes
activits Cloud soutenues. Cette plateforme Cloud dont une premire collaboratifs. Trois couches sont proposes

3 CompatibleOne, le premier broker Cloud


open source a gnr plus dune
dmonstration est prvue en novembre
cherche faciliter la dcouverte et la
dans cette architecture afin de fournir des
services interdpendants en toute scurit. u

Dcembre 2014 > Programmez! 95


096_097_180 18/11/14 01:27 Page96

Timeline: 1993
time machine

Objet : laventure PowerPC


Processeur RISC concurrent du Pentium, le PowerPC a failli stopper la carrire dIntel.
Sauf que tous les acteurs concerns ont petit petit jet lponge. A part IBM.
En avril 1991, convaincus quils doivent faire puissance de calcul (projets Cheetah en 1982,
front commun contre les cloneurs de PC, les diri- puis America/ROMP en 1985) afin daboutir, en
geants dApple et dIBM se rencontrent Dallas. 1990, un POWER1 32 bits dot de 8 puces.
Du ct dApple, le PDG John Sculley, le DG Dans ses cartons, Phil Euster a maintenant un
Michael Spindler et lingnieur en chef Hugh processeur RSC (Risc Single Chip) qui consiste
Martin apportent dans leurs valises le projet intgrer les 8 puces du POWER1 dans une Le processeur Cell sera utilis dans la Playstation 3 et les serveurs
Unix en lame dIBM.
Jaguar. Jaguar doit incarner le successeur du seule. Pour IBM, il est financirement intressant
Mac : un systme dexploitation objet excut que ce RSC soit utilis ailleurs que dans ses 66 Mhz. De plus, le PowerPC 601 a deux fois
par des processeurs RISC. Le principe du RISC - propres machines Unix. Jack Keuler propose moins de transistors et cote deux fois moins
un microcode simplifi pour tre sr que chaque alors de vendre des stations avec le systme cher que son concurrent pour qui veut fabriquer
instruction sexcute en un seul cycle dhorloge - Pink, la condition quApple vende des Macintosh des ordinateurs personnels compatibles IBM.
fut invent par IBM en 1974, dans le cadre de avec le processeur RSC. Laffaire est intressan- Chez IBM, il y a lide de remplacer les compa-
son projet 801. Il sagissait alors de mettre au te, le POWER1 quipe les stations et les ser- tibles PC, qui ont trop enrichi Intel, par des com-
point un processeur pour les commutateurs tl- veurs RS/6000 dIBM, lesquelles sont quatre patibles PowerPC. Cest le standard PReP
phoniques, sans performance de calcul extraor- fois plus puissantes quun PC ou quun Mac. (PowerPC Reference Platform), qui correspond
dinaire, mais capable de copier ou dadditionner Mais Apple doute des capacits dIBM produi- une carte mre de PC avec un socket
trs rapidement des registres. Problme, Pink re cette puce grande chelle. John Sculley PowerPC. Problme, quand Apple sort ses pre-
(Projet logiciel orient objet, NDLR) nest dve- naccepte le deal qu la condition que Motorola miers PowerMac en 1994, ceux-ci ne sont pas
lopp que par une quipe rduite et aucun pro- soit dans la boucle. Laffaire est entendue : le 2 compatibles PReP ; leurs cartes mres relvent
cesseur RISC monopuce test (le Motorola octobre voit la naissance officielle de lalliance en effet plutt du chipset historique des Macin-
88100, lAcorn ARM2, le MIPS R3000) nest AIM (Apple-IBM-Motorola), dont lobjet est de tosh que de celui des PC. IBM propose donc un
assez puissant pour lexcuter. A dfaut, ils pr- construire des ordinateurs base de proces- second standard en 1995, le CHRP (Common
sentent une version de Pink avec linterface de seurs RSC. Pour gagner du temps, Motorola Hardware Reference Platform), indpendant du
MacOS 7 (mai 1991) mule sur un IBM PS/2 propose dadapter au RSC le bus de son 88100, chipset, mais reposant sur un firmware - Open-
Model 70 base de processeur 486. sur lequel Apple avait dj travaill. Le nouveau Firmware - qui fait linterface entre la carte mre
Du ct de la dlgation IBM, le vice-prsident processeur est baptis PowerPC, littralement et lOS install. Dans la logique de CHRP, Apple
Jack Keuler saccompagne de lingnieur Phil le POWER des ordinateurs personnels, mme si, vend des 1995 des licences de MacOS pour que
Euster, lequel a en charge la division des proces- officiellement, le PC signifiait ici Performance des fabricants tiers puissent proposer des com-
seurs RISC. Depuis 1974, IBM a dabord fait vo- Computing. La premire puce, le PowerPC 601 patibles CHRP sous MacOS. Des clones de
luer son 801 en le dotant de plusieurs puces cadenc 50 et 66 MHz, est livre en avril 1993. PowerMac, en somme. Hlas, il devient rapide-
fonctionnant en parallle pour lui donner de la ment vident que les clones de PowerMac sont
Laventure des clones une erreur stratgique pour Apple : plutt que
PowerPC fait long feu dtendre le nombre dutilisateurs de MacOS, ils
En octobre 1993, IBM est le premier proposer cannibalisent les clients du Mac original. De
des stations RS/6000 (sous Unix) bases sur retour aux commandes dApple en 1997, Steve
PowerPC. OS/2 serait dj en cours dadapta- Jobs interdit leur fabrication. Pendant ce temps,
tion pour fonctionner dessus, tout comme les
prochains Windows NT 3.51 de Microsoft et
Solaris 2.51 de Sun. Motorola fabrique des
clones dans la foule pour ponger la demande. Le G4 dIBM est
en fait un
Le premier PowerPC, le PPC601. Il faut dire que les machines dotes de ce PowerPC 750
PowerPC affichent dans les bancs dessai des avec unit
performances deux fois suprieures celles des vectorielle pour
consoles
premiers PC quips du dernier Pentium dIntel Nintendo.

Le POWER1
Pour concurrencer le Pentium II, le PPC 603 grimpait 200 MHz avait huit puces.

96 Programmez! < Dcembre 2014


096_097_180 18/11/14 01:27 Page97

time machine
Le PowerPC 750 tait connu sous lacronyme G3. Le PowerPC 970, premier PowerPC 64 bits pour Le POWER3, premier PowerPC 64 bits en une seule puce.
machines grand public.
les carrires dOS/2, de Windows NT et de Sola- rola PowerQUICC et les IBM PowerPC 400 ; ils GHz des instructions historiques POWER pour
ris sur machines CHRP font long feu : les utilisa- ne sont pas interchangeables dans leurs sockets proposer Apple le PowerPC 970 2 GHz, ou
teurs nachtent pas ces configurations tant que et sont, par consquent, concurrents. Du ct G5 , le premier PowerPC 64 bits sur machine
toutes les applications nont pas t recompi- des machines Unix haut de gamme, IBM rempla- grand public. Apple devra encore attendre 2004
les en code PowerPC et celles-ci ne le sont pas ce le POWER1 par un POWER2 (1993) pour pour un PowerPC 970FX 2,5 GHz - refroidi par
tant quil ny a pas assez dutilisateurs sur ces continuer proposer les stations et les serveurs liquide tellement il chauffe - alors que le Pentium
machines. Le march des clones CHRP meurt les plus rapides du monde. Les huit puces de ce 4 Prescott dpasse dj les 3 GHz. Cen est trop :
dautant plus prmaturment en 1997 que le POWER2 sont galement combines en un seul Apple jette lponge et annonce passer ses Mac
fameux OS Pink (entretemps devenu Taligent) processeur P2SC en octobre 1996. Mais il cote aux processeurs x86 en 2005. Pourtant IBM se
est avort. trop cher pour faire partie de la famille PowerPC. dmne. Ds 2003, il met au point le processeur
En 1997, IBM quipe ses machines AS/400 du Cell pour la Playstation3 de Sony (2005). Il sagit
Trois types de PowerPC pour processeur RS64 monopuce 125MHz, un dun PowerPC 970 3,2 GHz, dit PPE, qui intgre
trois marchs PowerPC 64 bits auquel est ajout le jeu dins- 8 units 128 bits vectorielles. IBM reprendra
De 1993 2001, le PowerPC est divis en trois truction 48 bits historique de ces machines. Ses cette puce dans ses lames serveurs sous Unix et
familles. Pour les machines grand public, il sagit RS/6000 passent la mme anne au processeur Linux. Ce qui lui inspirera de relancer une plate-
dun processeur 32 bits qui connat, comme le POWER3 200 MHz, un PowerPC 64 bits mono- forme pour cloneurs : le standard PAPR (Power
Pentium dIntel, quatre gnrations et dont les puce intgrant les instructions POWER qui nont Architecture Platform Reference) cens servir de
performances restent systmatiquement les pas t implmentes dans les PowerPC. Les rfrence pour construire des serveurs PowerPC
meilleures. La gnration G4, connat deux RS64 et POWER3 sont regroups en un seul sous Linux. En vain. Dans le mme temps, Micro-
implmentations distinctes : les PPC7400 de POWER4 1,3 GHz en 2001. soft commande IBM un PowerPC pour que sa
Motorola (1999) 1GHz apportent une unit vec- future console Xbox 360 (2005) rivalise avec la
torielle aux Mac, alors que les PPC750 dIBM Baroud dhonneur pour le Playstation 3. IBM lui fournira le Xenon, savoir
(1999) implmentent une unit vectorielle diff- PowerPC 64 bits une puce disposant de trois curs PowerPC 970
rente pour les trois prochaines gnrations de En 2002, il ny a gure plus quIBM qui croit enco- 3,2 GHz, mais sans les 8 units vectorielles du
consoles Nintendo : la GameCube (PPC750CXe re au PowerPC. Motorola na pas les fonds pour Cell. En 2014, Sony et Microsoft ne renouvelle-
486 MHz, en 2000), la Wii (PPC750CL 729 fabriquer un PowerPC 64 bits et songe dj se ront pas le contrat ; leurs Playstation 4 et Xbox
MHz, en 2006) et la Wii U (3 PPC750CL 1,2 sparer de son activit processeurs. Celle-ci One sont dsormais quipes de processeurs
GHz, en 2012). deviendra autonome en 2004, sous le nom de AMD x86 8 curs. Continuant damliorer seul
Simultanment, Motorola et IBM dclinent le Freescale ; elle ne fabriquera plus que des puces son POWER (dont la version POWER8 12
PowerPC en modles simplifis, sans FPU (cal- pour lectronique embarque. De son ct, curs et 5 GHz est sortie durant lt 2014), IBM
culs flottants) ni MMU (mmoire virtuelle) pour Apple voit rouge face la monte en puissance retente depuis 2013 de susciter lenvie des clo-
llectronique embarque, en particulier celle dIntel : son Pentium 4 Northwood grimpe 2,2 neurs autour dune plateforme PowerPC ouverte.
des voitures, de larospatiale, des imprimantes GHz, soit deux fois la frquence du PowerPC G4. Cela sappelle dsormais lOpenPOWER consor-
et des contrleurs de disques. Ce sont les Moto- En rponse, IBM dbarrasse son POWER4+ 1,9 tium... Yann Serra

Une publication Nefer-IT Crdits couverture : 10-18-13 FulopZsolt


Abonnement : Service Abonnements PRO- 7 avenue Roger Chambonnet Contacts
GRAMMEZ, 4 Rue de Mouchy, 60438 91220 Brtigny sur Orge Maquette : Pierre Sandr Rdacteur en chef :
Noailles Cedex. - Tl. : 01 55 56 70 55 - abon- redaction@programmez.com ftonic@programmez.com
nements.programmez @groupe-gli.com - Fax : Tl. : 01 60 85 39 96 Publicit : PC Presse, Rdaction : redaction@programmez.com
01 55 56 70 91 - du lundi au jeudi de 9h30 Directeur de la publication Tl.: 01 74 70 16 30, Fax : 01 41 38 29 75 Webmaster : webmaster@programmez.com
12h30 et de 13h30 17h00, le vendredi de & rdacteur en chef : Franois Tonic pub@programmez.com Publicit : pub@programmez.com
9h00 12h00 et de 14h00 16h30. Tarifs Evenements / agenda :
Ont collabor ce numro : S. Saurel, Yann Serra, Imprimeur : S.A. Corelio Nevada Printing, 30 alle de la redaction@programmez.com
abonnement (magazine seul) : 1 an - 11 nu-
F. Bordage, J. Chatard recherche, 1070 Bruxelles, Belgique.
mros France mtropolitaine : 49 - Etudiant : Dpt lgal : parution - Commission paritaire :
39 CEE et Suisse : 55,82 - Algrie, Secrtaire de rdaction : Olivier Pavie Marketing et promotion des ventes :
1215 K 78366 - ISSN : 1627-0908
Maroc, Tunisie : 59,89 Canada : Experts : H. Carnicelli, L. Ellerbach, S. Civetta, F. Dupont, Agence BOCONSEIL - Analyse Media Etude
68,36 - Tom : 83,65 - Dom : 66,82 T. Lebrun, J. Guittard, O. Guilloux, J. Antoine, T. Desmas, Directeur : Otto BORSCHA oborscha@boconseilame.fr NEFER-IT / Programmez, novembre 2014
Autres pays : nous consulter. M. Frappat, F. Hebrard, M. Hubert, C. Villeneuve, S. Goudeau, Toute reproduction intgrale ou partielle est
Responsable titre : Terry MATTARD
PDF : 30 (Monde Entier) souscription B. Talmard, E. Briand, G. Egron, J-B Claramonte, P. Gilot, interdite sans accord des auteurs
Tlphone : 09 67 32 09 34
exclusivement sur www.programmez.com S. Vidouse, J. Devillard, M. Labelle et du directeur de la publication.
098_178 18/11/14 01:29 Page82

Quand un chef de projet parle avec un chef de projet.

Chaque semaine, de nouvelles aventures ! www.commitstrip.com


Pub cahier couv 180_180 17/11/14 22:33 Page99

Sur abonnement ou en kiosque

Le mag
m
magazine
gazine
g
d pros
des p s de lIT
T
Mais aussi sur le web

Ou encore sur votre tablette

PUB INF PROGRAMMER-decembre indd 1 17/11//2014


/2 10:16
Pub cahier couv 180_180 17/11/14 22:34 Page100

prolongation Jusquau 18 dcembre 2014

UNE TL POUR 1 EURO


DE PLUS
INCURV
Tl SAMSUNG
Pour 1 Euro de plus, choisissez :
Tl Samsung cran Incurv
121 cm HD Rf: UE48H6800
Tl Samsung 4K ultra HD
ou 127 cm, LED
Dfinition dimage fabuleuse: 3.840 x 2.160
Rf: UE50HU6900
ou Tl Samsung 140 cm 2D/3D HD
Rf: UE55H6400

COMMANDEZ
WINDEV 20 (OU WEBDEV OU
WINDEV MOBILE) CHEZ PC SOFT ET
RECEVEZ UN SUPERBE MATRIEL AU Elu
Langage

CHOIX POUR 1 EURO DE PLUS le plus productif


du march

Ou vous pouvez galement choisir :


(x2) Nouvelle
tablette Samsung
Document non contractuel. Logiciel professionnel.Version 20annonce

Samsung Galaxy Gear 2


Le tout

+ + +
(x2) Nouveau Galaxy Tab S 10,5p Lite +
nouveau Smartphone
smartphone Configurations sur Samsung
Samsung www.pcsoft.fr Galaxy Note 4
Galaxy Alpha
Galaxy S5 Configurations sur
Configurations www.pcsoft.fr
Configurations dtailles sur
dtailles sur www.pcsoft.fr
www.pcsoft.fr Ou encore un PC portable
DELL ou un PC de bureau
DELL ou une station de tra-
vail DELL

Pour bnficier de cette offre exceptionnelle, il suffit de commander WINDEV Mobile 20 (ou WINDEV 20, ou WEBDEV 20) chez PC SOFT au tarif cata-
logue avant le 14 dcembre 2014: pour 1 Euro de plus, vous recevrez alors le ou les magnifiques matriels que vous aurez choisis. Offre rserve aux Descriptif technique
socits, administrations, mairies, GIE et professions librales, en France mtropolitaine. Loffre sapplique sur le tarif catalogue uniquement. complet des matriels
Voir tous les dtails et des vidos sur : www.pcsoft.fr ou appelez-nous. sur www.pcsoft.fr
Le Logiciel et le matriel peuvent tre acquis sparment.Tarif du logiciel au prix catalogue de 1.650 Euros HT (1.973,40 TTC). Merci de vous
connecter au site www.pcsoft.fr pour consulter la liste des prix des matriels et les dates de disponibilit. Tarifs modifiables sans pravis.

Tl province: 04.67.032.032
Tl Paris: 01.48.01.48.88 Fournisseur Of ficiel de la Prparation Olympique
www.pcsoft.fr