@manhng

Welcome to my blog!

Fake & some things about .NET

January 30, 2021 22:30

Fake and some things about .NET (edit)

Faker.js

Generate massive amounts of realistic fake data in Node.js and the browser

https://github.com/marak/Faker.js/

Bogus

A simple and sane fake data generator for C#

https://github.com/bchavez/Bogus/

https://stackoverflow.com/questions/6625490/c-sharp-library-to-populate-object-with-random-data/

var user = testUsers.Generate();
Console.WriteLine(user.DumpAsJson());

Types of auto generated data include:

  • Addresses: ZipCode, City, Country, Latitude, etc.
  • Commerce: Department name, ProductName, ProductAdjective, Price, etc.
  • Company: CompanyName, CatchPhrase, Bs, etc.
  • Date: Past, Soon, Between, etc.
  • Finance: Account number, TransactionType, Currency, CreditCardNumber, etc.
  • Image URL: Random image, Animals image, Nature image, etc.
  • Internet: Email, DomainName, Ipv6, Password, etc.
  • Lorem: single word, Words, Sentence, Paragraphs, etc.
  • Name: FirstName, LastName, etc.
  • Rant: Random user review, etc.
  • System: FileName, MimeType, FileExt, etc.

Faker.Data

Faker library for fake data

https://github.com/FermJacob/Faker.Data

MockData

https://www.codeproject.com/Tips/697006/Creating-mock-data-for-software-testing

  • .NET Framework 4.5

FakeItEasy

The easy mocking library for .NET

https://github.com/FakeItEasy/FakeItEasy/

https://fakeiteasy.github.io/

https://daniel-krzyczkowski.github.io/Easy-mocking-in-C-code-with-FakeItEasy-library/

  • .NET Framework 4.5

Faker.NET

C# port of the Ruby Faker gem (http://faker.rubyforge.org/) and is used to easily generate fake data: names, addresses, phone numbers, etc.

https://www.nuget.org/packages/Faker.Net/ 

  • .NET Framework 4.0

https://github.com/slashdotdash/faker-cs/

  • .NET Framework 4.0

.NET Fiddle

C# Online Compiler | .NET Fiddle

https://dotnetfiddle.net/

Data Access: CRUD

    public interface IDataRepository<T> where T : BaseEntity
    {
        Task<T> AddAsync(T newEntity);
        Task<T> GetAsync(string entityId);
        Task<T> UpdateAsync(T entity);
        Task DeleteAsync(string entityId);
        Task<IReadOnlyList<T>> GetAllAsync();
    }
    public abstract class BaseEntity
    {
        [JsonPropertyName("id")]
        public string Id { get; set; }
    }

1) Message Queue

https://toidicodedao.com/2019/10/08/message-queue-la-gi-ung-dung-microservice/

Message queue là gì

Message Queue nôm na là Queue (hàng đợi), chứa Message (Tin nhắn) như hộp thư.

  1. RabbitMQ
  2. Kafka

2) Message Bus

Message Bus còn được gọi Service Bus.

Message Bus cung cấp phương thức để một hoặc nhiều application giao tiếp message đến một hoặc nhiều application khác.

Message Bus không đảm bảo cho việc vào trước xuất trước. Người nhận (Subscribers) đã đăng ký Message Bus có thể nhận message được publish mà không biết về người gửi (Publisher or Sender).

Một số Message Bus được dùng hiện nay:

  1. Microsoft Azure Service Bus
  2. Oracle Enterprise Service Bus

3) Message Broker

https://topdev.vn/blog/system-design-co-ban-message-broker/

4) Identity Server 4

IdentityServer4 là 1 framework  .NET dành cho OpenID Connect và OAuth 2.0.

Hiện tại, mình chỉ biết 1 vài thư viện làm nhiệm vụ như Authorization Server:

  1. Identity Server 4
  2. Azure Active Directory
  3. Auth0
  4. OpenIddict
  5. Google OAuth 2.0
  6. Facebook Login

OAuth2 có 4 loại grant type:

  1. Resource Owner Password Credentials
  2. Authorization Code
  3. Implicit
  4. Client Credentials

https://alexbilbie.com/guide-to-oauth-2-grants/

OAuth 2.0 Password Grant

https://developer.okta.com/blog/2018/06/29/what-is-the-oauth2-password-grant

Khi nào thì sử dụng password grant?

Chỉ nên sử dụng cho những ứng dụng thực sự được tin tưởng vì nó trực tiếp xử lý thông tin đăng nhập của người dùng.

Ứng dụng đưa ra một form cho phép người dùng nhập thông tin đăng nhập (ví dụ: username/password).

