Articles

La longue route vers les threads virtuels Java

.

Explorer les threads virtuels Java peut être une route longue et difficile, mais avec un peu de persévérance, les résultats en valent la peine!

Il a fallu presque 30 ans. L’introduction de Threads Virtuels Java 1.21 rendra enfin le multitâche presque sans effort dans Java. Pour pleinement apprécier leur nature révolutionnaire, il est utile de jeter un coup d’œil aux diverses solutions imparfaites offertes par Java au fil des ans pour résoudre le problème « faire un travail utile pendant que nous attendons autre chose ».

Il a fallu presque 30 ans. L’introduction de Threads Virtuels de Java 1.21 rendra enfin la multitâche dans Java presque sans effort. Pour pleinement apprécier leur nature révolutionnaire, il est utile de jeter un coup d’œil aux différentes solutions imparfaites offertes par Java au fil des ans pour résoudre le problème «faire un travail utile pendant que nous attendons autre chose».

Java 1 

L’introduction de Java version 1 en 1995 était remarquable. Un langage fortement typé, orienté objet et syntaxe similaire à C qui offrait de nombreuses fonctionnalités, y compris des Threads faciles à utiliser. La classe Thread représentait un objet qui exécuterait le code sélectionné dans un thread séparé du thread d’exécution principal. L’objet Thread était lui-même un wrapper pour un thread de niveau système d’exploitation réel connu sous le nom de thread de plate-forme, également appelé thread noyau. La logique à exécuter était décrite en implémentant une interface Runnable. Java s’occupait de toute la complexité du lancement et de la gestion de ce thread séparé. Maintenant, il sera presque trivial d’effectuer plusieurs tâches simultanément, ou du moins c’est ce qu’il semblerait. Considérez l’exemple suivant:

Les limites des threads

Malgré tous les avantages qu’offre Java, les threads ont leurs limites. Les threads sont très coûteux à créer et à gérer, et leur utilisation peut entraîner une surutilisation des ressources système et une augmentation des temps de latence. De plus, les threads ne peuvent pas être partagés entre plusieurs processus, ce qui signifie que le code doit être dupliqué pour chaque processus et gère indépendamment. Cela peut entraîner des problèmes de cohérence et de synchronisation entre les threads et les processus.

Pour résoudre ces problèmes, Java a introduit un certain nombre de solutions, notamment les threads légers, les threads poolés et les futures. Bien que ces solutions aient permis d’améliorer la gestion des threads, elles n’ont pas réussi à résoudre tous les problèmes liés à la gestion des threads et à l’utilisation des ressources système.

Cependant, avec l’introduction des Threads Virtuels de Java 1.21, ces problèmes sont enfin résolus. Les Threads Virtuels sont une solution plus efficace pour la gestion des threads qui offre une meilleure utilisation des ressources système et une meilleure gestion des threads. Les Threads Virtuels sont basés sur le concept de «threads légers» qui permettent aux développeurs de créer et de gérer facilement des threads sans avoir à se soucier des coûts associés à la gestion des threads. De plus

Source de l’article sur DZONE

Discussions limitées avec systèmes distribués.

Les systèmes distribués offrent des discussions limitées, mais avec des avantages considérables pour les utilisateurs.

L’art d’équilibrer le contrôle et l’accessibilité

Database

The Airport realized that they needed to balance control and accessibility. To do this, they created a database with all the information related to the flight. This database included the flight number, arrival time, departure time, and the number of passengers. This allowed the Airport to have a better understanding of the situation and to make better decisions. For example, they could decide which flights should be parked closer to the terminal building and which ones should be parked further away. This way, they could ensure that passengers had a shorter wait time for their luggage.

Conclusion

Houston Airport was able to solve their problem by reframing it and creating a database. By balancing control and accessibility, they were able to make better decisions and reduce the wait time for passengers. This is a great example of how technology can be used to solve real-world problems. It is also a reminder that sometimes the best solution is not always the most obvious one.

Contexte

L’aéroport de Houston avait un gros problème : les passagers se plaignaient du temps qu’il fallait pour que leurs bagages arrivent à la salle d’embarquement après l’atterrissage de l’avion. L’aéroport a investi des millions pour résoudre ce problème et améliorer le processus, embaucher plus de personnel et introduire de nouvelles technologies. Ils ont finalement réussi à réduire le temps d’attente à 7 minutes mais les plaintes continuaient. L’aéroport a alors réalisé qu’ils étaient arrivés à un point où l’optimisation du processus/design n’était plus optimale. Ils ont alors fait quelque chose de différent : ils ont reformulé le problème.

