Le site BigDataParis n’est pas accessible.

Par défaut

Aujourd’hui c’est le premier jour de l’évènement BigDataParis, #BigDataParis.

Malheureusement, le site est actuellement hors-service. Les inscriptions ne sont plus possibles.

Sur Twitter, ils disent qu’ils sont en train de travailler pour la résolution du problème.

C’est probablement du à un accroissement du trafic ou à une action malveillante. A voir.

Systèmes de données complexes et l’intégration de plusieurs outils.

Par défaut

Les professionnels ont parfois tendance à catégoriser les bases de données relationnels ou non relationnels, les files d’attentes, les caches etc. Même si une base de donnée et une messagerie qui basent leurs fonctionnements sur une file d’attente peuvent avoir quelques similarités, les deux conservent la donnée pour un temps défini et ils utilisent des méthodes différentes pour avoir accès à ces données, qui peut conduire à des différences en termes de performances par exemple.

Une pléthore d’outils permettant de gérer le stockage et le traitement des données sont apparus ces dernières années. Ils sont optimisés en fonction de cas d’usage spécifique Par exemple, on a Redis qui est utilisé comme agent de message et il y a aussi des agents de messages qui permettent le traitement complexe et en temps réel des données, comme une base de données. La frontière qui séparent ces différents catégories d’outils devient de plus en plus flou.

Il y a aussi de plus en plus d’applications qui implémentent des fonctionnalités qui ne peuvent être fourni par un seul outil. Dans ce cas le travail est décomposé en plusieurs tâches qui peuvent être exécutés de façon optimale sur un outil spécifique. Les développeurs interviennent ensuite pour ’’gluer’’ tous ca avec le code.

Un exemple, si vous avez une application qui gère le cache comme Memcached et un serveur de search comme ElasticSearch qui sont séparés de votre base de données principale, alors il est le ressort du développeur que je suis 🙂 de faire en sorte que tous ces outils soient synchronisés avec la ou les base de données principales.

Exemple d’un système de données complexe.

Quand vous utilisez plusieurs outils pour fournir un service, l’API qui expose ce service au monde extérieur fait une abstraction ou cache le plus souvent ces différentes implémentations. Lors de la conception d’un tel système, vous devez vous poser plusieurs questions. Par exemple, comment s’assurer qu’il n’y ait pas de dégradation dans la performance, même si vous avez une très grosse charge sur une ou plusieurs parties du système ? Comment montez vous à l’échelle entre autres.

Il y a plusieurs facteurs qui peuvent influencer la conception d’un système comme celui-ci, comme par exemple l’équipe, l’expérience (et le talent:) des développeurs qui y sont impliqués, ensuite il faut aussi se poser la question sur l’intégration avec des applications monolithiques ( et oui ! ), le temps de livraison et bien sur la vulgarisation auprès du métier pour qu’ils prennent en compte tous ces facteurs ( l’impact sur le risque, la gouvernance etc ). C’est un gros travail qui demande une expertise approfondi dans le fonctionnement d’applications et de base de données.

NextCog vous accompagne dans l’audit, l’implémentation et la conception de systèmes de données complexes. Nous sommes en constante veille technologique et nous nous assurons de vous fournir un service complet. N’hésitez pas à prendre contact avec nous et nous reviendrons vers vous au plus vite. 

Faire le choix entre une base de données relationnelle et une base de données orientés document.

Par défaut

Il y a plusieurs différences à considérer quand on fait la comparaison entre une base de données relationnelle et une base de données orientés document, y compris dans leurs tolérances face aux failles et la gestion de la concurrence. Ici je vais me concentrer sur les différences dans le modèle de données.

Les principaux arguments qui sont en avant pour privilégier une base de données orientés document c’est la flexibilité par rapport au schéma, une meilleure performance due à la localisation ( le fait de stocker des données spécifique à la meme endroit si elles sont fréquemment demandés …) et et le fait qu’il y ait une certaine similarité par rapport aux structures de donnés utilisés par certaines applications. Le modèle relationnel par contre offre des avantages sur une meilleure prise en compte des jointures et les supports sur les relations 1 à plusieurs et relations plusieurs à plusieurs.

Quel modèle de données est le moins couteux en lignes de codes ?

Si la donnée présent dans votre application a une structure qui s’apparente à un document ( par exemple un arbre d’une relation 1 à plusieurs), alors il est plus judicieux d’utiliser le modèle document. La technique qui consiste à éparpiller une structure de type document en plusieurs tables peut conduire à des schémas de données complexes et des lignes de codes supplémentaires en plus.

