Hỏi đáp về cài đặt SQL SERVER

Sau một thời gian chinh chiến trên khắp các nẻo đường Facebook, tôi chợt phát hiện ra rằng rất nhiều bạn đang gặp trục trặc khi cài đặt SQL để thực hành. Vậy nên trong bài này tôi sẽ nói qua một số lỗi và cách khắc phục. Bài viết này sẽ trình bày dưới dạng hỏi đáp.

1.Nên chọn phiên bản SQL Server nào?

👉 Trừ khi bạn có một yêu cầu nhất định, còn không thì cứ tải về phiên bản mới nhất mà dùng. Phiên bản hiện tại là 2019.

2. Có thể dùng SQL Server express hay Developer để học không?

👉 Tất nhiên là được! Từ góc độ lập trình cơ bản, cả 2 phiên bản đều đáp ứng được yêu cầu của bạn.

Continue reading “Hỏi đáp về cài đặt SQL SERVER”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP – TÍNH ĐA HÌNH (Polymorphism)

Đa hình là tính chất quan trọng nhưng khó hiểu nhất của OOP – nắm bắt được tính chất này, bạn sẽ dễ dàng hiểu được tất cả những gì còn lại, kể cả tính trừu tượng sau này. Trong bài này tôi sẽ giải thích nó theo cách đơn giản nhất, sau đó trong phần 2 ta sẽ đào sâu vào, xem những gì thực sự xảy ra ở bên dưới.

👉 Giải thích đơn giản thì đa hình cho phép tự động gọi một phương thức dựa trên các tham số truyền vào (1) hoặc kiểu thực sự của đối tượng bạn đang có (2). (1) Nếu bạn có 2 phương thức:

function Add(x, y : Integer) : Integer;
begin
    Add := x + y
end;
function Add(s, t : String) : String;
begin
    Add := Concat(s, t)
end;
Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP – TÍNH ĐA HÌNH (Polymorphism)”

HÀM main TRẢ VỀ GÌ?

int main(int argc, char *argv[])

int main (void)

public static void main(String [] args)

static void Main(string[] args)

def main():

Có lẽ bạn không lạ gì hàm main, hàm đầu tiên bạn viết khi học lập trình C, ngay cả khi chuyển sang một ngôn ngữ khác, nhất là các ngôn ngữ thừa kế từ C như C++, Java và C#, bạn cũng sẽ thấy một hàm tương tự. Đặc trưng của main là nó sẽ nhận vào các tham số (các tham số này được truyền cho chương trình đang chạy từ trên dòng lệnh) và trả về dữ liệu kiểu int hoặc void.

👉 Khi gọi một hàm (sqrt, rand, malloc…), bạn sẽ nhận được kết quả trả về của hàm đó, vậy giá trị trả về của hàm main sẽ trả về cho ai? Và để làm gì?👉 Vì khi main kết thúc cũng đồng nghĩa với chương trình kết thúc, nên bên trong chương trình bạn không có cách nào lấy giá trị đó (trừ khi bạn cố ý gọi main), mà giá trị này sẽ trả về cho hệ điều hành, hệ điều hành sẽ lưu lại và cho phép chương trình kế tiếp thực thi có thể đọc được. Nhờ khả năng chuyển kết quả thực thi của một chương trình cho một chương trình khác mà ta có thể viết được các chuỗi lệnh (hay các batch scripts, bash scripts…).

Continue reading “HÀM main TRẢ VỀ GÌ?”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 2)

Thừa kế cho phép ta tạo một lớp mới mở rộng từ một lớp khác, lớp mới được gọi là lớp con, lớp thừa kế hay lớp dẫn xuất (derived class), mình hay gọi là lớp con cho nhanh.

Lớp cha còn gọi là lớp cơ sở.Ưu điểm dễ thấy nhất là ta có thể tạo ra một lớp con mới tận dụng các tính năng có sẵn được cung cấp từ lớp cha, hay còn gọi là khả năng sử dụng lại.

