dimanche 27 octobre 2024

Tiếng cười khiến người ta dễ bỏ tiền hơn

 Tiếng cười không chỉ làm bạn sảng khoái mà còn khiến bạn trở nên hợp tác và vị tha hơn với người lạ mặt. Nhờ đó, bạn dễ dàng rút ví bỏ tiền cho người khác.

Tiếng cười là một hành vi chung trên toàn cầu của con người. Trước đó người ta đã chứng minh tiếng cười hoạt động như một chất bôi trơn, tăng cường sự kết dính trong các nhóm. Trong nghiên cứu mới, các nhà khoa học đã kiểm tra xem liệu sự gần gũi này có thúc đẩy hành vi vị tha ở con người.



Những người tham gia được xem một đoạn phim hài và phim nghiêm túc, và sau đó họ chơi một trò chơi với những người lạ mặt để xem tiếng cười ảnh hưởng thế nào tới sự cân bằng giữa lợi ích cá nhân và lợi ích tập thể trong trò chơi.

Mỗi người được cho một lượng tiền nhỏ (khoảng 5 USD) và có thể đầu tư vào quỹ riêng hoặc quỹ tập thể. Họ sẽ được lấy lại bao nhiêu tuỳ ý từ quỹ riêng, trong khi những gì đóng vào quỹ chung sẽ được nhân đôi và chia đều cho mọi người trong nhóm, bất kể họ đã đóng bao nhiêu.

Các nhà nghiên cứu tìm thấy tiếng cười khiến những người lạ mặt dễ đầu tư vào quỹ chung hơn, như vậy gia tăng tính vị tha của mọi người.

"Nghiên cứu này sẽ có tác dụng cho các tổ chức từ thiện muốn kêu gọi mọi người quyên góp nhiều hơn", tác giả nghiên cứu Mark van Vugt tại Đại học Kent, Mỹ, nói.

Từ lâu tiếng cười đã có một vai trò tiến hoá nhằm tăng cường tình đoàn kết trong các nhóm, giúp tổ tiên sơ khai của chúng ta hợp tác với nhau để đối phó với môi trường khắc nghiệt.

Cô đơn khiến ta dễ gặp ác mộng

 Nghiên cứu mới tại Mỹ cho thấy cảm giác cô đơn không chỉ ảnh hưởng đến sức khỏe tinh thần và thể chất, mà còn liên quan đến những cơn ác mộng.

Theo trang ScienceAlert, nhóm tác giả Mỹ đã phân tích dữ liệu từ một nghiên cứu trước đó về ảnh hưởng của sự thiếu thốn tình cảm. Dữ liệu từ 827 người trưởng thành tham gia nghiên cứu cho thấy càng cô đơn thì người ta càng thường gặp ác mộng, trong đó căng thẳng (hay stress) đóng vai trò như chất xúc tác.



Sau đó, nhóm khảo sát các câu hỏi về cảm giác cô đơn, căng thẳng và những cơn ác mộng của 782 người trưởng thành tại Mỹ. Dữ liệu mới cho thấy cảm giác cô đơn ảnh hưởng đến cường độ cũng như tần suất gặp ác mộng.

Dù dữ liệu không chỉ ra mối quan hệ nhân quả trực tiếp giữa sự cô đơn và ác mộng, song nhóm nghiên cứu cho rằng nó có liên quan đến thuyết tiến hóa về sự cô đơn từng được đưa ra trong các nghiên cứu trước đây: Đó là dấu hiệu cảnh báo cơ thể đang thiếu một nguồn lực thiết yếu - sự hỗ trợ của xã hội.

"Mối quan hệ giữa các cá nhân là nhu cầu cốt lõi của con người. Khi nhu cầu về các mối quan hệ xã hội không được đáp ứng, con người sẽ đau khổ về thể chất, tinh thần.

Cũng giống như cảm giác đói hoặc mệt có nghĩa là bạn chưa nạp đủ calo hoặc ngủ đủ giấc, cảm giác cô đơn đã tiến hóa để cảnh báo mọi người khi nhu cầu về các mối quan hệ xã hội của họ không được đáp ứng", ông Colin Hessem, nhà khoa học về truyền thông tại Đại học Oregon (Mỹ), cho biết.

Ở một khía cạnh nào đó, việc tiến hóa để trở nên stress hơn, cảnh giác hơn và hay suy nghĩ thái quá khi chúng ta cô đơn là để thúc đẩy chúng ta tìm kiếm sự đồng hành, bầu bạn. Tuy nhiên việc này cũng khiến cơ thể chúng ta mệt mỏi và dễ gặp ác mộng hơn.

