Ocelot

Ocelot est un middleware pour .net core qui permet de créer une « gateway » (un point d’entrée) unique pour un ensemble de micro service. C’est une sorte de router. Par exemple, admetons que l’on est deux services Asp.Net Core (Orders, Customers) qui tournent respectivement sur : localhost:7001 localhost:7002 Chacun ayant un simple controler « racine » qui retourne n’importe quoi. Ils sont à ce stade joigniables uniquement via ces url. On veut maintenant qu’ils soient tous accesibles depuis localhost:7000 : localhost:7000/orders localhost:7000/customers Pour cela on va ajouter le middleware Ocelot https://ocelot.readthedocs.io/en/latest/introduction/bigpicture.html et le configurer avec un fichier de configuration suivant : { « ReRoutes »: [ { « DownstreamPathTemplate »: « /api/orders », « DownstreamScheme »: « http », « DownstreamHostAndPorts »: [ { « Host »: « localhost », « Port »: 7000 } ], « UpstreamPathTemplate »: « /orders », }, { « DownstreamPathTemplate »: « /api/customers », « DownstreamScheme »: « http », « DownstreamHostAndPorts »: [ { « Host »: « localhost », « Port »: 7000 } ], « UpstreamPathTemplate »: « /customers », }, ], « GlobalConfiguration »: { « BaseUrl »; « <http://localhost7000> » } } Et hope, on a nos deux services accessible depuis le même point d’entrée (gateway) localhost:7000 Plus de précision avec cette vidéo :

Asp.net Core 2.2 : identity et roles

Vous avez commencé à coder votre API, celle ci est déjà bien avancé et vous vous demander comment la sécuriser ? La sécu avant tout, mais après le reste Si on était pro (pro pro), on aurait commencé par la sécu. Mais on aime coder pour avoir du résultat. Et la sécu… bon, ça attendra… Oui mais non. En fait cela n’a pas plus beaucoup d’incidence aujourd’hui avec Asp.net Core car peut importe l’ordre d’implémentation, le framework est tellement mature qu’implémenter la sécurité en phase finale ou primaire n’a que peut d’incidence… enfin en théorie. Microsoft propose un « model » de sécurité pour la gestion des utilisateurs (authentification et autorisation) de votre API basé sur ce qu’il appelle « Identity » et souvent couplé à EntityFramework pour plus d’efficacité. Oui mais, qu’en est t-il si notre base de donnée n’est pas SQL Server et que notre couche d’accès aux données n’utilise pas EntityFramework ? Mise en situation Cet article tente d’explorer le « User Management » à la sauce Microsoft, avec une couche à nous custom. Partons du principe que nous avons déjà un modèle de données, une base de données Oracle par exemple, une couche DAL déjà toute prête (avec ou sans mapper type Dapper) et un service d’abstraction. Ce dernier va faire du CRUD (Create, Read, Update, Delete) et j’ajouterai List, un CRUDL quoi. Dedans on un « équivalent » utilisateur (user) que l’on nommera Operator, qui possède un login (username) et un mot de passe (hashé). Voyons voir comment coupler notre système avec les fonctionnalités de gestion utilisateur de base d’Asp.Net Core Identity. Sous le capot Afin d’implémenter ce modèle, on va devoir respecter ces interfaces : C’est une couche d’abstraction qui va permettre de s’affranchir de comment la couche de données gère ses utilisateurs. Du moment que ça passe par une classe qui implémente l’interface IUserStore et IRoleStore, le reste on s’en fou. (enfin à vous de gérer l’implémentation quand même…) UserManager et RoleManager comme leurs noms l’indique vont faire le boulot, on est coté couche métier avec une logique qui va vérifier par exemple la complexité du password (basé sur une configuration préétablit). Controler de test Créeons un controler « Access » basique avec 3 actions, toute en Get : Noter que dans un premier temps les attributs [Authorize] sont commentés. Maintenant fait un run de votre WebApi et requêter ces urls : https://localhost:44389/api/Access https://localhost:44389/api/Access/Authenticated https://localhost:44389/api/Access/RoleAdmin Vous devriez voir afficher respectivement : Vous êtes autorisé (anonyme). Vous êtes autorisé car vous êtes authentifié. Vous êtes autorisé car vous êtes authentifié et Admin. Bien entendu ceci n’est qu’un test temporaire pour valider que vos actions répondent bien. Maintenant vous pouvez décommenter les attributs [Authorize] Maintenant, nous devrions avoir un code de retour 200 pour le 1er get, comme avant, car le fait d’ajouter [AllowAnonymous] ne change rien, il ignore tout les attributs [Authorize], mais il n’y en a pas ici. (il est utile si vous encapsuler tout le controler avec un [Authorize] et qu’une seule action peut être anonyme, donc sans authorisation particulière.) Par contre pour l’action GetAuthenticated et GetAuthenticatedRoleAdmin nous devrions avoir un code de retour 401 : Unauthorized (les codes http), or si vous refaites une requête c’est le code 500 : internal server error qui s’affiche. Voici ce que l’API Asp.net Core nous retourne : InvalidOperationException : No authentication Scheme was specified, and there was no Default Challenge Scheme found. En effet, nous n’avons rien fait jusqu’ici pour dire à l’API comment nous voulions gérer nos authentifications. Ajout d’un schéma d’authentification Dans Startup.cs ajoutons ceci : Ici vous définissez une identité de type Operator avec des rôles de type Role. (on verra ça plus tard). Maintenant ré-exécuter les deux dernières requêtes, vous allez obtenir une 302 : Redirection temporaire, qui nous amène si on à taper l’url dans un navigateur vers une nouvelle page : https://localhost:44389/Account/Login?ReturnUrl=%2Fapi%2FAccess%2FAuthenticated Ce comportement est géré par Asp.net Core. L’attribut [Authorize] indique au framework que la ressource demandé est soumise à authentification. Donc au lieu de répondre un 401 unauthorized comme je l’indiquais, Asp.net Core redirige directement l’utilisateur vers un controler Account sur l’action Login. C’est utile si notre page login est sur le même serveur. Sinon faudra revoir ce comportement. Notez le paramètre ReturnUrl. Il va nous servir à re-rediriger l’utilisateur sur la page initialement demandé si besoin après un sign-in correct.         Comment qu’on fait ? Tout d’abord, je vous conseille d’écrire qq tests avant de tout casser. Ils vont juste nous permettre de valider que nos modifications n’affecterons pas le comportement actuel. Pour utiliser le mode tout fait, dans le Startup.cs on ajoute le service suivant : Vous allez avoir besoin de Microsoft.Extensions.Identity.Core. Mais cette étape nous l’avons faite précédemment et on veut customiser la mécanique. C’est cette librairie qui va apporter les dépendances pour UserManager<T> et RoleManager<T>. UserManager fournit les APIs pour gérer l’utilisateur, comme le changement de mot de passe, la validation de mot de passe. Voici la liste de des dépendances nécessaire dans le constructor de UserManager : IUserStore<TUser> store: The persistence store the manager will operate over IOptions<IdentityOptions> optionsAccessor: The accessor used to access the IdentityOptions IPasswordHasher<TUser> passwordHasher: The password hashing implementation to use when saving passwords IEnumerable<IUserValidator<TUser>> userValidators: A collection of IUserValidator<TUser> to validate users against IEnumerable<IPasswordValidator<TUser>> passwordValidators: A collection of IPasswordValidator<TUser> to validate passwords against ILookupNormalizer keyNormalizer: The ILookupNormalizer to use when generating index keys for users IdentityErrorDescriber errors: The IdentityErrorDescriber used to provide error messages IServiceProvider services: The IServiceProvider used to resolve services ILogger<UserManager<TUser>> logger: The logger used to log messages, warnings and errors Ajoutons un Controler Account Le constructeur du controler prend en paramètre 4 classes qui viennent d’être instancier dans le Startup.cs. Ces dernières seront automatiquement injecté dans le controler à son instanciation. A partir de la vous n’avez plus qu’a coder des actions pour ce controler, la exemple HttpPost Login(string username, string password). Il faudra aussi implémenter les interfaces CustomUserStore : IUserStore et CustomRoleStore : IRoleStore qui seront couplé à votre service d’accès aux données. Personnellement, je ne suis pas allez plus loin, j’ai même fait marche arrière en se…