Base de données

L’aéroport a compris qu’il devait trouver un équilibre entre le contrôle et l’accessibilité. Pour cela, ils ont créé une base de données contenant toutes les informations liées aux vols : numéro de vol, heure d’arrivée, heure de départ et nombre de passagers. Cela leur a permis d’avoir une meilleure compréhension de la situation et de prendre de meilleures décisions. Par exemple, ils pouvaient décider quels vols devaient être stationnés plus près de la salle d’embarquement et lesquels devaient être stationnés plus loin. Ainsi, ils pouvaient s’assurer que les passagers attendent moins longtemps pour récupérer leurs bagages.

Conclusion

L’aéroport de Houston a pu résoudre son problème en reformulant le problème et en créant une base de données. En trouvant un équilibre entre le contrôle et l’accessibilité, ils ont pu prendre de meilleures décisions et réduire le temps d’attente des passagers. C’est un excellent exemple de la façon dont la technologie peut être utilisée pour résoudre des problèmes du monde réel. C’est également un rappel que parfois, la meilleure solution n’est pas toujours la plus évidente.

Source de l’article sur DZONE

Réduire les Hallucinations LLM

Réduire les Hallucinations LLM est une tâche difficile, mais pas impossible. Nous allons découvrir ensemble les moyens pour y parvenir.

LLM Hallucination : Les Effets de l’IA Générative

One approach to reducing AI hallucinations is to simplify the architecture of the model. This involves reducing the number of layers and neurons, as well as reducing the complexity of the activation functions. Additionally, regularization techniques such as dropout and weight decay can be used to reduce overfitting. 

L’hallucination LLM fait référence au phénomène où de grands modèles linguistiques tels que des chatbots ou des systèmes de vision informatique génèrent des sorties non sensées ou inexactes qui ne correspondent pas aux vrais modèles ou objets. Ces faux résultats de l’IA proviennent de divers facteurs. Le surajustement à des données d’entraînement limitées ou biaisées est un grand coupable. Une grande complexité du modèle contribue également, permettant à l’IA de percevoir des corrélations qui n’existent pas.

Les grandes entreprises qui développent des systèmes génératifs d’IA prennent des mesures pour résoudre le problème des hallucinations de l’IA, bien que certains experts pensent que l’élimination complète des faux résultats ne soit pas possible.

Une approche pour réduire les hallucinations de l’IA consiste à simplifier l’architecture du modèle. Cela implique de réduire le nombre de couches et de neurones, ainsi que la complexité des fonctions d’activation. De plus, des techniques de régularisation telles que le dropout et le déclin des poids peuvent être utilisées pour réduire le surajustement.

Source de l’article sur DZONE

Développement Dirigé par l'Observabilité pour LLMs

Le développement dirigé par l’observabilité (DDO) est une approche innovante pour améliorer le développement et le déploiement des logiciels à base de microservices et de logiciels légers (LLMs).

Notre industrie est à ses débuts d’une explosion dans le logiciel utilisant les MLM, ainsi qu’une (séparée, mais liée) révolution dans la façon dont les ingénieurs écrivent et exécutent du code, grâce à l’intelligence générative.

Data is the key to unlocking the potential of this new world. Without data, LLMs and generative AI are nothing more than empty promises. Data is the fuel that powers the engine of ML-driven software development. It is the lifeblood of our industry, and it is essential that we understand how to use it effectively.

Nous sommes à l’aube d’une explosion du logiciel utilisant des modèles d’apprentissage automatique (MLM) et d’une révolution de la façon dont les ingénieurs écrivent et exécutent le code, grâce à l’intelligence artificielle générative.

De nombreux ingénieurs logiciels rencontrent pour la première fois les MLM, tandis que de nombreux ingénieurs en apprentissage automatique sont directement exposés pour la première fois aux systèmes de production. Ces deux types d’ingénieurs se retrouvent plongés dans un nouveau monde déroutant – un monde où un problème de production particulier qu’ils ont peut-être rencontré occasionnellement dans leur carrière est maintenant au centre de l’attention.