Le modèle document a quelques limitations, par exemple, vous ne pouvez pas faire référence directement à un élément imbriqué dans un document. Donc tant que les documents ne sont pas fortement imbriqués les uns les autres, alors ce n’est pas nécessairement un problème.

Le faible support pour les jointures dans les bases de données orientés document peut, ou ne peut pas être un problème. Cela dépend de l’application. Par exemple, il n’est pas utile d’utiliser les relations plusieurs à plusieurs dans une application qui utilise une base de données orientés document pour enregistrer des évènements associés à une heure.

Cependant, si votre application doit utiliser les relations plusieurs à plusieurs, alors le modèle de données document devient moins intéressant. Il est possible de réduire le besoin pour les jointures en dé-normalisant, mais en contrepartie, l’application doit se charger de fournir un travail supplémentaire pour maintenir la consistence de la données dé-normalisée.

En général, Il n’est pas possible de dire quel modèle de données conduira à un code moins complexe, ca va dépendre des relations qui existent entre les entités de données. Pour les données très interconnectés, le modèle de données document s’avère compliqué à mettre en place alors que le modèle relationnel est acceptable, et les modèles de données graphes le choix ultime !

Exemple : Gain en simplicité avec le code en SQL ( à gauche ) vs Cypher ( langue de requête orientés graphe à droite)

Sql vs Cypher neo4j
Sql vs Cypher neo4j

NextCog vous accompagne dans l’optimisation de vos bases de données transactionnelles et décisionnelles et la transition vers des bases de données non-relationnelles et graphes. Si vous voulez en savoir plus, prenez contact avec nous et nous vous ferons un devis approprié.

Microsoft Azure et ses coûts, les PME négligés ?

Par défaut

La compréhension de la tarification Azure présente de nombreux défis. Microsoft a développé son service cloud Azure avec une rapidité remarquable et est monté en deuxième position en tant que fournisseur de cloud derrière Amazon Web Services. Il a pris deux de ses applications fares comme SQL Server et Office, et les a rendues disponibles sur demande, ce qui était impensable il y a une décennie.

Mais la question se pose, est-ce que Azure est fait pour les petites et moyennes entreprises ?

Avant de répondre à cette question, j’ai testé pendant 1 mois. Le but est donc d’avoir un point de vue rapide sur la tarification azure.

J’ai acheté une souscription qui comprend une machine virtuelle et un App Service.

La machine virtuelle

Le taux d’utilisation sur 1 mois

Le App service

J’ai crée une petite application asp.net core, que j’ai déployé.

J’ai testé l’application quelques fois, et ensuite je l’ai stoppé.



Il est intéressant de noter que meme si l’application est stoppé, les couts liés au ’App Service plan’ continuent de tourner.

Le App Service Plan : Taux Utilisation sur 1 mois

Le App Service Plan : Quota disque

Le quota n’est pas dépassé.

Avec tous ces éléments, on peut déjà se faire un bilan.

Résultats

Pour une utilisation plus que modérée, je trouve personnellement que les coûts sont élevées. Je suppose que les prix sont si élevés parce que les grosses entreprises ont de l’argent à brûler, mais pour les petites ou moyennes entreprises car les prix ne sont vraiment pas amicaux.

