Les nouveautés Microsoft C# 7.0

Jerome

Cette nouvelle version Microsoft de C# accompagne la sortie Visual Studio 2017. Les changements semblent minimes comparé au C#6.0 mais cette version améliore l’écriture du code et les performances.

Les nouvelles fonctionnalités au langage sont :

1.    Variables out

La syntaxe existante qui prend en charge les paramètres out a été améliorée dans cette version. Il n’est plus nécessaire de déclarer la variable en amont. :

Avant:

int numericResult;

if (int.TryParse(input, out numericResult))

WriteLine(numericResult);

Après:

if (int.TryParse(input, out int result))

WriteLine(result).

2.    Tuples

Il est désormais possible de créer des types légers et sans noms qui contiennent plusieurs champs publics sans avoir à utiliser les structures de données suivantes :

  • un tableau ou une liste ;
  • des paramètres out ;
  • la classe Tuple<…> existe depuis C# 4.0 ;
  • une classe spécifique pour représenter les résultats de la fonction.

Voici un exemple ecrit en C# 6.0:

public void Main()

{

var customer = GetCustomer();

int id = customer.Item1;

string firstname = customer.Item2;

string lastname = customer.Item3;

}

private Tuple<int, string, string> GetCustomer()

{

return new Tuple<int, string,=”” string=””>(1, “John”, “Doe”);

}

Avec C# 7.0, la méthode GetCustomer() devient:

private (int, string, string) GetCustomer()

{

return (1, “John”, “Doe”);

}

Au lieu d’utiliser .Item1, .Item2 nous pouvons nommer les propriétés du tuple:

public void Main()

{

var customer = GetCustomer2();

int id = customer.Id;

string firstname = customer. Firstname;

string lastname = customer. Lastname;

}

private (int Id, string Firstname, string Lastname) GetCustomer2()

{

return (1, “John”, “Doe”);

}

en décomposant le tuple directement en variables nous obtenons:

var (id, firstname, lastname) = GetCustomer();

 Par exemple, pour échanger les valeurs de deux variables, l’écriture devient triviale car nous n’avons plus besoin de variables intermédiaires :

(x, y) = (y, x).

3.    Éléments ignorés

Par exemple lors de la déconstruction d’un tuple, seul les variables nommées seront assignées:

var (_, _, _, pop1, _, pop2) = QueryCityDataForYears(“New York City”, 1960, 2010).

4.    Critères spéciaux

L’expression is étend l’opérateur is classique pour interroger un objet au-delà de son type. Dans notre exemple nous utilisons le « switch » mais fonctionne également avec le « if statement » :

public static int DiceSum(IEnumerable <object> values}