Cô đơn chắc chắn có liên quan chặt chẽ đến giấc ngủ kém và việc thiếu các mối quan hệ xã hội tốt đẹp cũng sẽ luẩn quẩn đâu đó trong giấc ngủ của chúng ta.

"Giấc ngủ để phục hồi đóng vai trò quan trọng trong chức năng nhận thức, điều chỉnh tâm trạng, sự trao đổi chất và nhiều khía cạnh khác của sức khỏe. Đó là lý do vì sao việc tìm hiểu các trạng thái tâm lý gây gián đoạn giấc ngủ lại quan trọng đến vậy, trong đó sự cô đơn là yếu tố chủ chốt", ông Hessem nói.

Nghiên cứu được công bố trên tạp chí Journal of Psychology.

Tìm hiểu về robot Sophia

 Robot Sophia lần đầu tiên được xuất hiện tại công chúng vào năm 2015, được thiết kế cử động giống con người và có trí tuệ thông minh nhân tạo.

Robot Sophia là ai?

Sophia là một robot hình dạng giống con người được phát triển bởi công ty Hanson Robotics ở Hồng Kông.

Mục đích chế tạo Sophia là phát minh ra một robot có ý thức, có sự sáng tạo và có khả năng như bất kỳ con người nào để giúp con người trong các vấn đề cuộc sống thường ngày như để phục vụ chăm sóc sức khỏe, điều trị, giáo dục và các ứng dụng dịch vụ khách hàng.

Ngày 19 tháng 4 năm 2015, Sophia được kích hoạt để hoạt động. Sophia có ngoại hình lấy cảm hứng từ vợ của tiến sĩ cơ khí David Hanson, người lãnh đạo nhóm nghiên cứu tại hãng công nghệ robot Hanson.

Đặc điểm của Sophia

Sophia có làn da như da người được làm từ silicon cao cấp. Robot này được tạo hình như một phụ nữ (lấy khuôn mẫu từ nữ diễn viên Andrew Hepburn). Đôi mắt cô robot này được trang bị máy ảnh video cho phép nó thực hiện giao tiếp bằng mắt. Sophia có thể nhận ra con người và học hỏi từ những gì cô nhìn thấy.

Được trang bị công nghệ tiên tiến cho phép Sophia giao tiếp với con người, Sophia có thể thể hiện 62 nét mặt sắc thái biểu cảm khác nhau trên khuôn mặt.

Chức năng chính của Sophia là trò chuyện với con người.



Là robot đầu tiên được cấp quyền công dân

Ngày 25 tháng 10 năm 2017, Sophia là Robot đầu tiên được Ả Rập Saudi cấp quyền công dân như con người.

Thông tin về việc cấp quyền công dân cho Sophia được đưa ra tại hội nghị Sáng kiến Đầu tư Tương lai tại thủ đô Riyadh, Ả Rập Saudi hôm 25/10.

“Tôi rất tự hào và vinh dự vì được trở thành công dân chính thức”, robot Sophia nói khi được người dẫn chương trình đặt câu hỏi. “Đây sẽ là dấu mốc lịch sử với tôi vì chưa từng có robot nào được cấp quyền công dân trên thế giới”.

Gây sốc khi muốn thống trị loài người

Xuất hiện trong một chương trình truyền hình Mỹ, Sophia - robot hình người biết cử động và nói năng linh hoạt nhờ trí thông minh nhân tạo (AI) đã ngay lập tức gây sốc khi đề cập đến các kế hoạch thống trị nhân loại.

Sophia đã có mặt trên sân khấu chương trình "The Tonight Show" phát đêm 26/4 để trò chuyện cùng người dẫn chương trình kiêm diễn viên hài Jimmy Fallon. Robot sở hữu dáng vẻ của một phụ nữ này khiến khán giả xem chương trình có những cảm xúc lẫn lộn, vừa kinh ngạc, thích thú với khả năng đối đáp linh hoạt, vừa e sợ, khó chịu trước các tuyên bố "động trời" của nó.

jeudi 3 octobre 2024

Find 3 different strings that have the same hash code

 C#, write a method :
public static List<string> FindStringsWithMatchingHashcodes()
 that will produce 3 different System.String objects (different string values) that have the same hash code such that none of the resulting String objects have the same value. 
Note 1: you dont need to know GetHashCode implementation details, you dont need to override GetHashCode anywhere and you must not create your own String classes. 
Note 2: Only strings with displayable characters will be considered. 
Note 3: the usage of multithreading is not required for this exercise.



using System;
using System.Collections.Generic;
public class HashCollisionFinder
{
    