Nadine project using Asp.net Core 2.1 with SignalR, GPIO and Raspberry pi 3

This is a personal project. I wanted to discover Asp.net Core 2.1 and SignalR. I use a Raspberry pi 3 with an external board so I can easily plug cables and play with leds and buttons on GPIOs. Here is the goal : count on an input (Gpio 17) linked to a photo-electric cell the number of passage of a fake fabric bottle line, simulated here by one propal of an old usb fan. The signal is read on Gpio17 by the raspberry pi and sent via SignalR to a web client (which is also host on the same raspberry pi server, with asp.net core razor pages.) So I can read the counter on my web page in real time (almost). GIT source code : https://github.com/couscousbzh/Nadine Youtube Demo here : https://youtu.be/c3wAWcoAf0M What you need A Raspberry pi 3 + power A testing board + cables (https://www.amazon.fr/gp/product/B01I58Y766/ref=oh_aui_detailpage_o08_s00?ie=UTF8&psc=1) A case (optional https://www.amazon.fr/gp/product/B01KZ26LKA/ref=oh_aui_detailpage_o09_s00?ie=UTF8&psc=1) A SSH client (putty or mobaXTerm) A button (I use a little button on board and a eletric photo cell, but I guess you don’t have one…) Some cables How it works In Asp.net Core you can manage WebHost as usual (your web site) but you can add other host that can act like a service. This is what i’ve done. I create two services, webhost and a timehostedservice. If my english is not so bad, I understood that host and webhost services will be « Generic Host » in the future. So I guess this will change in the future. I notice some diffences when creating it. With webhost service you can configure it in one line (CreateDefaultBuilder) but there is no such thing for host. Anyway, all of this is coded in program.cs and startup.cs (this one is basically only used for webhost) Timehost is a loop, you set the frequence you’d like. I set a 1 ms loop. So every 1ms, I call a worker to do a job. Which is basically just to read Gpio 17 input state. I start the webhost first and then the timehost. Webhost takes time to launch. And if counting starts, it needs to connect to Hub and do a start connexion first. But if the webhost is not yet started, I have an error. So I delay the worker init to 10s. I know this is ugly, this is something I wanted to correct but I spent too much time. And by the way, i am not sure that running 2 services like that is the best solution. Maybe doing 2 separate projects with their own life is better. So I did not loose my time on this. Web Service (host) Basic project made with a « dotnet new webapp » cli command. Then I follow the microsoft guide line : https://docs.microsoft.com/fr-fr/aspnet/core/signalr/introduction?view=aspnetcore-2.1 this give me a little chat room exemple using SignalR. Then, I add a Counter Page. The goal of this is to simulate a counter (like a bottle counter sensor) and upload the value directly in client web page, using SignalR. Template Gentelella : https://github.com/puikinsh/gentelella npm init -y npm install @aspnet/signalr npm install gentelella –save dotnet build WARNING : all of my code use hard IP adresse 192.168.8.123, please change it to yours or add a dynamic system. GPIOs Service (host) Thanks to Jeremy Lindsay, I could use the GPIOs as I wanted. Here is some usefull links : https://jeremylindsayni.wordpress.com/2017/05/01/controlling-gpio-pins-using-a-net-core-2-webapi-on-a-raspberry-pi-using-windows-10-or-ubuntu/ https://jeremylindsayni.wordpress.com/2017/04/05/turning-gpio-pins-high-and-low-on-a-raspberry-pi-3-using-net-core-2-and-ubuntu/ https://jeremylindsayni.wordpress.com/2017/04/18/write-net-core-2-once-run-anywhere-hardware-access-on-raspberry-pi-3-with-ubuntu-and-windows-10-iot-core/ I copy some classes into /GpioManager folder. And my code is basically located into the worker class (/HostedServices/Worker.cs) Here is some usefull commands For Raspbian Debian 9 Jessie you need to do the following (only once): sudo apt-get update sudo apt-get install curl libunwind8 gettext apt-transport-https chmod 755 ./MyWebApp export ASPNETCORE_URLS= »http://*:5000″ export ASPNETCORE_URLS= »http://192.168.8.123:5000″ echo $ASPNETCORE_URLS ./MyWebApp WiringPi WiringPi is a lib for linux (not C#) this can be helpfull to check input status or manually set them. gpio readall gpio mode 0 in (0 match GPIO 17) gpio mode 2 in (2 match GPIO 27) gpio mode 5 out (5 match GPIO 24) Deploying Deploy Asp.net Core 2.1 https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md#linux On dev environnement : dotnet publish -c Release -r linux-arm copy publish folder content to RapsberryPi or I wrote some powershell script that can helps to deploy in one command line. .\ps-deploy-raspian.ps1 -ip 192.168.8.123 -destination « /home/pi/Dotnet/Nadine » -username pi sudo ./home/Dotnet/Nadine/Nadine