Ứng dụng gửi thông tin đăng nhập cùng thông tin định danh của mình lên Authorization Server. Authorization Server xác thực thông tin, trả lại access token và refresh token (nếu có).

Ứng dụng sử dụng access token truy cập tài nguyên trên Resource Server.

5) OAuth 2 Simplified

This post describes OAuth 2.0 in a simplified format to help developers and service providers implement the protocol.

https://aaronparecki.com/oauth-2-simplified/#authorization

Roles

The Third-Party Application: "Client"

The client is the application that is attempting to get access to the user's account. It needs to get permission from the user before it can do so.

The API: "Resource Server"

The resource server is the API server used to access the user's information.

The Authorization Server

This is the server that presents the interface where the user approves or denies the request. In smaller implementations, this may be the same server as the API server, but larger scale deployments will often build this as a separate component.

The User: "Resource Owner"

The resource owner is the person who is giving access to some portion of their account.

6) Ba yếu tố quan trọng của một hệ thống

Khi thiết kế một hệ thống phục vụ hàng triệu người dùng, ta cần để ý 3 yếu tố quan trọng nhất: Performance, Availability, và Scalability:
  • Performance: Tốc độ phản hồi của hệ thống, được đo bằng đơn vị thời gian, có thể là giây hoặc mili giây. Hệ thống hoạt động càng nhanh thì người dùng làm được nhiều việc hơn, đem lại lợi nhuận cao hơn. Hệ thống mà quá chậm thì sẽ không có ai sử dụng.
  • Availability: Chỉ khả năng hoạt động của hệ thống vào mọi thời điểm, được đo bằng uptime. Ví dụ như trong 100 ngày, hệ thống hoạt động 99 ngày còn 1 ngày die thì uptime là 99/100 = 99%.
    • Uptime của các hệ thống lớn như Facebook, Google, Uber phải luôn >99%, vì chỉ cần ngưng hoạt động vài phút là các công ty sẽ thiệt hại từ vài nghìn cho tới vài triệu đô.
    • Hôm trước phỏng vấn ở Agoda, anh Director chia sẻ 1 giây Agoda kiếm được 1000 đô. Bum bum bum 3s là 3000 đô. Do đó hệ thống mà sập cỡ 5-10 phút là thiệt hại sẽ… hơi bị bự.
  • Scalability: Khả năng mở rộng của hệ thống. Liệu khi có đông user hơn thì hệ thống có thể mở rộng (scale) được không? Việc scale có thể thực hiện dễ dàng, nhanh chóng hay không? Chi phí scale như thế nào?
    • Ví dụ lượng người dùng tăng gấp 10, ta chỉ cần tăng gấp 2 hoặc gấp 5 lượng server là phục vụ được, hệ thống có scalability cao. Tuy nhiên, nếu ta phải tăng gấp 100, gấp 200 lượng server, hoặc không thể thêm server để phục vụ chừng đó người dùng, hệ thống có scalability thấp.

7) Một số đặc điểm chính của một mạng Blockchain lý tưởng:

  • Decentralization (Phi tập trung)
  • Security (Tính bảo mật)
  • Scalability (Khả năng mở rộng)

8) Một số tình huống phổ biến trong đó có thể có ích để bảo vệ cơ sở dữ liệu:

  • Lượng dữ liệu ứng dụng tăng lên vượt quá dung lượng lưu trữ của một nút cơ sở dữ liệu.
  • Khối lượng ghi hoặc đọc vào cơ sở dữ liệu vượt quá những gì một nút hoặc bản sao đọc của nó có thể xử lý, dẫn đến thời gian phản hồi hoặc thời gian chờ bị chậm.
  • Băng thông mạng được ứng dụng yêu cầu vượt quá băng thông có sẵn cho một nút cơ sở dữ liệu và bất kỳ bản sao đọc nào, dẫn đến thời gian phản hồi hoặc thời gian chờ bị chậm.

9) Sharding là để mở rộng ghi và Replication là để mở rộng đọc

https://cloudfun.vn/threads/lam-viec-tren-scale-replication-and-sharding-la-gi-va-cach-su-dung-chung.157/

10) KHI CODE MÀ BÍ THÌ PHẢI LÀM SAO?

5 KINH NGHIỆM SIÊU HAY ĐỂ GIẢI QUYẾT VẤN ĐỀ

1. Google vấn đề để xem người khác giải quyết ra sao

2. Tách thành nhiều vấn đề nhỏ hơn cho dễ xử lý

3. Thử giải quyết vấn đề dễ hơn trước

4. Đọc lại document, hỏi ý kiến đồng nghiệp