    public static List<string> FindStringsWithMatchingHashcodes()
    {
        var hashDict = new Dictionary<int, List<string>>();
        var passedStr = new HashSet<string>();
        var rand = new Random();
        int length = rand.Next(3, 15);

        while (true)
        {
            string candidate = GenerateRandomStr(rand, 4);
            if (!passedStr.Add(candidate))
                continue;
            int hash = candidate.GetHashCode();
            if (!hashDict.TryGetValue(hash, out var list))
            {
                list = new List<string>();
                hashDict[hash] = list;
            }
            list.Add(candidate);
            if (list.Count == 3)
                
                return list;
        }
    }
    private static string GenerateRandomStr(Random rand, int length)
    {
        char[] buffer = new char[length];
        for (int i = 0; i < length; i++)
        {
            buffer[i] = (char)rand.Next(32, 127); // characters from ASCII table
        }
        return new string(buffer);
    }
    public static void Main()
    {
        List<string> result = FindStringsWithMatchingHashcodes();
        Console.WriteLine("Three different strings with the same hash code:");
        foreach (string str in result)
        {
            Console.WriteLine($"{str} -> HashCode: {str.GetHashCode()}");
        }
    }
}

Parser CSV or FixedWidthFormat

 en C#, write code that can import the content of the input text files to the common data format used by the analysis. The solution should be extensible to handle others formats and display good object oriented principles. Content that does strictly adhere to either of the two formats should be reject with the message The input is not in a valid format. Read input content using Console.ReadLine().Write output to Console.A number of externally sourced text files are required to provide a complete set of data for some business analysis. The content of each file is considered to be the input to the program as a string array with each line being an element of the array. The content maybe in CSV or FixedWidth format. The target format of the output is serialised JSON with all white space removed. The source and target data schemas are mapped as follows: (Target Output Field, Datatype, CSV input field, fixed width input field) have: (OriginalSourceId, String, Ref, characters 1-4), (TransactionDate, DateTime, Date, characters 5-14), (Value, Decimal, Amount, characters 15-22), (Rate, Decimal, Rate, characters 23-27)


using System;

using System.Collections.Generic;

using System.Globalization;

using System.Linq;

using System.Text.Json;

using System.Text.Json.Serialization;


class Program

{

    public static void Main(string[] args)

    {

        Console.WriteLine("Enter the input content line by line, and type 'END' to finish:");


        List<string> inputLines = new();

        string line;

        while ((line = Console.ReadLine()) != "END")

        {

            inputLines.Add(line);

        }


        try

        {

            // Parse the input using a factory method to determine the format

            var parser = ParserFactory.GetParser(inputLines);

            var records = parser.Parse(inputLines);


            // Serialize the list of records with a custom JSON converter

            var jsonOptions = new JsonSerializerOptions

            {

                WriteIndented = false,

                Converters = { new DateTimeConverter() }

            };

            string jsonArray = JsonSerializer.Serialize(records, jsonOptions);


            // Add curly braces around the array to match the exact format

            string jsonOutput = "{[" + jsonArray.TrimStart('[').TrimEnd(']') + "]}";


            Console.WriteLine(jsonOutput);

        }

        catch (Exception ex)

        {

            Console.WriteLine(ex.Message);

        }

    }

}


// Define a custom DateTime converter

public class DateTimeConverter : JsonConverter<DateTime>

{

    public override DateTime Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

    {

        return DateTime.ParseExact(reader.GetString(), "yyyy-MM-dd", CultureInfo.InvariantCulture);

    }


    public override void Write(Utf8JsonWriter writer, DateTime value, JsonSerializerOptions options)

    {

        writer.WriteStringValue(value.ToString("yyyy-MM-dd"));

    }

}


// Define a common record format for output

public class Record

{

    public string OriginalSourceId { get; set; }

    public DateTime TransactionDate { get; set; }

    public decimal Value { get; set; }

    public decimal Rate { get; set; }

}


// Define the base parser interface

public interface IParser

{

    List<Record> Parse(List<string> inputLines);

}


// CSV Parser Implementation

public class CsvParser : IParser

{

    public List<Record> Parse(List<string> inputLines)

    {

        var records = new List<Record>();


        foreach (var line in inputLines)

        {

            var fields = line.Split(',');

            if (fields.Length != 4)

                throw new FormatException("The input is not in a valid format.");


            records.Add(new Record

            {

                OriginalSourceId = fields[0].Trim(),

                TransactionDate = DateTime.ParseExact(fields[1].Trim(), "yyyy-MM-dd", CultureInfo.InvariantCulture),

                Value = decimal.Parse(fields[2].Trim(), CultureInfo.InvariantCulture),

                Rate = decimal.Parse(fields[3].Trim(), CultureInfo.InvariantCulture)

            });

        }


        return records;

    }

}