Les données sont la clé pour déverrouiller le potentiel de ce nouveau monde. Sans données, les MLM et l’intelligence artificielle générative ne sont rien de plus que des promesses vides. Les données sont le carburant qui alimente le moteur du développement logiciel basé sur l’apprentissage automatique. C’est le sang vital de notre industrie et il est essentiel que nous comprenions comment l’utiliser efficacement.

Source de l’article sur DZONE

Votre base de code est un garage encombré.

Votre mission: le nettoyer!

Vous êtes prêt à relever le défi? Alors, allons-y! Débroussaillons ce garage encombré et transformons-le en une base de code bien organisée.

## Code inutilisé ajoute du temps et une charge pour maintenir la base de code et le retirer est le seul remède pour ce côté de « plus de cloche ». Malheureusement, il n’est pas toujours évident que les développeurs peuvent supprimer certain code sans casser l’application. À mesure que la base de code devient encombrée et difficile à gérer, les équipes de développement peuvent s’enliser dans le code mystère qui ralentit le développement et abaisse le moral.

Les données non utilisées ajoutent du temps et une charge supplémentaire à la maintenance du code et la seule solution à ce problème est de le supprimer. Malheureusement, il n’est pas toujours évident de savoir si les développeurs peuvent supprimer certaines données sans casser l’application. À mesure que la base de code devient encombrée et difficile à gérer, les équipes de développement peuvent se retrouver coincées dans un code mystérieux qui ralentit le développement et abaisse le moral.

Vous vous souvenez de la première fois que vous êtes entré dans votre garage, vide et étincelant, bâillant avec la promesse de protéger vos véhicules et outils électriques ? Comment était-il la dernière fois que vous y êtes entré ? Si vous êtes comme beaucoup d’entre nous, le désordre des boîtes fermées depuis longtemps vous nargue chaque fois que vous les contournez, perdant précieuses minutes avant de pouvoir atteindre les objets dont vous avez besoin alors que votre voiture est garée dans l’allée. Malheureusement, les équipes de développement ont un problème similaire avec leur code source, qui s’est transformé en un fouillis encombré.

Heureusement, il existe des moyens pour aider les équipes à nettoyer leur code source. L’utilisation de l’analyse statique des données peut aider à identifier les données non utilisées et à les supprimer. L’analyse statique des données est une méthode pour analyser le code source sans exécuter l’application. Cela permet aux développeurs de trouver facilement les données non utilisées et de les supprimer, ce qui réduit la complexité du code et améliore la qualité du logiciel. De plus, l’analyse statique des données peut aider à identifier les erreurs potentielles et à améliorer la sécurité du logiciel. Enfin, elle peut aider à réduire le temps de développement et à améliorer la productivité des développeurs.

Source de l’article sur DZONE

Systèmes distribués: le split-brain

Les systèmes distribués sont une technologie complexe qui peut présenter des risques, tels que le split-brain. Apprenons à mieux comprendre ce phénomène et à le gérer.

Le problème du Split-Brain

Split-brain can be caused by a variety of factors, including network partitions, hardware failures, or software bugs. It can also be triggered by intentional actions, such as when an administrator deliberately isolates a node from the cluster. In any case, the result is the same: two or more isolated groups of nodes, each with its own view of the data.

Real-World Example

A real-world example of split-brain occurred in 2017 when a major outage affected Amazon Web Services’ S3 storage service. The outage was caused by a network partition that split the S3 cluster into two isolated groups. As a result, some requests to the S3 service were routed to one group, while others were routed to the other group. This caused data inconsistency and led to widespread disruption.

The S3 outage serves as a reminder of the importance of testing distributed systems for split-brain scenarios. While it is impossible to completely eliminate the risk of split-brain, it is possible to reduce the impact by designing systems that are resilient to network partitions and other forms of failure.

Best Practices

When designing distributed systems, it is important to consider how the system will handle split-brain scenarios. In some cases, it may be possible to use techniques such as quorum or leader election to minimize the impact of split-brain. However, these techniques should be used with caution, as they can introduce additional complexity and overhead.

In general, the best approach is to design systems that are resilient to network partitions and other forms of failure. This can be achieved by using techniques such as replication, redundancy, and fault tolerance. It is also important to test distributed systems for split-brain scenarios before they are deployed in production.

Le problème du Split-Brain