5. Đi uống, đi dạo đi ngủ (1 mình)

11) BỐN PHƯƠNG PHÁP RÈN LUYỆN TƯ DUY LẬP TRÌNH

1. Học kĩ và nắm vững căn bản trước

2. Làm bài tập về thuật toán

3. Làm sản phẩm để có tư duy sản phẩm

4. Học rộng hơn, học những thứ mình chưa biết

12) Định hướng tương lai

Leadership, Managing People, Managing Product

Technical thì nên theo dõi Newsletter (tổng hợp nhiều nguồn)

Technical Lead
Bạn cần hiểu biết về công nghệ sâu và rộng, vì chính bạn là người lựa chọn công nghệ, qui trình… cho 1 dự án. Những quyết định lớn về thiết kế, cấu trúc code … sẽ do bạn chịu trách nhiệm. Ở giai đoạn này, ngoài việc technical “cứng”, bạn còn phải giỏi thuyết trình, hướng dẫn, giải thích… Vì sao á? Lead đưa ra vấn đề thì phải giải thích hợp lý, thành viên khác nó mới hiểu, nể và làm theo chứ. Mức lương cho vị trí này vào khoảng 1500-2500$.

Software Architect
Muốn đạt chức danh này, ít nhất bạn phải có 10-20 năm trong ngành. (Nhìn thằng nào mặt mũi trẻ măng mà vỗ ngực tự xưng SA thì đừng tin). Công việc của bạn khá gian khổ: Từ một yêu cầu “mơ hồ” của khách hàng, bạn phải làm việc với BA để đánh giá solution, làm việc với PM để xây dựng 1 team, làm việc với Technical Lead để thiết kế, đưa ra các quyết định quan trọng về kiến trúc. Vị trí này mặc dù không có quyền quản lý, nhưng lại có khá nhiều quyền lực ngầm. Mức lương cũng ngang ngửa hoặc cao hơn cả manager.

Console.WriteLine(System.DateTime.UtcNow.ToString("yyyyMMdd_hhmmsttt")); //=> 20210130_032054PM 
Console.WriteLine(System.DateTime.UtcNow.ToString("yyyyMMdd_HHmms")); // => 20210130_152054

Fake & Unit Testing

September 2, 2020 10:35

Fake & Unit Testing (edit)

There are three Unit Test project types for .NET Core.

  • MSTest Test Project (.NET Core)
  • xUnit Test Project (.NET Core)
  • NUnit Test Project (.NET Core)

This article focus on:

  • Visual Studio 2019 Enterprise
    • Test Explorer
    • Live Unit Testing
  • ASP.NET Core 3.1
  • EF Core 3.1
  • xUnit
    • [Fact]
    • [Theory]
    • [InlineData]
    • [ClassData] 
    • [MemberData] 
    • [DataAttribute]
    • IEnumerable<object[]>
  • Moq
  • Faker.js
  • Integration tests
  • Selenium WebDriver

https://github.com/Ermesx/testing-context

https://github.com/bchavez/Bogus

Code template

https://wakeupandcode.com/unit-testing-in-asp-net-core/

public class Calculator
{
    public int Add(int value1, int value2)
    {
        return value1 + value2;
    }
}
public class CalculatorTests
{
    [Fact]
    public void CanAdd()
    {
        var calculator = new Calculator();

        int value1 = 1;
        int value2 = 2;

        var result = calculator.Add(value1, value2);

        Assert.Equal(3, result);
    }
}
[Theory]
[InlineData(1, 2, 3)]
[InlineData(-4, -6, -10)]
[InlineData(-2, 2, 0)]
[InlineData(int.MinValue, -1, int.MaxValue)]
public void CanAddTheory(int value1, int value2, int expected)
{
    var calculator = new Calculator();

    var result = calculator.Add(value1, value2);

    Assert.Equal(expected, result);
}
public void TestAddNumbers(int x, int y, int expectedResult)
{
   // 1. Arrange
   var cs = new CalcService();

   // 2. Act 
   var result = cs.AddNumbers(x, y);

   // 3. Assert 
   Assert.Equal(expectedResult, result);
}

References:

https://www.simongilbert.net/unit-testing-xunit-csharp-dotnetcore/

https://wakeupandcode.com/unit-testing-in-asp-net-core/

https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdata/

https://www.automatetheplanet.com/visual-studio-project-templates/

https://code-maze.com/unit-testing-aspnetcore-web-api/

https://www.syncfusion.com/blogs/post/how-to-integrate-unit-testing-with-asp-net-core-3-1.aspx

https://www.sqlshack.com/sql-unit-testing-with-ssdt-sql-server-data-tools/

Categories

Recent posts