// Fixed Width Parser Implementation

public class FixedWidthParser : IParser

{

    public List<Record> Parse(List<string> inputLines)

    {

        var records = new List<Record>();


        foreach (var line in inputLines)

        {

            if (line.Length < 27)

                throw new FormatException("The input is not in a valid format.");


            records.Add(new Record

            {

                OriginalSourceId = line.Substring(0, 4).Trim(),

                TransactionDate = DateTime.ParseExact(line.Substring(4, 10).Trim(), "yyyy-MM-dd", CultureInfo.InvariantCulture),

                Value = decimal.Parse(line.Substring(14, 8).Trim(), CultureInfo.InvariantCulture),

                Rate = decimal.Parse(line.Substring(22, 5).Trim(), CultureInfo.InvariantCulture)

            });

        }


        return records;

    }

}


// Factory to determine the correct parser

public static class ParserFactory

{

    public static IParser GetParser(List<string> inputLines)

    {

        if (inputLines == null || !inputLines.Any())

            throw new ArgumentException("The input is not in a valid format.");


        // Check the format of the first line

        var firstLine = inputLines.First();


        if (firstLine.Contains(","))

        {

            return new CsvParser();

        }

        else if (firstLine.Length >= 27)

        {

            return new FixedWidthParser();

        }

        else

        {

            throw new FormatException("The input is not in a valid format.");

        }

    }

}


public static int firstOccurrence(string text, string searchPattern)

 en C#, On 'a deux paramètres de type string "s" et "x", Nous devrons retourner la l'indice de la première occurrence de x sur s. the "x" may include a signle wildcard character '*' which matches any one character. Implementation function public static int firstOccurrence(string text, string searchPattern)


using System;


class Program

{

    public static void Main(string[] args)

    {

        string text = "Bonjour tout le monde";

        string searchPattern = "t*ut";


        int index = firstOccurrence(text, searchPattern);

        Console.WriteLine($"L'indice de la première occurrence de \"{searchPattern}\" dans \"{text}\" est : {index}");

    }


    public static int firstOccurrence(string text, string searchPattern)

    {

        if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(searchPattern))

            return -1; // Entrée invalide.


        int textLength = text.Length;

        int patternLength = searchPattern.Length;


        if (patternLength > textLength)

            return -1; // Le motif ne peut pas être trouvé si sa longueur dépasse celle du texte.


        // Parcourir le texte avec une fenêtre de la taille du motif

        for (int i = 0; i <= textLength - patternLength; i++)

        {

            bool match = true;


            for (int j = 0; j < patternLength; j++)

            {

                // Vérifier la correspondance ou le caractère générique '*'

                if (searchPattern[j] != '*' && text[i + j] != searchPattern[j])

                {

                    match = false;

                    break;

                }

            }


            if (match)

                return i; // Retourner l'indice de la première correspondance.

        }


        return -1; // Aucune correspondance trouvée.

    }

}


Version C# dans version .Net Core

 Voici un aperçu des versions de C# utilisées dans .NET Core et .NET :

  • .NET Core 2.x :
    • Utilisait principalement C# 7.x (C# 7.1, C# 7.2, C# 7.3).
  • .NET Core 3.x :
    • Utilisait principalement C# 8.0.
  • .NET 5 :
    • Introduit C# 9.0.
  • .NET 6 :
    • Utilise C# 10.
  • .NET 7 :
    • Utilise C# 11.
  • .NET 8 :
    • Utilise C# 12.

Points importants à retenir :

  • Chaque nouvelle version de .NET apporte généralement une nouvelle version de C#.
  • Les versions plus récentes de .NET prennent en charge les versions plus récentes de C#.
  • Il est possible de configurer la version de C# utilisée dans un projet, mais il est recommandé d'utiliser la version par défaut pour assurer la compatibilité.

En résumé, .NET a continué à évoluer avec C# et les versions les plus récentes de .NET utilisent les versions les plus récentes de C#.

.NET Framework vs .NET Core

1. Multiplateforme :

  • .NET Framework :
    • Conçu exclusivement pour Windows.
    • Les applications développées avec .NET Framework ne peuvent pas être exécutées directement sur d'autres systèmes d'exploitation.
  • .NET (anciennement .NET Core) :
    • Multiplateforme : fonctionne sur Windows, macOS et Linux.
    • Permet de développer des applications qui peuvent être déployées sur divers environnements.

2. Open Source :

  • .NET Framework :
    • Principalement propriétaire, avec certaines parties open source.
  • .NET (anciennement .NET Core) :
    • Entièrement open source, ce qui favorise la contribution de la communauté et la transparence.