Dans les systèmes distribués, il est essentiel de maintenir une vue cohérente des données sur tous les nœuds pour un fonctionnement correct. Lorsqu’un scénario de split-brain se produit, chaque groupe partitionné peut recevoir des mises à jour différentes, ce qui entraîne une incohérence des données et rend difficile la résolution des conflits lorsque les partitions se reconnectent finalement.

Le split-brain peut être causé par une variété de facteurs, notamment des partitions réseau, des pannes matérielles ou des bogues logiciels. Il peut également être déclenché par des actions intentionnelles, telles que lorsqu’un administrateur isole délibérément un nœud du cluster. Dans tous les cas, le résultat est le même : deux ou plusieurs groupes isolés de nœuds, chacun ayant sa propre vue des données.

Exemple concret

Un exemple concret de split-brain s’est produit en 2017 lorsqu’une panne majeure a affecté le service de stockage S3 d’Amazon Web Services. La panne était causée par une partition réseau qui a divisé le cluster S3 en deux groupes isolés. En conséquence, certaines demandes au service S3 ont été acheminées vers un groupe, tandis

Source de l’article sur DZONE

Chorégraphie de modèles : optimiser la communication en systèmes distribués.

La chorégraphie de modèles est un outil puissant pour optimiser la communication en systèmes distribués. Elle permet de coordonner et de gérer les interactions entre les différents acteurs.

Dans le paysage technologique en constante évolution d’aujourd’hui, il est commun que les applications migrent vers le cloud pour embrasser l’architecture des microservices.

Logiciel Chorégraphie

La chorégraphie est une méthodologie qui se concentre sur l’interaction entre les services sans l’utilisation d’un orchestrateur central. Au lieu de cela, chaque service est responsable de la communication avec les autres services. Les services peuvent communiquer directement entre eux ou via un bus de messages. La chorégraphie est une méthode très populaire pour gérer la communication entre les microservices car elle offre une plus grande flexibilité et une plus grande scalabilité que l’orchestration. Il est également plus facile à mettre en œuvre et à maintenir.

Avantages et inconvénients de la chorégraphie

Bien que la chorégraphie offre une plus grande flexibilité et une plus grande scalabilité, elle présente également certaines limitations. Par exemple, le développement et le déploiement des services peuvent être plus difficiles car ils doivent être conçus pour fonctionner ensemble. De plus, il est plus difficile de déboguer et de maintenir des applications basées sur la chorégraphie car il n’y a pas d’orchestrateur central pour surveiller le flux de messages entre les services. Enfin, la chorégraphie peut être plus difficile à mettre en œuvre dans des environnements distribués car elle nécessite une coordination stricte entre les services.

Conclusion

La chorégraphie est une méthodologie très populaire pour gérer la communication entre les microservices. Il offre une plus grande flexibilité et une plus grande scalabilité que l’orchestration, mais il présente également certaines limitations. Il est plus difficile à développer et à déployer, à déboguer et à maintenir, et peut être plus difficile à mettre en œuvre dans des environnements distribués. Cependant, dans certains cas, la chorégraphie peut être la meilleure solution pour gérer la communication entre les microservices. Il est important de comprendre les nuances et les avantages et les inconvénients de cette méthodologie avant de choisir le bon logiciel pour votre application.

Logiciel Chorégraphie

La chorégraphie est une méthodologie qui se concentre sur l’interaction entre les services sans l’utilisation d’un orchestrateur central. Au lieu de cela, chaque service est responsable de la communication avec les autres services. Les services peuvent communiquer directement entre eux ou via un bus de messages. La chorégraphie est une méthode très populaire pour gérer la communication entre les microservices car elle offre une plus grande flexibilité et une plus grande scalabilité que l’orchestration. Il est également plus facile à mettre en œuvre et à maintenir.

Avantages du logiciel Chorégraphie

La chorégraphie offre une variété d’avantages par rapport à l’orchestration. Tout d’abord, elle permet aux services de communiquer directement entre eux sans avoir à passer par un orchestrateur central. Cela signifie que chaque service peut fonctionner indépendamment des autres, ce qui permet une plus grande flexibilité et une plus grande scalabilité. De plus, la chorégraphie est plus facile à mettre en œuvre et à maintenir car il n’y a pas d’or

Source de l’article sur DZONE

