Académique Documents
Professionnel Documents
Culture Documents
#192
le magazine du dveloppeur
- Janvier 2016
DOSSIER
SPCIAL
14 pages
SpEcial vintage !
Amiga, Amstrad CPC,
Apple II, Atari ST, GameBoy
Crer
son
drone
de
AZ
Node.JS
Les profils en
1ere partie
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
Java 8
3:HIKONB=^UZ^Z]:?a@l@t@c@a";
Kinect
SDK
Les
profils en
Java 8
2e partie
79
36
Agenda
Les
ralits
alternatives
10
Spcial
vintage
16
Rameur
geek
2e partie
64
Les
outils web
open source
Le boss
ftonic@programmez.com
69
Test : cran
tactile officiel
Raspberry Pi
Dv du
mois
Connecter
des IoT en
NodeJS
Cahier
Drupal 8
67
Java 8
et les grands
projets
Architecture
Java
2e partie
55
76
Mean.IO
4e partie
72
Construire
son drone
1ere partie
58
62
IDE
Non, Delphi
nest pas mort.
NoSQL
janvier
mars
LavaJUG
NIDays2016:
10 mars
JUG Nantes:
SnowCamp2016 !
BeMyApp
fvrier
DevFest Paris, le 5 fvrier!
National Instruments
organise sa journe
annuelle Paris le 10 mars
prochain. Occasion pour
faire le point sur les
diffrents outils,
linstrumentation, linformatique industrielle et embarque. La journe
sera rythme par de nombreuses confrences.
Grand rendez-vous de la journe, deux coupes seront organises, la
Coupe NXT et la Coupe RIO, dont le thme commun est la robotique.
Pour plus de dtails: http://france.ni.com/nidays/coupes-robotiques
Site officiel: http://france.ni.com/nidays
AlfrescoDay 2016
MICROSOFT TECHDAYS2016:
Les fameux TechDays se drouleront cette anne
en octobre et sur deux jours
Document non contractuel. Logiciel professionnel - Mobile Friendly = compatible mobiles COMPATIBLE WINDEV ET WINDEV MOBILE
WEBDEVV
NOUVELLE VERSION
RSION
Document non contractuel. Logiciel professionnel - Mobile Friendly = compatible mobiles COMPATIBLE WINDEV ET WINDEV MOBILE
www.pcsoft.fr
www.pcsoft.fr
Des c enta
aiines de tm
mooigna
agges su
ur le siitte
Le montage
Premier contact
Franois Tonic
Programmez!
Nous le
recommandons!
LES +
a Qualit de lcran
a Les possibilits du tactile avec la
Pi2
a Un vritable hybride fonctionnel et
pas cher
a Fixation rapide et derrire lcran
a Raspbian compatible (mais pas
adapte)
LES
a
a
a
a
Pas de documentation
Prix un peu lev
Pas toujours facile trouver
La colle entre le chssis et lcran
se dtache trop facilement
Fig.A
Valentin Michalak
Microsoft Student Partner Lead,
Ingnieur chez SOAT et Responsable
technique de la Virtual Association.
https://fr.linkedin.com/in/jonathan-salamon-35067486 https://www.linkedin.com/in/vmichalak
valentinmichalak@gmail.com
jonathan@glasscamp.org
Les objets connects, de plus en plus prsents
dans nos vies, sont une bonne premire tape
mais aujourdhui, les industriels rflchissent
dj ltape suivante : la ralit virtuelle /
augmente. Microsoft, Google, Facebook, HTC,
etc., tout le monde y va de son produit pour
rvolutionner les usages via des lunettes,
casques et autres priphriques.
Nous commenons dj voir ce que cette
disruption va nous rserver. Ces nouveaux
objets vont aussi rvolutionner le monde de la
production et la diffusion audiovisuelle, la
communication, le divertissement, lducation
immersive ...
Via ce dossier consacr spcifiquement aux
systmes de ralit augmente et virtuelle,
nous allons tenter de vous montrer ce qui
arrivera dans le futur et de comprendre
comment tous ces produits vont venir changer
notre quotidien.
tes-vous prt vous passer de votre cran
pour vous immerger dans vos informations de
manire virtuelle et/ou augmente ?
Si tout cela vous parat encore un peu abstrait,
nous vous proposons, avant daller plus loin, de
commencer par prciser ce dont il sagit.
10
Carlos Rodriguez
Ingnieur en lectronique et
informatique industrielle, est
impliqu dans un consortium
europen du son immersif
(projet Edison3D, Binaural)
Responsable du ple
Cration Matriel
(Hardware) de lassociation Glass Camp
www.glasscamp.org
https://www.linkedin.com/in/carlos-rodriguez-b5430241
carlos@glasscamp.org
Aurlie Filippetti, Ministre
de la Culture et de la
Communication, en plein
test de l'application
CultureGlass, le 28 mai
2014 lors de la soire de
clture de l'vnement
"Silicon Valois", organis
au ministre.
TESTEZ LE
MEILLEUR
T ES T E T APPROU V PAR
CLOUD
1&1 Serveur Cloud :
Easy to use ready to Cloud*
Les performances des nouveaux serveurs
Cloud sont imbattables en termes de
CPU, RAM et SSD.
Ralisez vos projets dans le Cloud
avec la combinaison parfaite entre
exibilit et performances.
Load balancing
Stockage SSD
Facturation la minute
Intel Xeon Processor
E5-2660 v2 et E5-2683 v3
1 mois gratuit !
Puis partir de 4,99 HT/mois (5,99 TTC)*
MOIS
POUR
ESSAYER
CLIC
POUR CHANGER
DE PACK
APPEL
UN EXPERT
VOUS RPOND
*Facile utiliser - prt pour le Cloud. 1&1 Serveur Cloud : 1 mois dessai gratuit, puis partir de 4,99 HT/mois (pour la conguration du serveur Cloud S). Facturation mensuelle
en fonction de la conguration choisie. Pas de dure minimum dengagement, ni de frais de mise en service. Conditions dtailles sur 1and1.fr. Intel et le logo Intel sont des
marques commerciales dIntel Corporation aux tats-Unis et/ou dans dautres pays. 1&1 Internet SARL, RCS Sarreguemines B 431 303 775.
1and1.fr
Le grand public,
une erreur de cible
12
Tango
Google Glass
Epson Moverio
Oculus Rift
Hololens
Comment Choisir ?
Il nest jamais facile de comprendre et de choisir parmi les produits qui sont
proposs ce jour. Afin de vous aider, nous vous proposons ci-dessous un
arbre de dcision que nous avons simplifi au maximum. Veuillez noter que
bien que cet arbre de dcision ait pour but de vous aider prendre une
dcision et y voir plus clair concernant lobjet qui rpondra vos besoins,
ce document doit tre considr sa juste valeur : il sagit dun schma
sajoutant une tude de march que vous devrez avoir mene au
pralable (ne pas considrer ce document comme rfrence absolue). De
plus, cet arbre ne prend en compte quun nombre restreint de modles
disponibles ce jour qui pourraient peut tre rpondre tout aussi bien ou
mme mieux vos besoins spcifiques.
Cardboard
Les Autres
*Totale : Signifie que se dplacer (marcher, courir, etc.) dans le monde physique provoque un mouvement
similaire dans le monde virtuel. Un contrleur supplmentaire reste ncessaire pour interagir 100%
(manipuler des objets) avec lenvironnement virtuel.
*Partielle : Signifie que certains mouvements physiques sont pris en compte (comme les mouvements de tte,
de bras et de mains). Un contrleur supplmentaire est ncessaire afin deffectuer des dplacements +
interagir 100% (manipuler des objets) avec lenvironnement virtuel.
Programmez! a Janvier 2016
13
Dans le monde des moteurs de jeu, Unity a su y creuser son petit trou.
Lenfant de Monogame (cr en Juin 2005) est depuis devenu la rfrence
des moteurs de jeu pour les crateurs indpendants et est sur le point de
devenir (si ce nest pas dj le cas) la rfrence du monde de la RV / VA.
Les raisons de son succs sont trs simple :
a Le moteur est compatible avec toutes les plateformes disponibles sur le
march ou presque, du PC la PS Vita en passant par les smartphones
Android et mme Windows Phone, aucune plateforme ne lui rsiste et
aucun casque de ralit augmente / ralit virtuelle non plus.
a La possibilit dutiliser du C# ou/et du Javascript. Dans le monde du
jeu-vido, le C++ longtemps t la seule vrai solution ; avec Unity, une
nouvelle voie sest propose et est plus adapt aux projets de petite ou
moyenne envergure.
De nombreux jeux que vous connaissez sont conus avec Unity et ils
reprsentent la vitrine du moteur.
Pour configurer son environnement pour faire de la VR, cest assez simple.
Vous devez disposer au minimum de la version 5.1 dUnity pour pouvoir
suivre ce tutoriel. Cest important car cette version intgre une nouvelle
fonctionnalit intressante autour de lintgration des casques de ralit
virtuelle. Crez un nouveau projet dans linterface, vrifiez quil soit bien en
3D. Pour intgrer votre quipement de RV / RA il existe deux mthodes :
a La mthode utilisant des plugins que nous ne dtaillerons pas dans cet
article car elle est spcifique chaque systme.
a Et la mthode en utilisant lintgration dUnity, beaucoup plus simple et
sur laquelle nous allons nous concentrer.
Pour activer lintgration avec nos casques, il va juste falloir cocher une
case Fig.1.
1 - Ouvrez le panneau qui se trouve dans Edit > Project Settings > Player,
2 - Ouvrez longlet Others Settings
3 - Activez la combobox Virtual Reality Supported.
Et cest parti, vous pouvez brancher votre paire dOculus !
Pour votre premier projet de VR nous avons choisi de vous faire adapter
un grand classique du jeu vido : le jeu de jongle.
Fig.1
Programmez! a Janvier 2016
Fig.3
Fig.2
14
Bravo ! Notre scne est prte recevoir les premires lignes de code !
Et aprs ?
Code de BallController.cs
using UnityEngine;
using System.Collections;
public class BallController : MonoBehaviour {
[Tooltip("Rebound force.")]
[SerializeField]
private int force = 200; // Force de rebond
/// <summary>
/// Factory de notre objet
/// </summary>
void Start()
{
initialPosition = transform.position; // Sauvegarde la position initiale pour le reset
rb = GetComponent<Rigidbody>(); // Met disposition la gestion de la physique de la balle
}
/// <summary>
/// S'excute chaque nouvelle frame
/// </summary>
void Update()
{
// Si une touche est appuye
if (Input.anyKeyDown)
{
transform.position = initialPosition; // Remettre la balle sa position initiale
}
}
/// <summary>
/// S'excute lorsque l'on rentre en collision
/// </summary>
/// <param name="collision"></param>
void OnCollisionEnter(Collision collision)
{
switch (collision.gameObject.tag) // En fonction du tag de l'objet avec lequel on rentre en collision
{
case "Player": // Si collision avec un player
rb.AddForce(0, force, 0); // Ajouter une force vers le haut pour faire rebondir la balle
break;
case "Ground": // Si collision avec le sol
Debug.Log("Game Over"); // Ecrire dans la console de dbug: Game Over
break;
}
}
}
Une fois ce code ajout, vous pourrez jouer avec votre Oculus.
Si vous le souhaitez, le projet est aussi disponible au tlchargement
ladresse suivante :
https://dl.dropboxusercontent.com/u/13395728/BalloonSample.zip
Intel RealSense
& Kinect
La Kinect de Microsoft et le
capteur RealSense dIntel
Intel RealSense
ont le mme objectif et le
dcortique
font de la mme manire
ou presque, capter votre
corps via un systme de
camra (notamment
infrarouge) afin den faire
Kinect
une carte. Une fois que
ceci est fait, il est assez simple de sinterfacer avec pour, par exemple,
coder un petit jeu et vous immerger entirement dedans.
Virtualizer
Le Virtualizer est un
systme permettant de
capter vos mouvements
pour les intgrer dans votre
exprience. Marchez,
courrez, sautez, tous vos
mouvements seront capts
mais vous ne bougerez pas
dans la ralit car vous tes
maintenu sur place par le
systme. Systme onreux
pour le moment, son
volution reste surveiller.
15
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Atari ST
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Amstrad CPC
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Amiga 500
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Amiga 2000
Apple II
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
La rdaction
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
T SPCIAL VINTAGE Y
Martin
Mystre
images : D.R.
16
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
aaa
Sorti en 1977, lApple II fut le roi des ordinateurs 8bits, et cest grce son succs et sa trs grande
longvit quApple a survcu aux checs de lApple III et du Lisa, et au trs lent dmarrage du
Macintosh. Conu par Steve Wozniak, sa russite est due principalement son lecteur de disquettes
apparu trs tt, et son architecture ouverte. En effet, lheure o ses principaux concurrents
chargeaient pniblement leurs programmes partir de cassettes lentes et peu fiables, les disquettes de
lApple II lont rendu compatible avec une utilisation professionnelle Visicalc fut la Killer Application et la possibilit dinsrer des cartes dextensions lui a allong sa dure de vie et surtout donn accs
des environnements complmentaires
trs riches comme CP/M.
Alain Zanchetta
Dveloppeur dans lquipe
Microsoft Hololens.
Avec ces deux lments, la palette de langages
de programmation de lApple II ne cde que
devant celle du PC: Basic, assembleur, Pascal,
C, logo, Lisp, Forth, Fortran, Modula II, Ada, etc.
Il existe mme une implmentation de Java,
certes limite, et le petit dernier de cette famille
sappelle Plasma, et est apparu en 2012, soit
35ans aprs la machine elle-mme.
Basic Applesoft
et assembleur 6502
Fig.1
80 HPLOT 278,Y TO X,0: HPLOT 279,Y TO X + 1,0
90 NEXT
Il utilise la haute rsolution: 280 x 192 pixels
en 6 couleurs. Au passage, on peut noter que
lApple II possde un mode graphique trs astucieux 280 x 160 pixels en 6 couleurs + 4 lignes
de texte en bas de lcran trs pratique pour
certains jeux ou pour les applications professionnelles. Le Basic supporte aussi un mode
basse rsolution (40x48) mais celle-ci nest quasiment jamais utilise. Pour tre exhaustif, il faut
noter que les derniers modles de la srie supportent des rsolutions plus varies comme 140
x 192 ou 560 x 192, mais celles-ci ne sont pas
accessibles aux programmes Basic, et elles ne
sont donc que rarement utilises Fig.1.
Les fonctions de dessin du Basic sont assez limites et consistent essentiellement au trac de
points avec HPLOT ou de lignes avec HPLOT
TO. Il existe une notion de SHAPE mais celle-ci
est trs limite et na rien voir avec les sprites
disponibles sur des ordinateurs cible essentiellement ludique.
Le dveloppeur de jeux sur Apple II doit donc
prendre tout en charge lorsquil veut afficher un
personnage ou un vaisseau spatial : les oprations logiques sont reines ici, avec les AND pour
effacer des parties de lcran et des OU pour
17
Un peu de pratique
Pour entrer de petites routines simples, le dveloppeur peut appeler le moniteur de lApple II via
la commande CALL -151, puis entrer les codes
hexadcimaux des instructions 6502 en les faisant suivre ladresse cible et:. Le mini dsassembleur, appel en entrant une adresse suivie
de L permet de vrifier le code saisi ou dinspecter le code prsent dans la ROM de lApple II.
a Appel du moniteur:
]CALL-151
a Entre de la routine prsente prcdemment :
*300: A0 00 B1 06 F0 07 20 F0 FD C8 4C 02 03 60
a Affichage du code 6502 de la routine COUT
du Basic :
*FDF0L
18
FDF0FDF1FDF3FDF6FDF7FDF9FDFAFDFBFDFEFDFFFE00FE02FE04FE05FE07FE09FE0BFE0DFE0FFE11FE13FE15FE17-
48
PHA
C9 A0 CMP #$A0
4C 95 FC JMP $FC95
48
PHA
84 35 STY $35
A8
TAY
68
PLA
4C 46 FC JMP $FC46
EA
NOP
EA
NOP
C6 34 DEC $34
F0 9F BEQ $FDA3
CA
DEX
D0 16 BNE $FE1D
C9 BA CMP #$BA
D0 BB BNE $FDC6
85 31 STA $31
A5 3E LDA $3E
91 40 STA ($40),Y
E6 40 INC $40
D0 02 BNE $FE17
E6 41 INC $41
60
RTS
Pour les programmes assembleurs plus consquents, il est prfrable de recourir un macroassembleur comme Merlin.
Celui-ci permet au dveloppeur de donner des
noms aux emplacements mmoire stockant les
variables, ainsi quaux sous-programmes et diffrentes branches du programme.
Voici le source Merlin de la routine prsente
prcdemment:
STRING = $6
COUT = $FDF0
*
ORG $300
*
LDY #$0
LOOP LDA (STRING),Y
BEQ END
JSR COUT
INY
JMP LOOP
END RTS
Merlin est assez compact et se place dans la
mmoire lemplacement habituel des programmes Basic, ce qui permet au dveloppeur
de modifier son source, de lassembler et de le
tester sans avoir recharger lenvironnement
depuis le lecteur de disquettes.
Paradoxalement, la programmation en assembleur est rpute difficile mais les processeurs
comme le 6502 sont en fait trs faciles programmer car ils ont peu dinstructions diffrentes : pour lessentiel, le programme charge
une valeur dans un registre, modifie cette valeur
$0100-$01FF
$0200-$02FF
$0300-$03FF
$0400-$07FF
$0800-$0BFF
$0C00-$1FFF
$2000-$3FFF
$4000-$5FFF
$6000-$BFFF
$C000-$CFFF
$D000-$DFFF
$E000-$FFFF
Utilisation
Appele Page 0, cette zone est trs utilise
par le systme car le 6502 a un
mode dadressage spcifique qui permet
dconomiser un octet et un cycle
CPU par instruction. Il reste nanmoins des
adresses qui ne sont pas utilises par
le systme et permettent au dveloppeur
dexploiter ce mode dadressage.
Pile du 6502.
Buffer dentre.
Quelques vecteurs dinterruptions sur le
haut de la page mais emplacement
idal pour stocker de petites routines 6502
cohabitant avec le Basic
Page texte ou graphiques basse rsolution.
Page de texteou graphiques basse
rsolution; plus gnralement le
dbut des programmes Basic.
Disponible.
Page graphique haute rsolution 1.
Page graphique haute rsolution 2.
Disponible. Le haut de la zone contient
gnralement le DOS qui se
charge en RAM partir dune disquette.
Adresses de pilotage du matriel et
des cartes priphriques.
ROM / Ram Bloc 1 / Ram Bloc 2
ROM / Ram
Abonnez-vous
Nos
classiques
111 numros
an
49
222 numros
ans
79
..............................
......................
PDF
30 (*)
1 an - 11 numros
..................
Etudiant
39
1 an - 11 numros
......
ISTOCK - DOLGACHOV
Vous souhaitez abonner vos quipes ? Demandez nos tarifs ddis* : redaction@programmez.com (* partir de 5 personnes)
n M. n Mme n Mlle
Entreprise : I___I___I___I___I___I___I___I___I
Prnom : I___I___I___I___I___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
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
@ I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I___I
n Je souhaite rgler rception de facture
PROG 192
n Abonnement 1 an au magazine : 49
Oui, je mabonne
Modern Fun
Fig.2
20
Fig.3
Dans les annes 80, Amstrad nest encore quune firme britannique spcialise dans le matriel
HIFI et vido dont le fondateur, Alan Michael Sugar (AMStrad) ambitionne dattaquer le march de
la micro -informatique.
Baptiste Bideaux
Consultant en Digital Learning
chez PwC France.
Le projet Colour Personal Computer dmarre
au dbut de lanne 1983, et en 1984 apparat sur
le march lAmstrad CPC 464, ordinateur 8bits avec 64ko de RAM, quip
dun microprocesseur Zilog Z80 cadenc 4MHz, dun magntophone
cassette et dun magnifique clavier QWERTY color. Il faudra attendre 1 an
pour voir arriver la version disquette de la machine: le CPC 664. La mme
anne dbarque le CPC 6128, une version du 664 avec une RAM augmente 128 ko. La mmoire primaire (64 ko de RAM) est partage en 4
banques de 16 ko chacune (numrotes de 0 3). Le CPC 6128 propose
64ko supplmentaires qui sont eux aussi partags en 4 banques de 16 ko
accessibles en assembleur.
Affichage
Equip dun moniteur monochrome ou couleur (selon les finances de chacun), la gamme CPC propose 3 modes daffichage:
MODE 0: 160x200 en 16 couleurs
MODE 1: 320x200 en 4 couleurs
MODE 2: 640x200 monochrome
La banque 3 situe entre ladresse &C000 et &FFFF est rserve pour laffichage cran. Quel que soit le mode daffichage, il y a toujours 200 lignes.
Chaque ligne une taille de 80 octets. Ainsi la premire ligne dmarre
&C000 et se termine &C049. Chaque ligne est dessine de manire
linaire, de gauche droite. Cependant, la fin dune ligne le trac effectue
un saut de 8 pixels plus bas. Si &C000 correspond aux coordonnes (0,0),
&C050 correspond (0,8). Pour accder la ligne directement en dessous
dune autre, il faut incrmenter 1000 (&800) ladresse de cette dernire.
Donc la seconde ligne sur notre cran (0,1) se trouve ladresse &C800.
La synchronisation vido est gre par le CRTC (Cathode Ray Tube
Controller), mais les couleurs sont gres par le Gate Array qui ne raisonne
pas en binaire, mais en tat (0,1 ou 2). Cest pour cela que nous avons une
palette de 27 teintes et non 16 ou 32. Les couleurs utilisables (16 maximum
en MODE 0) peuvent tre choisies parmi cette palette de teintes. Attention,
les teintes de palette sont indexes diffremment selon que lon y accde
par le BASIC ou par le Gate Array.
Organisation des pixels
Selon le MODE daffichage choisi, la manire de coder les pixels est sensiblement diffrente.
En MODE 0, un octet suffit pour afficher 2 pixels lcran, un pixel ayant
une longueur de 4 bits. Ainsi, la couleur du premier pixel est code sur les
bits 7, 5, 3 et 1. Le second pixel sur les bits 6, 4, 2, 0. Cest ce que lon
appelle lentrelacement des pixels.
En MODE 2, cest plus simple. Chaque bit dun octet correspond 1 pixel.
Comme on peut le voir, le 1er pixel se situe au bit N 7.
La programmation
Toute la gamme CPC est livre avec un BASIC intgr dans la ROM (le
Locomotive BASIC), qui permet lutilisateur de faire ses premiers programmes assez rapidement. Le langage est vraiment trs complet pour
lpoque et fournit beaucoup de commandes pour dessiner sur lcran,
jouer des sons, grer les priphriques (comme les 2 manettes de jeu). A
noter que le BASIC du CPC 6128 propose des commandes qui nexistent
pas dans le BASIC du 464 et 664. A lpoque, certains programmes taient
donc uniquement prvus pour le 6128. Le BASIC reste interprt. Aucun
compilateur nexiste lpoque. On peut toutefois protger son code
contre son listage (afin de garder un droit de proprit) et son interruption
dexcution. Mme sil reste plus lent quun programme cod en assembleur, le BASIC de lAmstrad permet tout de mme de produire des programmes de jeux honorables. Les puristes vous diront que pour
dvelopper pour lAmstrad CPC il faut un Amstrad CPC. Mais bon, ceux
qui nont pas la chance de possder un vrai CPC peuvent se tourner vers
les mulateurs qui feront trs bien laffaire. Le plus utilis est sans aucun
doute WinAPE (http://www.winape.net), qui a lavantage dmuler tous les
Amstrad CPC et de proposer un assembleur pour le Zilog Z80. Il mule par
dfaut la gamme CPC+, mais le BASIC reste identique aux versions CPC
plus anciennes. Tlchargez larchive ZIP depuis le lien http://www.winape.
net/download/WinAPE20A18.zip et extrayez tous les fichiers dans un dossier
(winape par exemple). Excutez le fichier WinAPE.exe. Lmulateur se
lance et vous voil sur lcran daccueil du BASIC.
21
MODE 2
Laffiche change nouveau et la rsolution est passe en 640x200 en
monochrome, soit 80 colonnes sur 25 lignes de caractres. Les caractres
sont dsormais 2 fois moins larges quen MODE 1.
Saisissez le code suivant, en appuyez sur ENTREE pour lexcuter:
MODE 1
Laffichage est revenu son tat initial.
Un peu de couleurs
Le BASIC utilise les couleurs indexes de 0 15. Chacune est associe par
dfaut lune des 27 teintes de la palette du CPC. Saisissez le code suivant :
10 MODE 0
20 FOR R=0 TO 15
30 PEN R:PRINTCOULEUR;STR$(R)
40 NEXT R
RUN
Voici les 16 couleurs par dfaut que vous pouvez utiliser en BASIC. La couleur 0
est la couleur utilise pour le fond dcran (bleu nuit). Les couleurs 14 et 15 sont
clignotantes car 2 teintes leur ont t associes. En effet, le BASIC permet de
dfinir 2 teintes pour une couleur afin de crer un effet de clignotement.
Explication du programme:
Ligne 10: Passage de laffichage en MODE 0
Ligne 20: Dbut de la boucle
Ligne 30: On utilise PEN pour la slection de la couleur du texte et PRINT
pour afficher le texte.
Ligne 40: Fin de la boucle
Restez sur cet cran, et saisissez ceci:
Voil comment saffichent nos couleurs en MODE 1. Nous avons bien nos 16
couleurs, mais seulement 4 teintes diffrentes (les teintes associes aux couleurs 0, 1, 2 et 3). En effet, le MODE 1 ne permet pas dafficher plus de teintes.
Essayons avec le MODE 2, saisissez le code suivant et excuter le programme:
10 MODE 2
RUN
En MODE 2, seules 2 teintes sont affichables (les teintes associes aux
couleurs 0 et 1).
Dessinons un peu
INK 1,15
Aprs excution, la couleur 1 a chang et est devenue Orange. La commande INK permet dassocier une teinte de la palette un index de couleur. La teinte doit tre comprise entre 0 et 26. Maintenant, saisissez ceci:
INK 2, 5 ,4
La couleur 2 est devenue clignotante car nous avons associ 2 teintes cette
couleur (5 et 4). Que ce passe-t-il si nous changeons de mode daffichage?
10 MODE 1
RUN
22
Explication du programme:
Ligne 10: Affichage en MODE 1
Ligne 20: Place le curseur graphique aux coordonnes absolues (0,0)
Ligne 30: Trace une ligne depuis la position du curseur graphique jusquau point (319,199)
Lune des possibilits offerte par le BASIC Amstrad est de pouvoir redessiner la table de caractres du CPC. Saisissez ce programme :
NEW
10 MODE 1
20 SYMBOL AFTER 47
30 SYMBOL 48,254,130,130,130,226,226,254,0
RUN
Afin de ne pas modifier les caractres saisis au clavier, nous allons redfinir les caractres 129, 130, 131 et 132. Saisissez le programme suivant:
10 MODE 1
20 SYMBOL AFTER 128
30 SYMBOL 129,7,31,printadr,126,126,254,255,255
40 SYMBOL 130,224,248,124,62,62,63,248,224
50 SYMBOL 131,255,255,255,127,127,63,31,7
60 SYMBOL 132,128,224,248,254,254,252,248,224
RUN
Vrifions que nos caractres ont bien t modifis en saisissant :
Explication du programme:
Ligne 10: Affiche en MODE 1
Ligne 20 : SYMBOL AFTER indique que la redfinition des caractres
dmarre aprs lindex 47.
Ligne 30: SYMBOL dfinit le caractre 48 (code ASCII du chiffre 0).
Un caractre CPC est contenu dans une matrice 8 x 8. Chaque ligne de la
matrice est code sur 8 bits, le bit 7 correspondant au premier pixel de la
ligne. Chaque pixel dune ligne correspond une valeur.
Note: Vous pouvez modifier les caractres
de 32 255. Les caractres 0 31 sont
appels caractres de contrle et ne peuvent pas tre redfinis par lutilisateur.
Attention, la redfinition des caractres 32
128 aurat un impact direct sur les caractres
saisis au clavier et affichs lcran (chiffres,
lettres, ponctuation). Si vous ne souhaitez
pas modifier la police de caractres, vous
pouvez uniquement modifier les caractres
partir de lindex 129.
Assemblage de symboles
Pour rappel un caractre est contenu dans une matrice de 8x8 pixels. Mais
comment faire si lon veut un graphisme plus grand? Pour cela, nous utiliserons un assemblage de symboles.
Nous allons raliser un programme BASIC permettant dafficher un PACMAN de 16x16 pixels en nous servant de lassemblage de symboles.
Rinitialisez le CPC avec le code suivant:
PRINT CHR$(129)
PRINT CHR$(130)
PRINT CHR$(131)
PRINT CHR$(132)
La commande CHR$ permet dutiliser le caractre N de la table de caractres du CPC. Ici, on affiche nos 4 caractres redfinis.
Assemblage!
Utiliser le code ci-dessus chaque fois que lon veut afficher notre PACMAN nest pas vraiment pratique. Nous allons donc assembler les morceaux de notre PAC-MAN. Saisissez la suite du programme, les lignes
suivantes:
70 PAC1$ = CHR$(129)+CHR$(130)
80 PAC2$ = CHR$(131)+CHR$(132)
RUN
Les lignes 70 et 80 initialisent 2 variables PAC1$ et PAC2$. Le typage des
variables est trs simple en BASIC Amstrad. Le $ indique que la variable
est de type chanede caractres. Pour les nombres, il ny a pas de symbole. Une variable ne peut pas avoir plus de 8 caractres.
PAC1$ assemble les caractres 129 et 130 lun cot de lautre. PAC2$ fait
de mme pour les caractres 131 et 132. Saisissez les lignes suivantes:
PRINT PAC1$
PRINT PAC2$
CALL 0
La commande CALL permet dappeler un sous-programme en langage
machine partir de ladresse mmoire donne. Ici, ladresse 0 permet de
rinitialiser compltement lordinateur.
Pour dessiner notre PAC-MAN, nous avons besoin de redfinir 4 caractres, qui se prsentent ainsi:
Nous constatons que nos 2 variables affichent les parties haute et basse
Programmez! a Janvier 2016
23
de notre PAC-MAN. Cest mieux, mais on peut faire encore plus avec lutilisation des caractres de contrle. Nous allons crer une 3me variable qui
assemblera le tout. Saisissez ces lignes la suite du programme:
90 PACMAN$ = PAC1$+CHR$(8)+CHR$(8)+CHR$(10)+PAC2$
RUN
La ligne 90 initialise la variable PACMAN$ avec nos 2 prcdentes
variables, assembles grce 2 caractres de contrle 8 (dplacement du
curseur texte vers larrire) et un caractre de contrle 10 (dplacement du
curseur texte vers le bas). Voyons comment saffiche dsormais notre
hros:
PRINT PACMAN$
Un sprite est un lment graphique, stock en mmoire qui est dessin sur
lcran. Sur CPC, laffichage dun sprite doit faire appel une routine en
assembleur afin dtre rapidement excut. Il serait possible de le faire en
BASIC, en dessinant point par point. Mais la lenteur de linterprteur rendrait le programme inexploitable. Saisissons le programme suivant:
NEW
10 MEMORY &3FFF
20 REM Donnes du sprite (16 lignes de 4 octets)
30 DATA 0, 112, 224, 0
40 DATA 16, 240, 240, 128
50 DATA 48, 240, 112, 192
60 DATA 112,224,48,224
70 DATA 112,224,48,224
80 DATA 240,224,48,240
90 DATA 240,240,240,128
100 DATA 240,240,224,0
110 DATA 240,240,128,0
120 DATA 240,240,224,0
130 DATA 240,240,240,128
140 DATA 112,240,240,224
150 DATA 112,240,240,224
160 DATA 48,240,240,192
170 DATA 16,240,240,128
180 DATA 0,112,224,0
La ligne 10 rserve la mmoire aprs ladresse &3FFF. Les lignes 30 180
contiennent les valeurs de chacun des octets de notre sprite. Chaque ligne du
sprite est code sur 4 octets (1 octet = 4 pixels de large en MODE 1). Notre
PAC-MAN donc une taille de 64 octets. Nous allons stocker notre sprite
partir de ladresse &4000. Ajoutons les lignes suivantes notre programme:
190 RESTORE 30
200 FOR ADR=&4000 TO &4000+63
24
En MODE 0, notre sprite mesure 8x16 pixels. Les pixels tant de largeur
double. Nous avons donc besoin de 1 octet pour afficher 2 pixels de couleur. Vous remarquerez que les valeurs contenues dans les lignes de DATA
sont exprimes en hexadcimal. On aurait pu les crire en nombre. Cest
juste un confort de lecture.
La ligne 20 charge en mmoire les donnes partir de ladresse &4000.
Nous allons nouveau utiliser le code assembleur prcdent pour affichage notre sprite. Ajoutons les 2 lignes suivantes notre programme:
110 CALL &6000
120 GOTO 120
RUN
Visionnaire
Notre PAC-MAN a pris des couleurs. Les pixels du MODE 0 sont plus larges.
La gamme Plus
Bien que lassembleur soit le langage favori des CPCistes, il est possible
de programmer en langage C et de compiler son code afin de lexcuter
sur CPC (mulateur ou vraie machine). Le compilateur C SDCC (Small
Device C Compiler) fonctionne sous Windows et permet (entre autres) de
raliser des programmes pour Amstrad et de gnrer du code pour le Zilog
Z80. (http://www.cpcwiki.eu/index.php/SDCC_and_CPC)
25
Aprs avoir fait mes armes en programmant des calculatrices (TI 57, FX 180P, PB 100), jai eu envie,
tel lextraterrestre du quartier, de faire lacquisition dun vritable ordinateur. A lpoque, tous ceux qui
taient proposs se ressemblaient beaucoup de par leurs
possibilits, leur langage de programmation (le Basic) et leur prix.
Compte tenu du fait que je devais le payer avec mes propres
deniers, jai cherch un bon compromis entre prix et capacits.
Mon choix sest port sur lAmstrad CPC 464 couleur, qui
lpoque (1984) ma cot un mois de salaire de job dt (650
euros en gros, oui mes jobs dt taient bien pays).
Stphane Sibu
Directeur Technique chez GUYZMO
Microsoft MVP Windows Platform Development
www.guyzmo.fr
stephane.sibue@guyzmo.fr
Ctait une vraie machine de course, processeurs Z80 4 Mhz, 64 Ko
de Ram (kilo octets oui), clavier mcanique (trs rare lpoque) et
lecteur de cassettes intgr, pas pour couter de la musique, mais pour
sauvegarder les programmes crits en Locomotive Basic (un autre basic
que celui de Microsoft). Ecran couleur intgr (une rvolution) et un processeur sonore permettant de faire de vritables morceaux de musique par
programme sans effort.
Jouer ou programmer?
Le jeu Sorcery
Locomotive Basic
Cot programmation, lAmstrad tait servi par un basic de trs grande qualit. Il tait trs rapide, et permettait dutiliser toutes les ressources de la
machine (sons, interruptions, ports, vido). Sur les 64 Ko de RAM, il ne restait que 42 Ko de disponible pour les programmes en basic, car il fallait
enlever la mmoire utilise par linterprteur et aussi la mmoire vido de
16 Ko. Cot vido ctait assez rustique. 3 modes taient disponibles. Plus
26
on voulait de couleurs diffrentes simultanes (dans une palette de 27 couleurs), moins on avait de pixels lcran:
Mode
0
1
2
Couleurs
16
4
2
Pixels
160x200
320x200
640x200
Caractres
20X25
40x25
80x25
Le lecteur de disquettes,
indispensable!
Toute cette littrature (seul mdia disponible lpoque) a permis beaucoup dentre nous de progresser et daller de plus en plus loin dans lutilisation de leur Amstrad.
En fait, mes dbuts en programmation ont t un peu atypiques. Contrairement beaucoup de personnes qui ont commenc dvelopper sur des
calculatrices ou sur des ordinateurs personnels (Amstrad, Comodore 64,
Oric, TO7, MO5, Amiga, etc), moi jai commenc directement par lassembleur ds 12 ans, et tout a cause dun concours de circonstances (je ne
vais pas entrer dans les dtails ici).
Cest tout naturellement quaprs lutilisation dun bon Basic ou dun bon
Turbo Pascal (langages de haut niveau), jai eu envie de retourner aux
sources et de me remettre dvelopper en assembleur (non, ce nest pas
sale) pour tirer le plus de puissance de la bte. Donc je me suis mis coder
pour le Z80, le processeur de lAmstrad (le mme que celui de la Game
Boy). Ce processeur de Zilog tait trs rpandu lpoque, et pour tout
vous dire, on le trouve encore aujourdhui dans les calculatrices programmables de chez Texas Instrument. L aussi ce fut une belle exprience qui
ma servi trs souvent dans mon travail par la suite.
Un peu dassembleur?
Trs vite une communaut sest cre autour de cette machine, des journaux se sont spcialiss dans la publication de programmes et dinfos la
concernant, des diteurs ont sorti normment douvrages permettant
daccder aux ressources caches de la bte (utilisation de routines en
code machine depuis le basic via les instructions PEEK, POKE et CALL).
Si vous aviez un Amstrad et que vous ne pouvez plus lutiliser, il existe sur
le net de trs bons mulateurs. Personnellement je vous recommande le
site WinAPE (http://www.winape.net/) dans lequel vous trouverez un mulateur Amstrad de grande qualit, pourvu de fonctions trs puissantes et pratiques (je vous laisse dcouvrir).
La bible du programmeur
Programmez! a Janvier 2016
27
Entre 1985 et 1994, Commodore International commercialise ce qui deviendra une machine de
lgende: lAmiga. En lespace de neuf annes de commercialisation, la gamme se verra dcline en
pas moins de 10 versions, dont la plus clbre reste lAmiga 500, sorti en 1987.
Baptiste Bideaux
Consultant en Digital Learning chez
PwC France.
LAmiga est devenu trs populaire dans les annes 1990. Il sduit les infographistes, devient un outil indispensable pour la TV et le cinma, et le secteur du jeu vido ladopte compltement, proposant mme des titres rien
que pour lui. Ses points forts: un affichage hyper-color pour lpoque, une
fluidit danimation, un systme multitche et une interface graphique similaire au Macintosh. Si Commodore a disparu, lAmiga perdure grce notamment la socit Amiga Inc, qui continue de faire voluer la gamme. Bien
sr, les machines proposes aujourdhui nont plus rien voir avec les premires architectures dpoque. Dailleurs, les anciennes versions sont nommes Amiga Classics, afin de diffrencier la vieille gamme de la nouvelle.
Les 3 Chipsets de l'Amiga
Selon les versions de lAmiga, on peut trouver 3 chipsets diffrents. LOCS
(Original Amiga Chipset) fut le premier chipset propos avec lAmiga 1000
et les premires versions de lAmiga 500 et 2000. Une version amliore
nomme ECS (Enhanced chipset) quipe les Amiga 500+, 600 et 3000. La
troisime gnration de chipset se nomme AGA (Advanced Graphics
Architecture); elle quipe les Amiga 1200, 4000 ainsi que la console de jeu
Amiga CD32. Les possibilits multimdia (audio et vido) sont fournies par
la puce Agnus. Cette puce volue en fonction de la gnration de chipset. Si la premire version (OCS) est capable de manipuler 512ko de
mmoire, une nouvelle version appele Fat Agnus et quipant les dernires versions de lAmiga 500 et 2000 manipule jusqu 1Mo de mmoire.
La puce du chipset ECS tout comme celle de lAGA permet de manipuler
jusqu 2Mo de mmoire et se nomme Super Agnus. La vido de lAmiga est propose en 2 spcifications: PAL(Europe) et NTSC(US). Le nombre
de lignes affichables en NTSC tant plus faible quen PAL, il ntait pas rare
de trouver des jeux en Europe qui noccupaient pas toute la hauteur de
lcran, enfin de rpondre galement au march US.
Basse rsolution
Haute rsolution
320x256
320x200
640x256
640x200
Haute rsolution
entrelace
640x512
640x400
Les couleurs
Chipset
OCS
ECS
AGA
28
Basse rsolution
Haute rsolution
2 32
2 32
2 32
2 16
2 16
2 16
Haute rsolution
entrelace
2 16
2 16
2 16
Palette
4096
4096
16,777,216
Programmation
Emulateur
WinUAE sera utilis. Il mule parfaitement lancienne gamme de lAmiga et
est simple configurer. Vous pouvez le tlcharger sur le site officiel :
http://www.winuae.net, dans la rubrique Downloads. Prenez les archives ZIP
si vous souhaitez viter la procdure dinstallation. La version de WinUAE
qui sera utilise dans cet article est la version 3.2.1.
Les ROMs Amiga tant copyrightes, WinUAE propose par dfaut lutilisation dune ROM publique nomme AROS. Elle est parfaitement compatible
avec les programmes Amiga et on reste dans la lgalit.
Langage de programmation
Nous allons utiliser le langage le plus populaire de lpoque: AMOS Basic.
Il sagit dun BASIC dvelopp par Franois Lionet en 1989. Il facilite le
dveloppement de jeux vido sur Amiga, mais permet aussi de dvelopper
des applications plus classiques. Il a lavantage dtre indpendant du systme dexploitation de lAmiga et donc de saffranchir des contraintes de
lOS. De ce fait, il communique directement avec le processeur 68000 et la
ROM, et permet de profiter pleinement du potentiel graphique de lAmiga.
Il a t dclin en une version Pro, apportant plusieurs amliorations. Nous
nutiliserons que la premire version, qui sera amplement suffisante pour
cet article.
AMOS Basic est disponible aujourdhui sous licence BSD. Le code source
a t mis la disposition du public par son auteur. Vous pouvez lutiliser
des fins personnelles. Pour plus dinformations: https://en.wikipedia.org/wiki/
AMOS_%28programming_language%29
Je vous propose de tlcharger larchive suivante:
http://www.baptiste-bideaux.com/amosbasic/amosbasic134.zip
Elle contient 2 images de disquette (au format ADF) utilisables sous WinUAE.
teur et appuyez sur les touches Shift+F9. Appuyez sur la toucheF pour
confirmer votre choix. Saisissez dsormais le code suivant:
Configuration de lmulateur
Lancez WinUAE. Aprs laffichage dun message vous informant des
ROMs manquantes, le panneau de configuration de WinUAE saffiche la
rubrique Quickstart . La configuration actuelle suffira. Il sagit dun
Amiga 500 quip du chipset OCS et dune RAM de 1Mo. Il faut insrer une
disquette dans le lecteur. Pour cela, cliquez sur le bouton Select image
file de la partie Emulated Drives et slectionnez le fichier AMOS The
Creator v1.34 (1991)(Europress).adf extrait de larchive prcdemment
tlcharge Fig.1. Cliquez ensuite sur le bouton Start situ en bas de la
fentre pour lancer lmulation. Aprs quelques secondes de chargement,
lditeur dAmos Basic apparait Fig.2.
Premier programme
Palette de couleurs
Fig.2
Programmez! a Janvier 2016
29
Fig.3
Nous allons amliorer notre programme. Voir les briques de couleurs safficher une une nest pas trs lgant. Nous allons ajouter un cran supplmentaire qui affichera un message de patience et masquera lcran de nos
couleurs. Lorsque nos couleurs seront totalement traces, nous les afficherons. Amliorons notre programme comme suit:
Explication du programme
Ligne 2 Ouverture de lcran N1,
de rsolution 640x200, en 2 couleurs et en haute rsolution.
Ligne 3 Dfinition de la palette de
lcran N1. Par dfaut, toutes les
actions de textes, de couleurs et
de tracs sont appliques au dernier cran ouvert.
Ligne 5 Ecrit le message de
patience sur lcran N1.
Ligne 6 On prend la main sur lcran N0. Lcran napparat pas, mais les
prochains tracs seffectueront sur cet cran. On dsactive le flashing de
couleur et le curseur texte pour cet cran.
Ligne 15 On bascule lcran N0 au premier plan. Ainsi, il devient visible.
Pour dmontrer des diffrences graphiques de chaque rsolution, jai choisi limage dune des toiles du
Fig.4
clbre peintre cossaisJack
Vittriano : The Singing Butler
Fig.4.
The Singing Butler,
Jack Vittriano, 1992.
Appuyez sur le touche F12
pour revenir au panneau de
configuration de WinUAE.
Nous allons insrer notre disquette de travail. Cliquez nouveau sur le
bouton Select image file et slectionnez le fichier programmez.adf
extrait de larchive tlcharge. Cliquez ensuite sur OK en bas du panneau pour revenir lmulation. La disquette contient toutes les images
dont nous avons besoin pour cette partie. Sous lditeur dAmos Basic,
crez un nouveau programme (Shift + F9) et saisissez le code suivant:
Limage affiche en 640x200 est plus fine. La palette est passe 16 couleurs. Les pixels affichs ne sont plus carrs, mais rectangulaires. Limage
met plus de temps safficher.
Affichons la mme image, mais en haute dfinition entrelace:
30
Manipulation dcrans.
Animation:
cycle de couleur
Lune des techniques simples pour crer une animation est de passer par
un cycle de couleurs. Ce procd consiste isoler quelques couleurs adjacentes dans la palette et dalterner les valeurs de leurs composants RVB, en
boucle. Nous allons voir comment mettre en place ce type danimation en
quelques lignes. Crez un nouveau programme et saisissez ce qui suit:
Le rsultat:
Le rsultat:
Le cycle de couleurs donne un effet de
dplacement du damier vers la droite.
u
Sur la disquette Programmez!
Animation: images par images
Voyons maintenant comment il est possible dobtenir, toujours en manipulant plusieurs crans, une animation images par images. Nous allons pro-
Retrouvez sur la disquette lensemble des programmes AMOS prsents dans cet article. Pour charger un programme AMOS depuis
lditeur, appuyez sur les touches Shift+F1.
31
Dans ce petit dossier, nous allons survoler 30 ans de machines Amiga, des historiques aux solutions
passant par lmulation. Ce tour dhorizon couvrant une grande priode et de nombreux rebondissements.
Alors plongeons directement dans le vif du sujet.
Jeffr3y
^Vital Motion ^AmigaVibes ^AmigaImpact
(jeffr3y.vm@gmail.com)
Revenons 30 ans en arrire, en 1985, cest en cette anne bnie, que lAmiga 1000, premire gnration de la machine de Commodore va sortir le
grand jeu dans la cour des micro-ordinateurs familiaux. Une prsentation
grandiose et tonitruante au Lincoln Center de New-York le 23 juillet 1985,
avec des stars, comme Andy Warhol(1) aid de Deborah Harry, plus
connue comme la chanteuse de Blondie, va dmontrer les capacits graphiques de lAmiga par un travail dartiste. Lors de cette crmonie, il y a
aussi la mise en avant des capacits de la machine via des dmos devenues lgendaires comme la Robo City et la mythique Boing Ball. LAmiga
1000 possde un KickStart 1.0 (KS) sur disquette, rapidement clips par
une version 1.1, ainsi quun WorkBench 1.0 (WB).
Second Reality!!
LAmiga 3000 arrive en 1990 avec WB et KS 2.0, vite suivi par une version
2.04. Mais la vritable troisime gnration arrive en 1992 par les 1200 et
600 du ct des familles et lAmiga 4000 pour les pros. Ces derniers sont
fournis avec les KS et WB 3.0 leur sortie, puis avec des KS et WB 3.1
aprs le rachat par Escom. Ces machines firent rver une grande majorit
des utilisateurs de 500 et 2000. Mais si les 1200 sont trs complet (le 600
tant un 500 sans le pav numrique, idal pour un Amiga transportable).
Le 4000 quant lui ft utilis par la Nasa jusquaux annes 2010, sur TF1
pour ses jingles pub et ses incrustations vido, ainsi que pour la ralisation
des effets spciaux de Babylon 5 (srie de SF des annes 90) pour ne citer
queux. Mais aprs les annes de faste, lAmiga linstar de lAtari ST, va
connatre la chute avec llvation du PC dans les chaumires durant le
milieu des annes 1990. Les jeux des annes 1992 sont Project-X et Pinball
Dreams pour ne citer queux, ainsi que Deluxe Paint, du 1 5, qui rayonna
durant toute la dure de vie de lAmiga (du 1000 au 4000). Je ne parlerai
pas des 3000UX, 1500, 500+, HD et autres variantes qui ne se dtachaient
pas des Amiga dcrits.
Dautres modles plus atypiques et moins rpandus ont t commercialiss comme le 2500, le Walker ou le CDTV qui tait une platine multimdia
avant lheure, mise en chec par un positionnement marketing dsastreux.
Nous ne parlerons pas non plus de la CD32 qui est une console.
32
essaie de se crer une communaut, cest Aros, avec pour leitmotiv davoir
un dploiement sur des machines PC (x86 donc Intel et AMD) et qui est
devenu Icaros(4).
Puis arrivent des cartes mres moins chres avec les Aone500 et SAM
dACube Systems(5) et depuis 2011, il y a A-eon Computer(6) qui commercialise des Amiga avec les X1000 et X5000, des machines possdant une
puce programmable Xena, compose de 2 curs 500 MHz, directement
lie au processeur. Back 2 the Roots!
Expansion is Revelation
Emulation is Salvation
Plusieurs mulateurs Amiga voient le jour sur PC, mais un seul sort du lot
aprs toutes ces annes: lincontournable WinUAE(8). Cest la solution la
plus fiable et la plus compatible dans son intgralit avec les Amiga Classics. Pour info, il existe UAE4All qui est moins compatible, mais port sur
de nombreuses plateformes comme la PSP (PSPUAE(9)) ou la GP2x.
Dans le genre plus indpendant en plateforme, il y a la solution du Raspberry 2 Pi avec de lAmiga mul dans les distributions Retropie(10) ou
RecalBox(11), mais cela ncessitera de bien les paramtrer avec les bons
OS et KS. La difficult venant surtout de cette dernire, car une fois bien
configur, le RPi2 savre une belle petite machine mulant lAmiga avec
brio. Si cest vers les dmos que vous lorgnez, prfrez-lui les solutions
hardware.
Enfin, il y a AmigaForever de Cloanto, solution tout-en-un comprenant
WinUAE et intgrant Amikit, Aros et des mini-bases de donnes, des
vidos pour les ditions DVD. Un must-have pour ceux qui veulent
reprendre simplement sur PC.
Hardwired by FPGA
Une autre alternative pour avoir des Amiga est la solution des FPGA initie
par le Minimig dAcube Systems dans le dbut des annes 2008. Cela permet une mulation du hardware de la machine. Ainsi les successeurs du
Minimig sont les MiST et autres FPGA Arcade. La solution ayant le plus le
vent en poupe est le MiST avec un dveloppement de cores consquents,
et pas moins de deux ddis lAmiga; un pour mulation des Classics
jusqu lAmiga 1200 de base 68020EC, mais pas au-del, ce sont les
FPGA Arcade qui devraient aller plus loin. Il y a aussi un core qui permet
lmulation de laffichage AGA. Bref, vous insrez une carte SD, installez le
core Amiga et des ADF (image de diskette), HDF (image de disque dur) et
mme WHDLoad. Un must!
Sur les portails de la demoscene, comme Pouet(12), Scene.org(13), Demozoo(14) ou Demoscene.fr(15), la scene demo Amiga nest plus aussi active
depuis les annes 2000 et des scnes comme celle du C64 apparaissent
bien plus actives. Mais avec les 30 ans de lAmiga cette anne, elle ft plus
On peut dire: lAmiga est mort, vive lAmiga et il continue avec une communaut de dveloppeurs, de sceners et dapplications restreintes. Les
temps ne sont plus des guguerres Amiga-Atari ST ou pire, OS4-MorphOS-Aros. Alors venez tous la prochaine Alchimie en 2017 Tain lHermitage, rejoignez les TripleA(17) ou dautres associations alternatives pour
ressentir encore les joies des OS multitches Amiga. Nhsitez pas
contacter des passionns de ces micros, ils vous montreront comment
exploiter les Amiga Classics comme les NG, voir les muler, car lAmiga
Spirit, cest le plaisir et la convivialit avant tout.
33
Le Hardware
34
Les mulateurs
Les Jeux
Coding Party
Les Dmos
35
Mobile-first (Responsive)
Premire volution notable, une approche mobile-first a t adopte pour cette 8me version :
les principaux thmes proposs par le CMS sont
intgralement responsive et le back office a t
repens (barre doutils mobile-friendly, tables responsives, bouton retour au site sur les pages
backend) afin de permettre ladministration de
son site depuis des supports mobiles. Le marquage des pages en HTML5, complt par des outils
de saisie mobile, permet doffrir aux internautes
en situation de mobilit une exprience utilisateur
fluide et ergonomique. Fig.1.
36
Architecture
Les champs
De nouveaux champs ci-dessous souvent utiliss sont entrs dans le cur galement, ce qui
facilite la tche de la configuration du site : Date,
Email, Link, Reference, Telephone.
Multilangue
Font-end / Intgration
Fig.1
parmi plus dune centaine fournies par la communaut sans avoir besoin de tlcharger un
fichier de langue placer dans un rpertoire prcis comme sur Drupal 7. De nombreux modules
contribs ont t intgrs dans le cur (par
exemple i18n, Administration Language...), qui
sont rorganiss en 4 modules. Cela permet une
traduction complte (l'interface, les configurations, les contenus, etc.) sans avoir besoin dinstaller de modules complmentaires.
Les blocs
Gestion de contenu
Programmation
Oriente Objet
Cache et performance
sont dsormais activs par dfaut ds l'installation du profil standard de Drupal. Nous verrons si
cela amliorera la situation actuelle car de nombreux sites Drupal 7 sont en production sans le
cache activ. En parallle, le cache pour les utilisateurs authentifis est galement disponible (et
activ ds l'installation), cela permet damliorer
les performances pour tous les utilisateurs. Du
ct front-end, la gestion de Javascript est bien
amliore, le Javascript est dsormais charg
dans le footer, et jQuery est charg uniquement
sur les pages qui en ont besoin. Tout cela permet
de rendre laffichage des pages plus rapide.
Conclusion
37
La rvolution du cache
Ce n'est un secret pour personne, l'un des principaux inconvnients de la programmation objet est
sa consommation de ressources serveur. Ainsi, lorsque Drupal a fait le choix de passer d'un modle
tout procdural au modle objet, il tait vident qu'il serait ncessaire de trouver une faon
d'optimiser un cur dj souvent dcri comme tant trop lourd. Comme il n'tait pas concevable
de transiger sur la souplesse de l'outil en rduisant son spectre fonctionnel, la communaut, en
parallle du travail d'optimisation normal du cycle de dveloppement, s'est intresse aux
problmatiques de cache. Le systme qui est dsormais nativement intgr au cur de Drupal 8
pourrait bien tre rpliqu dans tous les autres CMS tant il est malin et efficace.
Edouard Cunibil (DuaelFr)
Happyculture.coop
Constat
Dmarche
En partant du constat que Drupal 7 ne permettait pas toutes les typologies de sites de disposer d'un systme de cache performant, la communaut s'est demande comment il serait possible de rendre les
technologies utilises par les plus gros projets accessibles tous.
En effet, dans le cadre de sites trs dynamiques il n'est pas ais d'aller
chercher une couche supplmentaire de cache. Il reste deux problmatiques majeures rsoudre qui sont la mise en cache des parties de contenu trs spcifique l'utilisateur (panier de commandes, encart mon
compte, etc.) ou celles variant trs souvent dans le temps (derniers commentaires, flux d'actualits entrant, etc.).
Dans la plupart des systmes, dont Drupal 7, une page tant compose de
tous ces lments ne peut pas tre mise en cache sous peine d'tre soit
invalide constamment, soit de servir des informations l'attention d'un
utilisateur ou un autre.
Pour rpondre ces problmatiques, des solutions existent dj mais sont
difficiles mettre en uvre ce qui explique qu'on ne les retrouve que sur
des projets de grande envergure. Qu'il s'agisse d'utiliser des ESI ou un
chargement des donnes via AjaX, cela demande un travail supplmentaire non ngligeable.
38
Solution
Ils sont utiliss pour dfinir les dpendances entre le cache et des objets
arbitraires. Toutes les entits de contenu et de configuration sont des
dpendances valides mais il est galement possible de crer ses propres
la variation. Il est donc possible d'invalider toutes les variations d'un lment en se basant uniquement sur ses clefs de cache, ou d'invalider une
variation prcise en utilisant l'identifiant complet.
Par exemple, la liste des trois dernires actualits de notre site pourrait
dpendre de la langue et des permissions. Cela permettrait un utilisateur
de voir les trois dernires actualits correspondant ses droits et la
langue dans laquelle il parcourt le site, sans avoir considrer que cette
liste n'est jamais cache.
// Cre des variantes en fonction des permissions des utilisateurs
// et de la langue de la page.
$build['#cache']['contexts'] = ['user.permissions', 'languages'];
Drupal 8 multilingue
4 modules du cur de Drupal remplacent dsormais une vingtaine
de modules de la communaut
Si vous avez dj ralis un projet multilingue avec Drupal 7, vous savez que cela requiert l'installation
d'une multitude de modules communautaires. Drupal 8 simplifie grandement la tche en incluant au
cur du systme tout ce qui est requis pour crer des sites en plusieurs langues, ou mme simplement
des sites dans une langue autre que l'anglais. Pour ce faire, la nouvelle version est livre avec quatre
modules rpondant l'ensemble des besoins que l'on rencontre dans un projet multilingue.
Maxime Turcotte
Consultant en logiciel libre
Savoir-faire Linux
39
40
fier la traduction directement. Il est donc possible d'entrer plusieurs chanes de traductions
avant d'enregistrer. De plus, l'interface de Drupal
8 permet dsormais de traduire les textes pluriels, tel que: 1 commentaire / @count commentaires , ce que l'interface de Drupal 7 ne
permettait aucunement.
Bien que portant le mme nom que son homonyme en Drupal 7, le module content_translation
est fondamentalement diffrent. Drupal 8 rend
traduisibles toutes les entits de contenus, que
ce soient les nuds, les blocs, les termes de
taxonomie, etc. Dans sa version prcdente, ce
module ne supportait que la traduction des
nuds. Si l'on souhaitait traduire les termes de
taxonomie, les blocs ou les menus, il fallait utiliser des modules de la communaut.
Drupal 8 amliore grandement la traduction car
tous les contenus sont maintenant des entits
traduisibles l'aide d'un systme unique et configurables par type d'entit, par bundle, par
champs et parfois mme davantage. Pour un
champ d'image, par exemple, on peut rendre traduisible le titre et le texte alternatif, tout en
conservant la mme image pour toutes les traductions.
Toutes les entits de contenu (excepts les lments de menu) peuvent tre attaches des
champs, et tous ces champs du titre aux mtadonnes sont traduisibles. On peut ainsi choisir (ou non) d'avoir des mtadonnes diffrentes
selon les traductions. Le nouveau systme nous
donne aussi le choix, concernant les termes de
taxonomie, d'avoir soit des ensembles diffrents
par langue (en traduisant le champ attach au
contenu) soit un seul ensemble pour toutes les
traductions (en traduisant plutt les termes euxmmes). Il est donc maintenant possible de traduire tout ce que l'on veut, selon le degr
souhait, et rien de plus.
Une autre diffrence majeure entre Drupal 7 et 8,
c'est que cette dernire version ne duplique pas
les contenus pour chacune des traductions,
mais en traduit seulement les parties ncessaires. Par consquent, toutes les traductions
possdent le mme identifiant que leur source,
et la suppression de la source entrane la suppression de toutes ses traductions (une confirmation est bien sr demande).
La migration
Drupal 7 : example.info
Tous les modules dans Drupal ncessitent un fichier .info pour pouvoir tre
enregistrs dans le systme. Lexemple ci-dessus est typique dun module
de Drupal 7. Le format du fichier ressemble un fichier INI facilement
ditable, mais il comprend galement des Drupalismes tels que la syntaxe en array[] qui empche lutilisation de fonctions standard PHP de lecture/criture des fichiers INI. La cl files[], qui dclenche le chargement
automatique des classes personnalises pour ajouter du code dans la
base de registre, est particulirement drupalienne , et les dveloppeurs
de modules qui codent en orient objet doivent ajouter une ligne files[] pour
chaque fichier qui dfinit une classe, ce qui peut devenir stupide.
Drupal 8 : example.info.yml
Drupal 7: hook_menu()
Il sagit dun module assez basique dans Drupal 7 qui dfinit une URL sur
/hello qui, lorsquon y accde, fait des vrifications pour sassurer que lutilisateur dispose des permissions d accs au contenu avant dappeler la
fonction _example.page(), qui affiche Hello world. lcran en tant que
page entirement charte. Le hook_menu() est un exemple de ce qui est
connu de faon pjorative sous le nom de ArrayPI, qui est un modle darchitecture courant dans Drupal 7 et les versions antrieures.
Le problme pos par les ArrayPI est quils sont difficiles taper (par
exemple, navez-vous jamais oubli le return $items, puis pass 30 minutes
chercher comment rsoudre le problme?), ils ne disposent pas dautocompltion dans lEDI (environnement de dveloppement intgr) pour les
proprits disponibles, enfin la documentation doit tre mise jour manuellement chaque fois quune cl est modifie ou ajoute.
La documentation sur hook_menu() montre que le dfaut vient galement du
fait que trop de choses essaient dtre faites la fois.
Ce programme est utilis pour enregistrer les associations/accs entre les
chemins et les pages, mais galement pour afficher les liens dans linterface
de plusieurs faons, changer de thme, et bien plus.
41
src/Controller/Hello.php
existent, ce qui nest pas garanti) pour dcouvrir les fonctions hooks
nommes par magie dont vous avez besoin pour dfinir lapplication de
tel ou tel comportement. Certains sont ncessaires, dautres non. Parviendrez-vous deviner lequel est lequel ?
Dans Drupal 8, ces API mystres sont en majorit transfres vers le nouveau systme de plugin, qui ressemble ce qui suit :
src/Plugin/Block/Example.php
Drupal 7: hook_block_X()
block.module
Drupal 7 : Hooks
Voici un exemple typique de la faon dont on dfinit un nouveau composant dans Drupal (blocs, effets dimage formats de texte, etc.) : une sorte
de hook _info dclaratif, associ un ou plusieurs autres hooks pour
excuter dautres actions (voir, appliquer, configurer et bien plus). En plus
de ces lments, qui sont pour la plupart des ArrayPI, on constate quil y a
des API bien plus difficiles prendre en main, car lAPI gnrale elle-mme
ne peut absolument pas tre dcouverte, moins dinspecter rigoureusement tous les fichiers .api.php des diffrents modules supposer quils
42
Dans Drupal 7 et ses versions antrieures, le mcanisme dextension utilis est le concept de hooks . En tant que crateur dune API, vous pouvez dclarer un hook utilisant des fonctions telles que
module_invoke_all(), module_implements(), drupal_alter(), etc.
Si vous voulez quun module rponde cet vnement, il vous faut crer
une fonction nomme modulename_hookname() et dclarer ses rsultats
dune faon reconnaissable par lutilisation dune fonction hook . Par
exemple :
Bien que les hooks dominent encore largement dans Drupal 8 dans le
cas de comportements commands par vnements (les hooks de type
info ont t en grande partie transforms en annotations YAML ou en plugins), les portions de Drupal 8 compatibles Symfony (par exemple bootstrap/exit, systme de routage) ont pour la plupart t transfres dans le
systme Event Dispatcher de Symfony.
Dans ce systme, les vnements sont distribus lors de lexcution
lorsque certaines logiques sont en cours, et les modules peuvent abonner leurs classes aux vnements auxquels ils veulent quelles
ragissent.
Pour le prouver, regardons de plus prs la configuration API de Drupal 8,
qui est stocke dans Core/lib/Drupal/Core/Config/Config.php. Elle dfinit
de nombreuses mthodes CRUD telles que save(), delete(), etc. Chaque
mthode dclenche un vnement lorsque sa tche est accomplie, ce qui
permet aux autres modules de ragir. Voici par exemple Config::save() :
43
Fig.1
Christophe Villeneuve
Consultant IT pour Neuros, Mozilla Reps, auteur du livre "Drupal avanc"
aux ditions Eyrolles et auteur aux Editions ENI, Rdacteur pour WebRIVER,
membre des Teams DrupalFR, AFUP, LeMug.fr (MySQL/MariaDB User
Group FR), Drupagora...
Fig.2
Approche gnrale
Une application ouverte appele WebApps, est un site Web part entire et se
connectera distance votre Site internet. Il appellera le Web Service que nous
avons cr prcdemment. L'article utilisera comme environnement Firefox.
Mais vous avez la possibilit de le rendre compatible sur les autres smartphones.
Lanc en 2013 par la fondation Mozilla, Firefox OS est un Web pour smartphone. Il utilise les formats ouverts du Web (HTML5 / JS / CSS3).
Le systme possde une architecture 3 niveaux:
a Gonk: la couche basse du tlphone comme un cur;
a Geko: le moteur de rendu HTML5;
a Gaia: l'interface utilisateur.
44
Fig.3
L'interface utilisateur est l'emplacement o les applications seront accessibles partir du MarketPlace. Ainsi, avec cette approche vous construisez des applications avec seulement du HTML, Javascript et CSS.
Cas pratique
Il existe plusieurs manires pour publier une application Drupal sur un environnement mobile comme Firefox OS:
a Soit de garder sur votre serveur l'application;
a Soit de la mettre disposition dans la MarketPlace.
L'article va montrer comment dporter l'application Drupal en une application mobile et comme exemple, nous utiliserons votre magazine prfr
Programmez pour obtenir le rsultat suivant: Fig.4.
Pour rendre le site Internet visible sur le Marketplace de Firefox OS, un certain nombre d'tapes sont ncessaires:
te. Les dimensions ncessaires doivent tre ralises aux formats PNG et de
dimensions (en pixels): 128x128 et 512x512. Il est possible de prvoir des
icnes supplmentaires pour 16x16, 48x48, 128x128, 256x256 pour afficher
une icne de bonne qualit. Pour faciliter la gestion de vos fichiers, nous prconisons de ranger ces fichiers dans un dossier images et icons Fig.5.
<header>
<img src="img/logo.png" id="logo" alt="Programmez, le magazine du dveloppeur" />
</header>
"version": "1.0",
"name": "Programmez",
"description": "Programmez, le magazine du dveloppeur",
"launch_path": "/index.html",
"icons": {
"16": "/img/icons/programmez-16.png",
"48": "/img/icons/programmez-48.png",
"128": "/img/icons/programmez-128.png",
"512": "/img/icons/programmez-512.png"
},
"developer": {
"name": "Christophe Villeneuve",
"url": "http://www.hello-design.fr"
},
"installs_allowed_from": ["*" ],
"appcache_path": "/cache.manifest",
"locales": {
"fr": {
"description": "Programmez, le magazine du dveloppeur",
"developer": {
"url": "http://www.hello-design.fr"
}
}
},
"default_locale": "en"
Fig.6
Fig.7
45
Etape 5 : validation
Enfin
Fig.9
u
Fig.11
Fig.10
46
Processus de dveloppement:
Pertinence de la technologie:
Processus de dveloppement
(Source: http://www.appsdev.is.ed.ac.uk/blog/wp-content/uploads/2015/09/DrupalCon_Driesnote-1024x463.jpg)
de 28%. Il est par ailleurs dmontr que cette
baisse engendre par la suite un rel engouement, qui devrait se reproduire lors de la sortie
de Drupal 8.
Pourquoi Drupal 8 nest-il pas sorti en temps et
en heure?
On a tendance loublier mais Drupal existe
depuis presque 15 ans. 5 ans ont t ncessaires pour dvelopper Drupal 8, ce qui reprsente un cycle de dveloppement
particulirement long, surtout lorsquon le compare aux prcdentes release (8 mois entre
Drupal 4 et 5, 13 mois entre Drupal 5 et 6, 3 ans
pour passer de Drupal 6 7) et de manire plus
gnrale aux autres solutions du march.
Ce retard peut sembler dautant plus incomprhensible que la communaut elle, na cess de
crotre chaque anne. Plus spcifiquement sur
Drupal 8, on compte quand mme plus de 3.000
contributeurs, 15000 patches, 1300 bugs corrigs. Rappelons aussi que la mise en uvre de
cette nouvelle version suit les mmes pripties
que la mise en place de nimporte quel projet
que nous, agences, intgrateurs de solutions
Internet, mettons en uvre: une fonctionnalit
plus complexe quil ny paraissait, une charge
sous-value en dveloppement, une livraison
qui dclenche des effets de bord non prvus
Bref, il est difficile danticiper toutes les difficults inhrentes un projet, et finalement, sain de
se rappeler que le dveloppement de Drupal
reste aussi, et avant tout, un projet humain Fig.1.
A qui imputer ce retard? Il ny a pas de coupable comme le soulignait Dries, mme sil
reconnat que le dveloppement de Drupal 8 a
t par certains ct un peu chaotique . Le
dcoupage de Drupal 8 en plusieurs initiatives,
elles-mmes dcoupes en plusieurs fonction-
Fig.1
nalits a morcel les dveloppements, provoquant des rgressions entre des modules et le
noyau Drupal mais aussi entre les modules entre
eux.
Cest dailleurs ce qui sest pass lors de la
phase Alpha de Drupal 8. Pendant 1 mois,
aucun bug critique navait t remont par la
communaut jusquau jour o une simple
release - sans doute de module- a provoqu
une srie noire de plusieurs bugs majeurs,
repoussant de plusieurs semaines une ventuelle sortie RC qui semblait pourtant trs
proche.
Afin de pallier cette problmatique, il a t dcid de merger les dveloppements une fois la
fonctionnalit termine. Comme certains
membres lont remarqu, la terminologie de Drupal change en version 8. Dune version 7.x, on
passe une version 8.x.x
a Le 1er x correspond la mise en place de
nouvelles fonctionnalits dans le noyau dont
le trs attendu Migrate Update en V8.1 et
qui permettra de simplifier la migration des
sites Drupal 7 vers Drupal 8)
a Le 2e x appel Semantic versionning
correspond la monte de version mineure,
notamment en cas de Bug fixe. Son fonctionnement est aujourdhui similaire celui
des versions prcdentes de Drupal, notamment Drupal 6 et 7.
Depuis cette confrence une RC2 (21 octobre
2015) puis une RC3 (4 novembre 2015) sont sorties. La version finale dite drupal-8.0.0 a t
annonce.
Programmez! a Janvier 2016
47
Pertinence de la technologie
Petite histoire des CMS
Flashback!
Il y a presque 20 ans, les notions de pages et de
contenus taient trs lies: le webmaster disposait dun unique fichier HTML dans lequel figuraient la fois le fond (le contenu) et la forme (la
page). Lorsquil tait amen faire voluer le
graphisme de son site, le webmaster devait
modifier chaque page HTML quil devait ensuite tlcharger sur un serveur distant pour quil
puisse tre lu par un navigateur Web Fig.3.
Grce aux CMS, ce temps est rvolu: larrive
des CMS, il y a environ 15 ans, a rendu possible
Fig.2
48
dans un premier temps la sparation du conteneur (la page) et du contenu (larticle) via une
interface, appele Back-Office. Le contenu saisi
obligatoirement en HTML lpoque sinsrait par la suite dans un gabarit de page prdfini, dont le rendu visuel tait toujours gnr par
le serveur, saffranchissant ainsi des contraintes
prcdemment voques.
Par la suite ces mmes CMS ont bnfici de
nouvelles fonctionnalits simplifiant grandement
le travail des contributeurs: mise en place dun
diteur WYSIWIG pour saisir du texte, sparation des rles et des droits permettant une
dcentralisation des tches au niveau du BackOffice, cration de workflow de validation des
contenus
Ce qui est intressant de retenir de ce petit rappel historique, cest que les CMS et plus gnralement les langages de programmation comme
le PHP ont permis de propulser nos sites dans
une nouvelle re, facilitant dune part le travail
des quipes ditoriales et techniques mais aussi
dautre part ouvrant de nouvelles perspectives
pour nos sites Web avec lapparition de la vido,
mais aussi de nouveaux usages (RSE, e-commerce).
Disons-le clairement: les CMS ont ringardis
nos vieux outils de cration de sites Web classiques, mais se sont reposs pour beaucoup
sur leurs acquis en valorisant un nombre de plus
en plus consquent de modules sans forcment
investir dans des contres plus sinueuses (outils
Marketing, Exprience User-centric).
Dries reconnat lui-mme que Drupal 8 a mis le
paquet sur lexprience dveloppeur au dtriment de lexprience utilisateur (UX). Cette
confidence est dautant plus tonnante quil
existe aujourdhui sur le march des frameworks
qui rpondent ces 2 aspects.
CMS versus Framework: la nouvelle bataille?
En clair, est-ce que les choix stratgiques de
Drupal sont les bons? Larriv des frameworks
Web rpondant la fois des considrations
techniques et comportementales nont-ils pas eu
raison de nos bons vieux CMS? Sont-ils amens
disparatre?
Fig.3
Fig.4
Faut-il considrer ces Frameworks comme
une menace?
Cest un fait, larrive des frameworks Front-End,
appuys par de grands acteurs du Web (Google
pour AngularJS, Facebook et Instagram pour
React.js) a chamboul un certain nombre de nos
habitudes. Les frameworks sont dsormais une
49
Suite de la page 35
appel maxYMiser. Cet outil cr par Gareth
Morris (Gwem) permet de grer des patterns et
de crer des sons spcifiques au composant
Yamaha.
Aujourd'hui toutes les musiques provenant de
l'Atari ST sont archives principalement sur le
site http://sndh.atari.org/, maintenu pour le
fameux Phil Graham (Grazey), les fichiers sont
au format unique SDNH qui a t invent par
Jochen Knaus et qui peut tre jou via le logiciel JAM du groupe Cream pouvant tre cout
sur PC comme sur ST.
Voici un bout de code en assembleur 68k du
programme Plugin-based multipalette picture
viewer (MPP VIEWER) dvelopp par Francois
Gala (Zerkman) du groupe Sector One. Ce programme permet dafficher des images sur un
Atari STF et sur un Atari STE o les performances de celui-ci rajoutent plus de nuances au
niveau des couleurs avec en plus une utilisation
du Blitter permettant le mode overscan pour
dpasser le format traditionnel daffichage. Le
format des images est en 320 par 200 pour un
affichage de 56 couleurs par ligne, soit plus de
10000 couleurs affiches sur un cran standard!
;-------------------------------------------------------------; Multipalette routine.
; by Zerkman / Sector One
; mode 3: 416x273, CPU based, displays 48+6 colors per scanline
; with overscan and non-uniform repartition of color changes.
;-------------------------------------------------------------; Init routine.
; a0: file structure address
; a1: destination palette
m3_init: move.b#2,$ffff820a.w ; 50Hz
clr.b $ffff8260.w ; Low Resolution
rts
m3_timera1:
move #$2100,sr
stop #$2100
move #$2700,sr
; top border HBL=33, LineCycles=452~460
naupe 90
clr.b $ffff820a.w
naupe 11
move.b #2,$ffff820a.w
move.l a7,usp
m3_tstsync0:
move.b $ffff8209.w,d0
beq.s m3_tstsync0
neg.b d0
lsr.l d0,d0
move.l m3_pal(pc),a0
lea$ffff8240.w,a1
lea$ffff820a.w,a2
50
lea$ffff8260.w,a3
lea$ffff824c.w,a7
naupe 36
movem.l (a0)+,d1-d5
movem.l d1-d5,(a7)
rept 227
move a3,(a3)
; LineCycles = 508 -> 4
nop
move.b d0,(a3)
; LineCycles = 8 -> 16
movem.l (a0)+,d2-d7/a4-a5 ; 19
movem.l d2-d7/a4-a5,(a1) ; 18
movem.l (a0)+,d0-d7/a4-a6 ; 25
movem.l d0-d7,(a1) ; 18
movem.l a4-a6,(a1)
;8
moveq #0,d0 ; LineCycles = 368 -> 372
move.b d0,(a2)
; LineCycles = 372 -> 380
move a2,(a2)
; LineCycles = 380 -> 388
movem.l (a0)+,d1-d5 ; 13
move a3,(a3)
; LineCycles = 440 -> 448
nop
move.b d0,(a3)
; LineCycles = 452 -> 460
movem.l d1-d5,(a7) ; 12
endr
move a3,(a3)
; LineCycles = 508 -> 4
nop
move.b d0,(a3)
; LineCycles = 8 -> 16
movem.l (a0)+,d2-d7/a4-a5 ; 19
movem.l d2-d7/a4-a5,(a1) ; 18
movem.l (a0)+,d0-d7/a4-a6 ; 25
movem.l d0-d7,(a1) ; 18
movem.l a4-a6,(a1)
;8
moveq #0,d0 ; LineCycles = 368 -> 372
move.b d0,(a2)
; LineCycles = 372 -> 380
move a2,(a2)
; LineCycles = 380 -> 388
movem.l (a0)+,d1-d5 ; 13
move a3,(a3)
; LineCycles = 440 -> 448
nop
move.b d0,(a3)
; LineCycles = 452 -> 460
move.b d0,(a2)
movem.l d1-d3,(a7) ; 8
move a2,(a2)
rept 44
move a3,(a3)
; LineCycles = 508 -> 4
nop
move.b d0,(a3)
; LineCycles = 8 -> 16
movem.l (a0)+,d2-d7/a4-a5 ; 19
movem.l d2-d7/a4-a5,(a1) ; 18
movem.l (a0)+,d0-d7/a4-a6 ; 25
movem.l d0-d7,(a1) ; 18
movem.l a4-a6,(a1)
;8
moveq #0,d0 ; LineCycles = 368 -> 372
move.b d0,(a2)
; LineCycles = 372 -> 380
move a2,(a2)
; LineCycles = 380 -> 388
movem.l (a0)+,d1-d5 ; 13
move a3,(a3)
; LineCycles = 440 -> 448
nop
move.b d0,(a3)
; LineCycles = 452 -> 460
movem.l d1-d5,(a7) ; 12
endr
move a3,(a3)
; LineCycles = 508 -> 4
nop
move.b d0,(a3)
; LineCycles = 8 -> 16
movem.l (a0)+,d2-d7/a4-a5 ; 19
movem.l d2-d7/a4-a5,(a1) ; 18
movem.l (a0)+,d0-d7/a4-a6 ; 25
movem.l d0-d7,(a1) ; 18
movem.l a4-a6,(a1)
;8
moveq #0,d0 ; LineCycles = 368 -> 372
move.b d0,(a2)
; LineCycles = 372 -> 380
move a2,(a2)
; LineCycles = 380 -> 388
naupe 4
rept 3
clr.l (a1)+
endr
move a3,(a3)
; LineCycles = 440 -> 448
nop
move.b d0,(a3)
; LineCycles = 452 -> 460
rept 5
clr.l (a1)+
endr<<<<<<<
move.l usp,a7
move #$2300,sr
rts
Le source sera principalement utilis dans la dmo Antiques des
groupes Dune et Sector One sortie en 2011 o tout le talent du
graphiste Michel Savariradjalou (Mic) du groupe Dune est
impressionnant dans cette dmo.
Conclusion
Plan dadressage
La cartouche Gameboy
Samuel Blanchard
Responsable Dveloppement pour NavisoDev
MVP Windows App Dev
Ces lments sont souds sur une carte mre et cbls afin de pouvoir discuter entre eux. Ces cblages sont appels des bus. A laide de ces bus, le
CPU va pouvoir lire et crire dans la mmoire et dans le processeur vido.
Il existe 3 types de bus:
a Un bus dadressage permettant de positionner une adresse.
a Un bus de donnes (data) capable de lire ou dcrire cette adresse.
a Un bus de contrle capable de donner un sens au bus de donnes (criture ou lecture) mais galement de lever des interruptions (le CPU excute alors du code une adresse particulire).
Plan dadressage
Grce aux bus, le CPU est capable daccder des emplacements qui ressemblent un tableau doctets. Chaque octet est accessible par une
adresse de 16 bits soit 65536 emplacements accessibles de 0x0000
0xFFFF en hexadcimal.
Lorsquune cartouche de jeu est insre dans la Gameboy, celle-ci accessible dans le plan dadressage.
Selon les adresses on accdera donc des emplacements de la cartouche, de la Gameboy ou du coprocesseur vido.
0x0000
0x4000
0x8000
0xA000
0xC000
0xFF00
Plan Adressage
Rom Bank #0 16 KO
Rom Banks
16 KO
Vido Ram
Ram Banks
Internal Ram
I/O ports
Cartouche
Cartouche
Gameboy
Cartouche
Gameboy
Gameboy
51
A
B
D
H
8 Bits
Registres
F
C
E
L
16 Bits
AF
BC
DE
HL
SP
PC
Quelques instructions
Instructions
Paramtres
Opcodes
A, #
0x3E
A, C
0xB9
A, #
0xC6
##
0xC3
Cycles
4
4
8
12
Emulation du CPU
52
Fig.1
this.PC = this.Memoire.Lecture16Bits(this.PC+1);
cycle = 12;
break;
// Autres instructions
case
}
Return cycle;
}
Le processeur Vido
Le processeur 8 bits utilis par la Gameboy nest pas assez puissant pour
grer laffichage ncessaire la ralisation dun jeu vido. Il est donc paul par un processeur Vido ou GPU permettant laffichage simultan dun
fond scrollable (dplaable), de sprites et dune fentre Fig.2.
Pour envoyer les graphismes du jeu lcran on utilise un emplacement
mmoire particulier: La RAM vido (VRAM).
Afin que le CPU puisse modifier rapidement lcran, celui-ci ne permet pas
un accs direct par pixel.
Au lieu de cela il propose un systme de tuiles et de cartes.
Une tuile (ou tile) est un bloc de 8x8 pixels.
Chaque tuile est range dans la VRAM une adresse comprise entre
0x8000 et 0x9000. La carte (ou map) va rcuprer lindex de ces tuiles et
les afficher lcran Fig.3.
Cette utilisation de blocs de 8x8 pixels est particulirement visible dans
lillustration du jeu Zelda sur les poteaux par exemple.
La carte est range dans la VRAM une adresse comprise entre 0x9800 et
0xA000.
Concrtement un jeu chargera ses tuiles au dmarrage du niveau, puis
mettra en place sa carte. La carte sera modifie rgulirement durant la
partie alors que les tuiles le seront trs rarement.
Un cran fait 160 par 144 pixels soit 20 tuiles par 18.
Les pixels de chaque tuile sont stocks dans un format particulier. Les
tuiles sont capables dafficher 4 couleurs simultanment constitues de 2
bits:
00 = blanc
01 = gris clair
10 = gris fonc
11 = noir
Les deux bits constituant une couleur sont spars en deux octets comme
dans lillustration suivante. Les deux octets contiennent donc 8 couleurs
simultanment Fig.4.
Les sprites
Les sprites sont des lments graphiques dont la premire couleur est
transparente. Cela permet la cration de personnages se dtachant du
fond. Les sprites sont constitus de tuiles et peuvent tre inverss horizontalement ou verticalement afin de minimiser le nombre de tuiles
employes. Deux tuiles peuvent tre galement associes pour crer un
sprite ayant une hauteur double. Chaque sprite peut tre positionn indpendamment.
La fentre (Window)
La fentre est souvent utilise pour afficher des inventaires dans les jeux.
Elle est constitue de 20x18 tuiles soit la taille exacte de lcran (160x144
pixels).
Cette fentre peut tre dplace laide de deux registres du GPU reprsentant les positions X et Y.
Fig.3
Le fond (Background)
Le fond dcran est constitu 32x32 tuiles soit 256x256 pixels. Il est donc
plus grand que lcran.
Fig.2
Fig.4
Programmez! a Janvier 2016
53
Dessiner lcran
}
}
La mthode DrawBackgroundLine, par exemple, sera charge de rcuprer lemplacement vis par le compteur HBL dans la carte en intgrant les
registres SCX et SCY dans son calcul. Une fois lindex de la tuile rcupr,
on lit les octets contenus dans la tuile, et, en les associant par deux on est
capable de retrouver la couleur des pixels afficher (de 0 3). Il ne reste
plus qu convertir cette valeur en couleur comprhensible par notre systme (du RGB en loccurrence).
Toutes ces valeurs de couleur sont stockes dans un tableau reprsentant
la totalit de lcran.
Une fois toutes les lignes dessines (au bout de 65664 cycles), le GPU lve
linterruption VBL. Le CPU se positionne alors sur ladresse du code VBL.
Durant cette priode, Le CPU a accs la VRAM et en profite souvent pour
modifier les valeurs de la carte et parfois mme des tuiles. En effet, le
temps dexcution autoris de 4560 cycles est beaucoup plus long que
pour les HBLs.
A la fin de la VBL, nous possdons un cran complet du jeu.
Synchronisation de la Gameboy
et affichage cran
Sur un PC actuel, notre Gameboy risque dtre mule extrmement rapidement. Si nous ne la synchronisons pas avec notre PC, elle risque dtre
beaucoup trop rapide pour tre jouable.
On va donc synchroniser la Gameboy et le PC en prenant un de leurs
points commun: La VBL.
Lcran de notre PC dispose galement dune VBL.
Pour afficher nos pixels lcran, on utilise un framework graphique (par
exemple SharpDx).
Les frameworks graphiques actuels proposent pratiquement toujours une
mthode pour accder cette VBL.
Ils permettent galement denvoyer le tableau contenant les valeurs RGB
dans une texture. Cette texture sera ensuite affiche lcran.
Maintenant que laffichage cran est termin on peut reprendre lexcution
de la Gameboy pour afficher un nouvel cran.
public byte[] RunOneFrame()
{
int cycles = 0;
do
{
cycles += this.processor.Run();
this.video.Run(cycles);
}
// 70800 cycles pour 1 frame
while (this.Video.HaveNewFrame == false);
return this.video.Screen;
}
Conclusion
54
Open httpRequester:
tester ses Web Services Fig.1.
Un des moyens les plus simples de tester ses Web services est de sinstaller un plugin permettant de lancer des requtes POST (pour des requtes
GET, le navigateur seul suffit). Il est alors facile de remplir le corps en JSON
ou en XML, de modifier le content type et denvoyer sa requte en POST ou
en GET. On peut galement modifier le header ou bien ajouter, de manire
propre, des paramtres la requte. Mais ce qui est surtout utile, cest de
pouvoir enregistrer ces requtes de tests afin de ne pas reconstruire via
des copier-coller hasardeux son jeu de tests entre chaque modification de
code. Si lon veut pousser plus loin, on utilisera SOAP UI qui a des fonctionnalits avances de tests, dappels la chane, etc Fig.2.
Dust me selector :
faire du tri dans ses classes CSS Fig.4.
JsonParser:
construire un JSON en un clin dil
En lien avec le plugin prcdent, qui envoie des requtes dont le corps est
souvent en JSON, il nest pas rare alors de voir des dveloppeurs compter
Fig.3
Fig.1
JsonParser indente et colorie le JSON en entre. Ici le JSON est mal form, il manque une accolade.
Fig.4
Fig.2
SOAP UI est un logiciel avanc d'appels de Web service
Liste des classes CSS inutilises, classes par fichier de Dust me Selector
Programmez! a Janvier 2016
55
La bote couleurs:
une pipette couleurs sur le bureau Fig.6.
La boite couleur est un outil qui na quune seule fonctionnalit, mais cest
incroyable ce quelle peut servir : lorsque vous souhaitez rcuprer une
couleur prcise sur une image fournie par un designer, vous rcuprez en
un clic le code hexadcimal ajouter dans vos classes CSS. Indispensable.
jsfiddle.net:
crire son code statique et tester en ligne
Cette application Web est tout simplement magique. Elle sert principalement dvelopper du JavaScript et pouvoir valider les modifications
directement dans le navigateur. Cela permet de sabstraire de son site
Internet, de tester une fonctionnalit avant de limplmenter rellement.
Cette application se compose de quatre cases: la premire permet dentrer du HTML, la seconde du CSS, la troisime du JavaScript et enfin la
dernire permet de visualiser le rsultat de ce code aprs un clic sur
run. Il est bien sr possible dappeler des bibliothques JavaScript et
CSS externes. Une autre fonctionnalit extrmement utile est celle de pouvoir enregistrer son code, que lon peut alors retrouver ou partager sur les
forums grce une URL gnre Fig.7.
refresh-sf.com:
minimiser la taille de ses fichiers statiques
Fig.5
Aperu du plugin de changement de langue de Firefox
Fig.7
JSFIDDLE se dcompose en quatre cadrans : HTML, CSS, JavaScript et rendu
Fig.6
La bote couleurs, un outil mono fonctionnel, mais connatre
56
Fig.8
Refresh-CSS est en train de transformer notre feuille CSS afin qu'elle prenne le moins de poids possible
www.askapache.com/online-tools/base64image-converter :
convertir des images en base 64
Les data Uri permettent de stocker des informations dans le champ plutt
que daller chercher la ressource lextrieur. Concrtement, dans une
page HTML rfrenant des images, les balises img ont dans leur
champ une image encode en base 64 plutt quune URI pointant vers une
image externe. Cette mthode prsente lavantage de supprimer des
requtes. En revanche, une image encode est gnralement plus lourde
que limage elle-mme. chacun de dcider sil prfre privilgier le
nombre de requtes au poids de ses pages ou linverse.
<img
src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmd
akyH5BAQUAP8ALAAHJHUGBQAA8AAAPb
WLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVr
ApTYWy5FKM1IQe+Mp+L4rphz+qIOBerlUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHi
MGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxM
AF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=
" />
<!-- exemple dimage en base 64 insre dans le code HTML -->
Il est important de connatre au moins cette possibilit. Certains plugins
JavaScript demandent pour tre customiss de modifier des fichiers XML,
et notamment pour modifier une image par dfaut dy inclure une image
encode en base 64. Askapache va convertir une image donne en base
64, sachant quil est tout fait capable de faire linverse Fig.10.
Il existe beaucoup dditeurs et de comparateurs de fichiers ou de dossiers. Ils ont chacun leurs avantages et on naime pas forcment en changer. Cest justement pour cela que nous vous proposons Meld. Celui-ci a la
particularit dtre disponible sous Linux, Mac et depuis peu, sous Windows. Il possde des options sympathiques qui font que cest un outil
agrable utiliser comme la coloration syntaxique et le changement de la
tabulation pour y voir plus clair. Meld compare aussi bien les fichiers que
les dossiers. Fig.11.
Il est de temps en temps utile de vrifier lensemble des liens de son site
afin de prvenir les erreurs 404 (fichier non trouv). Pour cela, Xenu est un
logiciel trs simple dutilisation qui va rechercher tous les liens et tester
toutes les requtes que propose le site. Concrtement, Xenu va faire une
requte GET sur chacun des liens dans les balises <a>, <link>, <img>,
<script> et ainsi tester la prsence des fichiers. Au fur et mesure quil
avance, Xenu nous affiche les liens quil a tests et ltat de russite du
test. Ainsi en quelques instants, on peut dnicher les erreurs de frappes, et
nettoyer un peu son code dappels obsoltes Fig.12.
Conclusion
Fig.9
Interface de connexion de WinSCP
Fig.10
Fig.11
Meld possde une interface simple et moderne
Xenu nous remonte la liste des liens cass qui apparaissent ici en rouge
Programmez! a Janvier 2016
Fig.12
57
gres par ordre de priorit. Ajouter cela un tel chantier aurait forcment
ncessit un nombre dhomme/jour supplmentaire, sans compter le dlai
de monte en comptences, ainsi que le risque de rpercussions ngatives sur les performances de lapplication si le code design de la nouvelle
implmentation nest pas soign.
Sans oublier quilne sagit pas dun dveloppement from scratch: on
parle bien de codeexistant quil faudrait reprendre en Java 8. Si ce dernier
est complexe et/ou mal dvelopp, le Refactoringen serait dautant
plus dlicat. Mises part les contraintes de dlai, on risquerait de se
retrouver avec des performances dgrades malgr les promesses vendues par Java 8 et, dans ce cas de figure, peu despoir que le sujet ait
encore un grand intrt.
Conscients des possibilits offertes par ce nouveau style de dveloppement et prts relever le challenge, les dveloppeurs des diffrentes
quipes taient dj trs motivs lide de basculer vers Java 8. Ce ne
sont pas les comptences qui manquent chez VSCT mais ce projet de
migration ne remportait pas ladhsion du Management, pour les raisons
cites prcdemment. Le hackathon reprsentait cependant une belle
opportunit pour exprimenter cette ide et obtenirun premier rsultat qui
apporterait une meilleure visibilit quant la priorisation de ce chantier de
migration.
Dans le cadre de ce hackaton, nous avons opt pour le droulement des
tapes suivantes:
a Constitution de lquipe ;
a Prparation de lenvironnement de travail ;
a Transformation du code en Java 8 ;
a Excution des tests unitaires ISOsans Java 8 ;
a Tests de performance.
58
Une fois les rles dfinis et les classes identifies, nous avons dbut la
phase de migration :
a Prparation des environnements de travail: mise en place des projets
en local + compilation Java 8 + configuration de lIDE+ cration des projets sur Git [dure: 2H30] ;
a Prsentation de Java 8 axe autour des grandes nouveauts et des best
practices prendre en compte[dure: 1H30] ;
a Dbut du dveloppement: jai ddi 70% de mon temps au dveloppement et 30% au support des autres membres de lquipe. Chaque classe
redveloppe nest considre finie que si le Code Design est respect
(viter les Foreach au maximum) et que les rsultats des tests unitaires sont ISO code sans les expressions Lambda [dure: 1 jour] ;
a Pour assurer la qualit du code dvelopp, nous avons utilis les plugins
Exemple 1
public List<FrequentTravellerCardTypeEnum> getFrequentTravellerAdvantage() {
final List<ProgrammeDeFidelite> fids = getProgrammesDeFidelite();
/* Ancien Code
final List<FrequentTravellerCardTypeEnum> result = new
ArrayList<FrequentTraveller
CardTypeEnum>(fids.size());
for (final ProgrammeDeFidelite f : fids) {
final Integer id = Integer.valueOf(f.getCode());
if (FrequentTravellerCardTypeEnum.getById(id) != null) {
result.add(FrequentTravellerCardTypeEnum.getById(id));
} else {
logCarteInconnu(f)
}
}
return result;
*/
// nouveau code Java8
// 20 mn
return fids.stream()
.mapToInt(fid -> Integer.valueOf(fid.getCode()))
.mapToObj(FrequentTravellerCardTypeEnum::getById)
.peek(e-> {
if (e.getCode()) logCarteInconnu(e);
})
.filter(e -> e != null);
}
Exemple 2
/* Ancien code
59
carte.getCreationDate()))) {
carteARendrePrincipale = carte;
} */
// java8 20 mn
PaymentCard carteARendrePrincipale = lesCartesDePaiement.stream()
.filter(carte-> !carte.isExpired() && !carte.isDefault())
.min(Comparator.comparing(carte->carte.getCreationDate().getTime()))
.orElse(null);
Exemple 3
NB: Nous avons configur un comportement du StressTest reprsentatif de la charge de production, ce qui consiste injecter un grand nombre ditrations en parallle et non de gros volumes
de donnes.
commands.get(j).rollback(context);
}
return context.getStatus();
}
}
return context.getStatus();
}*/
/*------------------------------------------Java8--------------------------------------------Nous avons pass 1h30 sur cette mthode
Difficult de transformer les boucles imbriques avec les expressions Lambda sans passer
par Foreach
----------------------------------------------------------------------------------------------*/
public ReturnEnumeratedType executeJava8(final IContext vscContext, final FinalizationService
ValueObject vo, final boolean moduleDisabled) {
final CommandContext context = createContext(vscContext, vo, moduleDisabled);
Rsultats et interprtation
Nous avons russi migrer la totalit des classes simples avec une moyenne de 29 minutes par service, y compris les tests unitaires qui vont avec.
> Cest un rsultat encourageant pour une quipe compose des
niveaux mixtes. Le partage de connaissances et laccompagnement des
autres membres semblent avoir t efficaces.
Fig.3
Fig.2
Comme vous pouvez le constater, les performances du code Java8 sont deux fois
meilleures sur ce StressTest .
60
Contrairement la premire illustration, sur ce test le code Java8 est deux fois
moins performant. Conclusion : le code est revoir !
Fig.4
Fig.5
Fig.6
Conclusion
61
1ere partie
62
Le matriel
a 1 Raspberry Pi (facultatif)
Et enfin, le matriel pour la prise de vue :
a 1 Nacelle (Gimbal) (environ 80 euros)
a 1 Camra type GoPro
Un chassis :
et si on jouait au Tarot?
exprimes en pouces (). Le moteur que jai choisi ayant un fort couple, mon choix dhlice se portera vers des hlices de 13 ou 14 de longueurs
avec un pas de 4,5 ou 5. Une grande longueur
associe un pas important permettent davoir
une grande portance mme faible vitesse, ce
qui devrait, en associant cette configuration
mes moteurs, produire leffet escompt : dcoller! Il ne faudra pas oublier de vrifier lors de
lachat de ces lments, s'ils sont compatibles
entre eux. J'entends par l que pour quune hlice puisse se monter sur un moteur, il faut vrifier
que ladaptateur existe. Et vous devrez prendre
en compte que pour un multicopter, vous allez
avoir besoin dhlices conues pour tourner dans
le sens des aiguilles dune montre et dautres
dans le sens inverse. En effet si toutes vos
hlices tournent dans le mme sens, votre drone
a de grandes chances de tourner sur lui mme et
de devenir incontrlable!
63
2e partie
Gestion du moteur
SPCIFIQUE CHROME
64
Toute linteraction avec lArduino se fait directement via le port srie. Mais il faut pour cela passer par des tapes cls :
a Rcuprer les appareils connects sur les
ports srie chrome.serial.getDevices;
a Une fois un appareil trouv, on sy connecte chrome.serial.connect.
Dans notre exemple, on veille ce quil ny ait quun appareil de connect au moment du lancement de lapplication;
a Lire le port srie chrome.serial.onReceive.
function initArduino() {
chrome.serial.getDevices(function(ports) {
if (ports && ports.length == 1) {
chrome.serial.connect(ports[0].path,
onOpenArduino);
}
}
);
}
function onOpenArduino(openInfo) {
connectionId = openInfo.connectionId;
console.log("connectionId: " + connectionId);
if (connectionId == - 1) {
console.log('Could not open');
return;
}
console.log('Connected');
chrome.serial.onReceive.addListener(onReadArduino);
}
function convertArrayBufferToString(buf) {
return String.fromCharCode.apply(null,
new Uint8Array(buf));
}
function onReadArduino(readInfo) {
if (readInfo.connectionId == connectionId && readInfo.data) {
var str = convertArrayBufferToString(readInfo.data);
if (str.charAt(str.length - 1) === '\n') {
value += str.substring(0,
str.length - 1);
if (regExp.test(value)) // Light on and off
{
var distanceTmp = + regExp.exec(value)[1];
if (distanceTmp < ConstSAS.DISTANCE_MAX && Math.abs(distance - distanceTmp) < (Const
SAS.DISTANCE_MAX * 1.5) ) {
AppSAS.setDistance(distanceTmp);
}
distance = distanceTmp;
}
value = "";
}
else {
value += str;
}
}
}
Il faut noter une petite particularit lors de la lecture : nous lisons le port
srie et nous attendons une chane de caractres. Aussi, il est important de
penser convertir les donnes issues du port srie en donnes exploitables sous forme de chane de caractres.
Dplacement du dcor
Laffichage du rameur
Afin de restituer au mieux les gestes effectus par le joueur, il a fallu rflchir une faon dafficher la bonne image de rameur, en fonction de sa
position sur le rameur. La rponse tait relativement simple : il suffit de
connatre chaque instant la position du joueur sur le rameur et sa direction, puis dappliquer la bonne image Fig.1.
function indexToUse(direction, distance) {
var arrayToUse = direction >= 0 ? mappingPositonRameurFront : mappingPositonRameurBack;
for (var i = 0; i < arrayToUse.length; i++) {
var minMax = arrayToUse[i];
if (distance > minMax.min && distance <= minMax.max) {
return minMax.indexSprite + AppSAS.getSuffix();
}
}
return mappingPositonRameurBack[0].indexSprite + AppSAS.getSuffix();
}
// Affiche le bon sprite du bateau
function paintBoat() {
//var ratio = 0.05;
var image = AppSAS.ui.resources.images[AppSAS.gameModel.indexSprite];
AppSAS.ui.context.shadowOffsetX = 0;
AppSAS.ui.context.shadowOffsetY = 0;
AppSAS.ui.context.shadowBlur = 0;
AppSAS.ui.context.drawImage(image , 0 //sx clipping de l'image originale
, 0 //sy clipping de l'image originale
, image.width // swidth clipping de l'image originale
, image.height // sheight clipping de l'image originale
, (AppSAS.ui.canvas.width / 2) - ((image.width * AppSAS.ui.ratio) / 2) // x Coordonnes dans le dessin
du AppSAS.ui.canvas
, (AppSAS.ui.canvas.height / 2) - ((image.height * AppSAS.ui.ratio) / 2) + 100// y Coordonnes dans
le dessin du AppSAS.ui.canvas
, image.width * AppSAS.ui.ratio // width taille du dessin
, image.height * AppSAS.ui.ratio // height taille du dessin
)}
De cette manire nous affichons toujours la bonne image. Puis, afin de faciliter le dplacement du bateau, il a t considr quil tait en position fixe
sur lcran et que lillusion du dplacement se fait uniquement travers le
dplacement du dcor.
Gestion du ghost
Fig.1
Programmez! a Janvier 2016
65
pour donner lillusion que le dessin du ghost parte vers le haut de lcran.
// Affiche le bon sprite du bateau du mode Ghost
function paintGhost() {
//var ratio = 0.05;
var image = AppSAS.ui.resources.images[AppSAS.gameModel.indexSpriteGhost];
...
// Le fantme doit tre dessin l o il est au niveau de sa distance globale par rapport au bateau actuel
// => On affiche l o est son delta en distance par rapport bateau actuel
var stateGhost = AppSAS.gameModel.ghost[AppSAS.gameModel.step];
var deltaGhost = AppSAS.gameModel.distanceSkiff - stateGhost.distanceSkiff;
// On doit tronquer le ghost s'il dpasse de l'cran
var yGhost = (AppSAS.ui.canvas.height / 2) - ((image.height * AppSAS.ui.ratio) / 2) + 100 + (deltaGhost *
ConstSAS.FACTOR_GHOST);
var heightSpriteGhost = image.height;
if (yGhost < 0) {
heightSpriteGhost = image.height + yGhost;
yGhost = 0;
}
AppSAS.ui.context.drawImage(image , 0 //sx clipping de l'image originale
, image.height - heightSpriteGhost //sy clipping de l'image originale
, image.width // swidth clipping de l'image originale
, heightSpriteGhost // sheight clipping de l'image originale
, (AppSAS.ui.canvas.width / 2) - ((image.width * AppSAS.ui.ratio) / 2) // x Coordonnes dans le dessin
du AppSAS.ui.canvas
, yGhost // y Coordonnes dans le dessin du AppSAS.ui.canvas , image.width * AppSAS.ui.ratio // width
taille du dessin
, heightSpriteGhost * AppSAS.ui.ratio // height taille du dessin
);
...
}
Ces 2 crans sont diffrents car on y affiche non pas une animation, mais
du texte Fig.2.
Ecran de Login
Ecran de scores
Pour sauvegarder les donnes dune partie lautre, ou mme dun dmarrage dapplication lautre. Jai fait le choix le plus simple : le LocalStorage. Le seul hic avec le LocalStorage et les ChromeApps, cest que lAPI
telle quelle est disponible en html5 nexiste pas sur une ChromeApp. En
effet, lapi localStorage tant syncrhone, Google a prfr mettre en place
une solution asyncrhone : https://developer.chrome.com/apps/storage. Jai
donc mis en place la solution de Google et jen ai profit pour prvoir une
api uniforme entre localstorage & chrome.storage au cas o vous partiriez
sur une solution native html5.
Placer lArduino
ANNEXES
Fig.2
PROGRAMMEZ!
sur une cl USB (depuis le n100).
Fig.3
29,90 *
Cl USB 2 Go.
Photo non
contractuelle.
Test sur Linux,
OS X,
Windows. Les
magazines sont au
format PDF.
Un peu de thorie
67
Place la pratique
Fig.2
La thorie autour des Profils Java 8 assimile, les dveloppeurs ont besoin
doutils pour pouvoir dvelopper des applications sappuyant dessus. En
effet, il est difficile de se rappeler quelle API se trouve dans quel Profil
Compact. Pour aider les dveloppeurs tirer partie des profils et favoriser
au mieux leur adoption, Java 8 met disposition 1 outil en ligne de commande spcifique nomm jdeps et rajoute des options ddies au compilateur javac. A la compilation dun programme il est dsormais possible
dutiliser loption -profile afin de spcifier au compilateur de gnrer une
erreur si le programme utilise des classes dun profil suprieur. Ici, on peut
prciser que notre programme MyProg se limite utiliser le profil compact1:
javac -profile compact1 MyProg.java
Contenu des Profils
Nouvellement ajout avec Java 8, jdeps est un outil danalyse statique qui
ralise une analyse des dpendances dune classe spcifique ou dun
fichier JAR. Outre le fait quil permet de connatre les dpendances en
regard dun profil, loutil se rvle galement trs utile avec son option profile (ou son raccourci -P) indiquant de quel profil dpendent des packages.
Nous pouvons par exemple analyser les dpendances de lIHM de dmo
Notepad.jar inclus avec le JDK:
$ jdeps demo/jfc/Notepad/Notepad.jar
demo/jfc/Notepad/Notepad.jar -> /usr/java/jre/lib/rt.jar
<unnamed> (Notepad.jar)
-> java.awt
-> java.awt.event
-> java.beans
-> java.io
-> java.lang
-> java.net
-> java.util
-> java.util
compact1
-> java.util.logging compact1
-> javax.swing
Full JRE
Lutilitaire jdeps prend un grand nombre de paramtres en entre lui permettant dtre souple et de sadapter un grand nombre de cas dutilisations. Les dveloppeurs dsireux dutiliser les profils Compact ne pourront
rapidement plus sen passer.
Pour terminer un mot sur le support par les IDE de ces outils tournant
autour des profils de Java 8. Dvelopp par Oracle, lIDE NetBeans en version 8.0 supporte fort logiquement un large ventail des nouvelles fonctionnalits de Java 8. Ainsi, les profils Compact ne font pas exception la
rgle. Lors de la configuration dun projet, lIDE permet de slectionner en
regard de quel profil il devra tre compil. Il devient alors plus facile de
cibler un profil en particulier et de vrifier les classes ayant des dpendances non souhaites vers dautres profils. Bien entendu, il reste possible
de slectionner une compilation standard en ciblant un JRE complet. Un
support du mme type est planifi dans les futures releases des outils Java
pour Eclipse.
Conclusion
indispensables.
et confrences.
1re partie
Les trois premires parties expliquent comment prendre en main les cartes
Arduino Yn, Intel Edison et Raspberry Pi, avec Node.js et un peu de Bluetooth. Ensuite un premier DIY pour s'approprier la sortie vido du Raspberry
Pi 2. Suivi d'une initiation au mappage Bluetooth l'aide d'un bracelet Myo.
Pour terminer un DIY pour crer des modules multi-room pour enceintes
avec tlcommandes l'aide d'un Raspberry Pi 2 et d'un Arduino Yn.
Mise en route
Pour exploiter au mieux le Yn, il est ncessaire de faire quelques manipulations pour tendre l'espace disque et la mmoire vive. En effet le Yn ne
dispose que de 16 Mb de mmoire flash et 64 Mb (DDR2) de mmoire vive.
Prrequis
a
a
a
a
Trouver le port du Yn
Une fois le Yn connect en USB l'ordinateur, il faut ouvrir le "Gestionnaire de priphriques", et se rendre sur la section "Ports (COM et LPT)". Vous
devriez voir une entre : "Arduino Yun COMX" o X est le port du Yun.
OpenWrt upgrade
Dans le logiciel Arduino, il faut choisir l'Arduino Yn ainsi que le port correspondant.
a Outils > Type de carte > Arduino Yn
a Outils > Port > COMX (Arduino Yn)
Ensuite il faut charger l'exemple YunSerialTerminal sur le Yun pour viter
les conflits.
a Fichier > Exemples > Bridge > Yn Serial Terminal
Puis tlverser :
a Croquis > Tlverser
Pour la suite il suffit de copier l'image de OpenWrt la racine de la micro-sd
et redmarrer le Yn. Pour upgrader le Yn il suffit de se connecter via WiFi
l'Arduino pour accder l'interface Web du Yn : http://arduino.local (mot
de passe par defaut : "arduino"). Une fois entre sur l'interface, une option
upgrade (reset) apparat ! Le processus dure environ 3 minutes. Une fois
termine, la led WLAN arrte de clignoter.
Crer le Swap
Ici nous crons un swap de 512 Mo que Linino pourra utiliser en cas de
dpassement de la mmoire vive.
mkdir swap
dd if=/dev/zero of=/swap/yunswapfile bs=1M count=512
Programmez! a Janvier 2016
69
mkswap /swap/yunswapfile
swapon /swap/yunswapfile
Cylon.js
Le paquet Cylon.js permet de dialoguer en Javascript avec les composants de l'Arduino. Crer un dossier pour y installer cylon.js
},
devices: {
led: { driver: 'led', pin: 4 },
button: { driver: 'button', pin: 3 }
},
work: function(my) {
my.button.on('push', function() {
my.led.toggle()
});
}
}).start();
La mise en route de l'Edison est beaucoup plus aise, car Intel l'a mise
disposition l'adresse suivante :
https://software.intel.com/fr-fr/articles/assemble-intel-edison-on-the-arduino-board
70
Node.js
Dj prsent avec la mise jour, il ne vous reste plus qu' utiliser npm pour
installer vos paquets. Aucune action spciale n'est donc requise !
Le Raspberry Pi est une "single-board computer" dote entre autres d'une sortie video Full HDMI. Si cet ordinateur de poche permet la mobilit, il faut cependant faire attention la consommation gnre par la gestion de l'affichage.
Pr-requis
Une fois Raspbian installe, vous devez alors explorer la carte Micro-SD
pour vous rendre dans le dossier de configuration nomm etc
Pour accder au fichier du Raspberry, on peux utiliser le SFTP (SSH over FTP)
avec la mme configuration et un client SFTP (tel WinSCP sous Windows).
Installer Node.js
Petit plus
71
MEAN.IO (4/4)
Voici notre dernier article de la srie consacre MEAN.IO, aprs la prsentation gnrale du
framework lors du premier, et celles des concepts permettant de crer un nouveau module
dans le second, nous nous sommes attards sur un cas d'application concret : celui de la
visualisation de donnes gographiques. Depuis le dpart, nous souhaitons en effet crer une
application permettant de visualiser un ou plusieurs itinraires GPS (type randonne VTT ou
pdestre). Nous avons dfini prcdemment le modle de donnes permettant de stocker
l'information en base, ainsi que l'API REST permettant de le manipuler. Ensuite, nous avons cr
une partie cliente incluant des interfaces homme-machine (IHM) pour la prsentation et l'dition
de ces donnes. Il ne nous restait qu' ingrer et visualiser nos chemins sous formes de cartes
la faon de "Google Maps" (objet du prcdent article) ou de vues 3D la faon de "Google
Earth" (objet du prsent article).
Luc CLAUSTRES
Consultant indpendant
Crateur dApplications Numriques
http://www.digital-innovation.fr
Aux routes ct front-end, qui sont gres via l'AngularUI Router, nous en
ajoutons une nouvelle dans le fichier ApplicationRoutes.js du dossier
routes de la partie publique; il s'agit de la dclaration permettant d'accder la page pour afficher la vue 3D d'un chemin :
// Page permettant de voir un chemin sur la carte
$stateProvider.state('track globe', {
url: '/track/:trackId/globe',
templateUrl: '/application/views/TrackGlobe.html',
controller: 'TrackGlobeController',
resolve: {
loggedin: function(MeanUser) {
return MeanUser.checkLoggedin();
}
}
});
Pour la prsentation des chemins (sous forme de liste ou sous forme unitaire) nous avions utilis prcdemment despanels Bootstrap. L'en-tte (classe CSSpanel-heading) contenait notamment les actions ralisables par l'utilisateur (e.g. diter ou effacer) sous forme d'icnes, auxquelles nous rajoutons la possibilit d'ouvrir la vue 3D (Fig.1) dans public/views/Track.html :
<!-- Actions associs au chemin (effacer, diter, vue 3D et vue carte) -->
<a data-ng-click="remove(track)"><i class="pull-right glyphicon glyphicon-trash"
> </i></a>
<a href="/track/{{track._id}}/edit"><i class="pull-right glyphicon glyphicon-edit"
> </i></a>
<a href="/track/{{track._id}}/globe"><i class="pull-right glyphicon glyphicon-globe"
> </i></a>
</div>
mais j'ai choisi d'utiliserCesium pour sa large communaut et sa simplicit (en version 1.5 lors du codage). Pour ce faire il faut rajouter "cesium":
"1.5" dans le fichierbower.json la racine de votre dossier applicatif et excuterbower install. Ensuite il faudra vous rendre dans le dossier d'installation
et excuterant pour gnrer la version minifie des sources. Ensuite il faut
modifier le app.js du module applicatif pour rajouter les fichiers ncessaires l'agrgation (voir article prcdent) :
Application.aggregateAsset('css', '../../../../../../bower_components/cesium/Build/Cesium
Unminified/Widgets/widgets.css');
Application.aggregateAsset('js', '../../../../../../bower_components/cesium/Build/Cesium
Unminified/Cesium.js', {weight: -1});
Services
Cesium tant une librairie JavaScript "standard" je l'ai tout d'abord encapsule dans un service afin de pouvoir l'injecter dans d'autres composants
AngularJS. Ceci permet de conserver une injection de dpendance la
mode AngularJS sans accder de faon directe un objet global :
// Service utilis pour accder la librairie Cesium via l'injection de dpendances
angular.module('mean.application').factory('Cesium', [ function() {
return window.Cesium; // Assume que la librairie est dj charge dans la page
}
]);
Ensuite, j'ai cr un service ddi la cration du chemin suivi en 3D. En
effet, pour reprsenter une animation 3D, Cesium se base sur un format
interne nommCZML qu'il nous faudra donc gnrer. De plus, il faut pouvoir
convertir le chemin depuis le systme godsique utilis par le GPS vers un
repre 3D utilis par Cesium; en prambule je vous propose de dcouvrir
ces diffrents systmes de coordonnes qui devront tre manipuls (Fig.2).
Systmes de coordonnes
Afin de positionner un objet sur la Terre il est ncessaire de lui attribuer des
coordonnes dans un repre li la Terre. Un tel repre doit donc tre dfini, et le cas chant complt d'une reprsentation de la Terre, pour
VUE 3D
Fig.1
Ajout dans la vue listant les chemins les actions d'accs la vue cartographique ou 3D
72
Gnration du chemin en 3D
Fig.2
// L'animation 3D est dfinie sous la forme d'une liste de temps/position
for (var i = 0; i < waypoints.length / 3; i++) {
var position = new Cesium.Cartesian3(cartesianRoute[3*i], cartesianRoute[3*i+1],
cartesianRoute[3*i+2]);
Systme de coordonnes cartsiennes Earth-Centered Earth-Fixed (ECEF) avec son plan tangent local ( gauche),
systme de coordonnes godsique ( droite) et diffrence entre ellipsode ( gauche) et gode ( droite)
if ( Cesium.defined( previousPosition ) )
{
var distance = Cesium.Cartesian3.distance(previousPosition, position);
// Calcul du pas de temps, on considre une vitesse de 90 km/h soit environ 25 m/s
timeStep += distance / 25;
Programmez! a Janvier 2016
73
}
// Pas de temps
builtInCzml[2].position.cartesian[4*i] = timeStep;
// Position
builtInCzml[2].position.cartesian[4*i+1] = position.x;
builtInCzml[2].position.cartesian[4*i+2] = position.y;
builtInCzml[2].position.cartesian[4*i+3] = position.z;
previousPosition = position;
}
// Calcul de la date et l'heure de fin
var end = new Cesium.JulianDate();
Cesium.JulianDate.addSeconds(epoch, timeStep, end);
var timeInterval = new Cesium.TimeInterval({
start : epoch,
stop : end,
isStartTimeIncluded : true,
isStopTimeIncluded : true
});
builtInCzml[2].position.epoch = epoch.toString();
builtInCzml[2].availability = timeInterval.toString();
return builtInCzml;
};
Directive
74
}
}
}]);
Contrleur
}
// Recherche l'entit dans le contenu 3D
var getTrackedEntity = function() {
if (Cesium.defined($scope.lookAt)) {
$scope.trackedEntity = $scope.viewer.dataSources.get(0).entities.getById($scope.lookAt);
if (Cesium.defined($scope.trackedEntity)) {
// Vitesse de dfilement par dfaut
$scope.viewer.clock.multiplier = 1;
// Rcuprer l'icne reprsentant l'entit
$scope.trackedEntityIcon = $scope.viewer.dataSources.get(0).entities.getById($scope.
lookAt + 'Icon');
}
}
}
// Charger l'objet source au format Czml
// L'argument lookAt est le nom de l'entit suivre dans les donnes source
var loadSource = function(source, lookAt) {
$scope.lookAt = lookAt;
// Chargement de l'animation 3D
var dataSource = new Cesium.CzmlDataSource();
dataSource.load(source, 'Built-in CZML');
$scope.viewer.dataSources.add(dataSource);
// Rcupration de l'entit suivant le chemin
getTrackedEntity();
// Positionnement du callback appel chaque pas d'excution de l'animation
$scope.viewer.clock.onTick.addEventListener(function(clock) {
if ( Cesium.defined($scope.trackedEntity) ) {
// Rcupration de la position courante
var cartographicPosition = new Cesium.Cartographic();
var position = $scope.trackedEntity.position.getValue(clock.currentTime);
Cesium.Ellipsoid.WGS84.cartesianToCartographic(position, cartographicPosition);
// Calcul de la position projete au sol
var groundPosition = clampToGround(position);
if ( Cesium.defined(groundPosition) ) {
// Mise jour de la position 3D en consquence
position = groundPosition;
Cesium.Ellipsoid.WGS84.cartesianToCartographic(groundPosition, cartographicPosition);
// Et positionnement de l'icne
if ( Cesium.defined($scope.trackedEntityIcon) ) {
$scope.trackedEntityIcon.position = new Cesium.ConstantPositionProperty(ground
Position, Cesium.ReferenceFrame.FIXED);
var text = cartographicPosition.height.toFixed() + ' m';
$scope.trackedEntityIcon._label._text = new Cesium.ConstantProperty(text);
}
}
}
});
}
//Rcupre un chemin via son ID
$scope.findOne = function() {
TrackService.get({
trackId: $stateParams.trackId
}, function(track) {
$scope.track = track;
// Position par dfaut de la camra
$scope.viewer.scene.camera.lookAt(
new Cesium.Cartesian3(-1500.0, -1500.0, 500.0),
Cesium.Cartesian3.ZERO,
Cesium.Cartesian3.UNIT_Z);
loadSource( TrackGenerator.generateCzml($scope.track.waypoints), "Vehicle");
});
};
}
]);
Vue
La vue est la partie la plus simple car elle se contente d'instancier la directive et de requter le chemin en faisant appel au contrleur :
<div data-ng-init="findOne()">
<!-- Ajout d'un globe 3D -->
<cesium/>
</div>
Fig.4
CONCLUSION
Cet article a t l'occasion de dcouvrir le domaine de la cartographie 3D
et d'approfondir nouveau votre connaissance du framework MEAN.io en
le mettant en pratique sur un cas concret dutilisation via lintgration de
librairies externes. Jespre que vous serez maintenant prts faire vos
armes en dveloppant vos propres modules ou applications. Accs au
code complet de larticle sur https://github.com/claustres/meanio-tutorial-3. u
Fig.4
Fig.3
Lancer de rayon pour calculer la position sur le terrain 3D (point vert) partir de la position
gographique sur l'ellipsode (point rouge)
Vue 3D anime d'un chemin o le marqueur suit le parcours, grce la barre "magntoscope" en
bas il est possible d'acclrer ou de se dplacer dans le temps
Programmez! a Janvier 2016
75
2e partie
On va mettre laccent sur les tapes suivre pour aboutir une bonne architecture, solide, robuste et
maintenable. Pour commencer, on va voir comment bien choisir les technologies. Ensuite on va
examiner larchitecture en tudiant les diffrents outils utiliser dans un projet. Puis on va voir les
techniques et les stratgies mettre en place pour bien dvelopper. Enfin on va voir comment
maintenir le code travers les tests unitaires et les tests dintgrit.
Bouhanef Hamdi
Dveloppeur full-stack chez sfeir
https://fr.linkedin.com/in/bouhanefhamdi-62386051
Dridi Manel
Freelance web
https://www.linkedin.com/in/manel-dridiep-bouhanef-908316105
Intgration continue
Livraison continue
Le but ici est davoir une version pour la production ou pour la recette,
toute version de l'intgration continue peut tre livre. De mme cette
livraison dpend des environnements, des sprints, si en mode agile...
Dploiement continu
Apache Continuum
Jenkins (Hudson)
Cet outil vrifie la qualit du code, les codes morts, les imbrications trop
compliques...
CheckStyle
Il permet de vrifier le style du code crit sil est conforme ou pas. Par
exemple il vrifie les commentaires, Convention de nommage...
Sonar
Cet outil contient tous les outils cits plus haut (FindBugs, PMD et
Checkstyle). Il offre une interface conviviale pour visualiser la qualit du
code, et un reporting par projet, par package...
Ici il ny a quun seul dpt de version, cest--dire quil n'y a quun seul
serveur qui gre le versioning. Exemple SVN, CVS...
Gradle (Java)
Gradle a runi les avantages de Maven et de Ant sauf que ses fichiers de
configuration ne sont pas en XML.
Grunt (JavaScript)
Bower (JavaScript)
Sans doute loutil le plus utilis, cet outil est trs puissant, il gre la
plupart des systmes de gestion de versioning, il gre aussi les tests
avec plusieurs outils et il s'intgre aussi facilement avec Sonar...
Vrification du code
Les versions
FindBugs
Cet outil permet de chercher les bugs ventuels qui peuvent tre levs l'excution.
76
PMD
Les branches
Les branches sont, comme leur nom lindique, des drives de la branche
principale. Par exemple supposons quon ait une application standard de
gestion de parc automobile. On va dvelopper une version spcifique
pour un client, donc on cre une nouvelle branche pour y dvelopper
lapplication pour le client sans pour autant toucher la version standard.
En dautres termes, comme si on avait cr un nouveau dpt, sauf que
lorigine de ce dpt est une version prcise de la branche principale.
Environnement de dveloppement
Environnement de recette
Environnement de production
DVELOPPEMENT
Dans cette partie on va voir plus en dtail les outils et les bonnes
pratiques de dveloppement. Au dbut on va explorer les diffrents IDE
et la diffrence entre elles. Ensuite on va analyser les bonnes pratiques
mettre en uvre pour aboutir une bonne architecture logicielle.
Les IDE
Analyseur de code
Fig.1
Coloration de code
LIDE permet de colorer le code suivant les mots cls du langage pour
quil soit plus visible.
Autres fonctionnalits
Un projet peut vite devenir un calvaire si on ne suit pas les bonnes pratiques
de dveloppement et darchitecture. On va voir ici quelques techniques qui
permettent davoir une architecture modulaire et maintenable. On va prendre
comme exemple une application de gestion htelire n-tiers :
La partie front
Pour cet exemple on va prendre comme architecture HTML + AJAX, mais ce quon
va voir ici est applicable pour toutes les architectures front de type HTML + Ajax :
a Minimiser les appels serveur : Pour chaque appel serveur, on passe
par plusieurs couches, la communication passe par le protocole HTTP
qui va prendre un peu de temps pour envelopper le message, puis on
va passer par certaines couches rseau (Exemple les couches du
modle OSI), ensuite, passage dans le rseau et rcupration du
message de lautre ct. On ne le remarque pas pour des
communications non rcurrentes, mais si on fait plusieurs
communications avec le serveur et quon va chaque fois yvhiculer
des donnes qui seront divises en trames Cela sera trs vite
coteux. Donc, on doit essayer de tout ramener dans une seule
requte. Par exemple si on veut afficher un affichage gnral dun
htel, et que l'on sait que lutilisateur va utiliser la vue dtaille, on
peut la ramener une seule fois. Mais il ne faut pas tomber dans
lerreur de l'excs dinformations.
a Moduler le front : Crer dans le front plusieurs modules, pour la
rutilisation et la maintenabilit. Par exemple crer un module service
(REST), qui, lui, sera la seule interface pour communiquer avec le
rseau. On peut crer un module dutilitaire, o on runit toutes les
fonctionnalits utilitaires comme manipulation des dates, les RegEx...
Programmez! a Dcembre 2015
77
La partie back-end
Le couplage est le lien entre deux units du projet. Deux classes qui
dpendent lune de lautre sont fortement couples; ce lien doit tre le plus
faible possible pour que, si on doit changer le fonctionnement dune
classe, on nait pas changer la deuxime. La cohsion fait rfrence au
nombre et la diversit des tches dont une unit est responsable, cette
cohsion devrait tre la plus forte possible, pour permettre la rutilisabilit
de la classe et avoir une homognit dans le fonctionnement de la classe.
BIEN TESTER
Lune des tapes principales dune architecture, cest de mettre en place un bon
mcanisme de test. Ce dernier nous permet davoir une cohrence entre les
demandes et le programme. Il y a plusieurs types de tests, les plus importants sont :
Dummy
Cest le plus simple de tous, cest un objet pass au test mais jamais
utilis, en gnral on a besoin de passer un paramtre la mthode
tester mais on sait bien quil ne va pas tre utilis.
Fake
Stub
Mock
Spy
TestNG (Java)
Jasmin (JavaScript)
PhantomJS (JavaScript)
Cet outil est trs puissant, il peut tre utilis pour ouvrir des pages Web,
prendre des screenshots, excuter des actions de l'utilisateur...
Cobertura
Ce sont les tests de plus bas niveau, ces tests permettent de tester une
mthode, une classe ou une fonctionnalit unitaire. Ce qui nous
permettra de valider la performance et la qualit du composant test.
Emma
CONCLUSION
Ces tests valident l'intgrit des modules entre eux, et dans lenvironnement
final. Cela permettra de dtecter les erreurs dinterface entre les composants.
Ce sont les tests qui permettent de vrifier si la spcification et le code sont conformes.
78
Utilis dans Sonar, cet outil permet davoir des mtriques bien
synthtises pour la couverture du code.
2e partie
Body Index
}
_bitmapIntermediateBuffer.CopyTo(_bitmap.PixelBuffer);
_bitmap.Invalidate();
}
}
Sans oublier de mettre jour la mthode StopCurrentDemo pour librer les
ressources, voici un rendu pouvant tre gnr par lexemple actuel: Fig.1.
Le Body
Cette source permet au dveloppeur dobtenir prcisment les informations du corps ou squelette des utilisateurs traqus par la Kinect (Jusqu
un maximum de 6).
Les donnes de chaque utilisateur traqu sont agrges dans une instance
de la classe Body. De ces instances sont accessibles les coordonnes de
25 jointures, soit 25 points prcis sur le corps. Les 25 points du squelette
sont reprsents dans le schma suivant: Fig.2.
79
}
public double Width
{
get { return 40; }
}
public double Height
{
get { return Width; }
}
public JointType Type
{
get { return _type; }
set
{
if (Set(ref _type, value))
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Label"));
}
}
}
public string Label
{
get { return Type.ToString(); }
}
public bool IsTracked
{
get { return _isTracked; }
set
{
if (Set(ref _isTracked, value))
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("Visibility"));
}
}
}
public Visibility Visibility
{
get { return IsTracked ? Visibility.Visible : Visibility.Collapsed; }
}
public Color Color
{
get { return _color; }
set { Set(ref _color, value); }
}
public event PropertyChangedEventHandler PropertyChanged;
private bool Set<T>(ref T prop, T value, [CallerMemberName] string propertyName = null)
{
80
}
}
Ltape suivante consiste en louverture de la connexion avec la source de
donnes et en labonnement lvnement FrameArrived. Cest aussi
ltape idale pour initialiser quelques variables comme la liste des instances de Body, les Joints des 6 Body et la taille dune trame couleur.
var source = _sensor.BodyFrameSource;
_bodies = new Body[source.BodyCount]; // BodyCount == 6
var totalJointCount = source.BodyCount * JOINTS_PER_BODY;
_joints = new List<JointModel>(totalJointCount);
for (var i = 0; i < totalJointCount; i++)
_joints.Insert(i, new JointModel { IsTracked = false , Type = (JointType)(i % JOINTS_PER_BODY) });
SceneWidth = _sensor.ColorFrameSource.FrameDescription.Width;
SceneHeight = _sensor.ColorFrameSource.FrameDescription.Height;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(nameof(SceneWidth)));
PropertyChanged(this, new PropertyChangedEventArgs(nameof(SceneHeight)));
}
_bodyReader = source.OpenReader();
_bodyReader.FrameArrived += Reader_FrameArrived;
Pour fonctionner, ce code ncessite dimplmenter linterface INotifyPropertyChanged et de dclarer des champs et proprits:
public event PropertyChangedEventHandler PropertyChanged;
private const int JOINTS_PER_BODY = 25;
public double SceneWidth { get; set; }
public double SceneHeight { get; set; }
private List<JointModel> _joints;
public List<JointModels> Joints
{
get { return _joints; }
}
Le handler Reader_FrameArrived peut maintenant tre implment de
sorte itrer sur tous les body mis jour laide des mthodes de lAPI. En
effet, quel que soit le nombre dutilisateurs prsents devant le capteur,
lAPI travaille sur une collection de 6 Body et les met tous jour. Une proprit IsTracked permet ensuite de dterminer sil sagit dun Body associ
un utilisateur rellement dtect. Voici une faon de les traiter:
using (var frame = args.FrameReference.AcquireFrame())
{
if (frame == null) return;
frame.GetAndRefreshBodyData(_bodies);
var bodyCount = frame.BodyCount;
for (var i = 0; i < bodyCount; i++)
{
var body = _bodies[i];
//...
}
}
Dans la boucle for, il faut mettre jour les items de la collection _joints
selon ltat du Body correspondant. Si le Body nest pas dans ltat traqued (cest--dire si elles nappartiennent pas un utilisateur), il est possible de notifier lUI que les jointures correspondantes ne doivent pas tre
affiches.
if (!body.IsTracked)
{
for (var j = 0; j < JOINTS_PER_BODY; j++)
_joints[i * JOINTS_PER_BODY + j].IsTracked = false;
continue;
}
Dans le cas contraire, chaque Body permet dobtenir une collection de
jointures via la proprit Joints. Celle-ci tant un Dictionary index sur
lnumration JointType, on utilise cette dernire pour obtenir les coordonnes et informations de chaque jointure. Ces dernires tant exprimes
dans un espace en 3 dimensions et selon le point dorigine correspondant
la Kinect, il est ncessaire de faire appel au CoordinateMapper: un objet
ralisant les calculs ncessaires pour transposer des coordonnes dans le
rfrentiel des trames couleurs, entre autres.
var mapper = frame.BodyFrameSource.KinectSensor.CoordinateMapper;
for (var j = 0; j < JOINTS_PER_BODY; j++)
{
var bodyJoint = body.Joints[(JointType)j];
var uiJoint = _joints[i * JOINTS_PER_BODY + j];
uiJoint.IsTracked = bodyJoint.TrackingState != TrackingState.NotTracked;
if (uiJoint.IsTracked)
{
var pos = mapper.MapCameraPointToColorSpace(bodyJoint.Position);
uiJoint.X = pos.X;
uiJoint.Y = pos.Y;
}
}
En loccurrence, il sagit de la mthode MapCameraPointToColorSpace du
CoordinateMapper qui est utilise, ce qui permet dobtenir des coordonnes en adquation avec la trame couleur.
En effet, les composantes X et Y ainsi obtenues correspondent directement aux coordonnes dun pixel de cette trame. Cela permet entre autres
de superposer le rendu de ces deux sources et dobtenir une image parfaitement aligne. Une opration similaire peut tre ralise avec les sources
infrarouges, de profondeur, et BodyIndex avec la mthode MapCameraPointToDepthSpace.
Pour finir, le XAML de la vue doit tre modifi pour tenir compte de ces
changements. La liste des jointures avec leurs coordonnes tant une proprit de la page dans lexemple actuel, il est possible de les afficher trs
simplement en tirant parti du binding en commenant par nommer la page:
<Page x:Class="DemoKinect.WinRT.MainPage"
x:Name="Self"
Un ItemsControl avec dans une ViewBox permettra dafficher chaque jointure dans un Canvas, sans se soucier des coordonnes des jointures pouvant tre hors de lcran: la ViewBox se chargera de tout redimensionner.
<Viewbox Stretch="Uniform">
<ItemsControl ItemsSource="{Binding ElementName=Self, Path=Joints}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="{Binding ElementName=Self, Path=SceneWidth}"
Height="{Binding ElementName=Self, Path=SceneHeight}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Visibility="{Binding Visibility}">
<Ellipse Width="{Binding Width}"
Height="{Binding Height}"
VerticalAlignment="Top"
HorizontalAlignment="Left" />
<Ellipse.Fill>
<SolidColorBrush Color="{Binding Color}" />
</Ellipse.Fill>
</Ellipse>
<TextBlock Text="{Binding Label}"
Margin="30"/>
<Grid.RenderTransform>
<TranslateTransform X="{Binding X}"
Y="{Binding Y}" />
</Grid.RenderTransform>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Viewbox>
81
: 20;
}
}
Ensuite, au moment de dterminer les coordonnes de chaque jointure
(seconde boucle for du handler Reader_FrameArrived), un test sur la proprit Type aidant, il est possible de modifier la couleur de la jointure selon
le HandState:
if (uiJoint.IsTracked)
{
if (uiJoint.Type == JointType.HandLeft)
uiJoint.Color = HandStateToColor(body.HandLeftState);
if (uiJoint.Type == JointType.HandRight)
uiJoint.Color = HandStateToColor(body.HandRightState);
var pos = mapper.MapCameraPointToColorSpace(bodyJoint.Position);
uiJoint.X = pos.X - uiJoint.Width / 2;
uiJoint.Y = pos.Y - uiJoint.Height / 2;
}
La mthode HandStateToColor, pour finir, dtermine la couleur associe
chaque valeur de lnumration HandState:
return state == HandState.Closed
? Colors.Yellow
: state == HandState.Open
? Colors.Green
: state == HandState.Lasso
? Colors.Blue
: state == HandState.Unknown
? Colors.Gray
: Colors.Transparent;
Exemple de rendu effectu par-dessus le rendu de la camra couleur: Fig.3.
Cest bien videmment de la source Body dont le dveloppeur se servira la
plupart du temps pour effectuer le code mtier propre son application et
autoriser les interactions entre utilisateurs et applicatif. Nanmoins, ce dernier doit garder en tte que ce ne sont pas les seules possibilits du SDK.
En effet, la source Body permet priori de tout faire: reconnatre des
gestures, des postures, obtenir la position de lutilisateur ou une reprsentation de celui-ci dans lespace. Bref, un peu de code et quelques algorithmes bien implments peuvent sembler tre la solution tous les cas
de figure, mais, certains ne sy tromperont pas: cela demande parfois de
solides comptences en mathmatiques.
Cest pourquoi dautres articles venir traiteront de cas plus prcis comme
la mise en place du framework Touch-Less intgr au SDK, permettant
dutiliser la Kinect comme un dispositif de pointage de manire quasi transparente pour le dveloppeur et intuitive pour lutilisateur. Un autre outil,
Visual Gesture Builder, permet quant lui de mettre en place des scnarios
de reconnaissance de gestures mme complexes, pour bien moins defforts de la part du dveloppeur que si la dtection ne devait se baser que
sur du code maison.
u
Fig.1
Fig.2
Directeur de la publication
& rdacteur en chef : Franois Tonic
Fig.3
Contacts
Rdacteur en chef :
ftonic@programmez.com
Rdaction : redaction@programmez.com
Webmaster : webmaster@programmez.com
Publicit : pub@programmez.com
Evenements / agenda :
redaction@programmez.com
Dpt lgal : parution - Commission paritaire :
1215 K 78366 - ISSN : 1627-0908
NEFER-IT / Programmez, dcembre 2015
Toute reproduction intgrale ou partielle est
interdite sans accord des auteurs
et du directeur de la publication.
Le mag
m
magazine
gazine
g
d pros
des
p s de lIT
T
Mais aussi sur le web
!
ON 21
VERSIO
DISPONIBLE