Réalité Augmentée avec Unity et Vuforia

  Ça faisait bien un an que j’avais en stock une formation sur Unity. Et depuis l’auteur en a fait d’autre dont une sur la réalité augmenté avec Vuforia sur Unity. Alors ce coup ci, j’ai pas reporté. Je me suis lancé. J’avais en tête un projet de chasse au trésor en réalité augmentée, que j’ai réfléchi en été 2017. J’ai été voir quelques entrepreneurs du jeu. L’idée était de trouver un partenaire pour créer un jeu, un concept, des idées etc, et moi je m’occupais de la technique. D’ailleurs c’est toujours d’actualité ! Un organisateur de rallye, chasse au trésors et jeu de rôle, avec qui j’avais fait une étape de rallye à Rennes. C’était sympas.Le gars n’avait pas l’air branché informatique, je lui ai proposé mes services et un éventuel partenariat. J’ai pas sentit une vive émotion on va dire… J’ai aussi été voir « Terre de jeu », un magasin de jeu de société dont certains employés ont aussi une société d’organisation de jeu de rôle, murder party, etc. C’est leur boulot donc il voulait me vendre leurs prestations, ce qui ne m’intéressait pas, moi je souhaitais développer un nouveau concept. Donc on était pas sur un rapport de collaboration. Enfin j’ai été tâter une escape room à Rennes. Histoire de voir si je pouvais rencontrer des créateurs de salle. J’ai écris à deux personnes dans le tourisme (pays de Brocéliande et j’ai oublié l’autre), pour voir si de ce côté la on pouvait trouver des gens motivés.. J’en suis resté la. J’ai lancé une bouteille à la mer et j’attends toujours qu’elle soit trouvée.J’ai eu pas mal de taff depuis, je n’ai donc pas travaillé le sujet, mais la j’ai un peu de temps libre.   1 La réalité augmentée (Augmented Reality = AR). Je trouve que pour illustrer l’AR un bon exemple est celui d’Ikea et son catalogue que l’on pose au sol. Celui ci sert de référence pour l’application qui va permettre de modéliser sur le smartphone une représentation 3D d’un meuble que l’on souhaite voir dans sa maison.   Mais ce n’est qu’un exemple. On a vu grâce au jeu Pokeman Go qu’on peut aller beaucoup plus loin. Au delà du jeu, cette technologie intéresse de plus en plus le secteur de l’industrie ou les services. Il faut distinguer la réalité augmenté, qui consiste à ajouter du contenu dans une vue « réelle » (la caméra de votre smartphone), à la réalité virtuelle, qui elle n’est qu’un monde digitalisé (en 3d ou 2d). On peut aussi parler de réalité mixte. C’est du moins le point de vue de Microsoft avec leur Hololens, qui associe les deux et permet surtout l’interaction d’un univers virtuelle dans un univers réel. (comme par exemple lancer une vidéo sur votre mur en faisant un signe de la main, votre main est réelle, la vidéo est virtuelle, cependant vous la voyez sur un mur réel).   2 Unity Wikipédia : Unity est un moteur de jeu multi-plateforme (smartphone, Mac, PC, consoles de jeux vidéo et web) développé par Unity Technologies. Il est l’un des plus répandus dans l’industrie du jeu vidéo, du fait de sa rapidité aux prototypages pour les très gros studios, aussi pour la sphère du jeu indépendant qui développe directement dessus pour sortir leurs applications sur tout support Il a la particularité de proposer une licence gratuite dite « Personal » sans limitation au niveau du moteur. Unity utilise un éditeur de script compatible mono (C#) Donc Unity est un éditeur de jeu vidéo de plus en plus populaire. Moi il m’intéresse notamment par sa compatibilité C# et son portage sur plusieurs plateformes dont Windows, iOS et Android, mais aussi Playstation, Xbox,  Nintendo, Oculus Rift… Je ne suis pas expert dans ce milieu, d’un point de vu gamer je préfère le rendu du moteur Unreal Engine.D’un point de vu pro, Unity m’attire, sans avoir vraiment suffisamment de référence pour être certain de faire le bon choix. Les deux ont un intérêt. Voici une petite vidéo qui expliquera mieux que moi les différences :   3 Vuforia Vuforia est une plateforme dédiée à la réalité augmentée qui s’intègre parfaitement dans Unity. Ces deux outils vont nous permettre de créer des applications qui vont faire appel au moteur 3d Unity pour le rendu graphique et à Vuforia pour la réalité augmentée. Vuforia est la passerelle entre le monde réel et la version digitale que vous allez apporter à celui ci. Cette plateforme permet de reconnaitre des objets de votre entourage, des images, texte, le sol… A part pour le sol (encore bêta il me semble) qui ne nécessite aucune action préalable, les objets doivent être « scanner » avant d’être importés dans Unity comme « marker » afin d’être reconnu par Vuforia dans votre application. 4 AR avec une image L’exemple le plus simple est celui d’une image. Pour ma part j’ai pris ma carte de visite. J’ai envoyé son jpeg sur la plateforme (on peut en envoyer plusieurs). La plateforme analyse l’image et donne un score sous forme de 5 étoiles : Nous reste plus qu’à importer la base de donnée Vuforia et à l’importer dans notre projet Unity. En appliquant un cube 3D lorsque le marker (ma carte de visite) est détecter, on obtient ceci : 5 AR avec un objet réel Vuforia permet de scanner un objet réel de votre entourage pour le « modéliser » en 3d. On aura donc moyen par la suite, de la même manière que précédemment, d’identifier notre objet dans notre application pour ensuite faire ce que l’on veut. J’ai tenté de scanner un objet chez moi. Mais il faut une bonne lumière et un espace dégagé. Sur le moment j’avais un peu de mal a scanner mon objet correctement. Je suis passé à la suite car je n’avais pas vraiment d’intérêt sur l’instant. 6 AR et jeu vidéo Voici deux exemples d’application que j’ai réalisé grâce au cours que j’ai suivis (https://www.udemy.com/realite-augmentee-avec-unity-2017-et-vuforia/learn/v4/overview) :     Le jeu VuCarPark est un petit de parking. Le but est de garer une voiture…

App Android Perso

[vc_row margin_top= »-30″ margin_bottom= »15″][vc_column offset= »vc_col-lg-8 vc_col-md-8 vc_col-xs-12″][vc_empty_space height= »40px »][vc_column_text] Trésors de Bretagne [/vc_column_text][vc_empty_space height= »16px »][vc_column_text]Petite application Android personnelle listant les monuments et lieux intéressants prêt de chez nous, en Bretagne. https://play.google.com/store/apps/details?id=fr.reactor.breizhmap[/vc_column_text][vc_empty_space height= »30px »][vc_column_text]Tâches effectuées :[/vc_column_text][vc_empty_space height= »16px »][vc_column_text][dt_list style= »1″ bullet_position= »top » dividers= »false »][dt_list_item image= » »]Conception/Design.[/dt_list_item][dt_list_item image= » »]Integration/Animation.[/dt_list_item][dt_list_item image= » »]Développement C# Xamarin.[/dt_list_item][dt_list_item image= » »]Lead dev/ops.[/dt_list_item][/dt_list][/vc_column_text][vc_empty_space height= »30px »][/vc_column][vc_column offset= »vc_col-lg-4 vc_col-md-4 vc_col-xs-12″][vc_empty_space height= »40px »][vc_column_text] Techniques [/vc_column_text][vc_empty_space height= »16px »][vc_progress_bar values= »%5B%7B%22label%22%3A%22D%C3%A9veloppement%20C%23%20Xamarin%20Android%22%2C%22value%22%3A%2290%22%7D%5D » options= »striped,animated » caption_pos= »top »][vc_empty_space height= »40px »][/vc_column][/vc_row]

Enfin un livre en français sur Xamarin Forms !

  Ca y est, un livre est sortie, le 22 aout, en français sur la techno Xamarin. Ecrit par Olivier Dahan, MVP Microsoft. http://www.e-naxos.com/Blog/post/Rappel-Xamarin-Forms-ENFIN-LE-LIVRE-EN-FRANCAIS-!.aspx Ce livre est pas donné (comme tous les bouquin de tech), mais au dire de l’auteur, il ne se fait pas beaucoup d’argent avec. Et on peut le croire, car il est l’auteur d’une remarquable série de pdf, gratuit, que je vous recommande : http://www.e-naxos.com/AllDotBlog.html Je vais sans doute m’appuyer sur ce bouquin pour mes prochains articles. Alors un peu de pub pour son auteur n’est qu’un juste retour des choses.

Xamarin iOS retour d’expérience

  Vous avez tous pu constater le buzz récent autour de Xamarin. J’étais à deux doigts d’acheter une licence iOS qui m’aurait couté dans les 700€. Un brave de chez Xamarin m’a conseillé d’attendre la build de Microsoft, ce que j’ai fait. Un grand merci à ce monsieur de chez Xamarin sans quoi j’aurai été bien bien vénère, il m’a fait économiser beaucoup… Xamarin est donc gratuit ! Et c’est une excellente nouvelle. Car sans ça, les étudiants, les amateurs, les petit auto-entrepreneur comme moi voir même quelques TPE aurait bien eu du mal à se lancer sur cette techno. Microsoft rachète donc Xamarin et l’offre dans toutes ses éditions Visual Studio 2015 (community, pro et entreprise). Par contre le reste des offres de Xamarin, à savoir les cours via l’university Xamarin et son centre de test restent payant. Je comprends que Xamarin doit trouver son modèle économique, mais maintenant que Microsoft est derrière, j’espère que les cours seront gratuit. D’autant plus qu’ils font des efforts fou pour que les développeurs codent pour Microsoft. Donc pourquoi faire payer des cours sur une technos qui permettrait d’universaliser nos apps, dont celle sur WUP. Bref, l’academy de Microsoft est gratuite, j’imagine qu’a terme on aura des cours Xamarin dessus aussi. Autre bonne nouvelle, c’est l’arrivé depuis qq jours du simulateur iOS sur Windows. Oui oui, j’ai bien dit un simulateur iOS sur Windows. Il est inclu dans la version stable de Xamarin depuis début juin 2016. Je l’ai testé en version alpha puis stable depuis un mois. Et ca marche plutôt bien ! 1) Situation J’ai donc testé Xamarin iOS. J’ai une application (Trackus) que je développe depuis maintenant 2 ans sur divers plateformes (Windows Phone, Android, Web App, WUP), mais il me manquait iOS. Comment faire ? – Choix 1 : natif (Objective C ou Swift). Je préfère en générale cette approche. Coder en natif permet d’apprendre pas mal de chose, d’avoir des ressources (docs, communauté, billet Stackoverflow…). Mais ici je n’avais même pas le matériel. Et chez Apple ça coute un bras. De plus il faut tout réapprendre. Je bosse sur Windows depuis toujours. Et le mac… je connais pas ou mal. Je galère pour faire des trucs tout simple. Mon temps d’apprentissage va devoir impacter en plus l’OS et les outils de l’OS. Ca fait beaucoup pour un noob. – Choix 2 : Hybride (Cordova, Ionic). Pourquoi pas. J’ai passé un mois à me former sur AngularJS, Ionic aurait été un choix. Mais mon application nécessite de tourner en background, utilise des maps et le GPS… J’ai des doutes sur la fiabilité de tout cela en hybride. Peut être ai-je tort. Cela pourrait être un sujet prochain. Je n’ai pas vraiment étudier la question à fond. – Choix 3 : Xamarin iOS. C’est mon choix. Plus par curiosité qu’autre chose. Je suis les divers évolutions de Xamarin et le ressenti des développeurs. Cette techno est prometteuse. Mais dans les faits ? – Choix 4 : Xamarin Forms : autre solution, non étudié. Je voulais d’abord me rapprocher du natif et aborder éventuellement Xamarin Forms plus tard. Pour info, mon application (http://trackus.reactor.fr) propose de géo-localiser un utilisateur A et de permettre à un utilisateur B de le suivre sur une carte. J’utilise pour cela un code alphanumérique sur 6 chiffres qui va identifier un parcours. L’utilisateur A envoi ce code à l’utilisateur B qui peut alors suivre sa trace. Ce code est modifiable ce qui permet de garder un certain anonymat. J’ai donc un serveur qui permet d’échanger ces informations (Web API2 + Entity-Framework). Voici les apps déjà en prod (bêta): Web App : http://trackus.reactor.fr/pages/observer.html?code=AAAAAA Windows Phone (Silverlight) : https://www.microsoft.com/fr-fr/store/apps/trackus/9nblgggxzpg7 Windows 10 : https://www.microsoft.com/fr-fr/store/apps/trackus-10/9nblggh5xq6q Android : https://play.google.com/store/apps/details?id=fr.reactor.trackus Je trouve le sujet intéressant car il aborde d’autre sujet que la classique “liste de tâches” ou le flux RSS qu’on affiche en liste. Ici on a du GPS (droits utilisateurs), du offline/online à gérer (perte de réseau pendant un déplacement, stockage des données, gestion http REST), une tâche en background (cycle de vie) et la manipulation de maps (iOS, Google, Bing). Bref ya du boulot mine de rien. 2) à fond les ballons On y va on code. Ha oui, mais attends, d’abord le matériel… Peux importe ce que vous faites, si vous créez une app pour iOS il vous faudra un mac. Si vous êtes un peu short, il existe des solutions comme MacInTheCloud qui vous permet de louer un mac sur internet. Mais vous ne pourrez faire que du simulateur car impossible de brancher un device physique sur la machine. Sinon vous achetez un mac. Un mac mini fera l’affaire. J’ai acheté le mien sur le bon coin. Une pure affaire. Ca part comme des petits pains, donc sauter sur l’occasion. Vous avez donc un poste Windows, un poste Mac, branché sur le même réseau. C’est parti. Faut tout installer. Yen a pour un moment si comme moi vous tourner max à 2 Mbps (oui ca existe encore !). Il faut installer Xamarin sur le mac et installer Visual Studio 2015 update 2 + le kit simulateur. Tout est dis sur le site de Xamarin : https://developer.xamarin.com/guides/ios/getting_started/installation/ https://developer.xamarin.com/guides/cross-platform/windows/ios-simulator/ Quand tout est installé il faudra créer un projet iOS et tester la connexion avec le Mac (agent de build) Il faut que votre icone  soit verte. Sans ça pas de connexion avec le mac, donc pas de build ni de simulateur. Dans l’ensemble le setup se fait pas trop mal. Xamarin améliore grandement la simplicité car avant il fallait gérer l’agent de build à la main (voir précédent post sur le sujet). 3) Les mains dans le cambouis J’ai travaillé essentiellement sur Visual Studio avec le simulateur. Ce dernier propose pas mal de petites options intéressantes. Il y a même un simulateur de déplacement (à pied, en vélo et en voiture) ce qui permet de tester le GPS. Idéale dans mon cas. Il manque cependant un bouton pour couper le réseau ou un “dégradateur de réception 3G/4G” histoire de tester…

Retour d’expérience sur Angular JS + Web API 2 + Oauth2

    Démo live Listy : http://listy.reactor.fr Pour la petite histoire, on m’a demandé de faire un devis concernant une application web. Normalement on ne commence pas le travail tant qu’on a pas un acompte et surtout un cahier des charges bien ficelé. Surtout lorsque le client n’est au final plus trop sur de lui… qu’il doit réfléchir. Bref vous l’avez compris, j’ai travaillé à perte. Mais j’ai beaucoup gagné en compétence… En effet le sujet est simple : créer une liste d’envie sur internet. Il en existe déjà quelques une plus ou moins abouties. Le principe consiste à faire une liste de course avec des liens web et de sortir une liste au final à partager avec ses amis. Au premier abord, pas un énorme intérêt. Dans mon cas personnel j’adhère à l’idée pour noël, au lieu d’acheter des cadeaux pourris (chose que l’on fait quand même pour le fun), on se fait une liste d’objets utiles ou qui peuvent nous intéresser, chacun s’organisant comme il veut pour offrir le ou les cadeaux en question. J’avais besoin d’un projet comme celui ci pour enfin me former sur Angular. Entre temps j’ai fait une conf sur Angular 2 et bon… je tombe mal on va dire. Mais l’expérience en valait la peine. Ici je vais vous présenter ce que j’ai fait, les méthodes utilisées, les softs, plateformes… et surtout ce qui m’a posé problème en vous donnant les solutions. 1) Architecture :   Je voulais une architecture qui me permet de totalement découpler les services de l’application. Un peu d’historique : 1) Il y a quelques années, et ça se fait encore bien sur, on avait un site web (Asp.net WebForm) hébergé sur un IIS qui avait sa propre base de donnée. Du all in one. Très pratique. En effet pour accéder aux données on pouvait directement taper dans la BD pour afficher une donnée. Depuis les développeurs ont structuré leurs applications en ajoutant des couches, notamment la couche d’accès aux données (DAL) et une couche métier. Avantage : plus propre, réutilisable, maintenance plus simple, on peut changer de BD sans tout péter…Inconvénient, plus compliqué pour un débutant, plus de code donc un peu plus lourd à maintenir (oui c’est aussi écrit en avantage…) 2) On a vu ensuite apparaitre dans Visual Studio le modèle MVC. Depuis on ne parle que de lui. D’ailleurs j’ai cru lire quelque part que Microsoft allait laisser tomber WebForms dans ces prochaines versions de Visual Studio. J’ai personnellement mit du temps à m’y mettre. C’est une autre façon de concevoir son application qui a aussi ses avantages et inconvénients. Mais l’intérêt majeure face aux WebForms, c’est que l’on peut y faire des tests. J’en parlerai pas ici, c’est pas mon fort. La encore on avait tendance à accéder aux BD directement, soit en mode crado, soit via une couche. 3) Puis les sites webs ont proposé des fonctionnalités que l’on aurait bien vu dans nos mobiles, dans une application. Problème : comment accéder à nos données ? Sur le site web, on a quelques éléments de sécurité et fonctionnalités « intégrés » de façon native (la session, le système de fichier, droit utilisateurs, …) ce que j’appelle du all in one. Mais la le client, c’est à dire l’application mobile est totalement déconnecté de mon environnement de production. Qui plus est, sur un OS potentiellement différent et potentiellement dangereux, pas stable, hostile… pire entre les deux on a INTERNET le mal absolut si j’en crois mon ancien employeur Jaques Séguéla… Qui depuis à compris qu’il pouvait se faire du blé alors il a changé d’avis. Bref, comment faire ? Pour cela un web service était nécessaire. Jusque la j’avais travaillé avec SOAP. Mais bon SOAP c’est pas vraiment une archi, c’est plutot un protocole. Et puis SOAP c’est chiant. Depuis on ne parle plus (ou presque) que de REST. REST (Representational State Transfer) comme son nom ne l’indique pas est sans état (en fait dans le titre on parle d’état d’une ressource, et non de l’application). Ceci à des conséquences pour l’expérience utilisateur, surtout pour les « sessions » car en faite il n’y en a pas ! Vous pouvez laisser votre application dans un état et la retrouver dans le même état quelques temps après. En général, par exemple avec Asp.net WebForm, votre temps de sessions par défaut était de 20 min. Les développeur avait tendance à stocker pas mal de chose dedans. C’était très pratique mais on perdait tout ou presque à la fin de session (sauf bricolage ou stockage en BD). Ici pas de session. Cela va avoir un impact pour la sécurité de nos données (nous le verrons plus tard). Mais surtout, enfin pour moi, l’expérience utilisateur va en être affecté positivement : suivant le niveau de sécurité voulut, on peut maintenir un équivalent « session » sur plusieurs heure, voir jour. Comme sur Facebook ou l’on a pas besoin de se reconnecter toutes les heures. Un autre intérêt de REST c’est qu’au niveau maintenance et évolution des serveurs c’est plus simple à gérer. Mais le gros gros intérêt de REST, c’est qu’il vous permet de gérer n’importe quel type de client. Ici nous parlerons d’un client web Angular.js, mais rien ne vous empêche de créer une app Native Android ou un client Windows 10, le serveur n’aura besoin d’aucun update ! Il est prêt pour tout, ce qui change du tout au tout par rapport à un site php ou asp.net. (moins vrai avec la dernière version d’Asp.net qui combine MVC et API2) Coté client la encore, de la souplesse. J’utilise Angular principalement pour des raisons de formation, mais aussi pour éventuellement reprendre ce code et l’utiliser avec Ionic ! Ce formidable framework est basé sur Angular et propose de déployer son app, grâce à Cordova, sur plusieurs OS mobile comme iOS, Android ou Windows Phone. Donc vous l’aurez compris, utiliser ce genre d’architecture permet de voir loin ! 2) La construction Pour l’IDE, j’ai opté pour Visual Studio 2015, normal vu que je…

MangoPay – Une API de gestion de paiement sur internet.

MangoPay est une solution de gestion de paiement sur internet, l’équivalent de son homologue US Paypal mais, cocorico, cette solution est Française. Enfin presque, car la société est basée à Luxembourg… En même temps pour une « pseudo » banque, cela reste logique. En effet MangoPay est une banque qui n’en est pas une. C’est plutôt un intermédiaire qui facilite les paiements et s’assure (avec les vraies banques) que les paiements soient effectués. En anglais on appelle cela un « Escrow » (sans déconner !). Un opérateur tiers.    Donc un « Escrow » ne se traduit pas par « escroc » (escrow vient du vieux français escroue, qui signifiait « bout de parchemin ») mais plutôt par « dépôt », « compte bloqué ». Il faut le voir comme un intermédiaire entre les clients de votre site e-commerce et les banques de ces clients. MangoPay permet à de jeune startup de créer un porte-monnaie virtuel en marque blanche. Bien évidement une commission est prélevée (1.8% + 0.18€ –> détail)   MangoPay se veut être une plateforme de paiement en ligne pour les Marketplaces, les plateformes collaboratives et les sites de crowdfunding. Bien évidement les workflows ne sont pas les mêmes suivant ces cas. En ce qui me concerne, je vais m’intérresser aux modèles des sites e-commerces. Ma problématique est de mettre en relation client et acheteur, tout en garantissant que l’acte d’achat se déroule proprement. Ceci implique de gérer le suivis des livraisons et des retours, voir même les échanges physiques réel.   Pour cela je vais utiliser l’API de MangoPay. Comme je vais devoir manipuler de l’argent, des cartes de crédits, des porte-monnaies, MangoPay met en place deux environnements, la production classique et le mode sandbox. C’est sur ce dernier que je vais tester mon application. En plus d’être « fictif » il permet de tester des cartes bancaires factice et donc d’ajouter de l’argent sur les portes-monnaies virtuels de mes utilisateurs, en ne déboursant pas un rond !   Mises en place de l’API – Inscription   https://docs.mangopay.com   Vous devez créer deux comptes, un pour la prod (pour plus tard, quand vous serez prêt) et un pour la sandbox. Je vous conseil de faire les deux tout de suite, comme ça c’est fait, et vous allez conserver ses informations dans votre coffre-fort.    Rendez vous sur cette page https://docs.mangopay.com/api-references/start-in-production/ pour l’inscription en prod, et sur cette page https://docs.mangopay.com/api-references/sandbox-credentials/ pour l’inscription en mode sandbox.   On vous demandera de créer un clientId, de donner le nom de votre société et un email (choisir aussi la monnaie Euro). L’important c’est d’avoir un email valide (pro de préférence) et un clientId que vous allez utiliser par la suite dans l’API. Vous allez ensuite valider votre inscription et recevoir un mot de passe (passphrase). NOTEZ ces informations et conservez les !   Ça y est, vous avez créé vos accès à l’API, maintenant passons à la doc.   Les bases de l’API :   Bien sur il faut se référer avant tout à la doc online. Plutôt bien faite, du moins il y a bcp d’info, mais pas forcément affiché dans le bon ordre selon moi. Ce n’est que mon avis, mais je vous propose de regarder ces pages dans cet ordre (cas e-commerce) :   https://docs.mangopay.com/marketplace-workflow/ (workflow pour les sites e-commerce) https://docs.mangopay.com/api-references/ (vous donne l’ensemble des requêtes possible) https://docs.mangopay.com/mangopay-dashboard/ (accès au dashboard)   Et arrêtez-vous la pour l’instant. Créez vous un accès sur le dashboard Sandbox et familiarisez vous avec quelques minutes. Il est vide à ce stade donc pas grand chose à voir.    L’important ici est de comprendre à quoi sert MangoPay et ce que vous voulez en faire. Ou trouvez l’information, les ressources et savoir utiliser les outils disponibles (dashboard).    Le code C#   L’Api fonctionne avec l’architecture REST. Les avantages : simple, sans état : indépendance client-serveur, pas de session, représentation compréhensible sous forme d’URI. Les inconvénients : le client doit conserver certaines données, augmentation du nombre de requêtes.    Une des pages de la doc conseille de commencer par créer un utilisateur (user), puis de lui associer un porte-monnaie (wallet). C’est ce que je vais vous montrer, mais en créant plutôt deux utilisateurs : John et Julie.    Tout d’abord, vous devez télécharger le SDK de votre langage de programmation préféré. Le SDK MangoPay est disponible sur GitHub en PHP, Python, Ruby, Java, .Net et JavaScript. Je vais continuer l’article en m’appuyant sur le SDK .net, mais sachez les noms des méthodes sont les mêmes dans toutes les versions (attention, j’ai pas tout vérifié), et parfois avec les mêmes fautes d’orthographe ! (ceci ma permit d’en conclure qu’effectivement le code est fortement similaire)     https://github.com/MangoPay   Note: j’ai commencé par utiliser la version compilé du package SDK .net dans une solution WebForm Asp.net. J’ai eu des soucis lors de l’exécution sur les libs Common.Logging.Core.dll et Common.Logging.dll. J’ai pas compris pourquoi alors j’ai téléchargé le code source de MangoPay.SDK et j’ai ajouté/créé un projet web directement dans leur solution. Ça compile et ça s’exécute correctement. Mais mieux, dans la solution fournit par le SDK on a un projet de Test, c’est une mine d’or pour comprendre comment fonctionne l’API. Je vous conseille fortement d’aller y faire un tour. J’ai autant appris avec les tests qu’avec la doc sur internet.    Il faut pour cela instancier l’API et lui passer les paramètres suivant :   MangoPayApi api = new MangoPayApi (); api.Config.ClientId = « myClientId » ; api.Config.ClientPassword = « XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX » ;   L’objet ‘api’ dispose d’une autre propriété importante : api.Config.BaseUrl. Par défaut c’est l’url de la SandBox. Donc si vous ne la spécifiez pas, vous serez par défaut sur le serveur de test.    Pour créer un utilisateur, voici les quelques lignes de code :   UserNaturalPostDTO user = new UserNaturalPostDTO (« john.doe@sample.org » , « John » , « Doe » , new DateTime (1975, 12, 21, 0, 0, 0), CountryIso.FR, CountryIso .FR); user.Occupation = « programmer » ; user.IncomeRange = 3; user.Address = « Some Address » ;   UserNaturalDTO john = api.Users.Create(user);   Remarque : MangoPay distingue deux types d’utlisateur, les UserNatural et les UserLegal. Pour faire simple, UserNatural est un utilisateur lambda, le client de base et UserLegal une personne morale, représentant une société. Ceci m’amène à vous parler du KYC Concept de MangoPay. KYC signifie « Know Your Customer », « Connais ton client ». Bon tout ça découle certainement de directive Européenne et est en lien étroit avec la lutte contre la fraude, le blanchiment d’argent et le financement du terrorisme (rien contre l’évasion fiscale ? étonnant…) Du coup MangoPay distingue…