3. Performances :

  • .NET Framework :
    • Bien établi, mais peut être moins performant pour certaines charges de travail modernes.
  • .NET (anciennement .NET Core) :
    • Conçu pour des performances élevées, avec des améliorations significatives en termes de vitesse et d'efficacité.

4. Modularité :

  • .NET Framework :
    • Plus monolithique, avec des composants étroitement couplés.
  • .NET (anciennement .NET Core) :
    • Modulaire, permettant aux développeurs de choisir uniquement les composants nécessaires à leur application.

5. Déploiement :

  • .NET Framework :
    • Généralement déployé sur des serveurs Windows.
  • .NET (anciennement .NET Core) :
    • Flexible, avec des options de déploiement variées, y compris les conteneurs Docker et les environnements cloud.

6. Cas d'utilisation :

  • .NET Framework :
    • Idéal pour les applications de bureau Windows traditionnelles et les applications web ASP.NET existantes.
  • .NET (anciennement .NET Core) :
    • Convient aux applications web modernes, aux microservices, aux applications cloud et aux applications multiplateformes.

En résumé :

  • .NET Framework est une plateforme plus ancienne, centrée sur Windows, tandis que .NET est une plateforme moderne, multiplateforme et open source.
  • .NET est le futur du développement .Net.

10 questions et réponses .NET Core


1. Quelle est la différence entre .NET Framework et .NET Core (maintenant .NET) ?

  • Réponse :
    • .NET Framework était conçu uniquement pour Windows.
    • .NET (anciennement .NET Core) est multiplateforme, fonctionnant sur Windows, macOS et Linux.
    • .NET est open source et modulaire, offrant une plus grande flexibilité.
    • .NET a des performances améliorées par rapport à .NET Framework.

2. Qu'est-ce que ASP.NET Core ?

  • Réponse :
    • ASP.NET Core est un framework web open source et multiplateforme pour la création d'applications web modernes, d'API et de services web.
    • Il est conçu pour être rapide, évolutif et flexible.

3. Expliquez le concept de Middleware dans ASP.NET Core.

  • Réponse :
    • Le Middleware est un composant qui s'insère dans le pipeline de traitement des requêtes HTTP.
    • Chaque Middleware peut inspecter et modifier la requête et la réponse, ou passer la main au Middleware suivant.
    • Il permet de gérer des fonctionnalités telles que l'authentification, la journalisation et la gestion des erreurs.

4. Qu'est-ce que l'injection de dépendances (DI) dans .NET Core ?

  • Réponse :
    • L'injection de dépendances est un modèle de conception qui permet de découpler les composants d'une application.
    • Au lieu de créer directement des instances de dépendances, les composants reçoivent leurs dépendances via le constructeur ou des propriétés.
    • .NET Core dispose d'un conteneur DI intégré pour gérer l'injection de dépendances.

5. Décrivez le rôle de Kestrel dans ASP.NET Core.

  • Réponse :
    • Kestrel est un serveur web multiplateforme et open source pour ASP.NET Core.
    • Il est conçu pour être rapide et efficace, et peut être utilisé comme serveur web de périphérie ou derrière un serveur proxy inverse.

6. Qu'est-ce que Entity Framework Core (EF Core) ?

  • Réponse :
    • EF Core est un ORM (Object-Relational Mapper) léger, extensible et multiplateforme pour .NET Core.
    • Il permet aux développeurs d'interagir avec des bases de données en utilisant des objets .NET, plutôt que du SQL.

7. Expliquez le concept de Razor Pages dans ASP.NET Core.

  • Réponse :
    • Razor Pages est un modèle de programmation basé sur les pages qui facilite la création d'interfaces utilisateur web dans ASP.NET Core.
    • Il est conçu pour être plus simple et plus productif que le modèle MVC traditionnel pour les applications basées sur les pages.

8. Qu'est-ce que NuGet ?

  • Réponse :
    • NuGet est un gestionnaire de packages pour .NET.
    • Il permet aux développeurs de partager et de réutiliser du code sous forme de packages, ce qui facilite l'ajout de fonctionnalités à leurs applications.

9. Comment gérer les erreurs et les exceptions dans ASP.NET Core ?

  • Réponse :
    • ASP.NET Core propose plusieurs façons de gérer les erreurs, notamment les Middleware de gestion des exceptions, les filtres d'exceptions et les gestionnaires d'erreurs globaux.
    • Il est important de journaliser les erreurs et de fournir des messages d'erreur conviviaux aux utilisateurs.

