Làm quen với SpecFlow+

Trong bài viết này, mình chỉ tổng hợp các bước để hiểu sơ lược về SpecFlow, và các bước để tạo 1 project .NET Core để thực thi SpecFlow. Với góc độ của 1 .NET programmer, mình chỉ mong muốn đây là bài tổng hợp thật rõ ràng và đơn giản.

Đầu tiên bạn cần nắm các khái niệm về TDD, BDD, và đây là nền tảng cơ sở để bắt đầu làm việc với SpecFlow, 1 .NET framework thực thi BDD, dựa trên ngôn ngữ C# và Gherkin.

TDD là gì

TDD (Test Driven Development) là một phương thức làm việc, hay một quy trình viết mã hiện đại. Lập trình viên sẽ thực hiện thông qua các bước nhỏ (BabyStep) và tiến độ được đảm bảo liên tục bằng cách viết và chạy các bài test tự động (automated tests). Quá trình lập trình trong TDD cực kỳ chú trọng vào các bước liên tục sau:
  1. Viết 1 test cho hàm mới. Đảm bảo rằng test sẽ fail.
  2. Chuyển qua viết code sơ khai nhất cho hàm đó để test có thể pass.
  3. Tối ưu hóa đoạn code của hàm vừa viết sao cho đảm bảo test vẫn pass và tối ưu nhất cho việc lập trình kế tiếp
  4. Lặp lại cho các hàm khác từ bước 1

Hỗ trợ search tiếng Việt trong SQL Server

Hôm nay mình hướng dẫn mọi người thủ thuật tìm kiếm với Sql Server không phân biệt chữ hoa, chữ thường, có dấu, không dấu rất đơn giản.
Mặc định khi tạo 1 column có kiểu dữ liệu nvarchar, thì Collation sẽ có giá trị  SQL_Latin1_General_CP1_CI_AS.
Giải thích:
  • SQL – Tất cả các collation đều có tiền tố là SQL.
  • Latin1_General đại diện cho quy tắc sắp xếp, CI có nghĩa là không phân biệt chữ hoa chữ thường và AS có nghĩa là trọng âm.
Để biết được SQL Server của bạn đang hỗ trợ collation nào, bạn thực hiện câu lệnh:
SELECT SERVERPROPERTY('collation')
Liệt kê collation của các column trong 1 table
sp_help <table-name>

Đối với tiếng Anh, thì bạn sẽ không gặp vấn đề gì. Nhưng với tiếng Việt, thì bạn sẽ gặp vấn đề về dấu.
VD: Bạn tìm kiếm chữ "Châu". Nếu bạn gõ chữ "Châu" hay "Chau" thì sẽ ra 2 kết quả tìm kiếm khác nhau.

Khắc phục

Bạn execute câu lệnh sql sau:
ALTER TABLE <table-name> ALTER COLUMN <column-name> nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AI"
Trường hợp bạn sử dụng migration trong EF core: Tạo mới 1 migration rỗng:
dotnet ef migrations add Collation
Sau đó, bạn thêm 2 câu lệnh SQL sau:
public partial class Collation : Migration
{
 protected override void Up(MigrationBuilder migrationBuilder)
 {
  migrationBuilder.Sql("ALTER TABLE <table-name> ALTER COLUMN <colum-name> nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AI");
 }

 protected override void Down(MigrationBuilder migrationBuilder)
 {
  migrationBuilder.Sql("ALTER TABLE <table-name> ALTER COLUMN <colum-name> nvarchar(max) COLLATE SQL_Latin1_General_CP1_CI_AS");
 }
}
Chúc các bạn thành công
Nhật ký học tập

Nguyên tắc Demeter trong hướng đối tượng

Mở bài

Là dân lập trình, chắc hẳn các bạn cũng từng ít nhất một lần nghe đến Law of Demeter (LoD), tạm dịch là Nguyên tắc Demeter, còn được gọi là nguyên tắc Một dấu chấm.

Thân bài

Law of Demeter là gì?

Trong thần thoại Hy Lạp, Demeter là vị nữ thần của nông nghiệp, mùa màng và thiên nhiên.
Demeter
Tuy nhiên nữ thần Demeter không định ra và cũng không liên quan lắm đến nguyên tắc Demeter mà chúng ta đang nói ở đây cả.
Chuyện xưa kể rằng vào mùa thu năm 1987, tại Đại học Northeastern Mỹ, trong một cuộc thảo luận của dự án Demeter (một dự án nhằm giúp việc phát triển phần mềm trở nên dễ dàng hơn), nguyên tắc Demeter lần đầu tiên đã được đề ra, nhằm mục đích tối thiểu hóa sự phụ thuộc lẫn nhau (loose coupling) của các thành phần trong ứng dụng. Cái tên Law of Demeter được sinh ra từ đó.
Cơ bản thì Law of Demeter chỉ có một nguyên tắc.
Only talk to your immediate friends, tạm dịch là "Chỉ chơi với những người thân bằng quyến thuộc."
hoặc
Don't talk to strangers, nôm na là "Đừng chơi với người lạ mặt"