Les prix des VM sont un peu meilleurs si vous faites des prix réservés pour 1 ou 3 ans, mais je n’aime pas être bloqué. Vous devez également gérer les vcores sur une VM qui ne sont pas de véritables cœurs physiques, et vous devez toujours payer un supplément pour le stockage sur disque pour la machine virtuelle qui est cher, ainsi que la bande passante (Référence: https://azure.microsoft.com/en-us/pricing/details/virtual-machines/windows/ ). Donc, les VM ne sont vraiment pas beaucoup mieux que les app services à mon avis.

Il est BEAUCOUP moins cher de simplement payer pour les serveurs dédiés et d’avoir beaucoup de processeurs inactifs que d’utiliser des app services ou des machines virtuelles avec des groupes à mise à l’échelle automatique. Les machines virtuelles coutent jusqu’à 4 fois plus cher que les conteneurs.

Pour de nombreuses entreprises qui ont des besoins de « mise à l’échelle Azure », une facture mensuelle de 5000 euros va maintenant devenir quelque chose qui doit beaucoup les préoccuper à cause de la crise économique majeure dans lequel nous nous trouvons.

Pour une entreprise de logiciels ou de technologies, les solutions cloud proposées par Azure ou AWS peuvent représenter l’essentiel de leurs dépenses non salariales, et 5000 euros par mois peut meme correspondre au salaires de 2 développeurs.

Prédiction du pic de l’épidémie de Covid-19 à l’ile Maurice

Par défaut

L’épidémie de Covid-19 a touché l’ile Maurice en ce début d’année.

Je vais essayer de prédire le jour où le peak de l’épidémie sera atteint à l’aide de mes connaissances en Python et Machine Learning.

Je vais utiliser le modèle Logistique. Je ne veux pas utiliser le modèle Exponentiel pour des raisons …évidentes.

Je vais utiliser les librairies numpy et pandas.

numpy est une librairie utilisé pour le calcul scientifique.

pandas est une librairie qui est construit sur numpy, et elle fournit du calcul haute performance, des structures de données faciles à utiliser et des outils d’aide à l’analyse de de données.

Pour commencer, importons les librairies.

import pandas as pd
import numpy as np
from datetime import datetime,timedelta
from sklearn.metrics import mean_squared_error
from scipy.optimize import curve_fit
from scipy.optimize import fsolve
import matplotlib.pyplot as plt

Préparation des données

J’ai récupéré un google sheet qui recense les cas de covid-19 tous les jours. Je partage le fichier au format csv avec google sheets. Je vais ensuite le mettre dans un dataframe.

url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRG9SHNzCmx72RXRoz4BisAwawIdRWSzq43b09dBQYagYlW0FZjqSuwjDbJ0z0b129xLi_E0t_pqA1J/pub?gid=717908023&single=true&output=csv"

df = pd.read_csv(url)

Visualisation des données

df

Les colonnes qui m’intéressent sont le Timestamp et le cum_new ( nombre de cas positifs cumulés )


df = df.loc[:,['Timestamp','cum_new']]

Je formate la date correctement, pour pouvoir calculer le nombre de jours depuis le 1er janvier 2020.

FMT = '%m-%d-%Y %H:%M:%S'
date = df['Timestamp']
df['Timestamp'] = date.map(lambda x : (datetime.strptime(x, FMT) - datetime.strptime("01-01-2020 00:00:00", FMT)).days)


Le modèle logistique.
Le modèle logistique a été largement utilisé pour décrire la croissance d’une population. Une infection peut être décrite comme la croissance de la population d’un agent pathogène, donc un modèle logistique semble raisonnable. Cette formule est très connue des spécialistes des données car elle est utilisée dans le classificateur de régression logistique et comme fonction d’activation des réseaux de neurones. L’expression la plus générique d’une fonction logistique est:

Dans cette formule, nous avons la variable x qui correspond au temps et trois paramètres a,b,c

a est la vitesse de l’infection

b est le jour où est survenu le nombre maximal d’infections.

c est le nombre total des personnes infectés à la date de fin de l’épidémie.

Aux valeurs maximales, le nombre de personnes infectés se rapproche de plus en plus de c, et c’est le point où on peut dire que l’infection est terminé. La fonction a aussi un point d’inflexion à b, qui est le point où la dérivée première commence à décroitre, c’est à dire, le pic après que l’infection commence à devenir moins aggressive et le nombre de nouveaux cas commence à diminuer.

On le définit donc

def logistic_model(x,a,b,c):
return c/(1+np.exp(-(x-b)/a))

On peut utiliser le curve_fit, une fonction qui est contenue dans la librairie scipy, pour estimer les paramètres et les erreurs à partir des données sources.

x = list(df.iloc[:,0])
y = list(df.iloc[:,1])

fit = curve_fit(logistic_model,x,y,p0=[2,120,1000])

Voici le résultat

Voici les valeurs

a : 1.46

b : 81.06

c : 53.83

La fonction retourne aussi la matrice de covariance, donc les diagonaux correspondent aux variances des paramètres. En prenant les racines carrés, on peut calculer les erreurs standards.

errors = [np.sqrt(fit[1][i][i]) for i in [0,1,2]]

errors

[0.2881514331099414, 0.6209485659619303, 9.227239886449258]

Erreur standard de a : 0.29

Erreur standard de b : 0.62

Erreur standard de c: 9.23

a = fit[0][0]
b = fit[0][1]
c = fit[0][2]

Ces chiffres nous donnent des informations intéressantes.

Le nombre estimé de cas positifs à la date de fin de l’infection est de 54 +- 9.

Le nombre maximal de nouvelles infections par jour est déjà passée, et c’était il y a 2 jours, 23 mars, où on est passé de 14 cas à 28 cas ! ( tout ceci est bien sur à prendre avec beaucoup de précautions !. Les conditions sur le terrain risquent de changer.)

sol = int(fsolve(lambda x : logistic_model(x,a,b,c) - int(c),b))

Le pic de l’épidémie, c’est dans 4 jours, soit le 28 Mars 2020.

pred_x = list(range(max(x),sol))
plt.rcParams['figure.figsize'] = [7, 7]
plt.rc('font', size=14)

Données réels

plt.scatter(x,y,label="Données réels",color="red")

La courbe logistique prédite

plt.plot(x+pred_x, [logistic_model(i,fit[0][0],fit[0][1],fit[0][2]) for i in x+pred_x], label="Modèle logistique" )

plt.legend()
plt.xlabel("Données depuis le premier Janvier 2020")
plt.ylabel("Nombre total de personnes infectés")
plt.ylim((min(y)0.9,c1.1))

plt.show()

Conclusion : En utilisant cette modélisation, si le confinement maximal est appliqué 1 semaine et que toute le monde le respecte ( cas idéale ), si le gouvernement continue à fournir un effort considérable dans le dépistage à travers le ’Contact Tracing’ (plus le nombre de dépistages augmente, le mieux), que les personnels soignants et des services essentielles sont équipés d’équipements de protection adéquat et que les personnes positives sont isolés, l’épidémie pourra être maitrisé d’ici FIN MARS.

Installer NestJs sur MacOS Catalina

Par défaut

NestJS est un framework pour construire des applications node performants et scalables. J’ai voulu la tester, et la première chose est de suivre la documentation officielle, et comme ca arrive, ca ne passe pas forcément comme prévu ;(

Après avoir essayé

npm i -g @nestjs/cli

Pas de message d’erreur. Nest aurait du etre installé globalement, mais en essayant

nest --version

La commande est inconnu !

Je vérifie si nest est bien installé globalement, et oui, c’est bien le cas.

(base) Ajmals-MacBook-Pro:node_modules ajmal$ npm list -g --depth=0

/Users/ajmal/.npm-packages/lib

├── @angular/cli@9.0.5

└── @nestjs/cli@6.14.2

(base) Ajmals-MacBook-Pro:~ ajmal$ cd /Users/ajmal/

(base) Ajmals-MacBook-Pro:~ ajmal$ cd node_modules/

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd bin

(base) Ajmals-MacBook-Pro:node_modules ajmal$ ls

ansi-styles color-name has-flag

axios debug is-buffer

chalk escape-string-regexp ms

color-convert follow-redirects supports-color

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd /Users/ajmal/.npm-packages/lib/

(base) Ajmals-MacBook-Pro:lib ajmal$ ls

node_modules

(base) Ajmals-MacBook-Pro:lib ajmal$ cd node_modules/

(base) Ajmals-MacBook-Pro:node_modules ajmal$ ls

@angular @nestjs

(base) Ajmals-MacBook-Pro:node_modules ajmal$ cd @nestjs/

(base) Ajmals-MacBook-Pro:@nestjs ajmal$ ls

cli

(base) Ajmals-MacBook-Pro:@nestjs ajmal$ cd cli

(base) Ajmals-MacBook-Pro:cli ajmal$ ls

LICENSE actions commands node_modules

README.md bin lib package.json

(base) Ajmals-MacBook-Pro:cli ajmal$ cd bin

(base) Ajmals-MacBook-Pro:bin ajmal$ ls

Les 2 fichiers présents

nest.d.ts nest.js

Je récupère le chemin

(base) Ajmals-MacBook-Pro:bin ajmal$ pwd

/Users/ajmal/.npm-packages/lib/node_modules/@nestjs/cli/bin

Je crée un alias

(base) Ajmals-MacBook-Pro:bin ajmal$ alias nest="/Users/ajmal/.npm-packages/lib/node_modules/@nestjs/cli/bin/nest.js"

(base) Ajmals-MacBook-Pro:bin ajmal$ nest --version

6.14.2

Nest peut maintenant être utilisé dans ce terminal

Mais si ouvrez un nouveau terminal, cet alias sera inconnu. Donc pour pouvoir persister la définition de cet alias, il va faloir le renseigner dans votre bash profile

  1. Lancer le terminal
  2. Tappez la commande cd ~/ pour naviguer vers votre repertoire principal
  3. Faites touch .bash_profile pour ouvrir ou créer le fichier
  4. Editer .bash_profile avec votre éditeur ou faites open -e .bash_profile pour ouvrir dans gedit
  5. Rajouter la ligne suivant alias nest= »/Users/[votre nom utilisateur]/.npmpackages/lib/node_modules/@nestjs/cli/bin/nest.js »
  6. Tapez commande . .bash_profile pour recharger le .bash_profile et mettre à jour les alias.
  7. Ouvrez un nouveau terminal et refaites nest –version pour vérifier que nest est maintenant correctement installé.

Meetup ’’La minute Freelance – SOS : mon client ne comprend pas mon métier !’’

Par défaut

Le mercredi 4 mars 2020 donc, je suis allé à un meetup organisé par Novaa, un cabinet d’expert comptable basé à Paris. Il y avait une présentation sur le métier de freelance présenté par Lisa Slimane, fondatrice de laminutefreelance.fr.

Le thème abordé ’’Mon client ne comprend pas mon métier !’’.

Cette situation atypique, que certains professionnels du numérique ou du conseil peuvent rencontrer est la conséquence d’un manque de communication . Pourtant, une mission alignée ne peut reposer que sur une compréhension mutuelle.Au cours de la présentation qui était dans un format simple, compréhensible et direct, elle a partagé son expérience personnelle comme freelance et a aussi donné des pistes et des points clés pour améliorer notre profil auprès des entreprises. Je vous propose de découvrir ici quelques slides sur la présentation.

Le sommet du ChangeNow 2020: un salon au Grand Palais autour de la Green tech.

Par défaut

Le ChangeNOW Summit 2020, la première Exposition Universelle des solutions pour la Planète s’est déroulé au Grand Palais du 30 janvier au 1er février 2020. L’objectif de ce salon a but de rassembler tous les acteurs de l’innovation environnementale et sociale pour répondre concrètement aux urgences climatiques. Je partage quelques images du salon et de ses exposants.

Thèmes abordés des différents exposants

  • Zero Waste
  • Smart fashion ou mode responsables ;
  • Economie circulaire ;
  • Santé et bien-être ;
  • Smart cities, IOT, ville durable et mobilité verte ;
  • Energie verte ;
  • Ressources marines, océans
  • Foodtech, alimentation
  • Smart agriculture
  • Formation

C# – Soit 2 tableaux de n entiers chacun, trouvez une paire d’éléments issue des 2 tableaux {n1,n2} dont la somme se rapproche le plus d’une cible n.

Par défaut

Ce petit problème fort intéressant peut etre résolu de divers manières, mais j’ai voulu montrer comment on pouvait créer un dictionnaire en C# qui contient 2 clés, en utilisant les tuples.

[code language= »csharp »]
using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Exercises

{

class Program

{

static void ClosestToTarget(int[] array1, int[] array2, int target)

{

int i,
j = 0;

var dictionary = new Dictionary < Tuple ,
int > ();

int x = 0;

int[, ] totals = new int[array1.Length, array2.Length];

for (i = 0; i < array1.Length; i++)

{

for (j = 0; j < array2.Length; j++)

{

int total = array1[i] + array2[j];

totals[i, j] = total;

var key = new Tuple (i, j);

dictionary.Add(key, array1[i] + array2[j]);

}

}

foreach(KeyValuePair < Tuple , int > kvp in dictionary)

{

Console.WriteLine(« Clé = {0},{1} », kvp.Key, kvp.Value);

}

var bestMatch = dictionary.OrderBy(e = >Math.Abs(e.Value – target)).FirstOrDefault();

i = bestMatch.Key.Item1;

j = bestMatch.Key.Item2;

Console.WriteLine(« Elément issu du premier tableau : {0} , Elément issu du deuxième tableau : {1}, La Somme = {2} qui se rapproche le plus de la cible : {3} », array1[i], array2[j], array1[i] + array2[j], target);

}

static void Main(string[] args)

{

Console.WriteLine(« Ce programme prend en entré 2 tableau de taille n et vous donne quel pairs d’éléments des 2 tableaux se rapproche le plus d’une cible x »);

Console.WriteLine(« Veuillez entrer la taille des tableaux: »);

int size = 0;

while (!int.TryParse(Console.ReadLine(), out size))

Console.Write(« Attention, la valeur doit être un entier. Veuillez réessayer »);

int[] array1 = new int[size];

int[] array2 = new int[size];

int i;

Console.WriteLine(« Entrez les {0} chiffres pour le premier tableau: », size);

for (i = 0; i < size; i++)

{

while (!int.TryParse(Console.ReadLine(), out array1[i]))

Console.Write(« Attention, la valeur doit être un entier. Veuillez réessayer »);

}

Console.WriteLine(« Entrez les {0} chiffres pour le deuxième tableau: », size);

for (i = 0; i < size; i++)

{

while (!int.TryParse(Console.ReadLine(), out array2[i]))

Console.Write(« Attention, la valeur doit être un entier. Veuillez réessayer »);

}

Console.WriteLine(« Entrez la cible: »);

int target = Convert.ToInt32(Console.ReadLine());

ClosestToTarget(array1, array2, target);

Console.ReadLine();

}

}

}
[/code]

https://dotnetfiddle.net/4cKdGc