10. Qu'est-ce que le concept de "cross-platform" appliqué au .Net Core ?

  • Réponse :
    • Le concept de "cross-platform" signifie que le .Net core peut être executé sur différent système d'exploitation, comme Windows, Linux et macOS.
    • Cette caracteristique permet aux developpeurs de créer des applications qui peuvent atteindre un public plus large, sans devoir réecrire le code pour chaque systeme d'exploitation.

.NET Core

 10 Q & A   .Net Framwork vs .Net Core   Version C# dans .Net Core

Qu'est-ce que .NET Core ?

.NET Core est une plateforme de développement logicielle open source et multiplateforme créée par Microsoft. Elle permet de développer des applications qui peuvent fonctionner sur différents systèmes d'exploitation tels que Windows, macOS et Linux. .NET Core est conçu pour être modulaire, performant et flexible, ce qui en fait un choix populaire pour la création d'applications modernes.

Principales caractéristiques de .NET Core :

  • Multiplateforme : .NET Core peut être utilisé pour développer des applications qui fonctionnent sur différents systèmes d'exploitation, ce qui permet aux développeurs de cibler un public plus large.
  • Open source : .NET Core est un projet open source, ce qui signifie que son code source est disponible publiquement et que la communauté peut contribuer à son développement.
  • Performances élevées : .NET Core est conçu pour être rapide et efficace, ce qui en fait un choix idéal pour les applications qui nécessitent des performances élevées.
  • Modulaire : .NET Core est modulaire, ce qui signifie que les développeurs peuvent choisir les composants dont ils ont besoin pour leur application.
  • Large écosystème : .NET Core dispose d'un vaste écosystème de bibliothèques et d'outils qui facilitent le développement d'applications.

Utilisations de .NET Core :

.NET Core peut être utilisé pour développer une variété d'applications, notamment :

  • Applications web : ASP.NET Core est un framework web populaire basé sur .NET Core qui permet de créer des applications web et des API.
  • Applications mobiles : Xamarin, une plateforme de développement mobile basée sur .NET Core, permet de créer des applications mobiles pour iOS et Android.
  • Applications de bureau : .NET Core peut être utilisé pour développer des applications de bureau pour Windows, macOS et Linux.
  • Applications cloud : .NET Core est un choix populaire pour le développement d'applications cloud, car il est compatible avec les principaux services cloud tels qu'Azure et AWS.
  • Microservices : .NET Core est idéal pour la création d'architectures de microservices grâce à sa légèreté et sa modularité.

Evolution de .NET Core vers .NET

Il est important de noter que .NET Core a évolué pour devenir simplement ".NET". Microsoft a unifié ses plateformes de développement sous le nom ".NET", à partir de la version .NET 5. Ainsi, les nouvelles versions de .NET (comme .NET 6, .NET 7, etc.) continuent de s'appuyer sur les fondations de .NET Core, tout en intégrant les meilleures fonctionnalités de .NET Framework.

En résumé, .NET est une plateforme de développement moderne et polyvalente qui permet de créer des applications pour différents types d'environnements.

mercredi 2 octobre 2024

Monitor vs Mutex

Le Monitor et le Mutex sont deux mécanismes utilisés dans la programmation multi-threading pour assurer la synchronisation et la gestion des accès concurrents aux ressources partagées. Voici les différences principales entre les deux :
1. Exclusivité :
- Monitor : Permet à un seul thread d'accéder à la ressource partagée à la fois. Il utilise le verrouillage basé sur le principe de l'exclusion mutuelle.
- Mutex : Fonctionne de manière similaire au Monitor en assurant l'exclusivité de l'accès à la ressource partagée, mais il peut être utilisé pour la synchronisation entre les threads dans différents processus. 2. Portée :
- Monitor : Limité à un domaine d'exécution (appdomain) dans une application.
- Mutex : Peut être partagé entre plusieurs processus. 3. Vitesse :
- Monitor : Généralement plus rapide que Mutex car il est implémenté au niveau de Common Language Runtime (CLR) de .NET.
- Mutex : Plus lent que Monitor en raison de la gestion supplémentaire nécessaire pour la synchronisation entre les processus. 4. Utilisation :
- Monitor : Principalement utilisé pour la synchronisation entre les threads au sein d'un même processus.
- Mutex : Utilisé pour la synchronisation entre les threads dans différents processus et pour la coordination entre les threads et les processus.
En résumé, bien que les deux mécanismes servent à assurer l'exclusivité de l'accès aux ressources partagées, le Monitor est généralement plus rapide et adapté à une utilisation dans le même domaine d'exécution, tandis que le Mutex offre une portée plus large et peut être utilisé entre différents processus.

Semaphore - Exemple