Ấy nhưng đó lại chẳng phải là nguyên nhân người ta cho ra đời tính chất này, bởi nếu bạn đã có sẵn những tính năng đó thì dù có hay không khả năng thừa kế, bạn vẫn có thể tạo ra những lớp mới gọi lại các tính năng đó.Ưu điểm chính của thừa kế là nhờ có nó ta mới có được đa hình (polymorphism), và nhờ đa hình mà ta có trừu tượng (abstract).

❗️Trừu tượng là thứ mà tất cả những nhà thiết kế phần mềm đều muốn sử dụng càng nhiều càng tốt: các driver cho phép phần mềm giao tiếp với các thiết bị khác nhau khi dùng chung một phương thức, các file system driver giúp tương tác với các file trên đĩa mà không cần quan tâm chúng được định dạng với NTFS, HTFS, FAT hay Ext3, ngôn ngữ SQL cho phép làm việc với các cơ sở dữ liệu mà không cần biết chúng được lưu trữ thế nào, HTTP cho phép xem các trang web mà không cần quan tâm máy chủ của nó hoạt động ra sao… Có vô số các ví dụ như vậy. Vì thực sự thừa kế rất dễ hiểu nên tôi sẽ chỉ giải thích một số khái niệm liên quan:

Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 2)”

GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)

Tiếp theo các bài viết về tầm quan trọng của OOP trong lập trình, tôi sẽ tiếp tục giải thích kỹ hơn về các khái niệm có trong OOP. Tôi sẽ chỉ nói về ý tưởng, và cách thiết kế một cách hợp lý, tức là vì sao có nó và nên sử dụng nó như thế nào. Việc giới thiệu và cách viết trong từng ngôn ngữ cụ thể bạn có thể đọc được từ rất nhiều tài liệu khác có trong trường học và Internet.

OOP sẽ rất dễ hiểu nếu bạn nhìn từ góc độ cuộc sống, bạn đọc một khái niệm, tìm một ví dụ trong đời thực mô tả khái niệm đó, khi đã tìm được ví dụ bạn sẽ dễ dàng hiểu được nó.

Nhớ là các khái niệm trong OOP có sự liên hệ lẫn nhau, nên sẽ rất khó nếu bạn cố gắng học và hiểu toàn bộ từng-cái-một, cách tốt nhất là đọc toàn bộ, phần nào chưa hiểu hết cứ bỏ qua, rồi lại đọc lại toàn bộ một lần nữa, lần này bạn chỉ đọc những chỗ đã bỏ qua ở lần trước. Cứ lặp đi lặp lại như vậy, lúc nào đó bạn sẽ nghiệm ra và hiểu tất cả.

Continue reading “GIẢI THÍCH CÁC KHÁI NIỆM TRONG OOP (phần 1)”

64 bit? 32 bit?

Mỗi khi cài đặt Windows, Linux, các phần mềm, ta lại nghe đến khái niệm 32bit hoặc 64bit, vậy chúng là gì? Ta cùng tìm hiểu xem nhé.

👉 Bộ nhớ máy tính:Bộ nhớ máy tính là một dãy byte liên tiếp được sắp xếp từ vị trí 0, sau đó tăng dần, byte kế tiếp nằm ở vị trí 1, rồi 2, 3, 4…, mỗi byte có thể được truy xuất thông qua vị trí, hay còn gọi là địa chỉ. Như vậy byte đầu tiên sẽ có địa chỉ 0, byte thứ 1000 có địa chỉ 999. Để truy xuất vào 1 byte nào đó ta cần biết địa chỉ của nó.

👉 Thanh ghi trong máy tính:Thanh ghi là các vùng bộ nhớ nhỏ trong CPU, được dùng lưu trữ dữ liệu để làm việc, ta có thể coi nó giống như các tờ giấy note nhỏ CPU sử dụng trong lúc làm việc. Có nhiều thanh ghi khác nhau, mỗi thanh sẽ có tên và nhiệm vụ riêng, một số thanh ghi bạn có thể dùng lưu trữ chung như AL, AH, AX, EAX, EBX, ECX… một số khác được sử dụng cho một mục đích cụ thể: IP lưu địa chỉ lệnh kế tiếp sẽ được thực hiện, SP chỉ đến stack, CS, DS, ES… chỉ đến các phân đoạn (segment) bộ nhớ… Các thanh ghi có đuôi L (low) và H (high) là các thanh ghi 8 bit, vốn là 2 nửa của các thanh ghi đuôi X, AL và AH chính là 2 phần của AX, tương tự cho BX, CX… Vì là hai nửa cao và thấp nên thay đổi giá trị của AL hoặc AH cũng làm thay đổi AX. Tưởng tượng AL có giá trị là 0x20, AH là 0xFF, thì AX sẽ có giá trị là 0xFF20.

