Chuyển đến nội dung chính

Bài đăng

Đang hiển thị bài đăng từ Tháng 1, 2023

Control Flow Graph (CFG)

Định nghĩa Trong khoa học máy tính, luồng điều khiển (tiếng Anh: control flow hay flow of control) là thứ tự các câu lệnh, tập lệnh hay lời gọi hàm riêng biệt của một chương trình mệnh lệnh được thực thi hay đánh giá. Việc nhấn mạnh vào kiểm soát dòng một cách rõ ràng sẽ phân biệt một ngôn ngữ lập trình mệnh lệnh (imperative programming) với ngôn ngữ lập trình khai báo (declarative programming). Trong một ngôn ngữ lập trình bắt buộc, một câu lệnh điều khiển luồng là một câu lệnh thực thi mà kết quả trong một sự lựa chọn được thực hiện theo cách của hai hoặc nhiều đường dẫn tiếp theo. Đối với ngôn ngữ lập trình không nghiêm ngặt các ngôn ngữ chức năng, các hàm và cấu trúc ngôn ngữ tồn tại để đạt được cùng một kết quả, nhưng chúng thường không được gọi là các câu lệnh luồng điều khiển. Một tập hợp các câu lệnh lần lượt thường được cấu trúc như một Block, ngoài việc nhóm, cũng định nghĩa phạm vi từ vựng. Ngắt và tín hiệu là các cơ chế cấp thấp có thể thay đổi dòng điều khiển theo cách tươ...

ASP.NET Core User Secrets và Secret Manager Tool

Khi bạn phát triển website sử dụng ASP.NET Core, bạn thường lưu connection string, api key, password, và một vài thông tin nhạy cảm khác. Việc bạn đưa thông tin nhạy cảm lên Github, Gitlab, ... sẽ gây ra nhiều vẫn đề. Để giải quyết vấn đề đó, Microsoft đã đưa ra công cụ User Secrets (hoặc Secret Manager) để lưu trữ sensitive data vào tập tin secrets.json. Cài đặt Giả sử appsettings.json có nội dung như sau: { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "DefaultConnection": "Server=myServerAddress;Database=myDataBase;User Id=sa;Password=NoPassword;TrustServerCertificate=True;MultipleActiveResultSets=False;Connection Timeout=30;" } } Để ghi đè ConnectionStrings:localhost trên từng máy cá nhân, các bạn sẽ phải thêm user-secret có cùng tên. Có 2 cách để ...

ASP.NET Identity: Thêm Login và Register page - Part 2

Trong bài viết này, mình sẽ hướng dẫn các bạn setup Login, Register và Logout page. Để dễ dàng tiếp cận, mình sẽ chia ra làm 3 phần: Setup Login, Register Model và View Setup AspNet Identity Implement Login và Register logic Setup Model và View Register page Tạo Register model public class RegisterModel { public string FirstName { get; set; } public string LastName { get; set; } public string Email { get; set; } [DataType(DataType.Password)] public string Password { get; set; } [DataType(DataType.Password)] public string ConfirmPassword { get; set; } public string ReturnUrl { get; set; } } Register.cshtml @model ClaimExample.Models.RegisterModel; <div class="row"> <div class="col-md-4"> <form asp-route-returnUrl="ReturnUrl" method="post"> <h4>Create a new account.</h4> <hr /> <div asp-validation-summary="All" class="text-danger"...

ASP.NET Identity: Claim, Identity, Principle - Part 1

Authentication và Authorization luôn là chủ đề mà mình muốn tìm hiểu từ lâu. Trước kia mình thường dựa trên thư viện có sẵn, nhưng nay thử tìm hiểu xem cơ chế hoạt động của các thư viện ra sao. Ngoài ra, một phần là mình thất vọng về việc IdentityServer đã chuyển đổi lience từ OpenSource sang Commercial. Trong tương lai, có thể mình sẽ tìm hiểu thêm một vài thư viện khác để bổ sung cho phần Membership trong ASP.NET Core Hiện tại có một số thư viện mà mình quan tâm: Auth0 , Okta, Keycloak , Azure Active Directory B2C. Tạo Project ASP.NET Core Tạo Project ASP.NET Core (Model-View-Controller). Ở option ASP.NET Identity, bạn chọn No Authentication . Để thêm Authentication và Authorization, bạn cần qua các bước sau: Thêm thuộc tính [Authorize], chỉ thị này áp dụng được cho Controller, Action của Controller, được dùng để xác định ai được quyền truy cập Controller, Action của Controller. Setup Authentication và Authorization trong Startup của application Tạo trang Login page và xử lý data ...