{

var sum = 0;

foreach (var item in values)

{

switch (item)

{

case 0:

break;

case int val:

sum += val;

break;

case IEnumerable<object> subList when subList.Any():

sum += DiceSum(subList);

break;

case IEnumerable<object> subList:

break;

case null:

break;

default:

throw new InvalidOperationException(“unknown item type”);

}

return sum;

}

5.    Variables locales et retours ref

Les arguments et les variables locales de méthode peuvent être des références à un autre stockage.

public static ref int Find(int[,] matrix, Func<int, bool=””> predicate)

{

for (int i = 0; i < matrix.GetLength(0); i++)

for (int j = 0; j < matrix.GetLength(1); j++)

if (predicate(matrix[i, j]))

return ref matrix[i, j];

throw new InvalidOperationException(“Not found”);

}

Maintenant que la méthode retourne une référence à la valeur entière dans la matrice, vous devez modifier l’emplacement où elle est appelée. La déclaration var signifie que valItem est une référence vers un int :

var valItem = MatrixSearch.Find3(matrix, (val) => val == 42);

Console.WriteLine(valItem);

valItem = 24;

Console.WriteLine(matrix[4, 2]).

6.    Fonctions locales

Les fonctions locales permettent de déclarer des méthodes à l’intérieur d’une autre méthode. Il existe deux cas d’utilisation très courants pour les fonctions locales : les méthodes iterator publiques et les méthodes async publiques.

public static IEnumerable AlphabetSubset(char start, char end)

{

if (end <= start)

throw new ArgumentException($”{nameof(end)} must be greater than {nameof(start)}”);

return alphabetSubsetImplementation();

IEnumerable<char> alphabetSubsetImplementation()

{

for (var c = start; c < end; c++)

yield return c;

}

}

public Task<string> PerformLongRunningWork(string address, int index, string name)

{

return longRunningWorkImplementation();

async Task<string> longRunningWorkImplementation()

{

var interimResult = await FirstWork(address);

var secondResult = await SecondStep(index, name);

return $”The results are {interimResult} and {secondResult}. Enjoy.”;

}

}

7.    Autres membres expression-bodied

C# 6 a introduit les membres expression-bodied pour les fonctions membres, ainsi que des propriétés en lecture seule.

C#7 développe les membres autorisés pouvant être implémentés comme expressions. C’est-à-dire implémenter des constructeurs, des finaliseurs ainsi que des accesseurs get et set sur des propriétés et des indexeurs.

// Expression-bodied constructor

public ExpressionMembersExample(string label) => this.Label = label;

// Expression-bodied finalizer

~ExpressionMembersExample() => Console.Error.WriteLine(“Finalized!”);

private string label;

// Expression-bodied get / set accessors.

public string Label

{

get => label;

set => this.label = value ?? “Default label”;

}

8.    Expressions throw

Cette version permet de lever des exceptions dans les constructions de code qui n’étaient pas autorisées auparavant, car throw était une instruction.

public string Name

{

get => name;

set => name = value ??

throw new ArgumentNullException(paramName: nameof(value), message: “New name must not be null”);

}

Cette fonctionnalité permet d’utiliser des expressions throw dans des expressions d’initialisation :

private ConfigResource loadedConfig = LoadConfigResourceOrDefault() ??

throw new InvalidOperationException(“Could not load config”);

Auparavant, ces initialisations devaient se trouver dans un constructeur, avec les instructions throw dans le corps du constructeur :

public ApplicationOptions()

{

loadedConfig = LoadConfigResourceOrDefault();

if (loadedConfig == null)

throw new InvalidOperationException(“Could not load config”);

}

9.    Types de retour async généralisés

Les méthodes déclarées avec le modificateur async peuvent retourner d’autres types en plus de Task et de Task<T>.

public ValueTask<int> CachedFunc()

{

return (cache) ? new ValueTask(cacheResult) : new ValueTask(LoadCache());

}

private bool cache = false;

private int cacheResult;

private async Task LoadCache()

{

// simulate async work:

await Task.Delay(100);

cacheResult = 100;

cache = true;

return cacheResult;

}

10.    Améliorations de la syntaxe littérale numérique

De nouveaux jetons améliorent la lisibilité des constantes numériques. Le séparateur de chiffres peut apparaître n’importe où dans la constante. Pour les nombres de base 10, il arrive fréquemment qu’il soit utilisé comme séparateur des milliers. Il est possible d’utiliser le séparateur de chiffres également avec les types decimal, float et double :

public const long BillionsAndBillions = 100_000_000_000;

public const double AvogadroConstant = 6.022_140_857_747_474e23;

public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M.

facebooktwittergoogle_plusmail

Les évolutions de la réglementation MIFID : MIFID 2

Cédric Berthelot

Comme tous les ans, la nouvelle année amène la mise en place de nouvelles réglementations.

Préparée depuis longtemps, vaguement terminée ou oubliée dans un placard pendant 7 ans, le 3 janvier 2018 était le premier jour de la réglementation MIFID 2.

MIFID : Ouvrir la concurrence et renforcer la réglementation

En 2007, MIFID (Markets In Financial Instruments Directive) faisait ses grands débuts. La Commission européenne espérait libérer la concurrence, protéger les clients et surtout harmoniser la réglementation des marchés financiers dans l’Union Européenne.

Les principales évolutions furent d’ouvrir les places d’exécution des instruments listés, qui étaient alors la chasse gardée des bourses de valeur, et la permission pour les entreprises d’offrir plus de services d’investissement en Europe une fois l’autorisation accordée dans leur pays d’origine.

Du côté client, l’objectif était de protéger les plus vulnérables et de rendre plus transparents les processus d’exécutions tout en fournissant un service de Best Execution propre à chaque client. Le Best Exec signifie que le client est celui qui décide des paramètres optimaux de l’exécution demandée. S’il demande à privilégier la vitesse au prix alors l’entreprise doit respecter ce choix et agir en priorisant la vitesse.

A peine mise en place, la directive MIFID a eu le droit de se tester face à une crise. Le résultat est connu, un nouvel ennemi a été identifié, les produits dérivés, et MIFID 2 apparait pour compléter le travail de son ainé. Les objectifs sont toujours les mêmes, protéger les clients et offrir plus de transparence sur les marchés mais en élargissant grandement le périmètre.

Après la crise, MIFID 2 contre-attaque

Afin de protéger le client, chaque produit financier créé par une entité soumise aux règles européennes se doit de définir en détail son produit ainsi que les clients ciblés. Même chose pour les distributeurs qui se doivent de proposer à leur clientèle uniquement des produits adaptés. Si le créateur du produit n’est pas soumis aux directives MIFID, toutes ses tâches reviennent au distributeur. Le ciblage des clients concerne bien entendu ceux pouvant souscrire en comprenant le risque et les coûts engendrés, mais aussi les clients négatifs, ceux auxquels un produit ne doit pas être vendu. La politique de Best Execution devra aussi être transparente et comprise par le client.

Toujours dans une optique de transparence envers le client, les frais et commissions de chaque transaction devront être détaillés. Un effort particulier est demandé pour les frais de recherches qui, désormais, doivent être facturés aux gérants d’actifs. Auparavant ils étaient considérés comme implicitement inclus dans les frais d’exécutions d’ordre. Désormais c’est un nouveau coût à gérer pour les sociétés de gestion qui devront choisir entre absorber une nouvelle dépense ou la répercuter auprès de leurs clients (et le détailler dans la facturation bien entendu).

Plus proche de notre quotidien au travail, les transactions sont désormais soumises à une série de règles contraignantes aussi bien en pre-trade qu’en post-trade. Les prix négociés, ainsi que la quantité et le prix des transactions exécutées, devront être publiés à la milliseconde près. Le but est d’offrir à tous les clients la possibilité de bénéficier du même prix et ainsi éviter les préférences entre entités. Ces règles s’appliquent aux actions, obligations mais aussi aux produits dérivés et structurés.

Pour suivre au mieux les nouvelles règles, les marchés réglementés sur lesquels des transactions concernant des dérivés transitent offriront à chaque contrepartie un identifiant de transaction qui devra être conservé et présent dans les reportings réalisés auprès des instances de contrôles européennes.

Des OTC mais listés ?

L’un des principaux problèmes de MIFID concerne les reportings des OTC. Ces produits étant par définition non listés, ils sont difficiles à identifier dans le flot de transactions. Pour pallier ce problème ceux-ci seront désormais affublés de codes ISIN. Tout comme pour les produits listés, ces codes seront uniques. Cependant, tous les OTC ne sont pas concernés, seuls ceux ayant au moins un sous-jacent échangeable sur une plateforme de négociation européenne se doit d’avoir un ISIN.

Dans les faits cela signifie que dans le cas où vous vendez un panier de produits contenant une action échangeable sur n’importe quel marché européen, vous devez demander la création d’un ISIN au DSB (Derivatives Service Bureau) de ANNA, l’agence en charge de la création des ISIN. Autre exemple, si vous avez une option sur un Indice, qui contient lui-même un produit échangeable, une demande d’ISIN est nécessaire. Le changement d’un sous-jacent, d’une caractéristique principale du produit, comme une date de maturité, entrainent une mise à jour de l’identifiant.

Si l’idée de vouloir identifier plus facilement les OTC est légitime, elle se confronte à de nombreux heurts. Avec des produits complexes il est difficile d’identifier lorsque la composition d’un sous-jacent change et donc de faire évoluer l’ISIN en conséquence. De même, reporter et suivre un produit dont le code peut changer dans la journée peut rapidement devenir un défi.

MIFID 2 est l’une des dernières réglementations issue de la crise de 2007 à entrer en vigueur. Il reste encore quelques mois aux sociétés pour régler les derniers détails sur certains sujets. Après, cela ce ne sera pas encore le temps de se reposer puisque FRTB (Fundamental Review of the Trading Book), surnommée Bâle IV, est prévue pour une entrée en vigueur en janvier 2019.

facebooktwittergoogle_plusmail

Une soirée de fin d’année pleine de souvenirs, en images !

Laura NATAF

Pour sa soirée de fin d’année 2017, l’équipe OSSIA Conseil a multiplié les animations et a fait en sorte de pouvoir conserver des souvenirs en clichés et en vidéo de ce mémorable évènement. Désormais, chaque participant, ou presque, fait partie de notre “Wall of Fame”. t il n’a pas fini de se remplir 😉

The wall of famePHOTOMATON 2

facebooktwittergoogle_plusmail

Kata sur le refactoring et les tests unitaires

Laura NATAF

Notre consultant Yusuf a présenté la semaine dernière, à 8 développeurs spécialisés en développement C#, un KATA, c’est-à-dire un exercice consistant à apprendre en s’exerçant jusqu’à ce que le sujet soit maîtrisé par les participants.

Le sujet était le “Tennis refactoring Kata”, basé sur le language C#, et les idées ont fusionné tout au long de cette soirée spéciale organisée au sein de nos locaux.. L’échange fut le maître mot de ces quelques moments, suivis par une dégustation de pizzas au feu de bois autour de notre table de cuisine.

Voici quelques clichés représentatifs ! :)