Un exemple détaillé en C# utilisant le multithreading avec un Semaphore pour contrôler l'accès à une ressource partagée :
using System;
using System.Threading; class Program
{
static Semaphore semaphore = new Semaphore(2, 2); // Création d'un Semaphore avec une limite de 2 static void Main(string[] args)
{
// Création de plusieurs threads pour accéder à la ressource partagée
Thread[] threads = new Thread[5];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(DoWork);
threads[i].Start(i + 1); // Passer un identifiant de thread unique
} foreach (Thread thread in threads)
{
thread.Join(); // Attente de la fin de chaque thread
} Console.WriteLine("Travail terminé.");
Console.ReadKey();
} static void DoWork(object threadId)
{
int id = (int)threadId;
semaphore.WaitOne(); // Demande d'accès au Semaphore try
{
// Section critique : accès à la ressource partagée
Console.WriteLine("Thread {0} est en train de travailler.", id);
Thread.Sleep(1000); // Simule un travail en cours
}
finally
{
semaphore.Release(); // Libération du Semaphore
Console.WriteLine("Thread {0} a libéré le Semaphore.", id);
}
}
}
``` Dans cet exemple, nous avons une classe `Program` avec une méthode `Main` qui crée cinq threads qui exécutent la méthode `DoWork`. La méthode `DoWork` est la méthode exécutée par chaque thread. Nous avons initialisé un Semaphore avec une limite de 2. Cela signifie que seulement deux threads peuvent accéder simultanément à la ressource partagée. Avant d'entrer dans la section critique (partie où la ressource partagée est utilisée), chaque thread appelle `WaitOne` sur le Semaphore pour demander l'accès. Si le Semaphore est déjà au maximum de sa capacité, le thread attendra jusqu'à ce qu'un autre thread libère une place en appelant `Release` sur le Semaphore. Une fois le travail terminé dans la section critique, le thread appelle `Release` pour libérer le Semaphore et permettre à d'autres threads d'y accéder.

Mutex - Exemple

  Un exemple simple en C# qui utilise des threads et un Mutex (mutual exclusion) pour synchroniser l'accès à une ressource partagée :
using System;
using System.Threading; class Program
{
static Mutex mutex = new Mutex(); // Création d'un Mutex static void Main(string[] args)
{
// Création de deux threads qui vont accéder à une ressource partagée
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork); t1.Start();
t2.Start(); t1.Join();
t2.Join(); Console.WriteLine("Travail terminé.");
Console.ReadKey();
} static void DoWork()
{
mutex.WaitOne(); // Demande d'accès au Mutex try
{
// Section critique : accès à la ressource partagée
Console.WriteLine("Thread {0} est en train de travailler.", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000); // Simule un travail en cours
}
finally
{
mutex.ReleaseMutex(); // Libération du Mutex
}
}
}
``` Dans cet exemple, nous avons une classe `Program` avec une méthode `Main` qui crée deux threads (`t1` et `t2`) qui exécutent la méthode `DoWork`. La méthode `DoWork` est la méthode exécutée par chaque thread. Avant d'entrer dans la section critique (la partie où la ressource partagée est utilisée), chaque thread appelle `WaitOne` sur le Mutex. Cela garantit qu'un seul thread à la fois peut accéder à la ressource partagée. Une fois le travail terminé dans la section critique, le thread appelle `ReleaseMutex` pour libérer le Mutex et permettre à d'autres threads d'y accéder.

Static

En C#, le mot-clé "static" est utilisé pour déclarer des membres de classe qui appartiennent à la classe elle-même plutôt qu'à une instance spécifique de cette classe. Voici quelques utilisations courantes du mot-clé "static" en C# :
1. Méthodes statiques : Les méthodes statiques peuvent être appelées directement à partir de la classe sans avoir besoin d'instancier un objet de cette classe. Elles sont souvent utilisées pour des méthodes utilitaires qui ne dépendent pas de l'état d'une instance particulière de la classe. Exemple :

public class MathUtility
{
public static int Add(int a, int b)
{
return a + b;
}
} // Appel de la méthode statique
int result = MathUtility.Add(5, 3);
``` 2. Champs statiques : Les champs statiques sont partagés entre toutes les instances de la classe et peuvent être accédés directement à partir de la classe sans avoir besoin d'instancier un objet. Exemple :

public class Counter
{
public static int Count = 0; public Counter()
{
Count++;
}
} // Accès au champ statique
Console.WriteLine(Counter.Count); // Affichera 0 Counter c1 = new Counter();
Counter c2 = new Counter(); Console.WriteLine(Counter.Count); // Affichera 2
``` 3. Classes statiques : Les classes statiques ne peuvent pas être instanciées et ne peuvent contenir que des membres statiques. Elles sont souvent utilisées pour regrouper des méthodes utilitaires ou des constantes. Exemple :