Sử dụng in-memory database trong Entity Framework

Entity Framework Core cho phép bạn lưu trữ và truy xuất dữ liệu đến và từ cơ sở dữ liệu sử dụng bộ nhớ chính của máy tính để lưu trữ (in-memory database). Đây là một cách nhanh chóng và dễ dàng để kiểm tra các ứng dụng web ASP.NET Core 7. Có nhiều lý do tại sao bạn có thể muốn sử dụng in-memory database. Giả sử bạn đang phát triển một tính năng mới và muốn thử nghiệm tính năng đó mà không ảnh hưởng đến database của mình. Hoặc đơn giản là bạn muốn viết ví dụ và không cần phải xóa database vừa tạo. Ý tưởng Có quá nhiều thứ để implement, nào là Repository, nào là EF Core, rồi thêm Swagger nữa. Để bắt đầu đơn giản nhất, chúng ta sẽ lần lượt thực hiện các bước sau: Tạo Model class: Author và Book 2 model này đại diện cho 2 entity mà chúng ta sẽ khai báo trong Entity Framework Cài đặt package EF Core InMemory NuGet. Tạo DbContext class Khai báo Repository class: IAuthorRepository và AuthorRepository Khai báo Dependency Injection Cài đặt và khai báo Swagger Khai báo Controller   Khai báo ...

Tìm góc của tam giác

Giải thử $$ \begin{cases} x1 + x2 = 140 \\ x3 + x4 = 90 \\ x1 + x3 = 100 \\ x2 + x4 = 130 \end{cases} $$ $$ \\ \begin{cases} x1 + x2 = 140 \\ x2 + x4 = 130 \\ \end{cases} \ => x1 = 140 - x2 = 140 - (130 - x4) = 10 + x4 \\ $$ $$ <=> x1 - x4 = 10 (1) $$ Dựa vào biểu thức cũ: $$ \begin{cases} x1 + x2 = 140 (2)\\ x2 + x4 = 130 (3) \end{cases} $$ $$ From (2) AND (3) => x1 + x4 + 2*x2 = 270 <=>x1 + x4 = 270 - 2*x2 $$ $$ x1 + x4 = 270 - 2*(140-x1) <=> x1 + x4 = -10 + x1 $$ $$ <=>x4 = 10 $$ $$ =>\begin{cases} x2 = 120 \\ x1= 20 \\ x3 = 80 \end{cases} $$

TinyMCE: Cài đặt và sử dụng cơ bản - Part 1

TinyMCE được viết bằng ngôn ngữ JavaScript và phát hành dưới dạng phần mềm mã nguồn mở LGPL bởi Ephox. TinyMCE có khả năng chuyển đổi các trường HTML hoặc các thành phần HTML thành bộ biên tập văn bản. TinyMCE được thiết kế để dễ dàng tích hợp vào hệ thống quản lý nội dung bao gồm Django, Drupal, Joomla!, WordPress và SOY CMS. Cài đặt Sử dụng CDN: https://cdn.tiny.cloud/1/qagffr3pkuv17a8on1afax661irst1hbr4e6tbv888sz91jc/tinymce/6/tinymce.min.js Hoặc bạn download bản Community tại đây: https://www.tiny.cloud/get-tiny/ Cài đặt TinyMCE Truy cập trang web chính thức của TinyMCE tại đây và tải xuống TinyMCE SDK như bên dưới. Giải nén tệp đã tải xuống và sao chép thư mục tinymce bên trong dự án của bạn bên trong wwwroot->js->tinymce như bên dưới. Như vậy là bạn đã cài đặt xong TinyMCE Sử dụng TinyMCE Khai báo PostModel public class PostModel { public string Content { get; set; } } Trong HomeController, thêm Action TinyMceExample public IActionResult TinyMceExample() { //examp...