WhatsApp Image 2017-11-08 at 20.46.25

WhatsApp Image 2017-11-08 at 20.49.59

WhatsApp Image 2017-11-09 at 10.29.53

 

 

facebooktwittergoogle_plusmail

Quoi de neuf sur Microsoft?

 

Il est primordial de se tenir informé des évolutions de son environnement de développement et de faire ce qu’on appelle communément de la veille techno. En ce qui me concerne, j’interviens sur une mission en tant développeur C# et je m’informe continuellement .

Découvrez ainsi mon retour sur les dernières versions Microsoft .NET 4.7 et Visual Studio 2017.

picto microsoft

1- .NET 4.7

Microsoft .NET Framework 4.7 est une mise à jour sur place hautement compatible des précédents framework .NET.

ll ajoute principalement des fonctionnalités sur le transfert de données, la communication réseau et le développement d’interfaces utilisateurs

  • Pour le transfert de données, c’est en particulier la classe DataContractJsonSerializer et la sérialisation WCF qui ont été améliorées;
  • Pour la communication réseau, il y a maintenant le possibilité de paramétrer les protocoles TLS par défaut alors qu’auparavant, il était nécessaire de coder;
  • Pour les technologies liées aux interfaces utilisateurs, on peut noter des fonctionnalités supplémentaires dans ASP.NET, WINFORM, WPF. Par exemple, la gestion de la mémoire pour ASP.NET, que ce soit au niveau du cache ou des ressources disponibles. Pour WINFORM ou WPF, il y a la gestion de la haute résolution (meilleur rendu graphique sur les moniteurs haute résolution), ou la gestion du tactile et du stylet (pour les moniteurs tels que la surface pro de Microsoft).

