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.

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();

		}

	}

}

https://dotnetfiddle.net/4cKdGc