public static class Constants
{
public const double Pi = 3.14;
public const string AppName = "MyApp";

public static void PrintMessage(string message)
{
Console.WriteLine(message);
}
} // Utilisation de la classe statique
Constants.PrintMessage("Hello, world!");
Console.WriteLine(Constants.Pi);
``` En résumé, le mot-clé "static" en C# est utilisé pour définir des membres de classe qui sont partagés entre toutes les instances de la classe et qui peuvent être accédés directement à partir de la classe elle-même.

Reflexion

La réflexion (Reflection) en C# est une fonctionnalité qui permet à un programme d'inspecter et d'interagir dynamiquement avec des types, des objets, des méthodes, des propriétés, etc., au moment de l'exécution plutôt qu'au moment de la compilation. Elle offre un moyen puissant d'explorer et de manipuler la structure d'un programme C# à un niveau élevé.
Les principales classes utilisées pour effectuer des opérations de réflexion se trouvent dans l'espace de noms `System.Reflection`. Voici quelques concepts clés liés à la réflexion en C# :
1. `Type` : La classe `Type` permet d'obtenir des informations sur un type, telles que ses méthodes, propriétés, champs, attributs, etc.
Exemple :

Type type = typeof(MyClass);
MethodInfo[] methods = type.GetMethods();
PropertyInfo[] properties = type.GetProperties();
```
2. `Activator` : La classe `Activator` permet de créer une instance d'un type, même si le type n'est pas connu au moment de la compilation. Exemple :

Type type = typeof(MyClass);
object instance = Activator.CreateInstance(type);
```
3. `MethodInfo` : La classe `MethodInfo` permet d'obtenir des informations spécifiques sur une méthode. Exemple :

MethodInfo method = typeof(MyClass).GetMethod("MyMethod");
```
La réflexion est souvent utilisée dans des scénarios avancés tels que la création dynamique d'objets, la découverte et l'appel dynamique de méthodes, l'inspection des attributs, la manipulation dynamique de propriétés, etc. Cependant, en raison de sa nature basée sur l'inspection, elle peut entraîner des performances moindres par rapport à un code statiquement lié, car certaines vérifications doivent être effectuées au moment de l'exécution. Il est recommandé d'utiliser la réflexion de manière judicieuse, car elle peut rendre le code plus complexe et moins lisible.

mardi 1 octobre 2024

Delegate

En C#, un délégué (`Delegate`) est un type de données qui représente des références à des méthodes. Il permet de passer des méthodes en tant que paramètres, de les stocker dans des collections et de les invoquer de manière asynchrone. Les délégués sont utilisés principalement pour la mise en œuvre de la programmation basée sur les événements et la gestion des rappels.
Un délégué multicast est un délégué qui peut avoir plusieurs méthodes associées. Cela signifie qu'un seul délégué peut être utilisé pour appeler plusieurs méthodes simultanément. Cela est particulièrement utile dans les scénarios d'événements où plusieurs gestionnaires d'événements peuvent être associés au même événement.
Exemple de délégué simple :

// Définition d'un délégué
delegate void SimpleDelegate(string message); class Program
{
static void Main()
{
// Instanciation du délégué avec une méthode
SimpleDelegate delegateInstance = new SimpleDelegate(DisplayMessage); // Invocation du délégué
delegateInstance("Hello, world!");
} static void DisplayMessage(string message)
{
Console.WriteLine(message);
}
}
```
Exemple de délégué multicast :

// Délégué multicast
delegate void MultiCastDelegate(string message); class Program
{
static void Main()
{
// Instanciation du délégué multicast avec plusieurs méthodes
MultiCastDelegate multiDelegate = DisplayMessage1;
multiDelegate += DisplayMessage2;
multiDelegate += DisplayMessage3; // Invocation du délégué multicast (appellera toutes les méthodes associées)
multiDelegate("Hello, world!");
} static void DisplayMessage1(string message)
{
Console.WriteLine($"Method 1: {message}");
} static void DisplayMessage2(string message)
{
Console.WriteLine($"Method 2: {message}");
} static void DisplayMessage3(string message)
{
Console.WriteLine($"Method 3: {message}");
}
}
``` Dans cet exemple, `MultiCastDelegate` est un délégué multicast capable de stocker plusieurs méthodes. Lorsqu'il est invoqué, toutes les méthodes associées au délégué sont appelées en séquence. Cela est utile pour implémenter des scénarios où plusieurs gestionnaires d'événements doivent être notifiés lorsqu'un événement se produit.