2 – Visual Studio

Visual Studio est une suite de logiciels conçue par Microsoft. Plus précisément, il s’agit d’un ensemble complet d’outils de développement permettant de générer des applications web ASP.NET, des services web XML, des applications bureautiques et des applications mobiles.

Visual Basic, Visual C++, Visual C# utilisent tous le même environnement de développement intégré (dit IDE), qui leur permet de partager des outils et facilite la création de solutions faisant appel à plusieurs langages.

Par ailleurs, ces langages permettent de mieux tirer parti des fonctionnalités du Framework .NET.

La dernière version est Visual Studio 2017. Voici les principales évolutions recensées sur cette version :

  • L’IDE est plus rapide plus réactif et est moins gourmand en consommation mémoire. Il contient bon nombre d’outils permettant d’être plus productif. On peut noter par exemple, la notification des tests unitaires faite en temps réel (pas uniquement pour mstest mais aussi Nunit et Xunit). Il en est de même pour la validation de dependance d’architecture. Cela risque de faire de l’ombre sur des outils comme Ncrunch;
  • Les tâches sont simplifiées : plus besoin de gérer les branches GIT via une extension comme gitextensions, visual studio l’intègre. Il est maintenant possible de configurer notre environnement de développement et le retrouver sur le poste que l’on souhaite en utilisant la gestion des extensions itinérantes;
  • Des raccourcis ont été ajoutés pour naviguer plus facilement dans une solution (on retrouvera des raccourcis similaires à ceux proposes par Resharper ou Productivity power tool);
  • Le développement d’application mobile: il est désormais possible d’innover et d’obtenir des résultats rapidement grâce à Xamarin, qui regroupe les exigences des différentes plateformes mobiles en une seule base de code ;
  • Il y a également beaucoup de nouveautés sur le debogage, notamment la gestion améliorée des erreurs.