Migration Cloud: Comment surmonter les craintes et saisir les opportunités

La migration vers le cloud peut sembler effrayante, mais elle offre de nombreuses opportunités. Découvrez comment surmonter vos craintes et saisir ces opportunités !

## Croissance du Cloud Computing au cours des dernières Décennies

Testing is a key factor in the success of cloud computing. It is essential to ensure that applications, services, and infrastructure are secure and reliable. Testing helps to identify and fix any issues before they become a problem. It also helps to ensure that the cloud environment is able to meet the needs of users. Testing should be done regularly and should include both automated and manual tests.

Depuis plus d’une décennie, le cloud computing est une tendance majeure. En 2015, sa croissance annuelle à trois chiffres a été enregistrée. Bien que, à la fin de 2019, les plus grands fournisseurs de cloud aient connu une croissance plus lente, à seulement 31 % par an, et que cette croissance devrait diminuer en 2020 et 2021 à mesure que l’industrie mûrit, la croissance du cloud a tout de même surpassé celle de nombreux autres secteurs.

De plus, en 2020, le marché du cloud a connu une croissance plus rapide qu’en 2019 selon certains critères. Cela s’est produit malgré la grave récession économique. La raison de cette croissance est l’augmentation de la demande provoquée par la pandémie, les confinements et le passage au travail à distance.

Le test est un facteur clé de la réussite du cloud computing. Il est essentiel de s’assurer que les applications, services et infrastructures sont sûrs et fiables. Le test permet d’identifier et de corriger les problèmes avant qu’ils ne deviennent un problème. Il aide également à s’assurer que l’environnement cloud est en mesure de répondre aux besoins des utilisateurs. Les tests doivent être effectués régulièrement et doivent inclure des tests automatisés et manuels.

Source de l’article sur DZONE

Déclaration/Instruction attendue à la fin de l'entrée en C résolue

Bienvenue à la fin de l’entrée en C! Nous allons maintenant passer à la déclaration/instruction attendue pour compléter cette résolution.

Programmer en C nécessite une attention particulière aux détails, car même de petites erreurs de syntaxe peuvent causer des problèmes inattendus dans votre code. Un message d’erreur commun que les développeurs peuvent rencontrer lors de l’écriture de code C est « Déclaration ou instruction attendue à la fin de l’entrée« . Ce message d’erreur peut être frustrant à gérer, mais heureusement, il est généralement facile à diagnostiquer et à corriger. Dans cet article, vous apprendrez comment identifier où se trouve le problème, comment le gérer et comment l’éviter.

The most common cause of this error is a missing semicolon at the end of a line. This is because the semicolon is used to indicate the end of a statement in C. If the semicolon is missing, then the compiler will not be able to recognize the end of the statement and will report an error.

Another potential cause of this error is a missing curly brace. Curly braces are used to indicate the beginning and end of a block of code in C. If a curly brace is missing, then the compiler will not be able to recognize the end of the block and will report an error.

Deal with the Problem

Once you have identified the source of the problem, it is usually straightforward to fix. If the problem is a missing semicolon, then simply add the missing semicolon to the end of the line. If the problem is a missing curly brace, then add the missing brace to the beginning or end of the block of code.

If you are still having trouble identifying the source of the problem, then you can try using a debugging tool such as GDB or Valgrind. These tools can help you identify where in your code the problem is occurring and can provide additional information that can help you diagnose and fix the issue.

Avoiding the Problem

The best way to avoid this error is to pay close attention to your code and make sure that all statements and declarations are properly terminated with a semicolon and all blocks of code are properly enclosed in curly braces. Additionally, you should use a linter such as Clang or GCC to check your code for potential errors before compiling it.

You should also make sure that you are using a text editor that is designed for programming in C. A good text editor will provide syntax highlighting, which can help you identify potential errors in your code before they become an issue.

Finally, you should make sure that you are using a compiler that is compatible with your version of C. Different compilers may have different rules for how they interpret certain statements or declarations, so it is important to make sure that you are using a compiler that is compatible with your version of C.

Conclusion

The « Expected declaration or statement at the end of input » error message can be frustrating to deal with, but fortunately, it is usually straightforward to diagnose and fix. In most cases, the problem is a missing semicolon or curly brace. Once you have identified the source of the problem, it is usually easy to fix. Additionally, there are steps you can take to avoid this error in the future, such as using a linter and a text editor designed for programming in C.

