Surveiller sa maison via son Smartphone sous Android
|
|
|
- Claude Dumais
- il y a 10 ans
- Total affichages :
Transcription
1 Rapport TER HLIN601 Licence Informatique Troisième année, effectué de Janvier à Avril 2015, encadré par Abdelhak-Djamel Seriai Surveiller sa maison via son Smartphone sous Android Rapport Travail réalisé par l équipe Abdoulaye DIALLO Quentin PHILIPPOT Jihen Fourati Redoine EL-OUASTI
2 2 Remerciements Nous remercions notre référent, M. Seriari, pour ses conseils avisés et pour l efficacité avec laquelle il nous a guidés tout au long du développement du projet. Nous tenons à remercier aussi toutes les personnes présentes lors de notre soutenance et plus particulièrement les membres du Jury. À propos du logo de l application, il s agit en réalité d un emprunt au séduisant logo de l équipe de Hockey Rapace.
3 3 Table des matières 1 Introduction 5 2 Contexte et Étude des systèmes existants Contexte Télésurveillance et vidéosurveillance Présence de télésurveillance Poste de surveillance Application mobile Système d exploitation mobile et Android L apport des applications mobiles Aperçu des systèmes existants L application Rapace Gestion du projet, Analyse et conception Cahier des charges Architecture Cas d utilisation Schéma Détail Diagramme de classes Diagramme de séquence Base de données Réalisation et implémentation Interface Homme Machine : Communication client - serveur Côté client Rapace Côté serveur Apache Mécanisme d alerte : Lecture streaming :
4 4 5 Intérêts de ce projet L enrichissement personnel Des compétences techniques Conclusion 22 7 Bibliographie 23 8 Annexe Mode d emploi Réception de l alerte L Authentification Affichage des sites Streaming Complément sur les communications Client-Serveur Pourquoi le package network? Les processus légers ou Thread Accès à la base de données Comment est encodée la réponse du serveur? Nativité d une application Envoyer un SMS à l émulateur Android Code source Utilisateur Site MessageHTTP MessagePOST Serveur SMSReceiver
5 5 1 Introduction Étudiants en troisième année de licence informatique, notre projet consiste à développer une application pour smartphone permettant de surveiller un lieu à distance. Par sa vocation à surveiller, notre travail s apparente à la télésurveillance, plus précisément à la vidéo-surveillance. Nous verrons quelles techniques sont associées à la "Télésurveillance". Autre domaine en lien avec notre projet, celui de la programmation mobile, qui consiste en la programmation de logiciels pour appareils mobiles. En mariant ces deux domaines, nous tâcherons d associer la performance de l un à la mobilité de l autre afin de proposer la meilleure expérience possible à l utilisateur. Pour répondre à ces objectifs, nous avons connu plusieurs phases (gestion de projet, analyse et conception, définition de l architecture, implémentation) durant lesquelles notre organisation évolua. Collégiale au début (conception et apprentissage d Android), notre organisation s est ensuite structurée : chacun se spécialisa dans un domaine (IHM pour Redoine, noyau l application cliente pour Abdoulaye et Jihen, serveur Rapace pour Quentin). Ce rapport est écrit de sorte à initier le lecteur aux problématiques rencontrées au cours du projet, et d apporter des explications concises aux solutions proposées. Nous approfondirons certains points en annexe. Pour commencer nous présenterons le contexte dans lequel se place notre projet et l étude des systèmes existants, lesquels guideront notre analyse durant la phase de conception. Nous détaillerons ensuite la réalisation et l implémentation. Enfin, nous porterons un regard sur l ensemble du projet et discuterons de son intérêt pour notre formation.
6 6 2 Contexte et Étude des systèmes existants Cette section a pour but d expliciter le contexte dans lequel notre projet s est déroulé. 2.1 Contexte 2.2 Télésurveillance et vidéosurveillance La télésurveillance désigne un ensemble de techniques utilisant des réseaux informatiques, dispositifs de capture et de traitement de l information. Son but est d assurer la surveillance d un lieu (entre autre) à distance. La vidéosurveillance est une branche active de la télésurveillance, reposant sur l usage de caméras de surveillances. Il s agit alors de garantir la protection d un lieu par l étude d images en provenance de ce dernier Présence de télésurveillance L évaluation du trafic routier (fréquentation, pollution, etc). Aide à la maintenance des machines (usure, disponibilité ressources, détection d erreur, etc). Surveillance de lieux sensibles (DBA, centres commerciaux) et moins sensibles (résidences privées) Poste de surveillance La télésurveillance force un individu à utiliser un poste de surveillance afin de visualiser les informations récoltées. La vidéosurveillance d un supermarché, par exemple, impose aux vigiles d être dans une pièce contenant des moniteurs pour voir les images obtenues grâce aux caméras. Dans le cas général, un utilisateur doit accéder à un poste de surveillance (moniteur, ordinateur, etc.) pour visualiser des informations.
7 7 2.3 Application mobile Il s agit d un logiciel applicatif pour appareil mobile. L avantage de ces applications est d apporter une plus grande liberté à son utilisateur. Ce dernier pouvant accéder à ses applications favorites, où qu il soit, simplement en allumant son appareil mobile. 2.4 Système d exploitation mobile et Android Il existe plusieurs systèmes d exploitations pour les appareils mobiles (smartphones, tablettes, etc). Android, ios et Windows Phone dominent le marché. Android se distingue des autres OS par la simplicité avec laquelle nous pouvons créer de nouvelles applications. Le choix de Java comme langage natif (voir annexe) libère les développeurs des contraintes liées à la gestion mémoire. De plus l interprétation de code Java par la machine virtuelle Android Runtime permet aux entreprises de créer rapidement des applications efficaces L apport des applications mobiles Ce qu apportent les applications mobiles à la télésurveillance, c est la capacité de transformer son appareil mobile en un véritable poste de surveillance, via des applications de télésurveillance.
8 8 2.5 Aperçu des systèmes existants Il existe sur le marché plusieurs solutions afin de transformer son mobile en poste de surveillance : icamspy (Android) : transforme son pc ou sa webcam en caméra de surveillance. Visualisation depuis son mobile. Détection de mouvements, mécanisme d alerte. (Version payante : enregistrement vidéo) AtHome (ios) : transforme une webcam en caméra de surveillance. Visualisation depuis son mobile. (Version payante : limite de webcams augmentée, enregistrement vidéo). PrynPocket (ios) : Enregistrement programmé. Visualisation depuis son mobile. Mécanisme d alerte. Contrôle du matériel à distance (etc.) Celles-ci exigent une préparation de la part de l utilisateur, (manipulation et/ou installation de logiciel/serveur pour icamspy et AtHome, achat de matériels de l entreprise pour PrynPocket). Un second type d application existe, ne nécessitant aucune installation, permettant uniquement de lire le flux vidéo à partir d une url (adresse diffusant le flux). Exemple d applications : IPCamViewer, IPWebcam L application Rapace Nous proposons une application nommée Rapace, appartenant à la première famille d applications présentées précédemment. Nous considérerons toutefois qu un utilisateur peut connecter autant de caméras qu il le souhaite, et ne ferons donc pas le hiatus application gratuite/payante.
9 9 3 Gestion du projet, Analyse et conception Cette section expose notre analyse du problème et la conception de l application Rapace. 3.1 Cahier des charges L application Rapace (client), devra implémenter les fonctionnalités suivantes : L authentification d un utilisateur enregistré. La présentation et l accès sécurisé aux informations relatives à un Site (nous nommerons ainsi un lieu placé sous surveillance) à un utilisateur autorisé. La lecture en streaming d une vidéo. D autres fonctionnalités pourront venir se greffer par la suite : Mécanisme d alerte avertissant en cas d intrusion (simulation logicielle). Possibilité de contacter directement la police sans quitter l application. Gérer le cas de fausses alertes depuis l application Rapace. 3.2 Architecture L architecture sera la suivante : l application cliente communiquera avec le serveur afin d interagir avec la base de données ou de récupérer un flux vidéo. Le serveur Rapace sera en réalité composé de deux serveurs : un serveur Apache pour les scripts PHP, et un serveur MySQL gérant nos données.
10 Cas d utilisation Schéma Détail L authentification : Après enregistrement d un utilisateur dans la base de données, ce dernier possède une adresse et un mot de passe qui régiront son authentification. Un message d erreur pourra être affiché dans les cas suivants :
11 11 Les données renseignées par le champ ne correspondent pas à une adresse . Les informations fournies ne permettent pas l authentification. Affichage d une liste de Sites : Cette activité permet la sélection d un site parmi une liste de sites surveillés. L IHM est dynamique, puisque l affichage diffère selon le nombre de sites surveillés et leur état d alerte (voir manuel en annexe). Chaque bouton correspond à un site. Une pression redirige l utilisateur vers la vidéo du site sélectionné. Surveiller ou Lecture d un flux vidéo : L activité lit un flux vidéo correspondant au site sélectionné. En cas d alerte, deux boutons apparaissent sous la vidéo permettant soit d appeler la police, soit de lever l alerte. Réception d une alerte : L activité affiche une alerte. Pour des raisons de sécurité, on donnera peu de détails sur la nature d une alerte (aucune information sur le site). Nous demandons à l utilisateur de s authentifier avant d obtenir plus d informations. Si l utilisateur égare son téléphone et reçoit une alerte, aucune donnée ne peut être lue par un tiers. 3.4 Diagramme de classes Notre conception utilise le patron MVC. On associe des contrôleurs à certains éléments graphiques comme suivant. Les classes Bouton_*_Listener sont des contrôleurs, Bouton ou Bouton_Site des éléments graphiques écoutés. Tous les contrôleurs (excepté Bouton_Site_Listener) sont en association avec l activité contenant l élément graphique). Les contrôleurs amorcent les transitions entre activités, et les interactions avec la classe métier (via la classe Serveur).
12 La classe Serveur est utilisée pour envoyer des messages à notre Serveur Rapace, sa structure est la suivante : (voir justification en annexe) 12
13 Diagramme de séquence Nous montrons ici comment nos contrôleurs gèrent les transitions : 3.6 Base de données Nous avons besoin d une base de données afin d authentifier un utilisateur, mémoriser des informations sur les utilisateurs, les sites, et les liens de surveillance. On décide qu un utilisateur peut surveiller un nombre illimité de sites, et qu un site peut être surveillé par un nombre illimité d utilisateurs,
14 14 mais qu un site ne dispose que d une seule caméra (champ url). Il vient le schéma entité-association suivant : Soient les relations : Utilisateur (id, nom, prenom, psswd, ) Site (id, nom, adresse, descriptif, url, en_alerte) Surveille (id_utilisateur, id_site)
15 15 4 Réalisation et implémentation Cette section présente la réalisation des fonctionnalités les plus importantes. 4.1 Interface Homme Machine : Les Activités sont des classes spéciales auxquelles est associé un fichier XML définissant une interface statique. On peut aussi définir l IHM en utilisant du code Java. Si d emblée cette pratique semble moins agréable qu une définition par XML, elle offre en revanche la possibilité de modifier de notre interface à la volée. C est ce que l on appelle une interface dynamique. L Activité Affichage_Liste_Site liste l ensemble des sites placés sous surveillance. Ce nombre étant variable, il est indispensable d utiliser une interface dynamique. Nous écrivons la partie statique dans le XML et la dynamique en Java, et reconstruisons cette partie chaque fois que l activité revient au premier plan ( callback : onresume() ). C est cette dynamicité qui permet de colorer un site en vert lorsque l état d alerte est faux (voir manuel en annexe), en rouge dans le cas contraire). Pour écrire une interface dynamique, notre solution est de laisser un <LinearLayout> identifié que l on manipulera dans le code Java. <!-- Fichier XML --> <LinearLayout android:id="@+id/content2... ></LinearLayout> // Fichier Java // Récupération Layout XML : LinearLayout content = (LinearLayout) findviewbyid(r.id.content2); // On le vide de son contenu : content.removeallviewsinlayout(); // Création d une vue : TextView no_site = new TextView(this); no_site.settext("vous ne surveillez actuellement aucun site."); LinearLayout.LayoutParams layoutparam = new LinearLayout.LayoutParams(/* paramètres layout );
16 16 // Insertion d une vue dans notre layout : content.addview(no_site, layoutparam); (voir code source en annexe pour d autres exemples.) 4.2 Communication client - serveur Pour gérer l authentification et déterminer les lieux qu un utilisateur place sous surveillance, on utilise une base de données. Dans notre cas, il s agit d un serveur MySQL couplé à l outil PhpMyAdmin ; ce sont des outils simples, et dont les performances suffisent largement. Voyons à présent comment client et serveur communiquent : Côté client Rapace Le package rapace.network régit l ensemble des communications avec le serveur Apache. La classe abstraite MessageHttp implémente les fonctionnalités indispensables à l envoi de messages HTTP. Elle repose sur la classe java.net.httpurlconnection, recommandée par developer.android depuis la version 2.3. MessagePost spécialise MessageHttp pour la méthode POST. La classe MessageHttp spécialise la classe Java.lang.Thread. La communication avec le serveur Apache peut prendre un certain temps durant lequel l application se fige. L IHM n est alors plus opérationnelle, et l utilisateur peut ressentir un désagrément. Pire encore, le système Android peut décider de fermer l application et afficher un message d erreur si le client n obtient pas rapidement une réponse! La classe Thread définit ce que l on appelle en français un processus léger. Un processus léger n est pas un processus au sens propre. (voir annexe) On utilise la fonction Message.start() pour envoyer un message, et Thread.join() pour attendre la réponse. MessagePost message = new MessagePost(url, parametres); message.start(); message.join(); Quant à la classe Serveur, elle implémente plusieurs méthodes comme authentifier(), ou lever_alerte(), dont le rôle est d envoyer un formulaire au bon script, et de traiter sa réponse.
17 Côté serveur Apache Nous utilisons trois scripts : authentification.php, demander_site_par_utilisateur.php, lever_alerte.php, dont les rôles sont explicites. Les scripts sont formés de la façon suivante : 1 - On teste la présence des paramètres attendus : if (!empty(trim($_post[ parametre1 ])) and!empty(trim($_post[ parametre2 ]))... and!empty(trim($_post[ parametre_n ])) ){ /* traitement 2 - On ouvre une connexion avec PDO, utilisons une requête préparée, et renvoyons le résultat avec une boucle sous la forme : $answer = $query->fetch(pdo::fetch_assoc); foreach ($answer as $value) { print $value. " "; (Voir annexe pour comprendre l importance d utiliser des requêtes préparées et autres questions de sécurité.) Authentification : Le cryptage du mot de passe Que se passerait-il si un individu parvenait à récupérer le contenu de notre base de données? Il posséderait le mot de passe tout utilisateur, et avec, aurait accès à toutes les caméras enregistrées! On évite ce genre de problème en cryptant la base de données. Le site php.net recommande l utilisation du couple password_hash(), password_verify() pour crypter et vérifier si un mot de passe crypté et non-crypté correspondent. authentification.php procède en deux étapes : il charge les informations d un utilisateur dont l identifiant est donné, vérifie le mot de passe, et si les deux concordent, renvoie les informations au client. $query = $bdd->prepare("select * FROM Utilisateur WHERE = : "); $query->bindparam( : , $ , PDO::PARAM_STR); $query->execute(); $answer = $query->fetch(pdo::fetch_assoc); if ( password_verify($password, $answer[ psswd ]) ) { foreach ($answer as $value) { print $value. " ";
18 18 Détail : getsitesbyuserid.php Ce script a pour mission de renvoyer l ensemble des sites surveillés par un utilisateur dont on connaît l identifiant. if (!empty((int)htmlentities($_request[ user_id ]))) { // Les id sont sous forme d int, pas d injection SQL possible. $user_id = (int)$_request[ user_id ]; $query = $bdd->prepare( "SELECT DISTINCT Site." "FROM Site ". "JOIN Surveille ". "ON Site.id = Surveille.id_site ". "WHERE Surveille.id_utilisateur=". $user_id ); $query->execute(); La seule difficulté posée par ce script réside dans le renvoi des informations, que nous étudions en annexe. Détail : lever_alerte.php Nous appliquons les principes de construction énoncés précédemment en ajoutant une contrainte : pour lever une alerte, il faut re-authentifier l utilisateur. Cette mesure est faite pour éviter qu un intrus déjoue le système d alertes en envoyant une simple requête au serveur Rapace. $statement = $bdd->prepare( UPDATE Site, Utilisateur, Surveille SET en_alerte = 0 WHERE Site.id = :id_site AND Utilisateur. = : AND Utilisateur.psswd = :password AND Utilisateur.id = Surveille.id_utilisateur AND Surveille.id_site = Site.id; ); $statement->bindparam( : , $_POST[ ], PDO::PARAM_STR); // Remarque : Le mot de passe reçu correspond au mot de passe CRYPTE! // (gardé en mémoire dans l application cliente le temps de l éxécution) // on peut donc le passer tel quel en parametre. $statement->bindparam( :password, $_POST[ password ], PDO::PARAM_STR);
19 19 $statement->bindparam( :id_site, $_POST[ id_site ], PDO::PARAM_INT); $statement->execute(); 4.3 Mécanisme d alerte : Le serveur contacte l utilisateur par sms. Après réception du message, l application revient au premier plan en affichant le message d alerte. Android permet aux développeurs d interagir facilement avec les composants du téléphone. La classe SMSReceiver spécialise la classe BroadcastReceiver qui permet d écouter un composant Android. Lorsqu un message arrive, il est accessible depuis les instances de BroadcatReceiver. Dans notre cas, on récupère le message, on vérifie la provenance, et on invoque Alerte si le numéro (pdus) correspond à celui du serveur. public void onreceive(context context, Intent intent) { // On récupère l intent Bundle bundle = intent.getextras(); SmsMessage[] msgs; if (bundle!= null) { Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage [pdus.length]; /* Pour tout messages entrant for (int i=0; i < msgs.length; i++) { SmsMessage message_entrant = SmsMessage.createFromPdu((byte[]) pdus[i]); /* Si le numéro correpond à celui du serveur (000) if (message_entrant.getoriginatingaddress().equals("000")) { msgs[i] = message_entrant; /* On appelle l Activité Alerte Intent mainactivityintent = new Intent(context, Alert.class); mainactivityintent.setflags(intent.flag_activity_new_task); context.startactivity(mainactivityintent);
20 Lecture streaming : Différents types de streaming : Il existe deux types de streaming : Lecture progressive : On lit un fichier (fini), stocké sur un serveur. On parle de lecture progressive lorsque l application télécharge et lit le fichier simultanément. Le protocole HTTP supporte ce type de streaming. C est le streaming utilisé par Youtube, par exemple. Lecture continue : On lit un flux vidéo. Le protocole HTTP ne supporte pas très bien ce mode de streaming, on utilise plutôt RTSP ou RTMP. C est ce type de streaming qui est utilisé pour diffuser le flux d une caméra. L API Android propose de lire une vidéo en streaming (lecture continue ou progressive) en utilisant un VideoView auquel on renseigne une uri. Par exemple : // On récupère la vue : VideoView video = (VideoView)findViewById(R.id.video); // On renseigne l uri de la vidéo à lire : video.setvideouri(uri.parse(url)); // Let s play : video.start();
21 21 5 Intérêts de ce projet 5.1 L enrichissement personnel Avant d être une expérience informatique, ce projet est une expérience humaine. Les étudiants doivent coopérer pour mener à bien la réalisation de l application. Cela nous a permis d apprendre à communiquer, et à échanger pour clarifier parfois certains concepts que nous ne maîtrisions pas. Découvrir une nouvelle façon de programmer, ainsi que la richesse de l univers Android, en dehors des cours magistraux est également une expérience intéressante. Dans le monde de l entreprise nous serons certainement amenés à nous auto-former, et des projets comme celui-ci nous aident à acquérir la discipline et la maturité requise pour cela. 5.2 Des compétences techniques Les notions abordées par ce projet sont nombreuses, et en font selon nous un très bon sujet pour l apprentissage. Le code natif étant en JAVA, nous avons été amenés à renforcer notre maîtrise du langage. Puisque la télésurveillance repose grandement sur les réseaux informatiques, il n est pas étonnant de constater que nous avons approfondi nos connaissances dans ce domaine (l architecture client-serveur et le protocole HTTP). Nous nous sommes également initiés aux problématiques du streaming et aux différents protocoles associés, comme aux formats d encodage des images. Le projet revêt un coté système, puisqu il a fallut (brièvement) étudier le fonctionnement du système Android afin d implémenter un mécanisme d alerte, et le multi-threading. De plus, conjointement avec nos cours d architecture du web et de base de données, ce projet nous a permis d apprendre dans ces deux disciplines puisque nous avons dû écrire des scripts php régissant les interactions avec notre base de données. Enfin nous avons acquis certaines connaissances sur des outils comme PhpMyAdmin, les serveurs Apache et MySQL, le gestionnaire de versions SVN, le lecteur multi-média vlc dont nous n avons pas parlé dans ce rapport mais qui nous a guidé tout au long de nos tests sur le streaming!
22 22 6 Conclusion Nous avons, dans le présent document, proposé une solution simple pour répondre aux problèmes logiciels que pose la télésurveillance. La modularité du code et le respect des concepts objets permettront aux curieux de modifier et d améliorer notre application avec aisance. En effet les améliorations possibles sont nombreuses. Nous pouvons imaginer de nouvelles fonctionnalités venant enrichir notre application Rapace. Gérer la détection de mouvement, par exemple, de manière à compléter notre mécanisme d alerte, où permettre à l utilisateur d enregistrer des vidéos à partir d un flux, de conserver des clichés en cas d intrusion, sont autant d options pouvant améliorer l expérience de l utilisateur.
23 23 7 Bibliographie *)Livres Programmer en Java de Claude Delannoy Coder proprement, Martin, Robert C. Cours Développement d applications Mobiles sous Android, Abdelhak Djamel Seriai, Université Montpellier *)Sites web https :// https :// https :// http ://developer.android.com/ http :// http ://fr.wikipedia.org/wiki/vidésurveillance
24 24 8 Annexe 8.1 Mode d emploi Nous allons présenter une utilisation classique de notre application à travers la simulation d une intrusion. On suppose que l application est installée sur le mobile, et que l utilisateur est enregistré dans la base de données Réception de l alerte
25 25 La pression du bouton "voir" nous redirige vers l authentification L Authentification Il s agit alors de renseigner notre adresse et notre mot de passe. La pression du bouton "s authentifier" nous redirige vers l affichage des sites.
26 Affichage des sites Les sites affichés en vert sont des sites pour lesquels aucune alerte n est enregistrée, les sites rouge en revanche sont en état d alerte! Une pression sur un bouton vous redirigera vers les images du site Streaming Suivant le site que vous avez choisi, l affichage diffère :
27 On visionne un site sans alerte. 27
28 28 On visionne un site en alerte. La pression du bouton "appeler la police" provoque l appel de la police :
29 La pression du bouton "lever alerte" provoque la levée de l alerte. Ainsi si l on retourne en arrière nous obtenons l affichage suivant : 29
30 Complément sur les communications Client-Serveur Nous reprennons dans cette section certaines explications déjà données dans le rapport que nous détaillons Pourquoi le package network? Le package rapace.network régit l ensemble des communications avec le serveur Apache.
31 31 Package rapace.network : Structure La classe abstraite MessageHttp implémente les fonctionnalités indispensables à l envoi de message HTTP, indépendamment la méthode utilisée. Elle repose principalement sur la classe java.net.httpurlconnection, recommandée par developer.android depuis la version 2.3. D autres classes permettent l envoi de requêtes HTTP, mais des problèmes de compatibilité apparaissent suivant la version du mobile. MessagePost spécialise MessageHttp afin de prendre en charge la méthode POST. Nous aurions pu créer une classe MessageGet spécialisant MessageHttp pour la méthode GET, mais nous n avons pas eu besoin d utiliser cette méthode dans notre projet. HttpURLConnection, supporte à elle seule l envoi de message HTTP, quelque soit la méthode. On peut alors se demander pourquoi avoir créé le package rapace.network. Le site developer.android nous donne un exemple de son utilisation : //Création de l URL : URL url = new URL(" //Ouverture de connection HttpURLConnection urlconnection = (HttpURLConnection) url.openconnection(); try {
32 32 //Configuration de la connection : urlconnection.setdooutput(true); urlconnection.setchunkedstreamingmode(0); //Création du flux d émission : OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream()); //ecriture dans ce flux : writestream(out); //Creation du flux de réception : InputStream in = new BufferedInputStream(urlConnection.getInputStream()); //Lecture du flux : readstream(in); finally { //fermeture de connection : urlconnection.disconnect(); Le code suivant pose plusieurs problèmes : Ce code génère un grand nombre d exceptions! On en compte pas moins de huit dans son adaptation à notre client Rapace. Or l implémentation ci-dessus ne permet pas d identifier clairement les exceptions et de les traiter. Plusieurs méthodes, par exemple, jettent une JavaNullPointerException. Solution : Une solution vise à découper le bloc try en autant de sous-blocs try qu il y a de méthodes à risque. Mais avec un nombre important de méthodes à risque, notre code devient rapidement illisible. Ce code gère un grand nombre de fonctionnalités : Ouverture de connexion, configuration de connexion, création de flux (émission/réception) ainsi que leurs entrées/sorties, plus fermeture de connexion. Or, il est généralement préférable de n attribuer qu un rôle à une méthode. Solution : Une solution consiste à découper notre code en autant sous routines, qu il y a de commentaires dans notre exemple. En conjuguant nos deux solutions, on obtient la méthode principale de MessagePost :
33 33 public void run() { ouvrir_connection(); emettre_requete(); setreponse_serveur(recevoir_reponse()); fermer_connection(); Les sous-routines ci-dessus sont elles mêmes découpées en sous-routines. En plus d améliorer le maintient de notre programme, la modularité permet aussi d associer une sémantique à une sous-routine. Package rapace.network : Relation entre les classes Puisque MessageHttp réutilise les propriétés de HttpURLConnection, on pourrait se demander pourquoi avoir choisi d associer les deux classes, alors qu une relation de spécialisation semblait mieux indiquée pour illustrer les liens sémantiques entre nos classes. Tout simplement parce que MessageHttp spécialise déjà la classe Java.lang.Thread. En effet, la communication avec le serveur Apache peut prendre un certain temps durant lequel l application se fige. L IHM n est alors plus opérationnelle, et l utilisateur peut ressentir un désagrément. Pire encore, le système Android peut décider de fermer notre application et afficher un message d erreur si le client n obtient pas rapidement de réponse! Quant à la classe Serveur, elle implémente plusieurs fonctions comme authentifier(), ou lever_alerte(), dont le rôle est simplement de renseigner l url du script à appeler et formater les paramètres à transmettre à la classe MessagePost. Lorsque message passe à l état terminé, la méthode lit la réponse renvoyée par le serveur Apache et effectue un traitement en conséquence Les processus légers ou Thread "Pour éviter toute ambiguïté, il est important de préciser qu un thread n est pas un processus. En effet, les processus vivent dans des espaces virtuels isolés alors que les threads sont des traitements qui vivent ensemble au sein d un même processus." (http ://alwin.developpez.com/tutorial/javathread/) En Java, la classe Thread permet de définir ce que l on appelle en français un processus léger. Un processus léger n est pas un processus au sens propre, mais un objet (dans notre cas) instancié dans un programme exécuté dans un certain processus. Processus et Thread permettent une exécution en parallèle (au moins par
34 34 illusion), mais deux processus ont leurs propres segments mémoire (pile, statique, dynamique), alors que les processus légers utilisent les mêmes segments, celui du processus père. Cela rend la communication entre processus légers particulièrement agréable. Chacun possède en revanche sa propre pile d appel, permettant dans notre cas de détacher l IHM de communication avec le serveur Apache. En java, la création d un processus léger se fait comme n importe quelle instanciation d objet. L exécution du processus léger démarre avec la méthode Thread.start() qui effectue le traitement défini dans la redéfinition de Thread.run(). Pour attendre la fin de la fonction Thread.start(), on utilise Thread.join(). L envoi d un message HTTP suivant la méthode POST se fait par : MessagePost message = new MessagePost(url, parametres); message.start(); message.join(); Accès à la base de données L importance d utiliser PDO et ses requêtes préparées? L API PDO propose un ensemble de fonctionnalités optimisées et disponibles indépendamment du système de gestion de base de données. Son usage (fortement recommandée par le site php.net) permet une plus grande portabilité du code, mais pas seulement. La faille par injection SQL : Une faille connue consiste à envoyer du code SQL dans un formulaire pour manipuler notre base de données sans en avoir les droits. En plus d optimiser nos requêtes, l utilisation de requêtes préparées permet de se prémunir contre ce type d attaque Comment est encodée la réponse du serveur? Un problème s est posé lorsque nous avons voulu sérialiser un ensemble de Site (code client) à partir des informations renvoyées par le serveur. Pour ce faire nous récupérons d abord tous les sites sous surveillance d un utilisateur : if (!empty((int)htmlentities($_request[ user_id ]))) { // Les id sont sous forme d int, pas d injection SQL possible,
35 35 //pas de requetes preparées. $user_id = (int)$_request[ user_id ]; // Néanmoins nous voulons $query = $bdd->prepare( "SELECT DISTINCT Site." "FROM Site ". "JOIN Surveille ". "ON Site.id = Surveille.id_site ". "WHERE Surveille.id_utilisateur=". $user_id ); $query->execute(); À ce stade, la réponse est contenue dans notre objet PDOStatement $query. Nous désirons dans l application client pouvoir construire autant d objets Site que d entrées (rows) trouvées dans la base de données. C est à dire, pour une solution utilisant StringTokenizer : String reponse_serveur = demande_site_par_utilisateur.getreponse_serveur(); if (!reponse_serveur.isempty()) { sites = new Vector<Site>(); reponse = new StringTokenizer(reponse_serveur); while (reponse.hasmoretokens()) { String long_token = reponse.nexttoken(token); sites.add(new Site(long_token)); Le code précédent fait plusieurs choses, il extrait une sous-chaîne délimitée par TOKEN et demande à la classe Site de créer une série d objets à partir de cette chaîne, jusqu à ce qu il n y ait plus de TOKEN dans reponse_serveur. De même, Site(String data) doit créer une nouvelle instance à partir d une chaîne de caractères. StringTokenizer strtok = new StringTokenizer(data, " "); String str = strtok.nexttoken(attr_token); id = Integer.parseInt(str); str = strtok.nexttoken(attr_token); nom = str; str = strtok.nexttoken(attr_token);
36 36 adresse = str; str = strtok.nexttoken(attr_token); descriptif = str; str = strtok.nexttoken(attr_token); url = str; str = strtok.nexttoken(attr_token); etat_alerte = str; La difficulté consiste donc à déterminer la valeur à donner à nos tokens. Comme "<" et ">" sont des caractères inhabituels pour décrire un site, nous avons choisis de remplacer TOKEN par "<" et ATTR_TOKEN par ">" dans notre code, et d échapper systématiquement ces caractères lors de toutes les insertions dans la table Rapace.Site. Nous renvoyons finalement notre réponse à l application client de la manière suivante : while ($answer = $query->fetch(pdo::fetch_assoc)) { foreach ($answer as $value) { print $value. > ; print < ; 8.3 Nativité d une application Que l on développe sous Android, ios ou Windows, il existe trois types d applications ayant chacune leurs avantages et leurs défauts. Les applications natives : Elles sont intégralement développées en langage natif (Java et XML pour Android). Ces langages ont l avantage d offrir de meilleures performances, il est compilé (en partie) et le système est optimisé pour les supporter. De plus, ils donnent la possibilité d interagir avec le système d exploitation. Les applications web : Elles récupèrent le contenu d une page web. Sous Android cela se fait via la balise ouvrante XML <WebView> prenant en attribut l url de la page encodée avec les technologies web usuelles. L avantage de ces applications est leur portabilité : il ne s agit plus de
37 37 compatibilité entre systèmes d exploitations mais entre navigateurs web. Là où une application native exige trois implémentations différentes pour être correctement représentée sur le marché (AppStore, AndroidMarket, Windows Phone Store), une seule implémentation suffit à une application web. Les performances sont certes moins élevées, mais il faut noter que la majorité des applications ne requièrent pas de hautes performances. Le vrai défaut de ces applications réside dans le fait que généralement, par sécurité, le système d exploitation interdit aux scripts l accès aux composants du système (caméra, accès sms, répertoire, etc). Les application hybrides : De manière assez évidente, elles acceptent du code natif et du code issu d une page web. Il s agit d un compromis entre application native et application web, permettant de tirer judicieusement parti de chacune. 8.4 Envoyer un SMS à l émulateur Android Un vrai téléphone possède un numéro, et le serveur envoi un sms d alerte à ce numéro. Dans notre cas il s agit d une machine virtuelle dépourvue numéro. Pour simuler l envoi d un sms, nous devons donc suivre la procédure suivante : On utilise la commande telnet #serveur #port pour se connecter au port utilisé par la machine virtuelle ; dans notre cas cela donne : telnet localhost Le numéro de port utilisé par votre machine virtuelle est indiqué dans le coin supérieur gauche de votre fenêtre contenant la machine virtuelle. On peut alors utiliser les commandes livrées avec l émulateur android sms send #num_telephonne #contenu_message Par exemple : sms send 007 "Mon nom est Bond, James Bond" se traduit par la réception chez notre machine virtuelle d un message provenant du numéro "007" contenant "Mon nom est Bond, James Bond". 8.5 Code source Dans cette section nous présentons une partie du code utilisé par notre application, nous occultons par soucis de clarté des commentaires ou des méthodes peu utiles au lecteur (on pense en particuliers aux accesseurs/mutateurs), ainsi que les import.
38 Utilisateur package com.example.quentin.rapace_v1.metier; Classe representant un utilisateur inscrit public class Utilisateur { identifiant dans la base de donnees private int id = -1; nom de l utilisateur private String nom = "non renseigné"; prenom de l utilisateur private String prenom = "non renseigné"; mot de passe (crypte) de l utilisateur private String psswd = "non renseigné"; adresse de l utilisateur private String = "non renseigné"; public Utilisateur(){ * Constructeur data Reponse formatee du serveur. public Utilisateur(String data) { //On utilise une instance de StringTokenize pour parser notre réponse : StringTokenizer strtok = null; try { strtok = new StringTokenizer(data, " "); catch (NullPointerException e) { /* Normalement il n est pas nécéssaire de catcher une RunTimeException, mais écrire un Log et quitter la fonction ici peut-être utile (aide à comprendre en cas d erreur!) Log.w("Bad Data", "Impossible d instancier Utilisateur à partir de null.");
39 39 id = Integer.parseInt(strtok.nextToken()); nom = strtok.nexttoken(); prenom = strtok.nexttoken(); psswd = strtok.nexttoken(); = strtok.nexttoken(); * Rassemble les donnees de l utilisateur dans une chaine de caracteres. Descriptif des donnees de l utilisateur. public String tostring() { return "[id] " + getid() + "\n[nom/prenom] " + getnom() + " " + getprenom() Site package com.example.quentin.rapace_v1.metier; Classe representant un site sous surveillance. public class Site { identifiant du site dans la base de donnee private int id = -1; nom du site private String nom = "non renseigne"; adresse du site private String adresse = "non renseigne"; descriptif du site private String descriptif = "non renseigne"; url de la video du site private String url = "non renseigne";
40 40 etat d alerte du site private String etat_alerte = "non renseigne"; * Constructeur data String contenant le réponse (formatee) du serveur. public Site(String data) { StringTokenizer strtok = null; try { strtok = new StringTokenizer(data, " "); catch (NullPointerException e) { Log.e("Bad Data", "Impossible d instancier Utilisateur à partir de null."); String str = null; str = strtok.nexttoken(">"); id = Integer.parseInt(str); str = strtok.nexttoken(">"); nom = str; str = strtok.nexttoken(">"); adresse = str; str = strtok.nexttoken(">"); descriptif = str; str = strtok.nexttoken(">"); url = str; str = strtok.nexttoken(">"); etat_alerte = str;
41 MessageHTTP * Classe abstraite implémentant des fonctions de bases nécessaires * à l envoi de requête Http. public abstract class MessageHttp extends Thread { adresse de la cible private URL url = null; paramètre de la requête private String param = null; classe gérant l envoi et la réception des requêtes Http private HttpURLConnection connection = null; reponse obtenue apres traitement de notre requete private static String reponse_serveur = null; * Constructeur url adresse de la cible param paramètre de la requête public MessageHttp(String url, String param) { try { this.url = new URL(url); catch (MalformedURLException e) { Log.e("Erreur", "URL invalide (malformée?)"); this.param = param; * Accesseur vers la reponse obtenu apres traitement de la requete. * Attention aux problemes de syncronisation. reponse obtenue apres traitement de la requete public String getreponse_serveur() { return reponse_serveur;
42 42 * Mutateur vers la reponse obtenu apres traitement de la requete reponse_serveur public void setreponse_serveur(string reponse_serveur) { this.reponse_serveur = reponse_serveur; * public void run(){ * Ouvre une nouvelle connection. public void ouvrir_connection() { try { connection = (HttpURLConnection) url.openconnection(); catch (IOException e) { Log.e("Erreur", "Impossible d accéder à l url demandée " + url.tostring()); * Ferme une connection active. public void fermer_connection() { connection.disconnect(); * Ouvertue du tampon de reception tampon de reception ouvert (si reussite) public BufferedReader obtenir_tampon_reception() {
43 43 BufferedReader _tampon_reception = null; // Ouverture du flux : try { _tampon_reception = new BufferedReader (new InputStreamReader(connection.getInputStream())); catch (IOException e1) { Log.e("Erreur", "Erreur dans la réception du flux en provenance de " + url.tostring()); return _tampon_reception; * Encadre la reception d une reponse serveur reponse a la requete public String recevoir_reponse() { BufferedReader tampon_reception = obtenir_tampon_reception(); String message = lire(tampon_reception); // Fermeture du tampon : try { tampon_reception.close(); catch (IOException e1) { Log.e("Erreur", "Impossible de fermer le flux de récpetion en provenance de " + url.tostring()); return message; * Lit le contenu d un tampon bufferedreader tampon a lire String fidele au contenu du tampon public String lire(bufferedreader bufferedreader) { String line; StringBuffer sb = new StringBuffer(); try { while ((line = bufferedreader.readline())!= null) { sb.append(line);
44 44 catch (IOException e1) { Log.e("Erreur", "Erreur dans la lecture du flux en provenance de " + url.tostring()); return sb.tostring(); MessagePOST package com.example.quentin.rapace_v1.network; * Permet l envoi de requete HTTP suivant la methode POST public class MessagePost extends MessageHttp { * Constructeur url adresse de la cible param parametres de la requete public MessagePost(String url, String param) { super(url, param); * Traitement effectue par le Thread a son public void run(){ ouvrir_connection(); emettre_requete(); setreponse_serveur(recevoir_reponse()); fermer_connection(); * Ouverture du tampon d emission tampon d emission ouvert
45 45 public OutputStreamWriter obtenir_tampon_emission() { OutputStreamWriter _tampon_emission = null; try { _tampon_emission = new OutputStreamWriter(getConnection(). getoutputstream()); catch (IOException e) { Log.e("Erreur", "Impossible d obtenir un flux de sortie."); return _tampon_emission; * Preparation de la requete : chargement des parametres en tampon. _tampon_emission tampon d emission ouvert public void preparerrequete(outputstreamwriter _tampon_emission) { // On y écrit notre morceau de requête HTTP contenu dans param : try { _tampon_emission.write(getparam()); catch (IOException e) { Log.e("Erreur", "Impossible d écrire sur le flux sortant."); * Envoi une requete HTTP suivant la methode POST _tampon_emission tampon d emission ouvert et prepare public void envoyerrequete(outputstreamwriter _tampon_emission) { // On vide le buffer afin d envoyer notre requête HTTP : try { _tampon_emission.flush(); catch (IOException e) { Log.e("Erreur", "Impossible d envoyer la requete HTTP."); * Met en forme et emet une requete
46 46 public void emettre_requete() { // On autorise un tampon pour l écriture de la requête : getconnection().setdooutput(true); getconnection().setchunkedstreamingmode(0); OutputStreamWriter tampon_sortie = obtenir_tampon_emission(); if (tampon_sortie == null) { Log.e("tampon", " nul"); preparerrequete(tampon_sortie); envoyerrequete(tampon_sortie); // On ferme le tampon car il ne nous sera plus utile : try { tampon_sortie.close(); catch (IOException e) { e.printstacktrace(); Serveur package com.example.quentin.rapace_v1.network; Assure la liaison entre l application et le serveur Rapace public class Serveur { url du script d authentification private static final String url_script_authentification = " // = pour android url du script listant les sites que surveille un utilisateur a partir de son identifiant private static final String url_script_demander_site_par_utilisateur =... url du script permettant de lever une alerte private static final String url_script_lever_alerte =... * Envoie une requete permettant d authentifier un utilisateur
47 47 * enregistre selon son et son mot de passe. adresse du client password mot de passe du client (non crypte) Une instance d Utilisateur public static Utilisateur authentifier(string , String password) { String identifiants = preparer_identifiants( , password); MessagePost demande_authentification = new MessagePost( url_script_authentification, identifiants); demande_authentification.start(); attendre_fin(demande_authentification); String reponse = demande_authentification.getreponse_serveur(); /* "String reponse" contient une chaine contenant l ensemble des attributs d un unique utilisateur ou est nulle. Utilisateur utilisateur = null; if (!reponse.isempty()) { utilisateur = new Utilisateur(reponse); return utilisateur; * Sous routine s occupant de la preparation des arguments de la * requete d authentification adresse du client password mot de passe du client (non crypte) String formatee exprimant les parametres de notre requete. private static String preparer_identifiants (String , String password) { String identifiants = null; try { identifiants = URLEncoder.encode(" ", "UTF-8") + "=" + URLEncoder.encode( , "UTF-8") + "&" + URLEncoder.encode("password", "UTF-8") + "=" + URLEncoder.encode(password, "UTF-8"); catch (UnsupportedEncodingException e) { Log.e("Error", "Argument mal formé?");
48 48 e.printstacktrace(); return identifiants; * Envoie une requete permettant de lister les sites surveilles * par un utilisateur. id_utilisateur numero identifiant un utilisateur enregistre Liste des sites sous la surveillance de l utilisateur renseigne public static Vector<Site> charger_site(string id_utilisateur) { Vector<Site> sites = null; String id = preparer_requete_site(id_utilisateur); StringTokenizer reponse = null; MessagePost demande_site_par_utilisateur = new MessagePost(url_script_demander_site_par_utilisateur, id); demande_site_par_utilisateur.start(); attendre_fin(demande_site_par_utilisateur); String reponse_serveur = demande_site_par_utilisateur. getreponse_serveur(); if (!reponse_serveur.isempty()) { sites = new Vector<Site>(); reponse = new StringTokenizer(reponse_serveur); while (reponse.hasmoretokens()) { String long_token = reponse.nexttoken("<"); sites.add(new Site(long_token)); return sites; * Envoie d une requete levant un etat d alerte pour un site donne adresse du client password mot de passe du client (crypte) id_site numero identifiant un utilisateur enregistre
49 49 public static void lever_alerte(string , String password, String id_site) { String parametres = preparer_requete_alerte( , password, id_site); MessagePost demande_levee = new MessagePost(url_script_lever_alerte, parametres); demande_levee.start(); attendre_fin(demande_levee); * Attendre qu une requete HTTP obtienne reponse messagehttp requete dont on souhaite attendre la reponse private static void attendre_fin(messagehttp messagehttp) { try { messagehttp.join(); catch (InterruptedException e) { e.printstacktrace(); SMSReceiver package com.example.quentin.rapace_v1.service; * Classe s occupant de la détection des alertes. public class SMSReceiver extends BroadcastReceiver public void onreceive(context context, Intent intent) { Bundle bundle = intent.getextras(); SmsMessage[] msgs; if (bundle!= null) { /* Les pdus correspondent aux numéros de téléphonne des expéditeurs Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage [pdus.length]; /* Pour tout messages entrant
50 50 for (int i=0; i < msgs.length; i++) { SmsMessage message_entrant = SmsMessage.createFromPdu((byte[]) pdus[i]); /* Si le numéro correpond à celui du serveur (000) if (message_entrant.getoriginatingaddress().equals("000")) { msgs[i] = message_entrant; /* On appelle l Activité Alerte Intent mainactivityintent = new Intent(context, Alert.class); mainactivityintent.setflags(intent.flag_activity_new_task); context.startactivity(mainactivityintent); Intent broadcastintent = new Intent(); broadcastintent.setaction("sms_received_action"); context.sendbroadcast(broadcastintent);
Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)
Quelques patterns pour la persistance des objets avec DAO Ce cours présente des modèles de conception utilisés pour effectuer la persistance des objets Université de Nice Sophia-Antipolis Version 1.4 30/8/07
Devenez un véritable développeur web en 3 mois!
Devenez un véritable développeur web en 3 mois! L objectif de la 3W Academy est de former des petits groupes d élèves au développement de sites web dynamiques ainsi qu à la création d applications web
Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :
Développement d un client REST, l application Vélib 1. Présentation L application présentée permet de visualiser les disponibilités des vélos et des emplacements de parking à la disposition des parisiens
M1 IFPRU 2008-2009. Cahier des Charges du projet de TER. Vidéo Surveillance sur IP Le système Rapace. Membres du groupe : Encadrés par :
M1 IFPRU 2008-2009 Cahier des Charges du projet de TER Vidéo Surveillance sur IP Le système Rapace Membres du groupe : SEDDIK Annes SERIAI Abderrahmane HENNANI Hakim FERJANI Mohammed Encadrés par : M.
Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;
CNAM NFP121 TP 10 19/11/2013 (Séance 5) Objectif Manipuler les exceptions ; 1 Entrées/sorties Exercice 1 : Lire un entier à partir du clavier Ajouter une méthode readint(string message) dans la classe
NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007
NFP 121 Java et les Threads Présentation : Thierry Escalarasse Mai 2007 Plan du cour Présentation de la notion de Threads La classe Thread L interface Runnable Les états d un thread La Synchronisation
INTRODUCTION A JAVA. Fichier en langage machine Exécutable
INTRODUCTION A JAVA JAVA est un langage orienté-objet pur. Il ressemble beaucoup à C++ au niveau de la syntaxe. En revanche, ces deux langages sont très différents dans leur structure (organisation du
BULK SMS Envoi en masse d un message texte moyennant un téléphone mobile (GSM)
Ministère de l Enseignement Supérieur et de la Recherche Scientifique Ecole Supérieure Privée d Ingénierie et de Technologie BULK SMS Envoi en masse d un message texte moyennant un téléphone mobile (GSM)
Remote Method Invocation (RMI)
Remote Method Invocation (RMI) TP Réseau Université Paul Sabatier Master Informatique 1 ère Année Année 2006/2007 Plan Objectifs et Inconvénients de RMI Fonctionnement Définitions Architecture et principe
Education Delivery Intelligent Tool
Education Delivery Intelligent Tool Projet AMO2 Maxence RAOUX Joachim SEGALA RICM 4 Avril 2012 Sommaire I. Presentation du projet... 2 1. Contexte... 2 2. Demande... 2 3. Spécifications... 2 II. Guide
La base de données XML exist. A. Belaïd
La base de données XML exist Introduction Qu est-ce-que exist? C est une base de donnée native, entièrement écrite en Java XML n est pas une base de données en soi Bien qu il possède quelques caractéristiques
RAPPORT DE CONCEPTION UML :
Carlo Abi Chahine Sylvain Archenault Yves Houpert Martine Wang RAPPORT DE CONCEPTION UML : Bamboo Ch@t Projet GM4 Juin 2006 Table des matières 1 Introduction 2 2 Présentation du logiciel 3 2.1 Précisions
Etude et développement d un moteur de recherche
Ministère de l Education Nationale Université de Montpellier II Projet informatique FLIN607 Etude et développement d un moteur de recherche Spécifications fonctionnelles Interface utilisateur Responsable
Premiers Pas en Programmation Objet : les Classes et les Objets
Chapitre 2 Premiers Pas en Programmation Objet : les Classes et les Objets Dans la première partie de ce cours, nous avons appris à manipuler des objets de type simple : entiers, doubles, caractères, booléens.
Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.
Chapitre 7 Le mode de communication en connexion est, a priori, supporté par le protocole TCP. Ce protocole fournit une communication fiable; les données sont transmises comme chaînes d octets. Avant de
Point sur les solutions de développement d apps pour les périphériques mobiles
Point sur les solutions de développement d apps pour les périphériques mobiles Par Hugues MEUNIER 1. INTRODUCTION a. Une notion importante : le responsive web design Nous sommes en train de vivre une nouvelle
Guide d utilisation. Version 1.1
Guide d utilisation Version 1.1 Guide d utilisation Version 1.1 OBJECTIF LUNE Inc. 2030 boulevard Pie-IX, bureau 500 Montréal (QC) Canada H1V 2C8 +1 514-875-5863 [email protected] http://captureonthego.objectiflune.com
Java Licence Professionnelle 2009-2010. Cours 7 : Classes et méthodes abstraites
Java Licence Professionnelle 2009-2010 Cours 7 : Classes et méthodes abstraites 1 Java Classes et méthodes abstraites - Le mécanisme des classes abstraites permet de définir des comportements (méthodes)
INTERNET est un RESEAU D ORDINATEURS RELIES ENTRE EUX A L ECHELLE PLANETAIRE. Internet : interconnexion de réseaux (anglais : net = réseau)
CS WEB Ch 1 Introduction I. INTRODUCTION... 1 A. INTERNET INTERCONNEXION DE RESEAUX... 1 B. LE «WEB» LA TOILE, INTERCONNEXION DE SITES WEB... 2 C. L URL : LOCALISER DES RESSOURCES SUR L INTERNET... 2 D.
PHP 5. La base de données MySql. A. Belaïd 1
PHP 5 La base de données MySql A. Belaïd 1 Base de données C est quoi une base de données? Une base de données contient une ou plusieurs tables, chaque table ayant un ou plusieurs enregistrements Exemple
BTS S.I.O. 2012-2013 PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais
BTS S.I.O. 2012-2013 PHP OBJET Module SLAM4 Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais Table des matières 1 But... 3 2 Les bases :... 3 3 Utilisation d'une classe : Instanciation...3
FileMaker Server 14. Guide de démarrage
FileMaker Server 14 Guide de démarrage 2007-2015 FileMaker, Inc. Tous droits réservés. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, Californie 95054 FileMaker et FileMaker Go sont des marques
Java DataBaseConnectivity
Java DataBaseConnectivity JDBC JDBC est une API Java (ensemble de classes et d interfaces défini par SUN et les acteurs du domaine des SGBD) permettant d accéder aux bases de données à l aide du langage
Chapitre 1 Windows Server 2008 11
Chapitre 1 Windows Server 2008 11 1.1. Les fondations du système... 15 1.2. La virtualisation... 16 1.3. La sécurité... 18 1.4. Le Web... 20 1.5. Fonctionnalité disponible dans Windows Server 2008... 21
Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement
Guillaume HARRY l Contenu sous licence Creative Commons CC-BY-NC-ND Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement P. 2 1. Introduction 2.
Compte Rendu d intégration d application
ISMA 3EME ANNEE Compte Rendu d intégration d application Compte Rendu Final Maxime ESCOURBIAC Jean-Christophe SEPTIER 19/12/2011 Table des matières Table des matières... 1 Introduction... 3 1. Le SGBD:...
RMI le langage Java XII-1 JMF
Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine
Plateforme PAYZEN. Définition de Web-services
Plateforme PAYZEN Définition de Web-services Ordre de paiement Version 1.1 Rédaction, Vérification, Approbation Rédaction Vérification Approbation Nom Date/Visa Nom Date/Visa Nom Date/Visa Lyra-Network
CTIconnect PRO. Guide Rapide
CTIconnect PRO Guide Rapide Version 01.02.2013 CTIconnect PRO est une application de communication permettant aux utilisateurs du système de voir le statut de leurs collègues et de les contacter en 1 clic
Programmer en JAVA. par Tama ([email protected]( [email protected])
Programmer en JAVA par Tama ([email protected]( [email protected]) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes
Administration de systèmes
Administration de systèmes Windows NT.2000.XP.2003 Copyright IDEC 2002-2004. Reproduction interdite. Sommaire... 2 Eléments logiques et physiques du réseau... 5 Annuaire et domaine... 6 Les utilisateurs
Évaluation et implémentation des langages
Évaluation et implémentation des langages Les langages de programmation et le processus de programmation Critères de conception et d évaluation des langages de programmation Les fondations de l implémentation
Fiche Technique Windows Azure
Le 25/03/2013 OBJECTIF VIRTUALISATION [email protected] EXAKIS NANTES Identification du document Titre Projet Date de création Date de modification Fiche Technique Objectif 25/03/2013 27/03/2013 Windows
Il est courant de souhaiter conserver à
Il est courant de souhaiter conserver à la fois Linux et Windows sur un même ordinateur, en particulier pour découvrir Linux, pour garder un filet de sécurité, ou pour continuer à jouer à des jeux récents
Chapitre VI- La validation de la composition.
Chapitre VI- La validation de la composition. Objectifs du chapitre : Expliquer les conséquences de l utilisation de règles de typage souples dans SEP. Présenter le mécanisme de validation des connexions
Définition des Webservices Ordre de paiement par email. Version 1.0
Définition des Webservices Ordre de paiement par email Version 1.0 Rédaction, Vérification, Approbation Rédaction Vérification Approbation Nom Date/Visa Nom Date/Visa Nom Date/Visa Historique du document
Mysql. Les requêtes préparées Prepared statements
Mysql Les requêtes préparées Prepared statements Introduction Les prepared statements côté serveur sont une des nouvelles fonctionnalités les plus intéressantes de MySQL 4.1 (récemment sorti en production
DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova
DA MOTA Anthony - Comparaison de technologies : PhoneGap VS Cordova I. Introduction Dans une période où la plasticité peut aider à réduire les coûts de développement de projets comme des applications mobile,
SQL Parser XML Xquery : Approche de détection des injections SQL
SQL Parser XML Xquery : Approche de détection des injections SQL Ramahefy T.R. 1, Rakotomiraho S. 2, Rabeherimanana L. 3 Laboratoire de Recherche Systèmes Embarqués, Instrumentation et Modélisation des
Tutorial Terminal Server sous
Tutorial Terminal Server sous réalisé par Olivier BOHER Adresse @mail : [email protected] Site Internet : http://xenon33.free.fr/ Tutorial version 1a Page 1 sur 1 Index 1. Installation des services Terminal
Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <[email protected]> Centrale Réseaux
Formation Webase 5 Ses secrets, de l architecture MVC à l application Web Adrien Grand Centrale Réseaux Sommaire 1 Obtenir des informations sur Webase 5 2 Composants de Webase 5 Un
Sommaire. I.1 : Alimentation à partir d un fichier Access (.mdb)...2
Sommaire I. SCENARII DE TRAITEMENTS...2 I.1 : Alimentation à partir d un fichier Access (.mdb)...2 I.1 : Vérification de l intégrité des traitements SQL sur la pyramide des ages...3 I.2 : Vérification
Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
INF 1250 INTRODUCTION AUX BASES DE DONNÉES. Guide d étude
INF 1250 INTRODUCTION AUX BASES DE DONNÉES Guide d étude Sous la direction de Olga Mariño Télé-université Montréal (Québec) 2011 INF 1250 Introduction aux bases de données 2 INTRODUCTION Le Guide d étude
Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction
PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS Depuis SAS 9.2 TS2M3, SAS propose un nouveau langage de programmation permettant de créer et gérer des tables SAS : le DS2 («Data Step 2»). Ces nouveautés
Sommaire. 1 Introduction 19. 2 Présentation du logiciel de commerce électronique 23
1 Introduction 19 1.1 À qui s adresse cet ouvrage?... 21 1.2 Comment est organisé cet ouvrage?... 22 1.3 À propos de l auteur... 22 1.4 Le site Web... 22 2 Présentation du logiciel de commerce électronique
TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet
TP Composants Java ME - Java EE Vous allez, dans ce TP, construire une architecture client serveur, plus précisément MIDlet cliente, servlet serveur. Pour cela, on va d'abord installer la partie serveur
Technologies du Web. Créer et héberger un site Web. Pierre Senellart. Page 1 / 26 Licence de droits d usage
Technologies du Web Créer et héberger un site Web Page 1 / 26 Plan Planification Choisir une solution d hébergement Administration Développement du site Page 2 / 26 Cahier des charges Objectifs du site
ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A.
ContactForm et ContactFormLight - Gestionnaires de formulaire pour Prestashop Edité par ARETMIC S.A. - 1 - PREAMBULE Les conditions générales d utilisation détaillant l ensemble des dispositions applicables
Auto-évaluation Programmation en Java
Auto-évaluation Programmation en Java Document: f0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INTRODUCTION AUTO-ÉVALUATION PROGRAMMATION EN
Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour http://cuiwww.unige.
: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java Michel Bonjour http://cuiwww.unige.ch/~bonjour Plan JDBC: API bas niveau pour l accès aux BD (SQL) - Introduction - JDBC et : Java, ODBC, SQL
< Atelier 1 /> Démarrer une application web
MES ANNOTATIONS SONT EN ROUGE : Axel < Atelier 1 /> Démarrer une application web Microsoft France Tutorial Découverte de ASP.NET 2.0 Sommaire 1 INTRODUCTION... 3 1.1 CONTEXTE FONCTIONNEL... 3 1.2 CONTEXTE
3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures
3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures Objectif global : A l issue de la formation, les stagiaires doivent être opérationnels dans la création d un site internet
Pratique et administration des systèmes
Université Louis Pasteur Licence Informatique (L2) UFR de Mathématiques et Informatique Année 2007/2008 1 But du TP Pratique et administration des systèmes TP10 : Technologie LAMP Le but de ce TP est de
Outils, langage et approche Android Une introduction. Nicolas Stouls nicolas.stouls@insa lyon.fr
Outils, langage et approche Android Une introduction Nicolas Stouls nicolas.stouls@insa lyon.fr Webographie La bible contenant «tout» : http://developer.android.com/index.html Les supports cette intervention
Dossier Technique. Détail des modifications apportées à GRR. Détail des modifications apportées à GRR Le 17/07/2008. Page 1/10
Dossier Technique Page 1/10 Sommaire : 1. REPONSE TECHNIQUE A LA DEMANDE 3 1.1. Prise en compte de la dernière version de phpcas 3 1.2. Gestion de la connexion à GRR 3 1.2.1. Récupération des attributs
SHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5
SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N
Programmation Web. Madalina Croitoru IUT Montpellier
Programmation Web Madalina Croitoru IUT Montpellier Organisation du cours 4 semaines 4 ½ h / semaine: 2heures cours 3 ½ heures TP Notation: continue interrogation cours + rendu à la fin de chaque séance
Construire une application marketing Facebook sur la plateforme Windows Azure
Construire une application marketing Facebook sur la plateforme Windows Azure Lorsque le «Social Effect» est au rendez-vous, comment s assurer que votre application va supporter la montée en charge? Nous
FileMaker Server 11. Publication Web personnalisée avec XML et XSLT
FileMaker Server 11 Publication Web personnalisée avec XML et XSLT 2007-2010 FileMaker, Inc. Tous droits réservés. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, Californie 95054 FileMaker est une
Diffuser un contenu sur Internet : notions de base... 13
Diffuser un contenu sur Internet : notions de base... 13 1.1 Coup d œil sur l organisation de cet ouvrage.............. 15 Préambule : qu est-ce qu une page web?................ 16 À propos du HTML...........................
TP1 : Initiation à Java et Eclipse
TP1 : Initiation à Java et Eclipse 1 TP1 : Initiation à Java et Eclipse Systèmes d Exploitation Avancés I. Objectifs du TP Ce TP est une introduction au langage Java. Il vous permettra de comprendre les
Ingénérie logicielle dirigée par les modèles
Ingénérie logicielle dirigée par les modèles Destercq Lionel & Dubuc Xavier 17 décembre 2009 Table des matières 1 Introduction 1 2 Diagrammes de classes 1 2.1 Principal..............................................
LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. [email protected] www.cril.univ-artois.fr/~jabbour
LMI 2 Programmation Orientée Objet POO - Cours 9 Said Jabbour [email protected] www.cril.univ-artois.fr/~jabbour CRIL UMR CNRS 8188 Faculté des Sciences - Univ. Artois Février 2011 Les collections
TP2 : Client d une BDD SqlServer
TP2 : Client d une BDD SqlServer Objectifs : utiliser la barre de menu, utiliser les préférences d application (settings) ou (options), gérer la persistance des données, utiliser la bibliothèque jtds:jdbc
CREATION WEB DYNAMIQUE
CREATION WEB DYNAMIQUE IV ) MySQL IV-1 ) Introduction MYSQL dérive directement de SQL (Structured Query Language) qui est un langage de requêtes vers les bases de données relationnelles. Le serveur de
Table des matières L INTEGRATION DE SAS AVEC JMP. Les échanges de données entre SAS et JMP, en mode déconnecté. Dans JMP
L INTEGRATION DE SAS AVEC JMP Quelles sont les techniques possibles pour intégrer SAS avec JMP? Comment échanger des données entre SAS et JMP? Comment connecter JMP à SAS? Quels sont les apports d une
Stockage du fichier dans une table mysql:
Stockage de fichiers dans des tables MYSQL avec PHP Rédacteur: Alain Messin CNRS UMS 2202 Admin06 30/06/2006 Le but de ce document est de donner les principes de manipulation de fichiers dans une table
Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin
Sécurité des sites Web Pas un cours un recueil du net INF340 Jean-François Berdjugin Vulnérabilité Définition (wikipédia) : Dans le domaine de la sécurité informatique, une vulnérabilité est une faiblesse
Utiliser SQL Server 2008 R2 Reporting Services comme source de donne es pour Microsoft Excel
Utiliser SQL Server 2008 R2 Reporting Services comme source de donne es pour Microsoft Excel Excel est un des meilleurs outils de manipulation de données et parfois il est nécessaire d exploiter des données
Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et
Licence 3 CDA 2010/2011 Client FTP Java Maxence Jaouan Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et Windows?...
domovea Portier tebis
domovea Portier tebis SOMMAIRE SOMMAIRE Page 1. INTRODUCTION... 2 1.1 OBJET DU DOCUMENT... 2 2. VIDEO UNIQUEMENT (SANS SON), BASE SUR CAMERA IP... 3 2.1 ARCHITECTURE... 3 2.2 CONFIGURATION... 4 2.2.1 Creation
La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 [email protected] 1
La persistance des données dans les applications : DAO, JPA, Hibernate... COMPIL 2010 [email protected] 1 Plan 1. Généralités sur la persistance des données dans les applications 2. La connection
Objet du document. Version document : 1.00
Version document : 1.00 Objet du document Les dix points de cet article constituent les règles à connaitre pour intégrer une application au sein d AppliDis. Le site des Experts Systancia comporte également
Serveurs de noms Protocoles HTTP et FTP
Nils Schaefer Théorie des réseaux (EC3a) Serveurs de noms Protocoles HTTP et FTP Théorie des réseaux (EC3a) Séance 7 Pourquoi DNS? Internet est une structure hiérarchique et arborescente de réseaux et
PDO : PHP Data Object 1/13
PDO : PHP Data Object 1/13 Tous ne sont que des extensions... Les fonstions mysql_* : API mysql Les fonctions mysqli_* aussi Il en est de même pour PDO PDO (avec le pilote PDO MySQL Driver et Extension
Ce document décrit une solution de single sign-on (SSO) sécurisée permettant d accéder à Microsoft Exchange avec des tablettes ou smartphones.
PERSPECTIVES Le Single Sign-On mobile vers Microsoft Exchange avec OWA et ActiveSync Ce document décrit une solution de single sign-on (SSO) sécurisée permettant d accéder à Microsoft Exchange avec des
Module BD et sites WEB
Module BD et sites WEB Cours 8 Bases de données et Web Anne Doucet [email protected] 1 Le Web Architecture Architectures Web Client/serveur 3-tiers Serveurs d applications Web et BD Couplage HTML-BD
Traduction des Langages : Le Compilateur Micro Java
BARABZAN Jean-René OUAHAB Karim TUCITO David 2A IMA Traduction des Langages : Le Compilateur Micro Java µ Page 1 Introduction Le but de ce projet est d écrire en JAVA un compilateur Micro-Java générant
BABEL LEXIS : UN SYSTÈME ÉVOLUTIF PERMETTANT LA CRÉATION, LE STOCKAGE ET LA CONSULTATION D OBJETS HYPERMÉDIAS
Quatrième colloque hypermédias et apprentissages 275 BABEL LEXIS : UN SYSTÈME ÉVOLUTIF PERMETTANT LA CRÉATION, LE STOCKAGE ET LA CONSULTATION D OBJETS HYPERMÉDIAS Anne-Olivia LE CORNEC, Jean-Marc FARINONE,
Encryptions, compression et partitionnement des données
Encryptions, compression et partitionnement des données Version 1.0 Grégory CASANOVA 2 Compression, encryption et partitionnement des données Sommaire 1 Introduction... 3 2 Encryption transparente des
GeniusTim_Labo Version 1.0
GeniusTim_Labo Version 1.0 GeniusTim_Labo est un logiciel de diffusion sous Androïd développé par GeniusTim. Il permet la répartition des apprenants dans 4 groupes vers lesquels seront diffusées les sources
Application web de gestion de comptes en banques
Application web de gestion de comptes en banques Objectif Réaliser une application Web permettant à un client de gérer ses comptes en banque Diagramme de cas d'utilisation 1 Les cas d'utilisation Connexion
Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java
Langages objets Introduction M2 Pro CCI, Informatique Emmanuel Waller, LRI, Orsay présentation du module logistique 12 blocs de 4h + 1 bloc 2h = 50h 1h15 cours, 45mn exercices table, 2h TD machine page
Magento. Magento. Réussir son site e-commerce. Réussir son site e-commerce BLANCHARD. Préface de Sébastien L e p e r s
Mickaël Mickaël BLANCHARD BLANCHARD Préface de Sébastien L e p e r s Magento Préface de Sébastien L e p e r s Magento Réussir son site e-commerce Réussir son site e-commerce Groupe Eyrolles, 2010, ISBN
Messagerie asynchrone et Services Web
Article Messagerie asynchrone et Services Web 1 / 10 Messagerie asynchrone et Services Web SOAP, WSDL SONT DES STANDARDS EMERGEANT DES SERVICES WEB, LES IMPLEMENTATIONS DE CEUX-CI SONT ENCORE EN COURS
Déploiement d application Silverlight
Déploiement d application Silverlight Thibault Laurens Bastien Chauvin 2 Déploiement d'application Silverlight 17/06/09 Sommaire 1 Introduction... 3 2 Intégrer une application à une page Web... 4 3 Les
Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.
Encapsulation L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. La visibilité dépend des membres : certains membres peuvent être visibles et d'autres
Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa www.degenio.com Novembre 2008
Introduction Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa www.degenio.com Novembre 2008 Forms 10g permet l utilisation du JAVA côté client et côté application
Une introduction à la technologie EJB (2/3)
Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce
Présentation du PL/SQL
I Présentation du PL/ Copyright Oracle Corporation, 1998. All rights reserved. Objectifs du Cours A la fin de ce chapitre, vous saurez : Décrire l intéret du PL/ Décrire l utilisation du PL/ pour le développeur
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface
Utiliser le site learningapps.org pour créer des activités interactives
Utiliser le site learningapps.org pour créer des activités interactives I. Créer un compte - Pour pouvoir utiliser le site learningapps.org à des fins de création, il faut commencer par créer un compte
RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.
RMI Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. Méthode proche de RPC. Outils et classes qui rendent l'implantation d'appels de méthodes d'objets distants aussi simples
Installation / Sauvegarde Restauration / Mise à jour
Installation / Sauvegarde Restauration / Mise à jour SPIP version 1.8.x Serveur (Linux) Jean Sébastien BARBOTEU [email protected] Introduction Nous allons aborder tous les aspects techniques liés à la
CARPE. Documentation Informatique S E T R A. Version 2.00. Août 2013. CARPE (Documentation Informatique) 1
CARPE (Documentation Informatique) 1 CARPE Version 2.00 Août 2013 Documentation Informatique S E T R A Programme CARPE - Manuel informatique de l'utilisateur CARPE (Documentation Informatique) 2 Table
MANUEL UTILISATEUR. Application 4trip
* MANUEL UTILISATEUR Application 4trip Table des matières 1. Introduction... 1 1.1. Description globale du produit... 1 1.2. Description de la finalité du manuel... 1 2. Manuel d utilisation... 2 2.1.
Wonderware Mobile reporting
Mobile reporting www.wonderware.fr Introduction Aujourd hui, plus que jamais, pour les décideurs et tous les personnels mobiles dans les industries du process, de l énergie et du manufacturier notamment,