N’hésitez pas à tester ces nouveautés et nous faire part de votre retour d’expérience !

facebooktwittergoogle_plusmail

Introduction à la Data Science

Eric Dupuis

On en entend parler de plus en plus de nos jours, des termes comme « big data » ou « machine learning » commencent même à être connus du grand public. Si la problématique est présente chez les grands du web comme facebook ou google depuis assez longtemps, l’utilisation de toutes ces techniques commence à se démocratiser. La république en marche aurait même utilisé certaines de ces techniques afin de mieux cibler son électorat pour faire du porte à porte lors des dernières élections par exemple. Mais qu’est-ce exactement que la data science et quel(s) domaine(s) recouvre-t-elle ?

 

1-    La Data Science : un domaine vaste

On retrouve un grand nombre de notions qui font partie, de près ou de loin, de la Data Science.

data science 2

A première vue, cela peut sembler un peu compliqué. Essayons d’y voir plus clair en définissant plus précisément 2 de ses expressions emblématiques.

 

2-    Big Data ou Data Science ? Kesako ?

Le « big data » désigne l’ensemble des techniques permettant l’exploitation et l’utilisation (analyse, tri, accès…) de très gros volumes de données. Ce domaine, très vaste, passe du stockage des données lui-même (avec des technos noSQL comme cassandra ou mongoDB), aux plateformes de traitements permettant une puissance de calcul suffisante pour traiter de tels volumes notamment en parallélisant les calculs (hadoop, mapReduce), des techniques d’analyse et de tri (statistiques, réseaux de neurones…).

La data science, désigne l’ensemble des techniques qui permettent d’analyser et de trier les données. Elle mélange modélisation mathématique et statistique ainsi qu’informatique. La data science s’applique donc aux données en général, pas spécifiquement au big data et c’est elle qui va nous intéresser principalement dans ce billet.

Si la majeure partie des techniques de data science existent depuis une trentaine d’années, ce n’est que récemment que nombre d’entre elles ont commencé à porter leurs fruits. Essentiellement grâce au big data. En effet, de nombreux modèles complexes nécessitent une grande quantité de données (et la puissance de calcul qui va avec) afin de révéler leur potentiel.

 

3-    Une approche avant tout mathématique

De façon très basique, la data science consiste à modéliser le comportement de données afin de prédire ou de trier ces données. Selon que le modèle choisi sera plus ou moins bien adapté aux données, on obtiendra des résultats plus ou moins intéressants.

Le domaine étant assez vaste, on va ici se limiter à l’étude de l’apprentissage automatique (machine learning).

Avant d’aller plus loin, il est nécessaire de préciser un peu ce que l’on entend par donnée. De manière générale, une donnée est une information qui concerne la réalité. Pour simplifier les choses on regroupe en général ces données autour d’un objet d’étude (par exemple un individu) et on rassemble alors ces données dans un tableau avec des colonnes décrivant l’objet de l’étude (par exemple si on s’intéresse aux individus, on pourra avoir des colonnes telles que nom, prénom, age, sexe, taille, poids, couleur des yeux, des cheveux…) et des lignes chacune décrivant un cas différent de l’étude.

En science des données, on distinguera essentiellement 2 types de données : les données discrètes (au sens statistique du terme) qui ont un nombre fini (raisonnable) de valeurs possibles, et les données continues qui peuvent prendre un nombre infini de valeurs différentes (ou très grand).

A suivre….

Dans le prochain article, nous rentrerons encore plus dans le détail de la Data Science et je vous exposerai ainsi les modèles et prédictions liés.

 

facebooktwittergoogle_plusmail

Soirée d’inauguration Ossia Conseil

Laura NATAF

La famille Ossia Conseil s’agrandit et on peut toujours compter sur la présence de nos Ossians pour nous accompagner dans cette magnifique aventure !

Merci d’être venus si nombreux à cette belle soirée d’inauguration.

On vous avait promis des photos… en voici quelques-unes!

20614559_10159081078875321_1612177075_n

20031535_320040838421056_8368804252169023481_n

20107795_10158963726210321_949975346_o

 

facebooktwittergoogle_plusmail