Sử dụng Gulp trong Visual Studio

Trong bài viết này, mình sẽ hướng dẫn các bạn cách sử dụng cơ bản công cụ Gulp trong môi trường command line và trong Visual Studio. Mình tình cơ biết Gulp khi xem framework Simplcommerce

Gulp là gì?

Gulp là một công cụ giúp bạn tự động hóa nhiều task (nhiệm vụ) trong quá trình phát triển web.
Có rất nhiều tác vụ khi build 1 website: Minify js, css, copy file, xóa file,…

Cài đặt Gulp

Đầu tiên bạn cài đặt NodeJs. Sau đó mở cmd lên, và sử dụng lệnh sau:
npm install gulp –g

Các thành phần chính của Gulp

Để chạy được gulp cần một file gulpfile.js trong đó có chứa các thành phần chính là: gulp.task, gulp.src, gulp.dest, gulp.watch.
Định nghĩa 1 task

gulp.task('task-name', function() {
  // Stuff here
});
Các hàm trong Gulp là các hàm async, vì vậy bạn cần viết thêm 1 phương thức để lắng nghe sự kiện kết thúc. Bạn có thể tham khảo thêm tại: https://gulpjs.com/docs/en/getting-started/async-completion
Có 2 cách đơn giản nhất:
Trả về 1 stream

const { src, dest } = require('gulp');

function streamTask() {
  return src('*.js')
    .pipe(dest('output'));
}

exports.default = streamTask;
Trả về 1 promise

function promiseTask() {
  return Promise.resolve('the value is ignored');
}
exports.default = promiseTask;
Ví dụ:
VD1: Trong ví dụ này, bạn sẽ tạo và xuất ra câu Hello World trong cmd.
Trong cmd, bạn gõ lệnh:
npm init
Lệnh này sẽ giúp bạn tạo file package.json. Sau đó, bạn muốn sử dụng thư viện nào thì gõ lệnh:
npm install <tên thư viện> --save-dev

Bạn tạo file gulpfile.js với nội dung sau:

var gulp = require('gulp');

gulp.task('hello', function() {
  return new Promise(function(resolve, reject) {
      console.log('Hello World');
      resolve();
    });
});
Câu lệnh require nói với Node tìm kiếm trong thư mục node_modules package có tên gulp. Khi package được tìm thấy, chúng ta gán nội dung tới biến gulp.
Task name: hello
Để thực thi task, bạn mở cmd, rồi gõ
gulp hello
VD 2: Hiển thị các file trong thư mục
Bạn cài đặt package gulp-debug:
npm install gulp-debug
Mở file js và thêm vào nội dung sau:

var gulp = require('gulp');
var debug = require('gulp-debug');

gulp.task('dir', function() {
  return gulp.src('Modules/**/*')
  .pipe(debug());    
});
**/*: tìm tất cả các file trong thư mục Modules và các thư mục con của Modules
VD 3: Trong ví dụ này, bạn sẽ xài package gulp-clean để xóa file trong thư mục hiện tại và copy file từ folder khác sang thư mục hiện tại:

var gulp = require('gulp');
var clean = require('gulp-clean');

gulp.task('copy', function() {
  return gulp.src('Modules/**/*')
  .pipe(debug())
  .pipe(gulp.dest('release/'));    
});

gulp.task('clean', function(){
  return gulp.src('release/', {read: false})
    .pipe(clean({force: true}));
});
gulp.src: lấy tất cả đường dẫn file trong thư mục Module và các thu mục con
debug(): in ra tất các đường dẫn file sau khi đọc file bằng gulp.src
gulp.dest: bạn cũng cần chỉ ra đường dẫn đích mà bạn muốn gulp trả về file sau khi đã thực hiện gulp.task.
clean(): xóa tất cả các file trong thư mục release
(còn tiếp)

Làm quen với Bootstrap với Visual Studio Code