Các thanh ghi AX, BX,CX, DX, IP, SP… là các thanh ghi 16 bit, tức giá trị tối đa nó có thể chứa là 65535.

Continue reading “64 bit? 32 bit?”

THAM CHIẾU VÀ THAM TRỊ

Một trong những vấn đề các bạn mới học C/C++ hay gặp lỗi là truyền tham số khi gọi hàm, trong bài này mình sẽ giải thích kỹ để các bạn có thể hiểu rõ.

Trước khi bắt đầu các bạn nên đọc qua 2 bài viết về con trỏbộ nhớ stack.

Như đã biết, khi gọi hàm, tham số sẽ được tạo ra trên stack và được giải phóng NGAY KHI kết thúc. Có nghĩa là các giá trị của nó sẽ bị hủy. Giả sử bạn có một hàm được khai báo là void f(int n), khi bạn gọi f(m), trước khi thực thi, tham số n sẽ được tạo ra trên stack, giá trị của m sẽ được sao chép vào n. Bên trong f sẽ không có bất kỳ liên hệ nào với m, nên khi kết thúc hàm trở về, ta sẽ thấy m vẫn còn mang giá trị cũ, vì những gì thay đổi trên n là thay đổi biến n trong stack.Trong C chỉ có 1 cách truyền đó nên khi muốn giữ lại giá trị của tham số, ta phải quy ước là truyền con trỏ cho hàm, và bên trong hàm đó bạn sẽ thao tác trên vùng nhớ mà con trỏ đó trỏ đến.Như vậy khi ta khai báo fx(int *n), rồi gọi fx(&m) thì một biến con trỏ sẽ được tạo ra trên stack, giá trị của nó sẽ được sao chép từ địa chỉ của m. Bên trong fx, khi nói đến n nghĩa là đang nói đến địa chỉ của m, do vậy *n chính là biến m, thay đổi giá trị của *n cũng chính là thay đổi m.Trong C chỉ có một cách duy nhất là truyền theo tham trị, truyền theo con trỏ cũng chỉ là truyền theo tham trị, chỉ khác là bạn dùng biến có kiểu con trỏ mà thôi, bên trong hàm bạn vẫn phải xử lý biến đó theo cách sử dụng con trỏ.Hãy đảm bảo bạn đã hiểu toàn bộ phần trên trước khi đọc phần tiếp theo, vì phần trên mới là phần quan trọng nhất.

Continue reading “THAM CHIẾU VÀ THAM TRỊ”

VỀ ĐỊA CHỈ 0

Địa chỉ 0 vốn là một địa chỉ hoàn toàn hợp lệ, tuy nhiên con trỏ có địa chỉ bằng 0 (hay NULL) trong hầu hết các trường hợp là không hợp lệ, tức nếu truy cập vào vùng nhớ thông qua con trỏ có địa chỉ NULL sẽ gây ra lỗi. Nguyên nhân là vì bạn chỉ có thể truy cập vào những vùng nhớ đã-được-cấp-phát, mà vùng 0 thì vốn luôn được sử dụng bởi hệ thống và sẽ không bao giờ sẵn dùng (available) cho ứng dụng của bạn.

❗️Tất cả các vùng nhớ khác cũng vậy chứ không chỉ riêng địa chỉ 0, bạn chỉ có thể đọc ghi vào cùng nhớ được cấp cho việc chứa dữ liệu – ngay cả vùng nhớ đã được cấp cho việc chứa code bạn cũng không được đọc nữa.