Programmation en C : Comment traiter l’erreur « Déclaration ou instruction attendue à la fin de l’entrée »

La programmation en C nécessite une attention minutieuse aux détails car même de petites erreurs de syntaxe peuvent entraîner des problèmes inattendus dans votre code. Un message d’erreur courant que les développeurs peuvent rencontrer lors de l’écriture de code C est « Déclaration ou instruction attendue à la fin de l’entrée« . Ce message d’erreur peut être frustrant à gérer, mais heureusement, il est généralement facile à diagnostiquer et à corriger. Dans cet article, vous apprendrez comment identifier où se trouve le problème, comment le résoudre et comment l’éviter.

Identifier le problème

Lorsque l’erreur « Déclaration ou instruction attendue à la fin de l’entrée » se produit, cela signifie que le compilateur est arrivé à la fin du fichier ou de la fonction sans trouver une déclaration ou une instruction complète. En d’autres termes, le compilateur s’attend à trouver du

Source de l’article sur DZONE

L'IA et l'IA générative : le voyage et le fonctionnement.

L’IA et l’IA générative sont des technologies qui offrent de nouvelles possibilités de voyage et de fonctionnement. Découvrons ensemble leurs avantages et leurs limites.

Ces dernières années, les technologies et services de pointe ont considérablement changé leurs directions, dynamiques et cas d’utilisation. Il est clair que la dernière vague d’adoption technologique mondiale par les industries est submergée par l’intelligence artificielle (IA) et ses différentes formes. L’IA s’intègre de plus en plus dans le tissu de notre vie quotidienne, changeant la façon dont nous vivons et travaillons. Cet article discute des bases de l’IA / ML, de son utilisation, de l’évolution de l’IA générative, de l’ingénierie prompte et de LangChain.

Machine Learning (ML) is a subset of AI that uses algorithms to learn from data and make predictions. ML algorithms are used to identify patterns in large datasets and then use those patterns to make predictions about future data. ML algorithms can be used to identify customer preferences, detect fraud, and recommend products.

L’intelligence artificielle et l’apprentissage automatique

L’intelligence artificielle (IA) est la capacité de simuler l’intelligence humaine et les processus de pensée tels que l’apprentissage et la résolution de problèmes. Il peut effectuer des tâches complexes qui historiquement ne pouvaient être effectuées que par des humains. Grâce à l’IA, un système non humain utilise des approches mathématiques et logiques pour simuler la raisonnement que les gens utilisent pour apprendre de nouvelles informations et prendre des décisions.

L’apprentissage automatique (ML) est un sous-ensemble de l’IA qui utilise des algorithmes pour apprendre des données et effectuer des prédictions. Les algorithmes d’apprentissage automatique sont utilisés pour identifier des modèles dans de grands ensembles de données et ensuite utiliser ces modèles pour effectuer des prédictions sur des données futures. Les algorithmes d’apprentissage automatique peuvent être utilisés pour identifier les préférences des clients, détecter la fraude et recommander des produits.

L’évolution de l’intelligence générative et le LangChain

L’intelligence générative (GI) est une forme avancée d’IA qui permet aux systèmes informatiques d’apprendre à partir de données et de générer des résultats sans être explicitement programmés pour le faire. Les systèmes GI peuvent apprendre à partir de données complexes et générer des résultats qui peuvent être utilisés pour prendre des décisions ou même créer des produits. Les systèmes GI sont utilisés pour la recherche, le développement de produits, la prise de décision et la gestion des bases de données.

Le LangChain est une technologie basée sur l’IA qui permet aux systèmes informatiques d’analyser les données textuelles et de les transformer en informations utiles. Le LangChain peut être utilisé pour extraire des informations à partir de documents, d’articles, de messages et même de conversations. Il peut également être utilisé pour générer des rapports, des recommandations et des prédictions basés sur les données textuelles.

En conclusion, l’IA et l’apprentissage automatique sont en train de révolutionner le monde numérique. Les technologies telles que l’intelligence générative et le LangChain offrent aux entreprises une variété de possibilités pour tirer parti des données et améliorer leurs opérations. Ces technologies sont en train de transformer radicalement la manière dont les entreprises interagissent avec leurs clients et leurs bases de données.

Source de l’article sur DZONE