Bạn muốn tìm 1 editor miễn phí, để có thể viết code html, js, css nhanh chóng, vừa có thể debug và chạy trực tiếp. Có rất nhiều tool editor miễn phí lần tính phí, nhưng theo cá nhân mình, mình thấy tool Visual Studio Code là công cụ nhẹ nhàng, mạnh mẽ, và có rất nhiều extension (tiện ích) hỗ trợ. Và quan trọng nhất là Visual Studio Code chạy được trên đa nền tảng, và có Microsoft hỗ trợ phát triển.
Download: https://code.visualstudio.com/download
Một số extension hữu ích và cần thiết để viết code Bootstrap
  1. Bootstrap 4, Font awesome 4, Font Awesome 5 Free & Pro Snippets - Ashok Koyi
  2. Live Server - Ritwick Dey
Để cài đặt extension cho Visual Studio Code, bạn mở Ctrl + Shift + P => Install Extensions, rồi gõ tên những extension mà bạn cần cài đặt.

Tạo project Web

Mở Visual Studio Code. Bấm File -> Open Folder -> Chọn folder cần chứa project -> Select Folder.
Tạo mới 1 file html: index.html.
Gõ b4-$ rồi bấm Enter. Extension 1 sẽ tạo mới 1 file template mẫu Html

<!doctype html>
<html lang="en">
  <head>
    <title>Title</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  </head>
  <body>
      
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
  </body>
</html>

Chọn file index.html và nhấp phải, chọn Open with Live Server.
Trang index.html sẽ được mở theo đường dẫn http://127.0.0.1:<port number>/index.html.

Các thành phần yêu cầu javascript

ComponentsDescriptionBootstrap JSPopper JS
Alertsfor dismissingYES
Buttonsfor toggling states and checkbox/radio functionalityYES
Carouselfor all slide behaviors, controls, and indicatorsYES
Collapsefor toggling visibility of contentYES
Dropdownsfor displaying and positioningYESYES
Modalsfor displaying, positioning, and scroll behaviorYES
Navbarfor extending our Collapse plugin to implement responsive behaviorYES
Tooltipsfor displaying and positioningYESYES
Popoversfor displaying and positioningYESYES
Scrollspyfor scroll behavior and navigation updatesYES

Hi vọng với bài viết này, bạn sẽ nắm được các bước để tạo 1 trang html đơn giản với bootstrap.

Tham khảo

https://dev.to/trevoirwilliams/bootstrap-4-and-visual-studio-code-in-10-minutes-2663

Chúc các bạn thành công

Bootstrapping cho Angular

Mỗi app đều có 1 main entry point. Đối với app Angular mà bạn tìm hiểu trong các part trước, được xây dựng bằng Angular CLI. Để chạy được ứng dụng, mình gọi lệnh:
ng serve
ng sẽ xem file angular.json để tìm Entry Point cho app. Bạn có thể hình dung theo sơ đồ sau:


Thay đổi đường dẫn khi mở ConEmu

ConEmu là phần mềm giả lập console Windows với nhiều tab. Bạn có thể dùng phần mềm này để thay thế cho cmd hoặc Power Shell.
Để thay đổi đường dẫn mặc định khi mở ConEmu, bạn làm như sau:
Bạn nhấn Windows + Alt + P hoặc bấm Menu => Settings...
Thêm Task mới, đặt tên là ChangeStartupFolder, sau đó bấm nút Startup dir... để thay đổi đường dẫn.
=>Save Settings.
2. Startup => Trong option Specified named task, chọn {ChangeStartupFolder}=> Save Settings

3. Mở thêm tab mới và xem kết quả

Chúc các bạn thành công

SSRS: Cách lấy permission cho 1 user bất kỳ


SELECT
    R.RoleName,
    U.UserName,
    C.Path
FROM
    Catalog C WITH (NOLOCK)    --Parent
    JOIN
    Policies P WITH (NOLOCK) ON C.PolicyID = P.PolicyID
    JOIN
    PolicyUserRole PUR WITH (NOLOCK) ON P.PolicyID = PUR.PolicyID 
    JOIN
    Users U WITH (NOLOCK) ON PUR.UserID = U.UserID 
    JOIN
    Roles R WITH (NOLOCK) ON PUR.RoleID = R.RoleID
WHERE
    C.Type = 1

Hướng dẫn thay đổi hàng loạt link trong file Excel

Hôm nay mình sẽ hướng dẫn các bạn cách đổi hàng loạt link trong file Excel.
Giả sử bạn có file Excel có nội dung như sau:

Tất cả link trong file Excel đều trỏ tới trang https://www.google.com.vn
Bạn muốn thay đổi link hàng loạt, trỏ tới 1 trang khác, ví dụ như trang https://ebook4u1001.blogspot.com
Sau đây là cách thực hiện