– Trong các ngôn ngữ C/C++, NULL chỉ là 1 macro thay thế cho 0.

– Trong Pascal người ta dùng từ khóa nil thay cho NULL.

– Trong Java ta có NullPointerException, .NET có NullReferenceException sẽ throw nếu bạn truy cập vào một biến == null.

VÀI ĐIỀU VỀ OOP DESIGNING

Ở trong bài OOP – chủ đề huyền thoại trong các cuộc phỏng vấn tuyển dụng tôi có nhắc đến OOP designing, trong bài này tôi sẽ nói kỹ hơn về nó.

Hầu hết chúng ta khi nhắc đến OOP đều chỉ nhớ là nó có 3 (hoặc 4) thuộc tính: đóng gói, thừa kế, đa hình và trừu tượng. Thực chất đó chỉ là những công cụ và nguyên liệu, cái quan trọng nhất vẫn là từ những công cụ và nguyên liệu này, bạn sẽ xây nên ngôi nhà như thế nào. Đó cũng là sự khác nhau giữa ông thợ xây và kiến trúc sư, giữa coder và designer. Muốn lên một trình cao hơn, ta cần biết cách sử dụng chúng một cách đúng đắn, và người xưa đã đúc kết ra một số quy tắc. Ta hãy cùng xem qua những nguyên tắc (nếu là một bậc thầy marketing thì sẽ thêm từ “bí mật” 🤮) nhé:

👉 Danh từ tạo nên lớp và thuộc tính, động từ tạo nên phương thức: Có lẽ nhiều người sẽ ngạc nhiên về điều này, nhưng thực ra, viết mô tả các chức năng hệ thống luôn phải là công việc đầu tiên khi thiết kế.

Hãy xem câu sau: “Người dùng nhập họ tên và email để đăng ký, hệ thống sẽ kiểm tra xem Email đã có trong hệ thống hay chưa, nếu có rồi sẽ hiển thị thông báo lỗi, nếu chưa có sẽ lưu vào cơ sở dữ liệu và gửi email chúc mừng đến người dùng vừa đăng ký.”

Trong đoạn văn trên, ta dễ dàng nhận ra một số danh từ: Người dùng, họ tên, email, hệ thống, cơ sở dữ liệu… và một số động từ: đăng ký, kiểm tra (email), hiển thị (thông báo lỗi), lưu (vào CSDL), gửi (email chúc mừng)…

Các danh từ có giá trị đơn (họ tên, email…) sẽ là thuộc tính (property), các danh từ chứa các thuộc tính sẽ là class.Đây là một quy tắc chung, giúp bạn không sai hướng khi phải làm việc với vô số thông tin đầu vào, và bạn có thể bám sát được đề bài. Sau bước này bạn sẽ có một danh sách thô, bạn sẽ phải tinh chỉnh, xem xét cái nào thừa, cái nào thiếu, nhóm chung các lớp cùng chức năng vào chung module… Ở bước này đòi hỏi kỹ năng và kinh nghiệm cửa người thiết kế khá nhiều, và không có cách nào khác là bạn phải thực hành, và tham khảo các dự án nguồn mở.

Continue reading “VÀI ĐIỀU VỀ OOP DESIGNING”

BẠN BIẾT GÌ VỀ INDEX?

Index là một thành phần không thể thiếu khi tối ưu việc truy vấn cơ sở dữ liệu, hiểu rõ về nó là yêu cầu bắt buộc với người thiết kế, và cả người lập trình ứng dụng cơ sở dữ liệu.

❗️Trong bài viết này mình sẽ nói chi tiết về cách thức lưu trữ, vận hành cũng như các yếu tố ảnh hưởng đến Index, nếu bạn chưa biết gì về Index thì đây không phải là bài viết dành cho bạn. Nội dung tập trung vào CSDL Mysql, tuy nhiên các kiến thức này đều có thể áp dụng vào các cơ sở dữ liệu khác như MSSQL hay Oracle, vì hầu hết chúng lưu trữ và vận hành giống nhau, ngoại trừ một số dạng dữ liệu đặc biệt.

Continue reading “BẠN BIẾT GÌ VỀ INDEX?”