CKEditor: Cài đặt và upload ảnh trong ASP.NET Core - Part 1

CKEditor hiện nay là trình soạn thảo văn bản thông dụng và phổ biến nhất thế giới. Tuy nhiên, việc cái đặt CKEditor thì rất dễ dàng, nhưng mặc định, trình soạn thảo này chỉ hỗ trợ soạn thảo mà chưa có sẵn chức năng upload hình ảnh, file lên server. Trong bài viết này, mình sẽ hướng dẫn các bạn viết 1 Adapter để upload ảnh lên server Cài đặt CKEditor Thêm đoạn code sau vào HomeController: public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IWebHostEnvironment _webHostEnvironment; public HomeController(ILogger<HomeController> logger, IWebHostEnvironment webHostEnvironment) { _logger = logger; _webHostEnvironment = webHostEnvironment; } public IActionResult CkEditor() { //example data var model = new PostModel { Content = "<p>Click on the Image Below to resize</p>" }; return View(model); } [HttpPost] public IActionResult UploadFile(IFormFile file) { var dir = Path....

Quill: Cho phép Drap and Drop và thay đổi kích thước hình ảnh - Part 5

Trong bài viết này, chúng ta sẽ nhúng thư viện Quill ImageDrop Module vào Quill. Github: https://github.com/kensnyder/quill-image-drop-module Thư viện này cho phép kéo thả và resize kích thước hình ảnh. Khá tiện lợi. Cài đặt Bạn có thể cài đặt package từ npm hoặc sử dụng bản min.js ở đây !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ImageResize=e():t.ImageResize=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={i:o,l:!1,exports:{}};return t[o].call(r.exports,r,r.exports,e),r.l=!0,r.exports}var n={};return e.m=t,e.c=n,e.i=function(t){return t},e.d=function(t,n,o){e.o(t,n)||Object.defineProperty(t,n,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var n=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(n,"a",n),n},e.o...

Quill: Upload image lên server - Part 4

Quill hỗ trợ tốt chèn ảnh với định dạng base64 vào editor. Khuyết điểm là khiến cho database mau chóng hết dung lượng và không tối ưu được cache. Để custom lại function trong toolbar, chúng ta sử dụng handler. Cụ thể trong bài viết này, chúng ta sẽ xây dựng 1 website cho phép upload file và trả về đường dẫn file vừa mới upload Setup Khai báo Toolbar QuillJs Customize 'image' event Implement hàm upload file trên server Trong ứng dụng ASP.NET Core, thêm folder FileUploads trong wwwroot File HomeController public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IWebHostEnvironment _webHostEnvironment; public HomeController(ILogger<HomeController> logger, IWebHostEnvironment webHostEnvironment) { _logger = logger; _webHostEnvironment = webHostEnvironment; } public IActionResult UploadImage() { var model = new PostModel { Content = ...

Quill: Thêm công cụ mới vào Toolbar - Part 3

Ở bài viết này, chúng ta sẽ tìm hiểu sâu hơn vào toolbar. Sau đó thêm 1 nút trên toolbar cho phép người dùng làm 1 tính năng mới. Do Quill hỗ trợ toolbar bằng Javascript với HTML, nên chúng ta sẽ có ví dụ được viết bằng cả 2 cách Sử dụng Javascript Array Khai báo button mới trong toolbar container: Khai báo button trong toolbar container Khai báo event cho new button đó Khai báo css cho new button Khai báo button trong toolbar: ['<new-button-name>'] Để xử lý event khi user click vào button, bạn khai báo event cùng tên với button 'new-button-name': handlers: { "example1": function () { this.quill.insertText(this.quill.getSelection().index, 'Hello', 'link', 'https://nhatkyhoctap.blogspot.com'); console.log(this.quill.getText()) } } Hàm insertText insertText(index: Number, text: String, source: String = 'api'): Delta insertText(index: Number, text: String, format: String, value: any, ...