Home Blog Page 88

Cách tự học lập trình tốt nhất

Cách tự học lập trình tốt nhất

Bài viết được sự cho phép của ucode.vn

Lập trình là một trong những kỹ năng có giá trị nhất mà bạn có thể học trong thời hiện đại này, cho dù mục đích của bạn là phát triển sự nghiệp hoặc thử thách trí tuệ hay để tạo ra một sản phẩm tuyệt vời nào đó. Nếu bạn vừa mới bắt đầu chuyến hành trình của mình vào thế giới lập trình, thì đây là danh sách 10 bí quyết và tài nguyên giúp bạn học lập trình một cách hiệu quả nhất.

1. Nhận ra lý do tại sao bạn muốn học lập trình

Hướng đi của bạn sẽ phụ thuộc phần lớn vào lý do tại sao bạn muốn học lập trình và bao nhiêu thời gian bạn có thể chuyên tâm dành cho việc học. Nếu bạn muốn trở thành một lập trình viên chuyên nghiệp thì việc đăng ký các khóa học tại các trường đại học có thể là lựa chọn tốt nhất dành cho bạn. (Google có một danh sách những kỹ năng và khóa học đề nghị đối với những người muốn trở thành kỹ sư phần mềm.) Nếu bạn muốn xây dựng các trang web hoặc các trò game cho vui (và có thể sinh lợi) trong thời gian rỗi, thì các tutorial dạng tương tác có thể là một lựa chọn tốt hơn.

2. Lựa chọn đúng ngôn ngữ lập trình

Không có ngôn ngữ lập trình nào là “tốt nhất” cả, và khi bạn đã học được một ngôn ngữ thì rất dễ để học sang ngôn ngữ khác, vì vậy đừng phân vân quá nhiều trong việc chọn ngôn ngữ đầu tiên của mình. Tuy nhiên có một số ngôn ngữ thân thiện với người mới bắt đầu hơn những ngôn ngữ khác. Ngôn ngữ bạn chọn để bắt đầu có thể phụ thuộc vào mục đích của bạn. (Ví dụ, nếu bạn muốn viết một ứng dụng iOS, bạn sẽ cần học Swift hoặc Objective-C). Nếu bạn muốn học lập trình một cách nghiêm túc thì hãy bắt đầu với C, mặc dù có những ngôn ngữ bậc cao hơn như Python khá là dễ học.

3. Bắt đầu nhỏ (và phải kiên nhẫn)

Không quan trọng việc bạn chọn ngôn ngữ lập trình hoặc phương thức nào để học, bạn nên bắt đầu ở mức cơ bản nhất. Ví dụ, khi David Sinsky tự học lập trình trong 8 tuần, anh ta đã dành ra một ngày cuối tuần để nắm kiến thức giới thiệu về Python và một ngày để hiểu sơ bộ về framework Django – thực hành theo những tutorial, sau đó xóa tất cả các code mẫu của tutorial, và tự làm lại thông qua trí nhớ. Bắt đầu với những thứ cơ bản và hãy kiên nhẫn với bản thân trong quá trình học tập. Để cho dự án lập trình đầu tiên của mình được hoàn thành, hãy chia nhỏ dự án đó thành nhiều bước đơn giản. Và nếu một phương thức học tập nào đó không mang lại hiệu quả cho bạn thì hãy thử những cách thức khác trước khi bỏ cuộc.

4. Thử một ứng dụng dành cho trẻ em

Ngày nay thậm chí những đứa trẻ mới tập đi cũng đã bắt đầu học lập trình rồi. Đó thực sự là một điều tuyệt vời cho tất cả chúng ta. Mặc dù nhiều chương trình được thiết kế để dạy trẻ em lập trình rất đơn giản, nhưng có nhiều phần mềm như Scratch phù hợp cho mọi lứa tuổi. Không quan trọng bạn bao nhiêu tuổi; thậm chí những ứng dụng hiệu ứng động dành cho trẻ em có thể giúp bạn bắt đầu với những kiến thức cơ bản trong lập trình (edX có một khóa học mới là Lập trình bằng phần mềm Scratch).

5. Sử dụng các trang web dạy lập trình trực tuyến miễn phí

Các trang web dạy học trực tuyến miễn phí như ucode.vn có thể giúp bạn viết chương trình máy tính đầu tiên của mình. Các tutorial từ những trang như KhanAcademy, Codecademy, Code.org, và nhiều tổ chức khác sẽ giới thiệu tới bạn những kiến thức lập trình cơ bản – trong khi tạo ra một trò game mới, một trang web, hoặc dự án khác. Tìm những tài nguyên cần thiết về những ngôn ngữ mà bạn đang học. Đây là những điểm bắt đầu rất tốt, nhưng bạn sẽ cần tiếp tục học xa hơn sau những phần sơ lược này.

6. Tham gia một khóa học lập trình

Bạn có thể tham gia các khóa học tại chính trường đại học của các bạn hoặc bây giờ có rất nhiêu các khóa học lập trình online về tất cả các ngôn ngữ. Các khóa học lập trình sẽ trang bị cho bạn một nền tảng vững chắc về một lĩnh vực nào đó trong ngành lập trình nói chung, từ đó bạn sẽ dễ dàng phát triển khả năng của mình trong lĩnh vực này.

7. Đọc sách lập trình miễn phí

Khi bạn bị mắc kẹt trong một vấn đề hoặc cần tìm kiếm một điều gì đó, thì những cuốn sách tham khảo là rất tiện dụng. Có một tuyển tập đồ sộ của trên 500 cuốn sách lập trình miễn phí được đăng trên GitHub, và tuyển tập ebook chứa nội dung về 24 ngôn ngữ lập trình khác nhau.

8. Chơi các trò game về lập trình

Thường thì cách tốt nhất để học là thông qua các trò chơi. Trong khi có rất nhiều các tutorial lập trình hướng dẫn bạn tự xây dựng các trò game từ đơn giản đến phức tạp, một số trang dạy học cũng chính là những trò game: Code Combat và CodinGame là 2 trang mang lại nhiều niềm vui khi học ở đó.

9. Tìm một người hướng dẫn (hoặc dạy một người nào đó)

Cộng đồng lập trình có rất nhiều người rất sẵn lòng giúp đỡ để tạo ra thế hệ lập trình viên tiếp theo. Hack.pledge() là một trang sẽ kết nối bạn với một người gia sư, hoặc bạn cũng có thể đăng ký trở thành gia sư của một ai đó. Thậm chí chỉ là lên kế hoạch để dạy những điều mà bạn đã học được, điều đó cũng giúp bạn ghi nhớ thông tin được tốt hơn.

10. Hack code của người khác

Khi bạn đọc code của một người khác, kiểm thử mỗi dòng để xem cách nó làm việc ra sao, bạn sẽ có được sự hiểu biết tốt hơn về toàn bộ bức tranh tổng thể. Nhờ rất nhiều dự án mã nguồn mở, bạn có thể học được về hầu hết mọi thứ – và luôn học hỏi để tiến bộ thêm từng ngày. Chỉ nên nhớ là hãy chia sẻ code của bạn tới cộng đồng nếu bạn đã cải tiến được một chương trình nào đó.

Bài viết gốc được đăng tải tại ucode.vn

Sự khác biệt giữa List.of và Arrays.asList là gì?

Sự khác biệt giữa List.of và Arrays.asList là gì?

Bài viết được sự cho phép của tác giả Lê Chí Dũng

Arrays.asListtrả về một danh sách có thể thay đổi trong khi danh sách được trả về List.oflà không thay đổi :

List<Integer> list = Arrays.asList(1, 2, null);list.set(1, 10); // OK List<Integer> list = List.of(1, 2, 3);list.set(1, 10); // Fails with UnsupportedOperationException
  4 ứng dụng của Array.from
  Cấu trúc dữ liệu List trong Python và các thao tác cơ bản

Arrays.asListcho phép các phần tử null trong khi List.ofkhông:

List<Integer> list = Arrays.asList(1, 2, null); // OKList<Integer> list = List.of(1, 2, null); // Fails with NullPointerException

contains cư xử khác với null

List<Integer> list = Arrays.asList(1, 2, 3);list.contains(null); // Returns false List<Integer> list = List.of(1, 2, 3);list.contains(null); // Fails with NullPointerException

Arrays.asListtrả về một khung nhìn của mảng đã qua, vì vậy những thay đổi đối với mảng cũng sẽ được phản ánh trong danh sách. Đối với List.ofđiều này là không đúng sự thật:

Integer[] array = {1,2,3};List<Integer> list = Arrays.asList(array);array[1] = 10;System.out.println(list); // Prints [1, 10, 3] Integer[] array = {1,2,3};List<Integer> list = List.of(array);array[1] = 10;System.out.println(list); // Prints [1, 2, 3]
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:

Khám phá cơ hội mới dành cho tài năng IT Việt Nam với sự xuất hiện của 5 công ty IT Hàn Quốc trong kỳ này

Trong những năm qua, Việt Nam là đối tác hợp tác kinh tế hàng đầu trong Chính sách hướng Nam mới và là một trong những đối tác kinh tế lớn nhất của Hàn Quốc tại khu vực ASEAN. Không chỉ có các doanh nghiệp lớn, tập đoàn đang từng bước xây dựng các chuỗi cung ứng chiến lược tại Việt Nam mà các doanh nghiệp nhỏ và vừa của Hàn Quốc cũng tăng cường xúc tiến đầu tư tại đây. 

Tiếp nối thành công của dự án hợp tác 2020, KICC HCMC cùng TopDev tiếp tục mang đến chương trình hợp tác năm 2021 với thông điệp “Make Your IT Career Outstanding – Khởi sắc sự nghiệp IT của bạn”. Theo đó là những hoạt động phối hợp với mục đích kết nối các việc làm ngành CNTT tại các doanh nghiệp IT Hàn Quốc với đối tượng Lập Trình Viên Việt Nam. Từ đó hỗ trợ, hợp tác và thúc đẩy tuyển dụng việc làm công nghệ thông tin cho các công ty Hàn Quốc và tạo thêm nhiều cơ hội để các tài năng IT Việt Nam sở hữu những tấm vé gia nhập vào các doanh nghiệp công nghệ hàng đầu của Hàn Quốc hiện đang có mặt tại Việt Nam. 

Vậy cơ hội nào đang rộng mở cho các tài năng lập trình viên Việt Nam trong kỳ này? Hãy cùng TopDev khám phá ngay nhé:

KHÁM PHÁ CƠ HỘI MỚI DÀNH CHO TÀI NĂNG IT VIỆT NAM VỚI SỰ XUẤT HIỆN CỦA 5 CÔNG TY IT HÀN QUỐC TRONG KỲ NÀY

1. Cyberlogitec Vietnam

CyberLogitec Vietnam là một Offshore Development Center chuyên cung cấp các dịch vụ và giải pháp Công nghệ thông tin cho các doanh nghiệp thuộc lĩnh vực logistics business: vận tải biển, bến bãi, kho bãi, vận tải đường bộ và giao nhận. Với hơn 10 năm kinh nghiệm trong ngành, công ty tự hào đã mở rộng quy mô hoạt động tại hơn nhiều quốc gia trên thế giới: Hàn Quốc, Mỹ, Thái Lan, Trung Quốc, Ả Rập Xê Út, Thổ Nhĩ Kỳ, UAE, Malaysia, Ấn Độ, Nhật Bản, Brazil và Singapore.

Đến với CyberLogitec, bạn sẽ được hòa nhập vào môi trường quốc tế và được thử thách năng lực của bản thân khi chinh chiến với các dự án quốc tế. Ngoài ra, đây chính là cơ hội giúp bạn tiếp thu thêm nhiều kiến thức mới về Logistics và hệ thống quản lý chuyên nghiệp thông qua quá trình thực hiện dự án.

>>> Bùng nổ năng lực tại CyberLogitec ngay hôm nay tại vị trí Java Developer 

2. Space T

Space T là nền tảng thương mại điện tử về nội thất, tập trung vào 3 danh mục: Nội thất, trang trí nhà và sinh hoạt. Space T tự hào là nơi bạn có thể tìm thấy mọi thứ  mình cần với mọi mức giá đồng thời phù hợp với thiết kế về không gian sống của bạn.

⇒ Bạn mong muốn được thử sức trong lĩnh vực thương mại điện tử? Đây chính là cơ hội tốt để bạn trổ tài! Khám phá ngay các vị trí đang tuyển tại Space T:

3. BrickMate Group

BrickMate Group (BMG) là cơ quan phát triển CNTT toàn cầu có trụ sở chính tại Seoul, Hàn Quốc, với các văn phòng vệ tinh và liên minh tại Thành phố Hồ Chí Minh, Việt Nam. Công ty hiện đối tác phát triển web/ app với một số doanh nghiệp nổi tiếng như Kyobo, Samsung, LG, Megazone,…

Với đà phát triển nhanh chóng, hiện công ty đang gấp rút tìm kiếm các ứng viên tài năng gia nhập. Và nếu bạn mong muốn theo đuổi đam mê công nghệ tại môi trường làm việc chuyên nghiệp, quốc tế nhưng không kém phần năng động cùng đội ngũ trẻ tài năng, hãy tham gia BrickMate Group ngay hôm nay!

⇒ Khám phá các vị trí đang tìm kiếm nhân tài IT Việt Nam tại BrickMate Group:

4. Daokiwoom Innovation

DaouKiwoom là một trong những tập đoàn hàng đầu trong lĩnh vực CNTT và dịch vụ tài chính tại Hàn Quốc. HIện tập đoàn đang hoạt động tại nhiều quốc gia khác trên thế giới: Nhật Bản, Trung Quốc, Pháp, Indonesia và Việt Nam.

DaouKiwoom Innovation được thành lập vào năm 2018, với mục tiêu phát triển các hoạt động kinh doanh đa dạng tại Việt Nam bằng những trải nghiệm tuyệt vời và năng lực của dịch vụ CNTT tốt nhất của Hàn Quốc.

Cơ hội làm việc toàn cầu cùng hàng loạt đãi ngộ xuất sắc tại DaouKiwoom Innovation đang trao đến tay các tài năng:

⇒ Đâu sẽ là vị trí phù hợp với bạn? Nhanh chóng click ngay link để khám phá nhé!

5. Tourpik Vina

Tourpik Vina có trụ sở chính tại Hàn Quốc, chuyên cung cấp các dịch vụ CNTT liên quan đến du lịch trên toàn thế giới. Có mặt tại Việt Nam, Tourpik Vina mong muốn quảng bá du lịch, phát triển các địa điểm du lịch mới và các tuyến du lịch độc đáo cũng như cung cấp những thông tin hữu ích này cho tất cả các bạn để có một chuyến đi tự do, dễ dàng và thoải mái tại Việt Nam.

Hiện Tourpik Vina đang tìm kiếm Product Owner tài năng cùng chinh phục mục tiêu lớn của công ty tại Việt Nam. Nếu đó là bạn, hãy nhanh chóng gửi CV ngay hôm nay nhé! 

Đường đua công nghệ tại Việt Nam đang nóng hơn bao giờ hết! Với sự xuất hiện của các công ty công nghệ Hàn Quốc trong kỳ này, hy vọng bạn sẽ lựa chọn được “bến đỗ” phù hợp và sẵn sàng cháy hết mình với đam mê công nghệ.

⇒ Và đừng quên KICC HCMC X TopDev sẽ còn mang đến cho cộng đồng IT Việt Nam nhiều cơ hội mới. Hãy chờ đón những bài viết tiếp theo cùng những cơ hội mới hấp dẫn bạn nhé!

Thông tin chi tiết về dự án vui lòng truy cập tại đây

Về KICC HCMC và NIPA:

Được thành lập vào ngày 23 tháng 5 năm 2019, KICC HCMC (KICC Hồ Chí Minh) là văn phòng thứ 6 trên toàn cầu và thứ 2 tại Việt Nam. KICC là văn phòng quốc tế trực thuộc Bộ Khoa học – Công nghệ Thông tin Hàn Quốc (MSIT) và Cơ quan Xúc tiến Công nghệ Thông tin – Truyền thông (NIPA) với mục đích giúp đỡ việc kinh doanh quốc tế của những công ty về Công nghệ Thông tin (CNTT) của Hàn Quốc. KICC có 06 văn phòng ở Thung lũng Silicon (Mỹ), Tokyo (Nhật), Bắc Kinh (Trung Quốc), Singapore, Hà Nội (Việt Nam) và Hồ Chí Minh (Việt Nam).

NIPA là tổ chức phi lợi nhuận từ Chính phủ Hàn Quốc và là thành viên của Bộ Khoa học – Công nghệ Thông tin Hàn Quốc, chịu trách nhiệm trong việc hỗ trợ các công ty và các chuyên gia CNTT. NIPA hiện dẫn đầu trong kiến thức về cơ sở hạ tầng kinh tế xã hội và phát triển kinh tế quốc gia bằng việc xúc tiến khả năng cạnh tranh của toàn ngành công nghiệp thông qua sự tiến bộ kỹ thuật CNTT và công nghiệp.

Thông tin liên hệ:

  • Hotline: 84 28 35208135 (Vietnamese) | 84 28 35208136 (Korean)
  • E-mail: HCMC@nipa.kr
  • Địa chỉ: 135 Hai Bà Trưng, Phường Bến Nghé, Quận 1, Thành phố Hồ Chí Minh

Về TopDev – nền tảng tuyển dụng IT

Với hơn 300.000 profile lập trình viên đồng thời sở hữu Cộng đồng Lập trình viên lớn nhất Việt Nam, TopDev hiện là một trong những nền tảng tuyển dụng chuyên về IT hàng đầu tại Việt Nam.  Ngoài ra, TopDev là một trong những đơn vị tiên phong ở lĩnh vực IT tại Việt Nam, giúp xây dựng và phát triển thương hiệu tuyển dụng – Employer Brand cho hàng trăm công ty công nghệ trong và ngoài nước. Đây còn là đơn vị chuyên khảo sát, phân tích và phát hành các báo cáo quý, năm về thị trường và nhân lực IT tại Việt Nam. (Báo cáo thị trường IT tại đây)

Python free variable

Python free variable

Bài viết được sự cho phép của tác giả Nguyễn Việt Hưng

Python có 2 loại variable (biến): local, global, và free (đếm từ 0, tất nhiên).

free

Xem thêm nhiều việc làm Python hấp dẫn trên TopDev

binding

x = 42 trong Python đọc là bind name x tới object 42. Tham khảo thêm tại bài Python call by gì?

3 loại variable trong Python

global variable

Đoạn code sau

print(x)
x = 42

x viết sát lề, gọi là global variable. Chạy đoạn code trên sẽ hiện ra exception:

NameError: name 'x' is not defined

do code dùng x trước khi x được bind tới object 42.

local variable

Đoạn code tiếp theo, chạy sẽ thấy gì? Gợi ý: không phải NameError:

def foo():
    print(x)
    x = 42

foo()

x = 42 nằm trong 1 block (trong thân function hay class), gọi là local variable. Trong 1 block, dùng 1 variable/name trước khi bind nó (tức là có bind, nhưng bind sau khi dùng), exception sẽ xảy ra là

UnboundLocalError: local variable 'x' referenced before assignment

free variable

def foo():
    print(x)

foo()

Xóa x = 42 trong ví dụ phần local, ta chạy đoạn code này, lại thấy NameError.

NameError: name 'x' is not defined

Lần này không xảy ra UnboundLocalError, do đoạn code không bind x = 42 trong thân function (block). x ở đây là một free variable.

Free variable hoạt động theo cách … rất tự do. Khi không tìm thấy x trong foo, Python sẽ đi tìm x ở global (bên ngoài function foo).

x = 42
def foo():
    print(x)

x = 96
foo()
x = 100

Màn hình sẽ hiện ra 42100 hay 96?

Việc tính toán tên x có giá trị gì, được thực hiện khi function CHẠY. Khi gọi foo() ở trên, x đã có giá trị là 96.

  Python: Top 18 module hữu ích nhất

Static analysis

Việc dùng các công cụ (phần mềm/chương trình) để phân tích/tìm lỗi code bằng cách đọc code (text) – mà không cần chạy code, gọi là static analysis. Trong Python phổ biến các công cụ như pep8flake8pylintmypy cũng có thể tính luôn, hay các tính năng tích hợp sẵn của IDE như Pycharm.

flake8 cơ bản giống pep8 (tên mới là pycodestyle), thêm tính năng phát hiện thư viện không dùng tới/ hay biến không tồn tại.

import math
def foo():
    print(x)
    x = 42
foo()

khi chạy flake8 với file code, flake8 sẽ phát hiện ra thư viện math được import nhưng không dùng, tên x chưa được định nghĩa.

$ flake8 scope.py
scope.py:1:1: F401 'math' imported but unused
scope.py:5:11: F821 undefined name 'x'
scope.py:6:5: F841 local variable 'x' is assigned to but never used

flake8 rất hữu ích khi dễ dàng phát hiện các lỗi đơn giản như gõ nhầm tên biến hay dùng biến không tồn tại như trên. Nhưng khi x là free variable, không công cụ nào của Python có thể phát hiện ra lỗi này cho tới khi chạy mới thấy exception:

def n_pymi_vn() -> int:
    s = x + 1
    return s

r = n_pymi_vn()
x = 10
print(r)

Do x là free variable, các công cụ phải quét hết cả file code để tìm x, và nó tìm thấy, nên tin rằng x có tồn tại, nhưng đã quá muộn rồi. Một ví dụ vô lý hơn nữa, để thấy sự bất lực của các công cụ static analysis:

def n_pymi_vn() -> int:
    s = x + 1
    return s

if 1 > 10:
    x = 10
r = n_pymi_vn()
print(r)
  Điều khiển luồng trong Python

Hành động của chúng ta

Hạn chế hết mức việc sử dụng global variable, free variable, cần biến gì thì đưa argument vào function biến đó, code “sát tường” cho hết vào 1 function main và gọi main() nếu cần chạy.

def n_pymi_vn() -> int:
    s = x + 1
    return s


def main():
    r = n_pymi_vn()
    x = 10
    print(r)

main()

flake8 sẽ làm tốt nhiệm vụ phát hiện ra x chưa được định nghĩa trong ví dụ trên: F821 undefined name 'x', và đoạn code này có thể viết lại để không còn dùng global/free variable nữa:

def n_pymi_vn(x) -> int:
    s = x + 1
    return s


def main():
    x = 10
    r = n_pymi_vn(x)
    print(r)

main()

Kết luận

Tính dynamic của Python khiến các công cụ khó có thể xử lý mọi trường hợp, công cụ sẽ chỉ giúp một phần, phần còn lại là sự cẩn thận của lập trình viên.

Tự do phải chăng cần trong khuôn khổ?

Tham khảo

Bài viết gốc được đăng tải tại pp.pymi.vn

Có thể bạn quan tâm:

Xem thêm việc làm IT hấp dẫn trên TopDev

Hướng dẫn học CSS Grid toàn tập phần 1

Hướng dẫn học CSS Grid toàn tập phần 1

Bài viết được sự cho phép của tác giả Trần Anh Tuấn

Sau loạt bài về css flexbox toàn tập chắc hẳn các bạn cũng nắm được kiến thức khá tốt về tạo layout. Tuy nhiên ứng dụng web ngày nay giao diện ngày càng phức tạp nên việc chỉ sử dụng flexbox thực sự vẫn chưa tối ưu, cần nhiều giải pháp hơn để tạo ra layout một cách nhanh nhất , đẹp mà lại không tiêu tốn nhiều sức.

Vì thế mà CSS Grid được sinh ra để giải quyết vấn đề này. Việc tạo layout không còn khó khăn nữa với CSS Grid ta có thể làm được nhiều layout phức tạp một cách dễ dàng, nhanh chóng tuy nhiên nó cũng chưa được nhiều trình duyệt hỗ trợ như flexbox nên việc sử dụng vẫn còn chưa rộng rãi.

  3 điều bạn có thể không biết về biến trong CSS
  9 CSS animation mới "mãn nhãn" cho các project

Xem thêm các việc làm CSS hấp dẫn trên TopDev

Trong series CSS Grid này, mình sẽ tập trung chia sẻ rõ ràng về các thuộc tính trong CSS Grid, cách sử dụng hiệu quả và xử lý khi trình duyệt không hỗ trợ cũng như kèm theo một bài demo kèm giải thích để các bạn dễ hiểu hơn trong khi đọc.

# CSS Grid

Để dễ hình dung trong việc đọc hiểu và học tập mình vẫn sẽ làm trên Codepen cho các bạn tiện xem demo và có thể sửa trên nó cho mau hiểu. Mình sẽ giải thích rõ các thuộc tính và công dụng của chúng thông qua ví dụ dưới đây xuyên suốt bài viết các bạn chú ý nha.

Đầu tiên mình tạo layout HTML như sau:

<div class="container">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
<div class="item item6">6</div>
<div class="item item7">7</div>
<div class="item item8">8</div>
<div class="item item9">9</div>
<div class="item item10">10</div>
</div>

Và kèm theo đó là CSS

.container {
background-image: linear-gradient(to right bottom, #ffa400, #e74c3c);
height: auto;
padding: 50px;
display: grid;
grid-template-columns: 500px 200px;
}
.item {
color: black;
font-weight: bold;
font-size: 2rem;
text-align: center;
padding: 10px;
background-color: #fff;
border-radius: 4px;
border: 2px solid orange;
}

Chúng ta sẽ được kết quả

Để sử dụng Grid thì đơn giản chúng ta dùng thuộc tính display: grid; thế là chúng ta đã dùng grid rồi giống như flexbox display: flex; vậy. Đơn giản quá nhỉ keke. Giờ chúng ta đi sâu vào từng thuộc tính một khác của CSS Grid nhá.

DÀNH CHO BẠN:

Mình có khoá học HTML CSS từ cơ bản tới nâng cao cho người mới, nếu bạn quan tâm thì bạn có thể học thử miễn phí bằng việc nhấn vào đây nha.

# grid tracks

Grid tracks hiểu nôm na là các đường được đánh dấu theo thứ tự theo các cột và các hàng để thiết lập vị trí cho các phần tử một cách dễ dàng hơn. Mình khuyến khích các bạn mở Firefox lên để Inspect Code(F12) của demo Codepen ở trên để thấy các grid tracks một cách rõ ràng nhất nha

Các đường đánh dấu theo hàng và cột tương ứng từ trên cùng hoặc ngoài cùng bên trái. Cách để nhớ đơn giản là cứ lấy số cột + 1 sẽ ra tổng tracks theo cột và số hàng + 1 sẽ ra tổng tracks theo hàng. Các bạn thấy đó có 2 cột thì có 3 tracks line cột đánh dấu 1 2 3, còn 5 hàng thì 6 tracks line hàng. -1 là cuối cùng.

Ở đây các bạn chỉ cần hiểu nó là các đường như hình trên là được. Ở bài sau mình sẽ nói chi tiết về công dụng rất quan trọng của nó trong việc tạo layout như thế nào. Do CSS Grid khá nhiều thuộc tính nên mình không gom vào một bài được.

# grid-template-columns

Columns đúng như tên gọi là cột, khi sử dụng thuộc tính này grid container sẽ chia cột cho các phần tử bên trong nó. Ở đây các bạn có thể chia bao nhiêu cột tùy các bạn, thường dựa vào design thiết kế là 12 cột bằng nhau, có khi 8….

Ví dụ ở đây mình có 10 phần tử, mình muốn chia mỗi cột có 2 phần tử thì mình sẽ chia cho 5 cột. Đơn vị ở đây các bạn có thể dùng px, %, em rem, auto hay gì tùy các bạn. Tuy nhiên ở đây có một giá trị mới chỉ dùng trong css grid đó là fr(fractional unit). Giá trị này mình sẽ giải thích ở một phần sau nha.

.container {
grid-template-columns: 20% 20% 20% 20% 20%;
}

.container {
grid-template-columns: 200px 300px 100px 50px auto;
}

.container {
grid-template-columns: 1fr 2fr 1fr 1fr 3fr;
}

Các bạn muốn chia bao nhiêu cột thì cứ điền vô thêm như thế này grid-template-columns: cột1 cột2 cột3.... cộtN tương ứng grid-template-columns: 10px 100px 1fr auto... Đấy các bạn nên áp dụng thử xem để mau hiểu hơn nha, dùng cái Codepen của mình ở trên có note sẵn cho các bạn để điền vào thử rồi á chớ đọc không mà không làm là mù màu với nó đấy.

# fraction-unit

Đây là một giá trị mới và dùng trong CSS Grid nha các bạn. Giá trị này sẽ chiếm khoảng trống lớn nhất có thể để mình giải thích cho các bạn dễ hiểu nà. Giả sử container có độ rộng là 100% và lúc này grid-template-columns: 1fr thì sẽ tạo ra một cột là 100%. Nên các phần tử sẽ nằm cùng một cột như dưới đây

Tuy nhiên nếu mình thêm vài đơn vị fr vào nữa lúc này sẽ là grid-template-columns: 1fr 2fr 1fr chẳng hạn thì layout nó sẽ tạo ra 3 cột với cột giữa là 2fr sẽ gấp đôi 2 cột còn lại. Nghĩa là container 100% sẽ chia cho 4 và cột đầu tiên và cột cuối cùng sẽ chiếm 25% còn 50% còn lại là cột ở giữa.

.container {
grid-template-columns: 1fr 2fr 1fr;
}

Các bạn có thấy nó quen quen không, khá là giống cái thuộc tính flex-grow trong css flexbox mình nói ở phần 3 của series css flexbox toàn tập ý. Khác cái là đây nó áp dụng cho grid và để chia cột nhá nên đừng hiểu nhầm nha.

# grid-template-rows

Cũng tương tự như grid-template-columns nhưng thuộc tính này là chia hàng(row). Các bạn có thể chia container thành nhiều hàng tùy vào thiết kế hoặc có thể không cần set, để tự động(auto) cũng được.

Các bạn thấy nó cũng khá đơn giản chứ nhỉ. Các bạn có thể tạo bao nhiêu hàng tùy ý và có thể dùng các đơn vị như ở thuộc tính grid-template-columns mà mình đã nói ở trên. Ở đây mình có 10 phần tử thì mình muốn chia thành 3 cột và 3 hàng thì nó sẽ như thế này

Tuy nhiên còn một phần tử cuối cùng nó không còn chỗ vì chia 3 cột 3 hàng thì được 9 phần tử thôi nên nó sẽ tự động rớt xuống tạo nên đường Implicit Tracks. Trong grid có 2 khái niệm về tracks đó là Implicit và Explicit, vậy nó là gì ? Các bạn kéo xuống dưới đọc để hiểu nha.

# grid implicit và explicit tracks

Hai đường này hơi lằng nhằng chút nhưng cũng dễ hiểu thôi thường khi làm mình không để ý lắm, nhưng viết bài thì mình phải nói rõ cho các bạn biết thêm. Như phần trên mình nói do có 10 phần tử, mà mình chỉ tạo 3 cột 3 hàng thì phần tử cuối sẽ rớt xuống tạo thành 1 hàng mới.

Các bạn mở giúp mình cái Codepen ở phần grid-template-rows lên bằng Firefox rồi F12 mở layout Grid lên được như hình trên. Các bạn zoom trình duyệt lên cho thấy rõ là có 1 đường đen ở trên cùng và những đường có dấu gạch ngang – cho tới một đường đen ở hàng số 4 đây chính là Explicit Tracks.

Còn một đường dấu … ở hàng số 5 đó là do container không đủ chỗ chứa cho phần tử số 10 nên nó rớt xuống tạo nên 1 hàng mới và tạo nên đường dấu… chứ không phải đen hay gạch ngang – như ở Explicit Tracks đây chính là Implicit Tracks.

Hai đường này giúp chúng ta nhận biết được vị trí của các phần tử để hiển thị cho đúng nha anh em. Để việc chia cột hay hàng trong layout được hiển thị chính xác nà.

# grid-auto-flow

Như ở trường hợp trên khi có một hoặc nhiều phần tử bị dư do không đủ cột hay hàng thì nó sẽ rớt xuống tạo nên hàng mới. Thì mình muốn set cho các phần tử bị rớt ra tạo nên Implicit Tracks có chiều cao nhất định nào đó. Chúng ta sẽ dùng thuộc tính grid-auto-flow: row kết hợp với thuộc tính grid-auto-rows để set cho các phần tử đó

Ở đây mình muốn cho phần tử số 10 khi rớt xuống tạo nên hàng mới có chiều cao là 100px thì mình set grid-auto-rows: 100px. Các bạn xem demo Codepen là sẽ hiểu ngay thôi.

Còn nếu các bạn muốn các cột đều nằm trên một hàng và tạo thành nhiều cột khác cho dù ban đầu bạn chỉ set có 2 cột mà thôi thì cũng tương tự chúng ta sử dụng thuộc tính grid-auto-flow: column nhưng giá trị là column.

Mình muốn các cột được tạo thêm đều bằng nhau và có giá trị là 250px thì mình sẽ code như thế này

.container {
grid-template-columns: 100px 200px; 
grid-auto-flow: column;
grid-auto-columns: 250px;
}

Nếu các bạn bỏ thuộc tính grid-template-columns ra thì nó cũng sẽ tự động tạo ra các cột tương ứng với số phần tử và độ rộng các cột là 250px.

# grid-gap

Thuộc tính này giúp chúng ta tạo khoảng cách giữa các phần tử với nhau theo cột và hàng. Thuộc tính này bao gồm thuộc tính grid-row-gap và grid-column-gap được viết như sau grid-gap: grid-row-gap grid-column-gap.

Các bạn có thể thấy hình minh họa dưới đây mình cho grid-gap: 20px. Nó sẽ tạo khoảng cách giữa các phần tử 20px theo cột và hàng luôn rất đều và đẹp

# Tạm kết

Phù!!! Bài viết tạm đến đây thôi. CSS Grid hại não lắm nên mình viết thành nhiều phần, đây mới chỉ là bước dạo đầu thôi các bạn ah. Đó mình học mãi mới hiểu được nó giờ thì hiểu tàm tạm rồi nên viết để chia sẻ cho các bạn.

Mình biết là nó hơi khó hiểu, các bạn chịu khó đọc và làm theo nha. Nếu không hiểu thì cứ comment hoặc inbox hỏi mình nhé. Nếu có góp ý hay gì thì comment cho mình phát để có động lực viết bài nha. Xin cám ơn và chúc các bạn một ngày tốt lành..

Bài viết gốc được đăng tải tại evondev.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Hướng dẫn cài đặt docker registry server (private registry server)

Hướng dẫn cài đặt docker registry server (private registry server)

Bài viết được sự cho phép của tác giả Trần Hữu Cương

Hướng dẫn cài đặt docker registry server (private registry server)

Registry là một server cho phép lưu trữ và phân phối các image docker. Registry là một phần mềm mã nguồn mở, có thể cài đặt qua docker.

  20 trường hợp sử dụng lệnh Docker cho developer
  Cách tạo một Docker đơn giản cho Node.JS

1. Cài đặt docker registry server

Chạy một docker container từ image registry:2

docker run -d --name registry -p 5000:5000 -v /data/registry:/var/lib/registry registry:2

Với câu lệnh trên mình thực hiện expose port 5000 trên container với port 5000 trên host; mapping folder /data/registry trên host với folder /var/lib/registry (các images được push lên server registry sẽ lưu tại folder này)

Hướng dẫn cài đặt docker registry server (private registry server)

Trên máy mình đang có một images ubuntu:18.04, Nếu chưa có thì bạn có thể pull về bằng lệnh:

docker pull ubuntu:18.04

Bây giờ mình sẽ đánh tag lại để push lên server registry vừa chạy.

docker image tag ubuntu:18.04 localhost:5000/ubuntu:18.04

trong đó localhost:5000 là địa chỉ registry server, ubuntu:18.04 là tên và tag mới của image (phần này các bạn đặt tùy ý)

Hướng dẫn cài đặt docker registry server (private registry server)

Thực hiện push image localhost:5000/ubuntu:18.04 lên server registry

Hướng dẫn cài đặt docker registry server (private registry server)

Để kiểm tra các image được lưu trên server registry ta truy cập vào url localhost:5000/v2/_catalog

Hướng dẫn cài đặt docker registry server (private registry server)

Bây giờ muốn sử dụng image trên server registry ta pull về như bình thường:

docker pull localhost:5000/ubuntu:18.04

Khi đó, hệ thông sẽ connect tới server registry ở địa chỉ localhost:5000 để lấy image chứ không lấy image từ docker repository.

Okay, Done!

References:

https://docs.docker.com/registry/
https://docs.docker.com/registry/deploying/
https://docs.docker.com/registry/spec/api/

Bài viết gốc được đăng tải tại stackjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

jQuery là gì? Ứng dụng jQuery và ưu điểm nổi bật

jQuery là gì? Ứng dụng jQuery và các thư viện jQuery phổ biến nhất hiện nay ra sao?

Bài viết được sự cho phép của BQT Kinh nghiệm lập trình

Hầu hết các website đều không thể thiếu Javascript vì đây là thành phần quan trọng giúp tạo hiệu ứng riêng cho từng trang. Tuy nhiên, sự kết hợp giữa Javascript và CSS với những đoạn code dài dòng, phức tạp đã gây không ít rắc rối cho người dùng. Và jQuery được ra đời như một phương thức mới giúp đơn giản hóa mọi thao tác trên website. Vậy jQuery là gì? Ứng dụng jQuery và các thư viện jQuery phổ biến nhất hiện nay ra sao? Hãy cùng tìm hiểu ngay sau đây nhé.

  15 thư viện slider jquery miễn phí cho dự án website của bạn
  Hướng dẫn và sử dụng jquery plugin typing để giả hiệu ứng gõ văn bản

Xem thêm nhiều việc làm JQuery hấp dẫn trên TopDev

 jQuery là gì?

jQuery là một thuật ngữ được dùng rất nhiều trong thời đại công nghệ hiện nay. Kể từ khi phát triển 2.0, cụm từ này đã được dùng khá phổ biến. Vậy jQuery thật sự là gì? Nói một cách dễ hiểu, jQuery là một thư viện được xây dựng trên Javascript. Chúng được tạo ra mới mục đích hỗ trợ các lập trình viên giải quyết các khó khăn khi sử dụng Javascript. jQuery được tích hợp từ nhiều module chuyên biệt, bao gồm cả module hiệu ứng đến module truy vấn selector.

jQuery với phương châm ưu việt “ viết ít làm nhiều” đang rất phổ biến hiện nay

Đồng thời cũng có thể hiểu jQuery là một thư viện Javascript đa tính năng, nhanh chóng, tiện dụng. Thư viện này được tạo ra bởi John Resig vào năm 2006 với phương châm hoạt động vô cùng ưu việt: viết ít hơn – năng suất hơn. jQuery  đơn giản hóa các thao tác duyệt tài liệu HTML, tăng cường tương tác Ajax để có thể nâng cao tối đa hiệu quả phát triển website. Hiện nay công cụ hỗ trợ này được sử dụng vô cùng rộng rãi. Theo thống kê, có đến 99% các website trên thế giới sử dụng thư viện này, trừ những trang dùng JS Framework.

jQuery – một số tính năng quan trọng

  • Thao tác DOM: jQuery cho phép người dùng đơn giản hóa việc lựa chọn các phần tử DOM để duyệt như khi dùng CSS. Cùng với đó, người dùng cũng có thể sử dụng phương tiện selector mã nguồn mở để chỉnh sửa nội dung của chúng.
  • Xử lý sự kiện: thư viện jQuery xử lý các sự kiện một cách nhanh chóng chính xác và hiệu quả mà không làm HTML code rối với các Event Handler. Nhờ đó nâng cao khả năng tương tác với người dùng một cách tối đa.
  • Hỗ trợ AJAX: bằng việc sử dụng công nghệ AJAX, jQuery cho phép lập trình viên phát triển website với đa dạng các tính năng và phản hồi tích cực hơn.
  • Tạo hiệu ứng động: jQuery cho phép cung cấp đa dạng các hiệu ứng động đẹp mắt, độc đáo cho website, giúp trang trở nên sinh động và chuyên nghiệp hơn
  • Kích thước cực kỳ gọn nhẹ: thư viện này vô cùng gọn nhẹ, vì vậy chạy rất mượt và nhanh. jQuery chỉ có 19KB
  • Được hỗ trợ cho hầu hết các trình duyệt hiện nay: ứng dụng này làm việc cực tốt trên IE 6.0+, FF 2.0+, Safari 3.0+, Chrome và Opera 9.0+ và hầu như được hỗ trợ ở tất cả các trình duyệt khác.
  • Cập nhật và hỗ trợ các ứng dụng mới nhất: hỗ trợ CSS3 Selector và cú pháp XPath cơ bản giúp lập trình viên có thể tiếp cận với những công nghệ tân tiến nhất của thời đại khoa học – máy tính 4.0

Những cách sử dụng jQuery hiện nay

Có hai cách sử dụng jQuery phổ biến nhất hiện nay chính là cài đặt cục bộ và sử dụng từ CDN:

  • Cài đặt cục bộ: bạn có thể thư viện jQuery từ máy chủ và đưa vào hệ thống HTML. Lập trình theo cú pháp sau để có thể đưa jQuery vào HTML file:
<html> 
<head> 
<title>The jQuery Example</title> 
<script type="text/javascript" src="../jquery/jquery-2.1.3.min.js"></script> 
<script type="text/javascript">
  $(document).ready(function(){ 
     document.write("Xin chào bạn!"); 
  }); 
</script> 
</head> 
   <body> 
     <h1>Hello</h1> 
   </body> 
</html>
  • Sử dụng CDN: người dùng có thể tự thêm jQuery vào trong HTML code trực tiếp từ Content Delivery Network (CDN) một cách vô cùng đơn giản. Google và Microsoft đều cung cấp những phiên bản mới nhất để mang đến những tính năng đột phá. Chỉ cần nhập lệnh sau khi sử dụng CDN Google:
<html> 
<head> 
    <title>The jQuery Example</title> 
    <script type="text/javascript"    src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"> 
    </script> 
    <script type="text/javascript">        $(document).ready(function(){ document.write("Xin chào bạn!"); }); 
    </script> 
</head> 
<body> 
    <h1>Hello</h1> 
</body> 
</html>

Với hai cách sử dụng trên, kết quả trả ra đều sẽ là “Xin chào bạn”

Cách để gọi một hàm thư viện jQuery

Trước khi sử dụng các đoạn code của jQuery để chỉnh sửa hoặc đọc DOM, cần đảm bảo thêm vào các sự kiện khi DOM đã sẵn sàng. Điều kiện sử dụng này cũng tương tự như JavaScript. Và để một sự kiện hoạt động tốt trên website, lập trình viên cần gọi tên chúng trong Hàm $(document).ready(). Các dữ liệu bên trong sẽ được tải lên trước khi nội dung trang được tải và khi DOM sẵn sàng

Những lý do lập trình viên nên sử dụng thư viện jQuery

Không phải ngẫu nhiên mà jQuery lại được sử dụng trong hầu hết các website trên thế giới. Thư viện lập trình này cho phép người dùng nâng cao tối đa khả năng tương tác và hoạt động của trang nhờ sở hữu những tính năng ưu việt:

  • jQuery rất nhanh và có khả năng mở rộng
  • Đơn giản hóa việc viết code. Giúp người dùng có thể viết các mã chức năng liên quan đến giao diện một cách dễ dàng
  • Cho phép các ứng dụng web tương thích với trình duyệt cùng phát triển.
  • Sử dụng hầu hết các tính năng hiện đại của các trình duyệt mới
  • Hỗ trợ trên hầu hết các trình duyệt

Trên đây là những kiến thức lập trình liên quan đến jQuery. Hy vọng các chia sẻ này có thể cung cấp đến quý bạn đọc những thông tin bổ ích.

Bài viết gốc được đăng tải tại kinhnghiemlaptrinh.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

MyBatis – Chim nhỏ nhưng làm được lâu!

MyBatis – Chim nhỏ nhưng làm được lâu!

Bài viết được sự cho phép của tác giả Kiên Nguyễn

1. MyBatis là gì?. Con chim ngáo ngơ này là gì?.

Nhìn logo thôi cũng thấy con chim này nóng tính vcl. Bé tẹo tèo teo nhưng thực ra võ nghệ đầy mình.

MyBatis là một persistence framework mã nguồn mở. Được tạo ra nhằm đơn giản hóa việc kết nối đến CSDL của JDBC. Ngoài ra nó còn cung cấp các API để giúp việc thao tác với Database được dễ dàng hơn.

Tất nhiên, để hiểu được về MyBatis, các bạn cần có một chút kiến thức về JDBC (Java Database Conectivity), hãy tham khảo bài viết này.

  Mybatis separator – tiện lợi và nguy hiểm
  Cài đặt MySQL Community Server trên macOS

2. Những ưu điểm nổi bật.

2.1 Viết code JDBC ít đi.

Thật sự đây là một trong những điểm mình thích nhất ở MyBatis. Nhớ trước đây làm 3 dựa án convert từ Database từ Oracle sang Postgres. Mở đống source sử dụng JDBC toàn cộng chuỗi String bằng “+”, nhìn vào thôi là chả muốn cơm nước gì nữa. Dự án như là cực hình, phải thật cố gắng mới kết thúc dự án được (rất may không lỗ).

JDBC-cong-chuoi-stringSử dụng “+” để tạo chuỗi String query, nỗi ám ảnh một thời của lập trình viên.

Trớ trêu thay, việc Concat String kiểu này lại chỉ là nỗi ám ảnh cho người maintanance code, chứ người phát triển dự án từ đâu lại không có vấn đề gì =))).

2.2 Dễ hiểu, dễ sử dụng.

Một khi đã nắm chắc kiến thức về SQL và Java, rất dễ dàng để sử dụng MyBatis. Ngoài một lượng lớn document, chỉ có một số ít kiến thức mới cần phải học thêm.

Có rất nhiều tài liệu viết về MyBatis rất dễ đọc.

2.3 Dễ tích hợp cho Spring và Guice framework

Mặc dù các dự án Spring thường được “đính kèm” sử dụng với Hibernate. Tuy nhiên, cả Eclipse và IntelliJ đều hỗ trợ cài đặt con chim ngáo ngơ như là một plugin. Không jar, không file download, rất tiện. Ngoài ra, việc thay đổi giữa các phiên bản cũng không quá khó khăn.

MyBatis install trên IntelliJ tương đối dễ dàng.Cài đặt MyBatis trên IntelliJ cũng như Eclipse tương đối dễ dàng.

2.4 Hiệu năng truy vấn cao (High perfomance)

Với cơ chế cache và polling connectionMyBatis cho hiệu năng truy vấn cao hơn hẳn so với JDBC. Tuy nhiên, khi thực hiện Select ở lần đầu tiên, JDBC vẫn chưa hề tìm ra đối thủ, nó chỉ hụt hơn do lần nào SELECT cũng phải gọi tới Database, tất nhiên không thể bằng lấy kết quả từ cache.

“Con chim của chúng ta” xem ra thực sự vượt trội khi thực hiện update và delete nhiều record.

Hiệu năng chính là vấn đề chính chúng ta tìm hiểu ở bài viết này. Có 3 yếu tố làm tăng perfomance, chi tiết sẽ có ngày sâu đây.

3. Performance (hiệu năng).

Performance is one of the key factors for the success of any software application. There are lots of things to consider for better performance, but for many applications, the persistence layer is a key for overall system performance.

Hiệu năng chính là chìa khóa cho thành công đối với mọi phần mềm. Có rất nhiều thứ có thể làm tăng hiệu năng. Đối với nhiều ứng dụng, lớp đặc tả giao diện chính là chìa khóa cho hiệu suất tổng thể của hệ thống.

Vậy tại sao sử dụng mybatis lại làm tăng hiệu suất của hệ thống?. Có 3 yếu tố ảnh hưởng trực tiếp:

3.1 Hỗ trợ connection polling.

MyBatis supports database connection pooling that eliminates the cost of creating a database connection on demand for every request.

MyBatis hỗ trợ kết nối database polling, điều này giúp giảm chi phí khởi tạo connection tới database cho tất cả request.

Đối với các biện chưa biết về polling có thể tham khảo thêm bài viết về http polling và connection pool. Bình thường mỗi request yêu cầu mở kết nối tới database sẽ được tạo connection riêng. Khi sử dụng Mybatis, với cơ chế polling (sau khi một kết nối được tạo và sử dụng xong nó sẽ không đóng lại mà sẽ duy trì trong connection pool để dùng lại cho lần sau và chỉ thực sự bị đóng khi hết thời gian timeout). Chính việc sử dụng polling đã giảm bớt đáng kể chi phí khởi tạo connection, qua đó tăng perfomance của application.

mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.Mybatis sử dụng cơ chế polling để tiết kiệm chi phí khởi tạo kết nối tới database.
<environments default = "development">
<environment id = "development">
<transactionManager type = "JDBC"/> 
<dataSource type = "POOLED">
<property name = "driver" value = "com.mysql.jdbc.Driver"/>
<property name = "url" value = "jdbc:mysql://localhost:3306/details"/>
<property name = "username" value = "root"/>
<property name = "password" value = "password"/>
</dataSource> 
</environment>
</environments>

Cấu hình polling trong MyBatis tương đối đơn giản. Kiểu của dataSource chỉ cần thiết lập type = “POOLED”.

3.2 Sử dụng cache cho query trùng lặp.

MyBatis has an in-built cache mechanism which caches the results of SQL queries at the SqlSession level. That is, if you invoke the same mapped select query, then MyBatis returns the cached result instead of querying the database again.

MyBatis có cơ chế cache lại kết quả từ SQL queries, trên cấp độ SqlSesssion. Điều đó có nghĩa răng, nếu bạn gọi lại một câu select query đã được ánh xạ vào bộ đệm (cache), thì Mybatis sẽ không thực hiện query ở database nữa, nó sẽ lấy kết quả trực tiếp từ cache.

Cùng xem xét ví dụ sau đây:

public static void main(String[] args) throws IOException {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User firstSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("first query with cache:" + firstSelectWithCache.getUserName());
User secondSelectWithCache = mapper.selectByIdWithCache(216);
System.out.println("second query with cache:" + secondSelectWithCache.getUserName());
sqlSession.commit();
} catch (PersistenceException e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}

Khi thực hiện, Mybatis sẽ chỉ thực hiện firstSelectWithCache. Tuy nhiên, khi gặp câu SQL thứ 2 giống hệt SQL1 và trong cùng sqlsession, nó sẽ lấy kết quả trực tiếp từ cache. Việc này tuy nhỏ, nhưng đối với những ứng dụng cần query dữ liệu nhiều lần, trùng lặp từ database, sử dụng Mybatis giúp tăng hiệu năng lên đáng kể.

  • The results of all queries are stored in the cache. Tất cả kết quả của queries đều được lưu vào cache.
  • End a transaction (or at the end of a query configured with autoCommit = true). Cache chỉ được xóa khi kết thúc transaction (hoặc khi query được thiết lập autoCommit = true).
  • Whenever an insert / update / delete query is made. Khi thực hiện các câu insert/ update/ delete.

Chi tiết hơn, Mybatis hỗ trợ 2 tầng cache. Thứ nhất là session cache, hai là global cache. Vấn đề này sẽ được tìm hiểu sâu hơn ở bài viết tiếp theo.

3.3 Không sử dụng proxy.

MyBatis doesn’t use proxying heavily and hence yields better performance compared to other ORM frameworks that use proxies extensively.

4. Kết luận.

MyBatis may not be the ideal or best solution.If your application is driven by an object model and wants to generate SQL dynamically, MyBatis may not be a good ft for you. Also, if you want to have a transitive persistence mechanism (saving the parent object should persist associated child objects as well) for your application, Hibernate will be better suited for it.

Mybatis có thể không là lựa chọn tốt nhất. Nếu ứng dụng của bạn cung cấp những cấu SQL động (dynamically), MyBatis có thể không tốt cho bạn. Tuy nhiên, nếu bạn muốn một cơ chế lưu trữ lâu dài (các object cha được lưu trữ và giữ liên kết tới các object con) thì Hibernate sẽ là trong những lựa chọn không tồi.

Nếu câu query cần sử dụng nhiều điều kiện if else, hoặc cần for loop một dãy giá trị IN. Hiển nhiên MyBatis là lựa chọn tốt nhất.

5. Tham khảo.

  1. MyBatis cache.
  2. Connection Pool.
  3. MyBatis in Practice.
  4. Java Persistence with MyBatis 3.

Bài viết gốc được đăng tải tại kieblog.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Đọc, ghi, xóa, sửa dữ liệu MongoDB

Đọc, ghi, xóa, sửa dữ liệu MongoDB

Bài viết được sự cho phép của smartjob.vn

Hệ quản trị CSDL MongoDB lưu trữ dữ liệu theo cấu trúc phân cấp:
database > collection >  document > field:value

1. Cặp field:value, có 4 ví dụ minh họa:
fullname: “Hoàng Thị Hồng Nhung”
birth_year: “1990”
email: “nhunghth@smartJob.vn”
group: [“van_phong”, “nhan_su”]

  MongoDB là gì? Cơ sở dữ liệu phi quan hệ
  MongoDB là gì? Định nghĩa đầy đủ và chi tiết nhất về MongoDB

Xem thêm các việc làm MongoDB lương cao trên TopDev

2. document tuân thủ định dạng BSON (gần giống JSON), một document gồm một hay nhiều cặp field:value như đã trình bày ở trên.

Chúng ta bắt đầu các thao tác với dữ liệu:
Gõ Windows + R, gọi tiện ích Run.
Gõ cmd, gọi tiện ích dòng lệnh (command line).
Cần 2 cửa sổ cmd, một để khởi chạy MongoDB bằng lệnh

mongod

một cửa sổ cmd khác để khởi chạy MongoDB client bằng lệnh

mongo

CSDL test mặc định được gọi ra (sau khi cài đặt MongoDB thì đã có sẵn CSDL này).

Mẹo: Các thao tác thực hành sẽ sử dụng dòng lệnh nhiều, khi câu lệnh dài, khó nhớ, bạn bấm phím Tab để có gợi ý câu lệnh, có thể bấm phím Tab nhiều lần để xuất hiện câu lệnh mong muốn.

Hiển thị các database hiện có:

show dbs

Có nhiều database trong MongoDB, để sử dụng thao tác với database nào thì cần khai báo bằng lệnh

use tên_database  ví dụ

Để xóa database restaurants, gõ lệnh

db.dropDatabase()

TẠO MỚI CƠ SỞ DỮ LIỆU

Để tạo một Cơ sở dữ liệu hoàn toàn mới, bạn sử dụng câu lệnh insert vào một database chưa sẵn có:

use smartJob

Để chèn collection employee (collection này có một document) đầu tiên cho CSDL smartJob, sử dụng câu lệnh:

Chúng ta đã tạo mới CSDL smartJob có một collection đầu tiên, collection đầu tiên có một document. Kiểm tra bằng cách gõ lệnh

show dbs

Chúng ta sẽ thêm mới 2 document mới vào collection có tên employee (thuộc về CSDL smartJob)

Để xem dữ liệu nằm trong collection employee của CSDL smartJob, gõ lệnh

db.employee.find();

hoặc

db.employee.find().pretty();

phương thức pretty() sẽ giúp nội dung dễ đọc hơn do đã được tự động định dạng

Để cập nhật năm sinh cho nhân viên “Nguyen Thi La”, từ năm 1987 thành 1970, ta sử dụng câu lệnh:

Kiểm tra lại collection employee bằng câu lệnh

db.employee.find().pretty();

để thấy rằng năm sinh của nhân viên “Nguyen Thi La” đã được cập nhật thành 1970.

Đỗ Như Vý – Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Sự khác nhau giữa OpenID Connect và OAuth 2.0

Sự khác nhau giữa OpenID Connect và OAuth 2.0

Bài viết được sự cho phép của tác giả Nguyễn Hữu Khanh

Mình đã giới thiệu với các bạn về OAuth 2.0 và OAuth 2.0 chỉ là một framework liên quan đến Authorization, nghĩa là nó chỉ định nghĩa những resources nào mà một Client Application có thể sử dụng trong access token, để khi request tới Resource Server, Resource Server sẽ căn cứ vào access token để quyết định có cho phép Client Application access tới resource hay là không?

  Authorization Code grant type với Proof Key for Code Exchange (PKCE) trong OAuth 2.1
  Building Microservices Application - Phần 3: Xác thực API bằng Oauth 2.0

Thế nhưng nói về security, các bạn có thể biết, chúng ta còn có cả authentication và OpenID Connect là một extension của OAuth 2.0 được giới thiệu để bổ sung phần authentication này. Sử dụng OpenId Connect thì nội dung của access token mà Client Application sử dụng để request tới Resource Server sẽ bao gồm cả thông tin user đang grant quyền truy cập tới những resources này.

Trong OpenID Connect thì Authorization Server được gọi là Identity Provider. Identity Provider sẽ đảm nhận chức năng authentication và authorization.

Access token được issue bởi một Identity Provider như mình đã nói, sẽ chứa thông tin của authenticated user, những thông tin này gọi là Idenitity Token hay gọi tắt là ID token.

Dưới đây là nội dung của một access token mà mình đã decode sử dụng trang web https://jwt.io/:

{
"exp": 1625973312,
"iat": 1625973012,
"jti": "57e9401f-c98b-43a3-9b5e-eb7bff182a5f",
"iss": "http://localhost:8080/auth/realms/huongdanjava",
"aud": "account",
"sub": "8a5092fa-d815-4620-92ab-4ac87542685c",
"typ": "Bearer",
"azp": "angular-test",
"session_state": "0e044481-02e3-4962-adaa-0683c2c26fbf",
"acr": "1",
"realm_access": {
"roles": [
"offline_access",
"uma_authorization",
"default-roles-huongdanjava"
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "email profile",
"email_verified": false,
"name": "Khanh Nguyen",
"preferred_username": "huongdanjava",
"locale": "en",
"given_name": "Khanh",
"family_name": "Nguyen",
"email": "huongdanjava.com@gmail.com"
}

Phần nội dung phía dưới claim ‘scope’, mà mình đánh dấu trong access token ở trên, chính là nội dung của ID token đó các bạn. Các bạn có thể thấy đây là những thông tin về user đã đăng nhập và grant access cho Client Application. Các bạn có thể xem thông tin những standard claims của ID token tại đây.

Các open source Identity and Access Management hiện nay ví dụ như Keycloak đều hiện thực OpenID Connect luôn chứ không chỉ OAuth 2.0.

Bài viết gốc được đăng tải tại huongdanjava.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Tìm hiểu về tiến trình Superfetch (Sysmain) trên Windows

Tìm hiểu về tiến trình Superfetch (Sysmain) trên Windows

Bài viết được sự cho phép của blogchiasekienthuc.com

Ngoài có sự thay đổi gần như hoàn toàn về giao diện người dùng so với Windows 7 thì Windows 10 cũng nhận được rất nhiều cải tiến về tính năng, hiệu năng và sự ổn định của toàn hệ thống trong suốt quá trình sử dụng và làm việc của người dùng chúng ta.

Nhưng đó là trên những chiếc máy tính với cấu hình tầm trung và có sử dụng ổ cứng SSD, còn với số còn lại, cụ thể là những máy tính cấu hình thấp, sử dụng ổ cứng HHD thì thực sự, Windows 10 đúng là một cơn ác mộng ◔◡◔

  Giải mã bí ẩn "system load" trên Linux
  Giới thiệu về Java Module System

Những chiếc máy tính cũ sử dụng hệ điều hành Windows 7 khi nâng cấp lên Windows 10 thì hiệu năng sẽ bị giảm sút rõ rệt, thường xuyên bị treo, đơ và Full disk 100% trong quá trình sử dụng. Thậm chí tình trạng này còn xảy ra ngay cả khi vừa mới khởi động vào hệ thống.

Để khắc phục được điều này, các bạn phải áp dụng rất nhiều thủ thuật để tối ưu hiệu năng Windows 10, và trên Blog thì admin cũng đã chia sẻ với chúng ta một bài viết rất hay, bạn có thể tham khảo lại tại đây nhé !

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (1)

Nguyên nhân gây ra vấn đề này thì có rất nhiều, nhưng phổ biến và được các bạn biết đến nhiều nhất có lẽ là dịch vụ Superfetch.

Vậy Superfetch là gì? và tại sao nó lại gây ra tình trạng giật lag và treo máy đối với các máy tính đời cũ có sử dụng hệ điều hành Windows 10?

Câu hỏi đó cũng chính là nội dung mà mình muốn chia sẻ với các bạn ngày hôm nay. Vâng, bài viết này chúng ta sẽ cùng tìm hiểu kỹ hơn về tiến trình Superfetch trên hệ điều hành Windows.

#1. Tiến trình Superfetch trên Windows là gì ?

Superfetch thực tế đã xuất hiện từ lâu, mình nhớ không nhầm thì có từ phiên bản Windows Vista nhưng mãi tới phiên bản Windows 10 thì nó mới được chú ý…

Đơn giản vì nó là một trong những nguyên nhân gây ra lỗi Full Disk 100% cho các máy tính sử dụng ổ cứng HDD truyền thống.

Theo như Microsoft, Superfetch có tác dụng duy trì và cải thiện hiệu năng của hệ thống theo thời gian sử dụng nên khó có thể thấy được hiệu năng thực sự của nó trong thực tế.

Thay vào đó, chúng ta thường có thói quen tắt hẳn dịch vụ này đi ngay sau khi cài đặt Windows 10.

Kể từ phiên bản cập nhật Windows 10 version 1803 trở đi, có lẽ tiến trình này bị người dùng tắt nhiều quá nên Superfetch đã được Microsoft đổi tên thành Sysmain để người dùng không tìm thấy Superfetch mà tắt nữa 😛

Bố ông kễnh Microsoft 🙂

Superfetch khi hoạt động sẽ luôn chạy nền (chạy ngầm) trong suốt quá trình bạn sử dụng máy tính và từ từ phân tích dữ liệu sử dụng RAM và các ứng dụng bạn thường xuyên sử dụng nhất.

Qua nhiều lần phân tích, các ứng dụng đó sẽ được phân loại thành “thường xuyên sử dụng” và được ưu tiên tải trước dữ liệu vào bộ nhớ RAM để cải thiện hiệu năng.

Từ đó, mỗi khi bạn khởi động những ứng dụng này, nó sẽ load nhanh hơn rất nhiều vì tất cả dữ liệu cần thiết đã được tải sẵn vào bộ nhớ RAM, mà tốc độ của RAM nhanh cỡ nào thì bạn biết rồi đó 😀

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (2)

Mặc định thì Superfetch sẽ có xu hướng chiếm hết những phần bộ nhớ còn trống mà Windows chưa sử dụng đến để lưu dữ liệu ứng dụng.

Nhưng ngay khi hệ thống cần, chẳng hạn như để tải dữ liệu của ứng dụng khác thì tất cả dung lượng bộ nhớ RAM mà Superfetch đang chiếm sẽ được nó giải phóng ngay nếu cần.

Trên Windows cũng có một tính năng tương tự như Superfetch có tên là Prefetch và có thể coi Superfetch là một sự kế thừa của Prefetch.

Khác biệt là ở chỗ, Prefetch không thực hiện phân tích dữ liệu sử dụng theo thời gian và điều chỉnh các thông số tải trước dữ liệu một cách hợp lý mà thôi.

#2. Superfetch có thực sự cần thiết với PC Windows?

Đa số chúng ta đều sẽ tắt dịch vụ Superfetch đi vì cho rằng nó là nguyên nhân chính gây ra lỗi Full Disk cực kỳ khó chịu cho các máy tính sử dụng ổ cứng HDD. Nhưng trong thực tế, Superfetch thực sự rất hữu dụng đối với quá trình hoạt động của Windows 10.

Và như bạn có thể thấy ở hình bên trên, nếu bạn có một chiếc máy tính với cấu hình tầm trung hay cùi cùi giống mình cũng được, và có sử dụng ổ cứng SSD thì Superfetch hoạt động cực kỳ trơn tru mà đến nỗi bạn cũng chẳng nhận ra sự tồn tại của nó nữa.

Ở trạng thái bình thường, nó chỉ sử dụng 1.1 MB RAM và hầu như không động chạm đến các tài nguyên khác của hệ thống như CPU, ổ cứng, mạng và GPU.

tim-hieu-ve-tien-trinh-he-thong-superfetch-tren-windows (3)

Tuy nhiên, vẫn có một vài vấn đề mà bạn sẽ gặp phải khi Superfetch được kích hoạt trên Windows 10:

1/ Vì Superfetch luôn chạy nền nên thỉnh thoảng nó sẽ ngốn rất nhiều RAM và tài nguyên hệ thống gây giật lag trong quá trình sử dụng, tất nhiên điều này rất ít khi xảy ra với ổ SSD và dung lượng RAM >4GB.

2/ Việc tải trước một lượng lớn dữ liệu ứng dụng từ ổ cứng HDD vào RAM cũng sẽ khiến cho quá trình khởi động bị chậm đi đáng kể, vì tốc độ của ổ HDD rất chậm.

Và đồng thời, đây cũng chính là nguyên nhân gây ra lỗi Full Disk 100% làm cho máy tính bị đơ trong một thời gian ngắn sau khi khởi động xong, vậy nên cách khắc phục mà đa số mọi người chọn lựa sẽ là tắt hẳn Superfetch đi như các bạn đã biết rồi.

3/ Thêm vào đó, nếu bạn đang sử dụng Windows 10 với ổ cứng SSD thì gần như sẽ không nhận thấy được những sự khác biệt về hiệu năng mà Superfetch mang lại, vì tốc độ của SSD đã rất nhanh rồi, việc tải trước dữ liệu là điều không cần thiết nữa.

Ngoài ra, Superfetch cũng có thể gây ra tình trạng giật lag khi chúng ta chiến game, đặc biệt là với các máy tính chỉ có 4GB hoặc ít hơn.

Lý do thì đến hiện tại vẫn chưa được tìm ra vì không phải tất cả chúng đều gặp hiện tượng này, nhưng tình trạng này có liên quan tới các game “ngốn RAM” vì các tựa game này liên tục yêu cầu thêm RAM khiến dịch vụ Superfetch phải tải rồi lại giải phóng dữ liệu khỏi RAM liên tục và liên tục.

Vậy tóm lại, Superfetch có ích như vậy thì tắt nó đi có làm sao không ? Có ảnh hưởng gì không ? Câu trả lời là: Không, sẽ không có ảnh hưởng gì tới Windows 10 của bạn nếu Superfetch bị tắt.

Trong trường hợp máy tính hoạt động trơn tru và không gặp những vấn đề mà mình kể trên thì cứ để như vậy, không cần phải tắt Superfetch đâu nha các bạn.

Nếu bạn vẫn thường xuyên gặp tình trạng Full Disk 100%, chiếm rất nhiều bộ nhớ RAM và hiệu năng tổng thể bị giảm khi chạy các tác vụ cần nhiều RAM thì việc tắt Superfetch sẽ giúp khắc phục được phần nào. Còn không hãy bật lại dịch vụ này trên Windows 10.

#3. Lời kết

Như vậy là mình và các bạn đã vừa tìm hiểu xong về dịch vụ Superfetch hay còn gọi là Sysmain trong các phiên bản cập nhật mới của Windows 10, một dịch vụ hệ thống mà có lẽ đã quá quen thuộc với nhiều bạn trên Blog Chia Sẻ Kiến Thức rồi 🙂

Hy vọng là qua bài viết này các bạn sẽ hiểu hơn về tiến trình Superfetch (Sysmain), cũng như là ý nghĩa thực sự của Superfetch và có nên tắt dịch vụ Superfetch (Sysmain) hay không?

Nếu thấy bài viết này hay và hữu ích thì đừng quên chia sẻ nó để ủng hộ cho Blog nha các bạn. Chúc các bạn thành công !

CTV: Nguyễn Thanh Tùng – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Những điểm mới của Java 8 (phần 4: DateTime API)

Những điểm mới của Java 8 (phần 4: DateTime API)

Bài viết được sự cho phép của smartjob.vn

Trước khi phát hành Java 8, lập trình viên Java phàn nàn nhiều về API xử lý thời gian. Nhiều class, method DateTime API cũ đã được đánh dấu bằng annotation @Deprecated (“Bị phản đối”). Các class, method xử lý thời gian cũ vẫn dùng được (để đảm bảo tính tương thích ngược của JDK) tuy nhiên không khuyến khích sử dụng.

Tuyển dụng Java lương cao cho bạn

  Các trường hợp kiểm thử cho trường nhập Ngày tháng năm (Date field)
  Date & Time trong Python

Trước Java 8, lập trình viên Java xử lý các bài toán thời gian phức tạp, cần sự chính xác thì dùng thư viện nào? Dùng thư viện Joda-time [2]. Hiện nay, với JDK 8 [3], DateTime API mới mang đến sự đơn giản và mạnh mẽ.

Các class mới trong package java.time.*

java.time.Clock: Đồng hồ xử lý thời gian, ngày, giờ có xét đến múi giờ (time-zone)
java.time.Duration: Xử lý dựa trên thời lượng của thời gian (ví dụ: Thời lượng 42.3 giây)
java.time.Instant: Điểm thời gian trên Lịch biểu
LocalDate: Thời gian địa phương (tính theo múi giờ), tuân theo hệ thống lịch quy chuẩn ISO-8601, ví dụ: 2016-02-02
v.v..

Ví dụ minh họa tính linh hoạt, dễ dùng của DateTime API mới

Nguyên nhân gây ra giây nhuận (leap second) là do Trái Đất quay với tốc độ không đều dẫn đến lệch giờ đồng hồ đo chuẩn của con người và giờ tính theo bóng nắng mặt trời. Các nhà khoa học sử dụng “giây nhuận” để đồng bộ và chính xác hóa thời gian ( https://en.wikipedia.org/wiki/Leap_second#Slowing_rotation_of_the_Earth ). Sự chính xác của thời gian là quan trọng, sự cố Y2K (Year 2000) từng xảy ra là do vấn đề thời gian trong các hệ thống máy tính.

Liên kết nhắc đến trong bài viết

[1] https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html
https://blogs.oracle.com/java-platform-group/entry/the_2015_leap_second_s
[2] http://www.joda.org/joda-time/
[3] https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html

Tải về mã nguồn sử dụng trong bài viết: DateTimeAPI
hoặc clone/fork từ Github: https://github.com/SmartJobVN/java8

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Todo List: Tạo bản ghi trong database thông qua Laravel Model

Todo List: Tạo bản ghi trong database thông qua Laravel Model

Bài viết được sự cho phép của tác giả Kien Dang Chung

Có vẻ chúng ta thực hiện hơi ngược quy trình viết code cho ứng dung Todo List, nếu chúng ta thực hiện việc tạo từng bản ghi Todo trước thì không cần đến tạo dữ liệu mẫu cho hiển thị danh sách Todo và chi tiết từng Todo. Bố cục chương trình Khóa học Laravel cơ bản qua ứng dụng Todo List muốn nhắm đến các khái niệm cơ bản về Laravel, do đó theo bố cục này bạn sẽ được học nhiều hơn. Thứ hai, viết code như chúng ta làm từ đầu đến giờ giống với các bước mà người dùng sẽ sử dụng ứng dụng hơn.

  "Làm PM, theo anh không cần biết về code, nhưng phải hiểu về SQL, database, những khái niệm cơ bản của code"
  26 công cụ và kỹ thuật trong Big Data có thể bạn chưa biết

Hiển thị form tạo bản ghi mới trong database

Các bước thực hiện rất đơn giản, nhưng trước khi thực hiện code, bạn hãy cùng tôi đúc kết ra quy trình tạo một chức năng mới trong ứng dụng Todo List. Đa số trong chúng ta đều muốn nhanh chóng đi đến đích, nhưng đó không phải là cách nhanh nhất. Đôi khi dừng lại, đúc kết kinh nghiệm để lần sau khi gặp lại có thể tăng tốc độ gấp đôi, gấp ba mới là cách hiệu quả.

Các bước tạo ra một chức năng mới trong Todo List

  1. URL: Nghĩ ra định dạng đường dẫn đến trang mới (chức năng mới), đăng ký với Laravel Route (routes/web.php).
  2. Xử lý nghiệp vụ: Trong bước đăng ký ở trên, để xử lý đường dẫn này sẽ là một phương thức nào đó trong TodosController. Tạo phương thức này và viết code xử lý nghiệp vụ như tương tác với database, thực hiện một hành động…
  3. Hành động kết thúc: Hành động kết thúc có thể là trả về một view, chuyển hướng đến một trang… Nếu View không tồn tại, chúng ta cần tạo ra view này.

Chúng ta đã áp dụng quy trình 3 bước này với việc tạo ra trang danh sách công việc (view index) và cả với trang thông tin chi tiết công việc (view show). Hôm nay, chúng ta sẽ áp dụng để xây dựng trang tạo ra công việc mới trong database, dự định đường dẫn sẽ là http://localhost:8000/new-todos.

Bước 1: Đăng ký URL vào Route

Mở file routes/web.php thêm vào định nghĩa cho URL mới.

Route::get('new-todos', 'TodosController@create');

Bước 2: Xử lý nghiệp vụ trong Controller

Thực hiện tạo ra phương thức create() trong TodosController (nằm trong thư mục app/Http/Controllers).

public function create()
{

}

Ở tình huống này chúng ta chưa cần xử lý gì nên để trống.

Bước 3: Xây dựng View

Phương thức create() sẽ trả về một View hiển thị form nhập liệu cho công việc cần làm (Todo).

public function create()
{
    return view('todos.create');
}

View ‘todos.create’ chưa có nên thực hiện tạo ra resources/views/todos/create.blade.php:

@extends('layouts.app')

@section('content')
    <h1 class="text-center my-5">Create Todos</h1>

    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card card-default">
                <div class="card-header">Create new todo</div>
                <div class="card-body">
                    <form action="/store-todos" method="POST">
                        @csrf
                        <div class="form-group">
                            <input type="text" class="form-control" placeholder="Name" name="name">
                        </div>
                        <div class="form-group">
                            <textarea name="description" placeholder="Description" cols="5" rows="5" class="form-control"></textarea>
                        </div>
                        <div class="form-group text-center">
                            <button type="submit" class="btn btn-success">Create Todo</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
@endsection

Đầu tiên, thực hiện “kế thừa” bố cục chung ứng dụng bằng câu lệnh @extends(‘layouts.app’). Tiếp theo chúng ta có một form để nhập liệu Todo. Form này có phương thức gửi dữ liệu là POST và gửi về đường dẫn /store-todos (đầy đủ là http://localhost:8000/store-todos). Trong form này có một câu lệnh @csrf, nó để phục vụ cho việc gì, nếu không có nó được không?

CSRF viết tắt của Cross-Site Request Forgery là một dạng tấn công tiềm ẩn nhiều nguy hại. Hacker có thể lợi dụng kiểu tấn công này để thực hiện các hành động trong Form nhập liệu với một người dùng đã xác thực, do vậy để ngăn chặn người ta sử dụng một token (một chuỗi mã) giữa máy chủ và trình duyệt để đảm bảo chỉ có form nhập liệu nào chứa token này mới là do máy chủ web sinh ra và an toàn.

Laravel giúp phòng chống tấn công CSRF dễ dàng, nó tự động sinh ra một token cho mỗi session người dùng và được quản lý bởi ứng dụng. Token này giúp kiểm tra xem người dùng được xác thực và có thể tạo ra các yêu cầu đến ứng dụng. Khi viết code form nhập liệu chúng ta chỉ cần sử dụng câu lệnh Blade @csrf là nó tự động sinh ra trường token cho chúng ta.

Thử thực hiện đường dẫn http://localhost:8000/new-todos trên trình duyệt chúng ta có một form nhập liệu Todo mới.

Màn hình tạo Todo mới

Xử lý dữ liệu từ form nhập liệu

Phần trên đây, chúng ta đã hoàn thành được 1/2 công việc của tạo bản ghi mới, phần còn lại chúng ta cần xử lý dữ liệu gửi từ form và lưu vào CSDL. Vậy tại sao có Quy trình 3 bước tạo một chức năng ở trên, nó sử dụng để tạo ra một chức năng vậy tại sao chưa hoàn thành. Câu trả lời là quy trình này áp dụng cho một chu trình khép kín từ user -> server -> user.

Thật vậy, user thực hiện đường dẫn /news-todos -> server xử lý -> trả về trang (view) tạo todo cho user. Như vậy với 1/2 công việc còn lại chúng ta sẽ lại áp dụng tiếp Quy trình 3 bước.

Bước 1: Đăng ký URL

Form nhập liệu ở phần trên gửi dữ liệu đến đường dẫn /store-todos với phương thức gửi là POST. Việc gửi dữ liệu này cũng bắt nguồn từ user. Chúng ta đăng ký URL này vào routes/web.php:

Route::post('/store-todos', 'TodosController@store');

Do phương thức yêu cầu là POST nên chúng ta sử dụng static function post() trên class Route. Cú pháp bên trong vẫn giống như chúng ta đăng ký URL trước đây.

Bước 2: Xử lý nghiệp vụ trong Controller

Trong TodosController chúng ta sẽ tạo ra phương thức store() với nội dung:

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store()
{
    $data = request()->all();

    $todo = new Todo();
    $todo->name = $data['name'];
    $todo->description = $data['description'];
    $todo->completed = false;

    $todo->save();

    return redirect('/todos');
}

Trong phương thức store ở trên, đầu tiên thực hiện lấy tất cả dữ liệu được gửi đến từ form thông qua Laravel Request với phương thức all(). Tiếp đó, tạo một Model Todo và thiết lập dữ liệu có được từ form nhập liệu, lưu trữ xuống database. Cuối cùng là chuyển hướng người dùng về trang danh sách todos.

Bước 3: Hành động kết thúc

Ở đây sau khi lưu dữ liệu xong chúng ta chuyển hướng người dùng về trang danh sách todos cũng giống như trả về view index, tuy nhiên nếu trả về view chúng ta phải thực hiện thêm việc lấy danh sách view mà công việc này đã làm trong trang danh sách todos do đó chúng ta chuyển hướng về trang này.

Kết luận

Qua bài học hôm nay, chúng ta đã đúc kết được cách tạo một chức năng mới trong ứng dụng thông qua một Quy trình 3 bước. Các bạn hãy thực hiện lại các đoạn code trong bài học để nắm vững và hiểu rõ hơn các khái niệm, hẹn gặp lại trong bài học tiếp theo.

Source code: Bài 11 – Tạo bản ghi trong database

Bài viết gốc được đăng tải tại allaravel.com

Có thể bạn quan tâm:

Xem thêm Việc làm Laravel hấp dẫn trên TopDev

Kiến trúc Model-View-Presenter

kiến trúc Model-View-Controller

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Trong bài viết trước, chúng ta đã khảo sát mô hình kiến trúc Model-View-Controller, Kiến trúc MVP chúng ta sẽ bàn dưới đây cũng dựa trên tư tưởng cơ bản của MVC nhưng với cách tiếp cận khác nhằm mục đích khắc phục các khuyết điểm đã có.

  ASP.NET MVC5 #3: Thêm mới View
  Database migration sử dụng Liquibase với Spring MVC

1. MẪU KIẾN TRÚC DOLPHIN SMALLTALK MODEL-VIEW-PRESENTER

TỔNG QUAN

Mẫu kiến trúc Dolphin Smalltalk Model-View-Presenter chia ứng dụng thành các phần dữ liệu (data), trình bày (presentation) và các xử lý logic thuộc phần trình bày (presentation logic) thành những thành phần riêng biệt.

LỊCH SỬ

Phiên bản Dolphin Smalltalk Model-View-Presenter (gọi tắt là Dolphin MVP) là phiên bản của MVP được xây dựng dựa trên phiên bản Taligent MVP xuất hiện trước đó. Dolphin MVP được xây dựng về cơ bản bên ngoài tương tự như MVC cổ điển nhưng khác nhau ở vai trò của Controller và Presenter.

CẤU TRÚC

CÁC THÀNH PHẦN

Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).

View là thành phần đảm nhận trình bày từ những dữ liệu của Model. View bao gồm những gì thể hiện trên màn hình như các control, form, widget,…

Presenter là thành phần đảm nhận các xử lý về trình bày mà nó cần đến sự tương tác trên dữ liệu.

PHỐI HỢP CÁC THÀNH PHẦN

Trong khi vai trò của Model không thay đổi so với MVC cổ điển. Thành phần View của Dolphin MVP cũng thực hiện việc trình bày từ nội dung của Model và gắn kết với Model thông qua Observer Pattern. Tuy nhiên, nó thực hiện bắt các sự kiện xảy ra ngay bên trong nó. Một vài trường hợp đơn giản như TextView, dữ liệu nhập được xử lý trực tiếp và cập nhật thay đổi trực tiếp vào Model còn hầu hết các trường hợp khác, việc xử lý được chuyển giao cho Presenter đảm trách khi cần thao tác đến Model.

Trong khi View đảm nhận trình bày thì Presenter đảm trách cách Model được thao tác và thay đổi như thế nào bởi giao diện người dùng. Presenter là nơi chứa các xử lý đặc trưng của ứng dụng (application logic so với business logic của Model). Một điểm đáng chú ý khác là Presenter có khả năng thao tác trực tiếp lên View mà nó gắn kết, điều này khác biệt với phiên bản Taligent MVP xuất hiện trước đó.

SO SÁNH DOLPHIN MVP VÀ MVC CỔ ĐIỂN

Điểm khác biệt cơ bản của Dolphin MVP và MVC cổ điển là sự khác nhau về vai trò của Presenter và Controller, nó cũng dẫn đến sự khác nhau về vai trò giữa hai thành phần View. Trong Dolphin MVP, sự hiện diện của Controller bị loại bỏ, thay vào đó, việc xử lý các dữ liệu input được View đảm nhận và được chuyển cho Presenter khi có yêu cầu tương tác đến Model.

MẪU KIẾN TRÚC MVP CỦA MARTIN FOWLER

TÓM TẮT

Martin Fowler là một trong những người đâu tiên đi sâu và nghiên cứu về các phiên bản của MVP. Vào năm 2006, Fowler tuyên bố sự kết thúc của các kiến trúc MVP cổ điển và tự chia MVP thành hai phiên bản mới là Passive View và Supervising Controller.

Martin Fowler dùng thuật ngữ Controller thay vì Presenter trong mẫu của mình

Trong mẫu Passive View, thành phần View được loại bỏ hoàn toàn các xử lý logic và tương tác đến Model. Thay vì vậy, nó chuyển giao các xử lý cho Controller đảm trách. Controller đảm nhận tương tác đến Model và cập nhật View khi có thay đổi từ Model. Controller là thành phần trung gian liên lạc giữa View và Model.

Trong mẫu Supervising Controller, View đầu tiên bắt lấy các sự kiện và sau đó chuyển giao cho controller xử lý. Để cập nhật thay đổi từ Model, View dùng data-binding và Observer pattern cho các xử lý đơn giản còn đối với các xử lý phức tạp sẽ nhờ đến Controller đảm nhận.

So với Supervising Controller chứa View đảm nhận xử lý sự kiện đơn giản thì với Passive View, thành phần View được tách rời hoàn toàn khỏi các xử lý, kể cả các xử lý cơ bản ở mức giao diện cũng được giao hoàn toàn cho Presenter xử lý. Điều này tạo thuận lợi hơn cho việc testing vì khi đó các thành phần Model và Presenter có thể được kiểm tra một cách độc lập mà không phụ thuộc vào giao diện. Phiên bản MVP của Microsoft đầu tiên được xây dựng dựa trên Passive View sau đó mẫu Supervising Controller cũng được hỗ trợ với một số điều chỉnh.

PHIÊN BẢN MVP CỦA MICROSOFT

LỊCH SỬ

Khởi đầu từ các framework Smart Client Software Factory and Web Client Software Factory dựa trên kiến trúc MVP được các nhóm nghiên cứu về pattern của Microsoft tạo ra từ năm 2006, Microsoft sau đó bắt đầu đưa MVP vào các tài liệu hướng dẫn và ví dụ về lập trình giao diện trong .NET framework. Mô tả dưới đây dựa trên phiên bản MVP được mô tả trong tạp chí MSDN vào năm 2006 (tham khảo 2) và có thể xem là kiến trúc cơ bản cho các framework trên. Ngoài ra, còn có một số framework MVP khác cũng được phát triển trên nền tảng .NET như MVC# hay NMVP.

Xin lưu ý là phiên bản cũ của Web Client Software Factory ban đầu được tổ chức dựa trên Passive View (cấu trúc bên dưới) nhưng với phiên bản hiện tại thì cấu trúc dựa trên Supervising Controller cũng được hỗ trợ.

CẤU TRÚC

CÁC THÀNH PHẦN

Model chứa dữ liệu và các tính toán xử lý logic để giải quyết vấn đề mà phần mềm hướng tới (business logic).

View là thành phần đảm nhận trình bày từ những dữ liệu của Model và là tổng hợp của các form, control được sử dụng.

Presenter là thành phần đảm nhận các xử lý về trình bày cũng như tương tác đến dữ liệu bên dưới và có thể tương tác để thay đổi View trong quá trình xử lý.

PHỐI HỢP CÁC THÀNH PHẦN

Mẫu kiến trúc MVP của Microsoft tương tự như Passive View nhưng nó bổ sung thêm ràng buộc là các Presenter chỉ có thể truy cập đến View thông qua các interface IView. Điều này giúp Presenter không phụ thuộc đến cài đặt cụ thể của View và có thể dễ dàng test Presenter một cách độc lập. Điều này đạt được do sử dụng IView, chúng ta có thể dùng kĩ thuật “Mock” để thay thế các xử lý cụ thể của View khi test Presenter. Ngoài ra, mối quan hệ giữa Presenter và Model là quan hệ một chiều (chiều còn lại là gián tiếp). Hệ quả của các liên kết là chúng ta có một mô hình đa lớp (multi-layer) như cấu trúc ở trên theo ý nghĩa các thành phần ở một layer chỉ phụ thuộc và sử dụng các thành phần ở layer ngay bên dưới nó.

Theo mẫu Microsoft MVP, khi một View gắn liền với một interface IView. Khi View được tạo ra, nó tạo ra một đối tượng private Presenter và gắn nó vào đối tượng này thông qua IView. Khi một sự kiện xảy ra, View bắt lấy và sau đó kích hoạt một phương thức của Presenter mà sau đó, nó có thể tương tác với Model. Một số sự kiện như bắt đầu hiển thị và đóng của View cũng được gửi tới để Presenter kích hoạt một số phương thức tương ứng, điều này giúp cho một số công việc như khởi tạo và giải phóng dữ liệu cho View được dễ dàng hơn.

Model theo Microsoft MVP cũng thường được tổ chức bổ sung một lớp Service nằm bên trên để tương tác với Presenter, qua đó giảm bớt sự phụ thuộc đến các xử lý data nằm sâu bên dưới. Ngoài ra, để điều khiển việc liên lạc giữa các View hay các Presenter, một thành phần thường được bổ sung gọi là Application Controller. Trong một ứng dụng có thể có nhiều Application Controller để quản lý các nhóm MVP. Ngoài ra, thay vì sử dụng Presenter để tương tác với Model, một cách là giao tất cả các thao tác này cho Application Controller đảm trách.

MỘT VÍ DỤ MINH HỌA ĐƠN GIẢN

Để minh họa mẫu Microsoft MVP, chúng ta sẽ cùng khảo sát một ví dụ đơn giản: tạo một form hiển thị danh sách sinh viên cùng chức năng thêm mới trên danh sách sinh viên đó. Với mục tiêu là minh họa cách tổ chức và liên kết giữa các thành phần là chủ yếu, chúng ta không đi sâu vào cài đặt cụ thể (bạn có thể tham khảo source code đi kèm bài viết, source code được tổ chức ở dạng project của VS 2008).

Ứng dụng được tổ chức thành 5 project: View, Presenter, DataService, Model và DataTransferObject. Trong đó, View là application còn các project khác là library. Các project phụ thuộc lẫn nhau theo thứ tự project phía trước sử dụng trực tiếp project phía sau, ngoại trừ DataTransferObject chức các loại dữ liệu được dùng chung cho 3 project View, Preseneter và DataService. Model là project chứa các tương tác trực tiếp đến dữ liệu và không phụ thuộc vào bất cứ thành phần nào khác.

GIẢI THÍCH CÁC PROJECT:

  • Model: chứa dữ liệu giả lập (StudentData.xml), schema (StudentDataSet.xsd) và lớp tiện ích được xây dựng bên trên (DataAccess.cs).
  • DataTransferObject: chứa đối tượng dữ liệu được dùng chung cho các project ở mức cao hơn (Student.cs).
  • DataService: được xây dựng bên trên Model, chuyển đổi dữ liệu từ Model sang DataTransferObject và xây dựng các tiện ích bên trên đối tượng transfer này (Service.cs).
  • Presenter: chứa interface của View dùng cho Presenter truy cập (IViewForm) và lớp Presenter (StudentPresenter).
  • View: chứa form view (ViewForm.cs) và Program.cs.

Trong bài viết khác, chúng ta sẽ tìm hiểu phương pháp TDD (Test-driven development) và ứng dụng nó để phát triển ứng dụng theo mẫu Microsoft MVP trong môi trường .NET.

TÀI LIỆU THAM KHẢO:

  1. Martin Fowler, GUI Architectures
  2. Jean-Paul Boodhoo , Design Patterns: Model-View-Presenter
  3. Buschmann F., Meunier R., Rohnert H. & Sommerlad P. & Stal M. (1996). Pattern-Oriented Software Architecture: A System of Patterns.
  4. Martin Fowler , Patterns of Enterprise Application Architecture.
  5. http://en.wikipedia.org/wiki/Model_View_Presenter
  6. http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
  7. Derek Greer, Interactive application architecture patterns
  8. Views Testability Guidance
  9. Dolphin MVP paper

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

http://aptech.fpt.edu.vn/chitiet.php?id=2631

Tổng hợp bởi edwardthienhoang

Bài viết gốc được đăng tải tại edwardthienhoang.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Làm Gì Để Vượt Qua Khủng Hoảng Sau Khi Trượt Phỏng Vấn?

làm gì khi trượt phỏng vấn
Làm Gì Để Vượt Qua Khủng Hoảng Sau Khi Trượt Phỏng Vấn?

Trượt phỏng vấn là câu chuyện không của riêng ai. Mỗi người có thể trượt phỏng vấn vì nhiều lý do khác nhau, tuy nhiên đa số mọi người sẽ cảm thấy thất vọng hoặc buồn bã về bản thân, nhất là với những bạn sinh viên mới ra trường chưa có nhiều kinh nghiệm. Bài viết này sẽ giúp bạn tìm được hướng đi đúng đắn và hợp lí hơn cho bản thân với việc nên làm gì khi trượt phỏng vấn.

làm gì khi trượt phỏng vấn
Nên làm gì để vượt qua khủng hoảng sau nhiều lần trượt phỏng vấn?

Đối diện với cảm giác thất vọng và tìm cách vượt qua

Thất vọng chắc chắn là cảm xúc biểu hiện rõ ràng nhất sau khi bạn nhận được kết quả trượt phỏng vấn. Rất nhiều suy nghĩ hiện ra trong đầu rằng bản thân vẫn còn quá kém cỏi, năng lực chuyên môn mình vẫn chưa đủ cứng, đâu là thiếu sót khiến mình không thể thông qua buổi phỏng vấn,… Nhiều câu hỏi được đặt ra một cách liên tiếp để chứng minh cho việc bạn đang lo lắng và thiếu niềm tin vào bản thân.

Nhưng trượt phỏng vấn không hề chứng minh được bất kỳ điều gì về năng lực bản thân của bạn cả. Nó chỉ đơn thuần là những gì bạn có thể đáp ứng vẫn chưa phù hợp với yêu cầu của công ty mà thôi. Do đó, hãy thật bình tĩnh và tìm cách vượt qua chính mình. Hoang mang hay lo lắng sẽ chỉ khiến bạn mất phương hướng hơn.

Trước khi bắt tay vào tìm kiếm một công việc mới, bạn hãy cho bản thân được thư giãn và nghỉ ngơi nhiều hơn một chút. Bạn có thể dành thời gian làm những gì mình thích để thư giãn tinh thần trước khi tìm kiếm cho mình một cơ hội mới, như vậy chắc chắn về mặt tâm lý bạn sẽ làm tốt hơn rất nhiều. Đây chính là câu trả lời chính xác cho vấn đề nên làm gì sau khi trượt phỏng vấn.

Xem thêm Nguyên Tắc 4 KHÔNG Khi Xin Việc Ai Cũng Cần Nhớ

Đánh giá lại toàn bộ những vấn đề mình đang gặp phải

Trước khi bắt tay vào tìm kiếm một công việc mới, tốt hơn hết bạn nên dành thời gian để đánh giá lại một cách tổng quan về những gì mà đã làm được và chưa làm được trong hành trình tìm việc vừa rồi. Hãy nhìn nhận một cách thẳng thắn về những gì mình vẫn chưa làm được và nên khắc phục nó như thế nào.

làm gì khi trượt phỏng vấn

Để có thể đánh giá một cách tốt nhất và có sự cải thiện cho sau này, bạn có thể tham khảo ý kiến từ những người xung quanh hoặc những người làm trong ngành nhân sự mà bạn quen biết. Người khác sẽ cho bạn cái nhìn khách quan về năng lực bản thân. Đặc biệt với những ai làm trong lĩnh vực nhân sự, vì họ thường xuyên làm việc với các ứng viên nên có thể dễ dàng trong việc giúp bạn tìm ra và cải thiện những vấn đề mình chưa làm tốt. Ý kiến của người khác thì luôn khách quan hơn chính vì thế đừng ngần ngại đặt câu hỏi để giúp bản thân trở nên tốt hơn bạn nhé!

  6 Điều Cần Tránh Khi Phỏng Vấn Để Tăng Cơ Hội Thành Công
  NÊN & KHÔNG NÊN Để Đàm Phán Lương Thành Công Khi Phỏng Vấn

Tìm kiếm những cơ hội mới cho bản thân

Sau khi đã cho bản thân khoảng thời gian thư giãn thoải mái về đầu óc cũng như tìm ra được điểm yếu và điểm mạnh của bản thân, bạn hãy tập trung dành thời gian để tìm kiếm những công việc mới. Công việc không bao giờ là khan hiếm trên thị trường cả, điều quan trọng là bạn có biết tận dụng đúng thời cơ và dành hết sức mình cho cho một công việc, một vị trí mới hay không.

Xem thêm các việc làm IoT Development lương cao tại TopDev

Bên cạnh đó, hãy đọc kỹ các mô tả công việc được đăng tuyển để xem mình có thể đáp ứng được bao nhiêu phần trăm khả năng trong số đó. Tốt hơn hết là từ 70% trở lên, nếu thấp hơn mức này bạn có thể thấy rằng bản thân chưa phù hợp với định hướng của công ty nên tốt hơn hết là không nên ứng tuyển. Việc không đạt kỳ phỏng vấn phần nhiều cũng là do mục tiêu của công ty và của ứng viên chưa thật sự tương xứng với nhau.

Đừng bao giờ cảm thấy khó khăn hay chán nản sau khi trượt phỏng vấn, vì biết đâu được bạn sẽ tìm được những cơ hội mới tốt đẹp hơn so với vị trí mà mình đã từng ứng tuyển. Hãy luôn giữ một tinh thần mạnh mẽ và lạc quan để tìm kiếm cho mình những cơ hội, những công việc mới mà bản thân thật sự cảm thấy yêu thích và phù hợp. Khi một cánh cửa đóng lại sẽ có cánh cửa khác mở ra, hãy tỉnh táo để nắm giữ “cánh cửa” mới này cho mình bạn nhé.

Có thể bạn quan tâm:

Xem thêm Việc làm UX/UI Design hấp dẫn trên TopDev

Todo List: Xây dựng bố cục chung của ứng dụng với file Layout

Todo List: Xây dựng bố cục chung của ứng dụng với file Layout

Bài viết được sự cho phép của tác giả Kien Dang Chung

Video trong bài viết

Ứng dụng Todo List của chúng ta đã có hai trang, một trang danh sách các công việc và một trang chi tiết cho công việc cụ thể. Hai trang này tương ứng với hai view là index.blade.php và show.blade.php nằm trong thư mục resources/views/todos. (Bạn nào chưa có source thì tải về nhé, source của bài trước ở đây). Nếu các bạn để ý trong hai file view này có rất nhiều đoạn code giống nhau, vậy làm thế nào chúng ta mô đun hóa và sử dụng lại các đoạn code chung này?

  Các loại layout trong Android (RelativeLayout, LinearLayout)
  Hướng dẫn sử dụng Framelayout trong android

Tại sao cần xây dựng bố cục ứng dụng chung?

Các website hiện nay thường có rất nhiều trang và có một vài bố cục chung. Ví dụ, như trang All Laravel mà bạn đang xem, ở bất kỳ trang nào chúng ta cũng thấy có 2 phần chung:

  • Header bao gồm logo, menu, phần các bài viết phổ biến.
  • Sidebar: bao gồm công cụ tìm kiếm, các thẻ, bài viết phổ biến.
  • Footer: Thông tin liên hệ, đăng ký nhận tin bài.

Bố cục chung ứng dụng

Bố cục ứng dụng chung có những ưu điểm như sau:

  • Những phần chung này sẽ được mô đun hóa đưa ra một file riêng gọi là file layout (bố cục chung). Các file muốn có bố cục này chỉ cần “kế thừa” lại layout này.
  • Khi cần thay đổi nội dung chung, chúng ta không cần thay đổi tất cả các trang mà chỉ cần thay đổi trong phần bố cục chung. Ví dụ, khi thay đổi Logo mới chẳng hạn, chúng ta chỉ cần vào file layout thay đổi và nó sẽ áp dụng cho tất cả các trang kế thừa bố cục này.

Xây dựng bố cục với Laravel Blade

Laravel Blade cho phép xây dựng file layout và các view sẽ kế thừa lại layout này. Quay lại hai view index và show trong ứng dụng Todo List, chúng ta thấy có rất nhiều phần chung, chúng ta tạo file chứa bố cục này resources/views/layouts/app.blade.php (đặt tên thế nào cũng được miễn là tên diễn giải được ý nghĩa).

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
        <title>
            @yield('title')
        </title>
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

Trong file này chúng ta thấy có một số code trông khá lạ như sau:

  • yield(‘title’)
  • yield(‘content’)

Diễn giải code, chúng ta thấy có tiêu đề các trang khác nhau (phần title) và phần nội dung trang (phần content) khác nhau do vậy, yield(‘title’) và yield(‘content’) chính là nơi hiển thị các phần khác nhau đó.

Mẹo: Tất cả các phần có nội dung thay đổi được đưa vào một phần riêng với lệnh yield(‘ten_vung_chung’).

Khi đó ở các trang (view) cần “kế thừa” bố cục này, chúng ta sẽ sử dụng câu lệnh extends. Cấu trúc lại code resources/views/todos/index.blade.php:

@extends('layouts.app')

@section('title')
    Todos List
@endsection

@section('content')
    <h1 class="text-center my-5">TODOS PAGE</h1>
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card card-default">
                <div class="card-header">
                    Todos
                </div>

                <div class="card-body">
                    <ul class="list-group">
                        @foreach($todos as $todo)
                            <li class="list-group-item">
                                {{ $todo->name }}

                                <a href="/todos/{{ $todo->id }}" class="btn btn-primary btn-sm float-right mr-2">View</a>
                            </li>
                        @endforeach
                    </ul>
                </div>
            </div>
        </div>
    </div>
@endsection

Và với resources/views/todos/show.blade.php:

@extends('layouts.app')

@section('title')
    Single Todo: {{ $todo->name }}
@endsection

@section('content')
    <h1 class="text-center my-5">
        {{ $todo->name }}
    </h1>

    <div class="row justify-content-center">
        <div class="col-md-6">
            <div class="card card-default">
                <div class="card-header">
                    Details
                </div>

                <div class="card-body">
                    {{ $todo->description }}
                </div>
            </div>
        </div>
    </div>
@endsection

Trong hai view này, để kế thừa bố cục chung ứng dụng chúng ta dùng câu lệnh extends(‘ten_bo_cuc’), chú ý là một ứng dụng có thể có nhiều bố cục chung khác nhau. Tên bố cục chứa cả đường dẫn đến file bố cục và phân cách bởi dấu chấm, ví dụ ở đây là layouts.app tức là file app.blade.php trong thư mục layouts với thư mục mặc định là resources/views.

Tiếp đến, các phần nội dung khác nhau được định nghĩa bằng câu lệnh yield ở trong layout sẽ được sử dụng trong view và nằm giữa @section(ten_vung_dinh_nghia_trong_yield) và @endsection.

Quay lại ứng dụng và kiểm tra các trang, bạn sẽ thấy ứng dụng khi thay đổi này không khác gì so với ứng dụng của bài học trước (bài số 9). Tại sao phải thực hiện những công việc ở trên?

Trở lại với câu hỏi ở phần trước, tại sao chúng ta lại đưa toàn bộ phần code chung ra file layouts/app.blade.php? Ứng dụng hoạt động trên các trang index và show đã rất ok, tuy nhiên chúng ta cần một menu chung cho toàn bộ ứng dụng để có thể chuyển hướng nhanh chóng đến một trang nào đó. Nếu như chưa có layouts/app.blade.php chúng ta sẽ phải đến từng trang (view) cụ thể và thêm menu vào, thật là mất nhiều công sức, chưa kể là mỗi khi cần thay đổi, chúng ta lại mất nhiều công sức hơn nữa và rất dễ bỏ sót những vị trí cần thay đổi.

Công việc dễ dàng hơn nhiều với file bố cục chung, chúng ta chỉ việc thêm menu vào file layouts/app.blade.php và các view kế thừa lại bố cục này sẽ tự động có thanh menu. Nội dung layouts/app.blade.php sẽ thay đổi như sau:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
        <title>
            @yield('title')
        </title>
    </head>
    <body>
        <nav class="navbar navbar-expand-lg navbar-light bg-light">
            <a class="navbar-brand" href="/">Todos App</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>

            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav mr-auto">
                    <li class="nav-item active">
                        <a class="nav-link" href="/todos">todos <span class="sr-only">(current)</span></a>
                    </li>
                    <li class="nav-item active">
                        <a class="nav-link" href="/new-todos">Create todos <span class="sr-only">(current)</span></a>
                    </li>
                </ul>
            </div>
        </nav>
        <div class="container">
        @yield('content')
        </div>
    </body>
</html>

Không cần thay đổi gì hai index và show trong thư mục view resources/views/todos nhưng khi chạy ứng dụng bạn thấy đấy chúng ta đã có menu cho cả hai view này.

Thêm menu vào bố cục ứng dụng

Bài viết gốc được đăng tải tại allaravel.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Cách sửa lỗi The DNS Server isn’t Responding trên Windows [OK]

Cách sửa lỗi The DNS Server isn’t Responding trên Windows [OK]

Bài viết được sự cho phép của blogchiasekienthuc.com

DNS là một trong những thành phần rất quan trọng của mạng Internet. Và nếu như bạn đã từng loay hoay với việc truy cập vào Facebook khi bị chặn thì chắc chắn bạn đã tìm hiểu qua về DNS rồi đúng không.

Và trong quá trình sử dụng máy tính, không biết các bạn thế nào chứ mình thì đôi khi gặp phải lỗi DNS Server is not responding khiến mình không tài nào kết nối vào Internet được.

Vậy nên trong bài viết này mình sẽ tổng hợp lại những cách hiệu quả nhất để khắc phục thành công lỗi DNS Server is not responding khó chịu này nha.

  DNS là gì? Tại sao chúng ta lại bị nhà mạng chặn khi vào web không lành mạnh?
  System Design Cơ Bản: Domain Name System (DNS)

Khi bị lỗi chấm than vàng ở biểu tượng mạng Internet thì mình thường sử dụng công cụ Troubeshoot problems để khắc phục một số lỗi liên quan đến Interent.

Đây là một trong số những công cụ Fix lỗi có sẵn trên hệ điều hành Windows, nó thường tỏ ra khá hiệu quả trong nhiều trường hơp. Nhưng không phải lúc nào cũng thuận tiện như thế.

khac-phuc-loi-dns

Xui xui cho bạn thì sẽ xuất hiện lỗi DNS như hình bên dưới đây 🙂

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (1)

#1. Khởi động lại máy tính

Đối với mình, điều đầu tiên mà mình làm nếu có bất kì lỗi nào xảy ra với hệ điều hành Windows đó là khởi động lại máy.

Nghe thì có vẻ hơi nhạt, hơi vô lí nhưng đôi khi nó lại có tác dụng không tưởng đó các bạn. Chính vì vậy, bạn cứ khởi động lại máy tính đó trước khi thực hiện các bước tiếp theo nhé.

Đừng đùa với cách làm này nhé, các lỗi thường gặp như máy tự tự nhiên bị mất âm thanh, không chạy được phần mềm, máy tính tự nhiên giật lag lạ thường, máy in tự nhiên không in được… thì khởi động lại sẽ là phương án khá là hay đấy 🙂

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (2)

#2. Thay đổi DNS Server

+ Bước 1: Mở hộp thoại Run bằng cách bấm tở hợp phím Windows + R => sau đó nhập ncpa.cpl => và nhấn Enter.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (3)

+ Bước 2: Sau đó bạn tìm đến đúng kết nối mạng Internet mà bạn đang dùng. Ví dụ như của mình ở đây là mạng Wi-Fi đó (có cột sóng ở bên dưới icon Computer).

=> Sau đó bạn nhấn chuột phải vào mang đó => và chọn Properties.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (4)

+ Bước 3: Sau đó bạn nháy đúp chuột vào phần Internet Protocol Version 4 (TCP/IPv4) để chúng ta vào phần thiết lập.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (5)

+ Bước 4: Bây giờ bạn tick chọn Use the following DNS Server addresses. Tiếp theo bạn có thể chỉnh các DNS sau:

  • 8.8.8.8 / 8.8.4.4

Hoặc:

  • 208.67.222.222 / 208.67.220.220

TIPs: Ngoài ra thì bạn có thể sử dụng dãy DNS tứ quý 1 của CloudFlare hoặc nhiều dãy DNS khác trong bài viết này nhé: Tăng tốc độ internet với dãy DNS tứ quý một của CloudFlare (1.1.1.1)

+ Bước 5: Sau khi đã xong xuôi hết thì bạn bấm OK => Cuối cùng bạn tắt mạng đi và bật lại để thử nha.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (6)

NOTE: Để tìm hiểu thêm về phần thiết lập này thì bạn có thể tham khảo thêm bài viết này, chắc chắn nó sẽ rất hữu ích cho bạn!

#3. Cài đặt lại Driver mạng

Lưu ý: Tải Driver mạng trước khi cài đặt lại nha các bạn. Mình đề xuất với các bạn sử dụng phần mềm 3DP NET, một phần mềm có thể cân được mọi thể loại máy tính hiện nay

Nhưng tất nhiên là bạn hãy thử qua phương pháp bên dưới đã, nếu vẫn không đường thì mới dùng đến tuyệt chiêu cuối 3DP NET nhé !

+ Bước 1: Bạn nhấn tổ hợp phím Windows + X => sau đó bấm chọn Device Manager => Bạn bấm vào Network Adapters.

Một cách mở Device Manager khác là nhấn chuột phải vào This PC => chọn Manage => sau đó chọn Device Manager

Tiếp theo, bạn nháy đúp chuột vào adapter mạng đang sử dụng, ví dụ như của mình ở đây đang sử dụng mạng Wi-Fi thì nó là Intel(R) Dual Band Wireless-AC 8230

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (7)

+ Bước 2:  Sau đó bạn chuyển qua tab Driver như hình bên dưới.

+ Bước 3: Tiếp theo bạn bấm vào Uninstall Device, nhớ tick vào Delete the driver software for this device => bấm Uninstall để thực hiện gỡ bỏ Driver hiện tại.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (9)

Hoặc bạn có thể làm theo cách nhanh hơn đó là nhấn chuột phải vào mạng bạn đang sử dụng => và chọn Uninstall device (hình ảnh bổ sung bởi Admin):

sua-loi-dns-tren-windows

+ Bước 4: Sau đó bạn nhấn chuột phải lại vào kết nối mạng như hình bên trên => sau đó chọn Scan for hardware changes để máy tính cài đặt lại Driver.

Hoặc là bạn có thẻ khởi động lại máy tính cũng được, lúc này ta có hai trường hợp sau:

  • Nếu máy tính vào mạng bình thường thì bạn thành công rồi đó.
  • Nếu máy tính vẫn bị lỗi trên hoặc không nhận Driver thì bạn tải lại Driver mới. Để tải Driver chuẩn nhất theo đúng hãng máy tính của bạn thì bạn xem bài viết này, còn nếu không có nhiều kinh nghiệm thì cứ dùng 3DP NET nha các bạn.

#4. Tắt tường lửa và phần mềm diệt virus

Tường lửa và phần mềm diệt virus đều là bức tường thành bảo vệ máy tính của bạn.

Nhưng đôi khi chính nó lại gây ảnh hưởng đến Internet của bạn. Chính vì vậy, hãy thử tắt tường lửa và phần mềm diệt virus, có thể sẽ tạm thời sửa được lỗi DNS Server is not responding gây khó chịu này đó.

#5. Sử dụng lệnh netsh trong CMD

+ Bước 1: Bạn hãy mở Command Prompt bằng quyền Admin, sau đó bạn nhập vào các lệnh sau (sau mỗi lệnh bạn nhấn Enter nhé):

netsh int ip reset

netsh winsock reset

ipconfig /flushdns

ipconfig /renew

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (10)

+ Bước 2: Cuối cùng bạn khởi động lại máy để áp dụng thay đổi nha.

#6. Khởi động máy tính ở chế độ Safe Mode

Safe Mode giúp bạn khởi động máy tính với các phần mềm và trình điều khiển (Driver) cơ bản nhất. Đôi khi lỗi DNS này xảy ra do phần mềm hoặc trình điều khiển của một phần cứng nào đó xung đột với nhau.

+ Bước 1: Để truy cập vào chế độ Safe Mode của máy tính thì bạn bấm phím Windows trên bàn phím (cạnh phím ALT) => sau đó bấm vào nút Power, giữ phím Shift => và bấm Restart.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (11)

+ Bước 2: Bạn bấm chọn Troubleshoot.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (12)

+ Bước 3: Tiếp theo bạn chọn Advanced options.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (13)

+ Bước 4: Sau đó bạn bấm chọn Startup Settings => và bấm Restart.

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (14)

Tiếp theo bạn bấm 5 hoặc F5 để vào chế độ Safe Mode with Networking (đây là chế độ Safe Mode có Internet).

sua-loi-the-dns-server-isnt-responding-tren-windows-10 (15)

Nếu mạng bình thường trong chế độ này thì đương nhiên là do phần mềm của máy tính gây ra lỗi DNS rồi. Bây giờ bạn chỉ việc tìm phần mềm gây ra lỗi và gỡ cài đặt thôi.

Ngoài cách truy cập vào Safe Mode để kiểm tra máy tính có mạng hay không thì nếu bạn có sẵn một chiếc USB BOOT thì bạn cũng có thể truy cập vào Mini Windows để kiểm tra một cách dễ dàng.

Mà mình đề xuất với bạn bản NHV BOOT, bạn có thể tạo sẵn một chiếc USB BOOT cứu hộ chuyên nghiệp để sử dụng khi cần nhé 🙂

#7. Khởi động lại Moderm hoặc Router 

Nếu tất cả các thiết bị kết nối với Moderm đều bị lỗi như trên thì nguyên nhân là do Moderm hoặc nhà cung cấp mạng của bạn đang có vấn đề.

Đầu tiên thì bạn hãy ra đằng sau Moderm, tìm nút Restart để khởi động lại. Hoặc không thì bạn có thể rút dây nguồn ra khoảng 10s sau đó cắm lại. Sau đó kiểm tra lại nhé !

#8. Reset lại Modem hoặc Router mà bạn đang kết nối

Nếu những cách bên trên không có tác dụng thì bạn có thể thử Reset Modem. Cách làm này thì hơi nâng cao một chút, bạn phải có một chút kiến thức về kỹ thuật thì mới có thể làm được.

Bạn có thể tham khảo bài viết này: Hướng dẫn cách cấu hình modem Wifi TP-Link chi tiết nhất

Tuy nhiên mình nói trước, hiện giờ việc cấu hình Modem đã khác khá nhiều rồi, vì nhiều dòng Modem đời mới nên giao diện khác khá nhiều.

Vậy nên, nêu bạn không am hiểu thì nên chuyển ngay sang bước số #9 bên dưới đây 🙂

#9. Liên hệ CSKH của nhà cung cấp dịch vụ

Đây chính là cách cuối cùng nếu như tất cả các cách trên đều không có tác dụng hoặc không triệt để. Bạn hãy liên hệ đến CSKH của nhà cung cấp dịch vụ để họ có thể sử được triệt để lỗi này cho bạn.

  • Viettel: Tổng đài hỗ trợ là 1800 8168
  • VNPT: Tổng đài hỗ trợ là 1800 1166
  • FPT: Tổng đài hỗ trợ là 1900 6600 hoặc 1800 6000

Nhà mạng sẽ có trách nhiệm Fix lỗi đường truyền giúp bạn, bạn nộp tiền mạng hàng tháng nên được quyền lợi này nhé. Nhưng tất nhiên đó là trong trường hợp bạn là người đứng ra đăng ký dịch vụ Internet.

Vào bài viết này để thảo luận thêm về chất lượng dịch vụ các nhà mạng nha các bạn: Nên lắp cáp quang của nhà mạng nào? Viettel, FPT hay VNPT?

#10. Một vài Tips nhỏ khác để xác định và khắc phục lỗi DNS Server này

Bạn hãy thử sử dụng một trình duyệt web khác xem sao.

Nếu máy tính bạn đang sử dụng mạng Wi-Fi để kết nối thì giờ thử chuyển sang mạng dây để kết nối xem có được không, hoặc ngược lại, nếu đang dùng mạng dây thì chuyển thử sang Wi-Fi.

Nếu đang sử dụng địa chỉ IP động thì giờ chuyển sang dùng địa chỉ IP tĩnh, hoặc ngược lại xem sao nhé các bạn: Cách đổi địa chỉ IP máy tính (cách sử dụng IP động và tĩnh) đơn giản nhất

#11. Lời kết

Trên đây là toàn bộ những cách và những bước để sửa lỗi The DNS Server isn’t responding trong quá trình sử dụng máy tính.

Bạn đã bao giờ gặp phải lỗi như thế này chưa? và nếu đã gặp thì bạn đã sửa nó như thếnào? Hãy chia sẻ lại cách làm của bạn để am em cùng học hỏi thêm nhé.

Chúc các bạn thành công, và mong mọi người hãy comment để ủng hộ bài viết của mình [đây là một trong những bài viết đầu tiên của mình trên Blog :)], có như vậy mình mới hoàn thiện hơn ở các bài viết sau nha. Thank you !

CTV: Hoàng Tuấn – Bài viết gốc tại blogchiasekienthuc.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Domain-Driven Design

Domain-Drive Design

Bài viết được sự cho phép của tác giả Edward Thien Hoang

Tôi đã có một bài viết về Domain Drive Development (DDD) – First thought để “đặt vấn đề” cho DDD, các bạn có thể tham khảo ở đó trước. Trong phạm vi bài viết này, tôi sẽ tham khảo và diễn đạt lại từ bài viết Domain-Drive Design của tác giả herbertograca.

Domain-Drive Design do Eric Evans tạo ra trong cuốn sách nổi tiếng của ông về Domain-Driven Design: Tackling Complexity in the Heart of Software, xuất bản năm 2003. Cuốn sách của Eric Evans là chìa khóa chính thức hóa nhiều khái niệm phát triển phần mềm hiện nay.

  Cách thiết lập một dự án Symfony để làm việc với Docker Subdomains
  System Design Cơ Bản: Domain Name System (DNS)

Tôi không thể đưa ra một đánh giá toàn diện về DDD trong một bài viết trên blog. Có quá nhiều khái niệm quan trọng liên quan đến DDD. May mắn thay, đó cũng không phải là mục tiêu ở đây. Tuy nhiên, những gì tôi sẽ làm là liệt kê các khái niệm DDD mà tôi thấy có liên quan đến cách tôi muốn tổ chức mã và cách tôi nghĩ về Kiến trúc: các khái niệm hệ thống rộng tạo thành nền tảng cho phát triển tính năng.

Trong bài viết, tôi sẽ nói về:

  • Ubiquitous language (Ngôn ngữ chung)
  • Layers Bounded contexts
  • Anti-Corruption Layer
  • Shared Kernel
  • Generic Subdomain

UBIQUITOUS LANGUAGE

Một vấn đề thường xảy ra trong phát triển phần mềm, xoay quanh sự hiểu biết về mã nguồn, nó là gì, nó làm gì, nó như thế nào, tại sao nó lại … nó thậm chí còn phức tạp hơn để hiểu mã nguồn khi nó sử dụng một thuật ngữ khác với thuật ngữ mà các chuyên gia về nghiệp vụ (domain expert) sử dụng. Ví dụ, nghiệp vụ chuyển tiền trong ngân hàng được các chuyên gia gọi là remittance, tuy nhiên khi các developer nghe được từ “chuyển tiền”, họ lại để trong code là money transfer, điều này có thể gây ra nhiều nhầm lẫn khi thảo luận về ứng dụng. Tuy nhiên, hầu hết sự mơ hồ này có thể được giải quyết bằng cách đặt tên đúng các lớp và các phương thức, làm cho chúng thể hiện một đối tượng và phương pháp nào đó trong ngữ cảnh của nghiệp vụ.

Ý tưởng chính của việc sử dụng một Ngôn ngữ chung (Ubiquitous language) là để giúp cho việc không nhầm lẫn mơ hồ giữa các khái niệm về nghiệp vụ với cách đặt tên, ánh xạ các khái niệm đó ở trong mã nguồn. Code, class, method, properties và đặt tên mô-đun phải phù hợp với ngôn ngữ chung. Nếu cần thì ta có thể refactor (tái cấu trúc) lại mã nguồn để đạt được điều đó, với mục đích chung là thống nhất các thuật ngữ giữa code và nghiệp vụ.

LAYERS

Tôi đã nói về Layers trong một bài viết trước, nhưng tôi sẽ viết lại trong bài viết này từ góc nhìn của DDD:

USER INTERFACE

Chịu trách nhiệm render màn hình người dùng sử dụng để tương tác với ứng dụng và dịch các đầu vào của người dùng vào các lệnh ứng dụng. Điều quan trọng cần lưu ý là “người dùng” có thể là con người nhưng cũng có thể là các ứng dụng khác kết nối với API của chúng ta, tương ứng hoàn toàn với các đối tượng Boundary trong kiến trúc EBI;

APPLICATION LAYER

Dàn xếp các đối tượng domain để thực hiện các tác vụ theo yêu cầu của người dùng hay còn gọi là các use-case. Nó không chứa business logic. Điều này giống với Interactors trong kiến trúc EBI, ngoại trừ Interactors là bất kỳ đối tượng nào không liên quan đến User Interfaces hoặc Entity, và trong trường hợp này, Application Layer chỉ chứa các đối tượng có liên quan đến một use-case. Lớp này là nơi mà Application Services thuộc về, vì chúng là nơi tổng hợp, sử dụng tất cả các loại object khác như repositories, Domain Services, Entities, Value Objects hoặc bất kỳ đối tượng Domain nào để đáp ứng yêu cầu của các use-case.

DOMAIN LAYER

Đây là lớp có chứa tất cả logic nghiệp vụ, Domain Services, Entities, Events và bất kỳ loại đối tượng khác có chứa Logic nghiệp vụ. Rõ ràng nó chính là Entity Object của EBI. Đây là trung tâm, là trái tim của hệ thống. Domain Services sẽ chứa các logic nghiệp vụ không phù hợp với một Entity, thường là kết hợp một số Entity trong việc thực hiện một số công việc liên quan đến nghiệp vụ;

INFRASTRUCTURE

Các khả năng kỹ thuật hỗ trợ các Layers ở trên, ví dụ như persistence hoặc messaging.

ddd_layers

Eric Evans, 2003

BOUNDED CONTEXTS

Trong một ứng dụng doanh nghiệp, có thể có rất nhiều model, các khái niệm cũng như số lượng và kích thước của team làm việc trên codebase là rất lớn. Điều này mang lại cho chúng ta hai vấn đề:

  1. Các developer làm việc trên codebase càng lớn thì càng khó nhận thức và hiểu đúng về những gì những đoạn mã đang làm, và do đó có thể tạo ra bug, gây khó khăn trong việc debug, hiểu đúng và ra quyết định được làm theo thế nào.
  2. Các nhiều developer làm việc trên cùng một codebase, càng khó khăn hơn để hợp tác và có một tầm nhìn chung về kỹ thuật và nghiệp vụ của ứng dụng.

Nói cách khác, đó là 2 vấn đề lớn cần giải quyết khi làm việc với các ứng dụng tầm cỡ enterprise.

Giải pháp thông thường cho một vấn đề lớn là chia nhỏ nó thành những phần nhỏ hơn, hay còn gọi là “bounded contexts”. Nơi mỗi phần phục cho những đối tượng người dùng khác nhau. Nói cách khác, trong 1 hệ thống phần mềm doanh nghiệp, nơi mà hệ thống sẽ phục vụ cho rất nhiều đối tượng người sử dụng khác nhau, việc chúng ta nên làm là chia nhỏ hệ thống đó ra thành những hệ thống nhỏ hơn, đơn lẻ về nhiệm vụ, và đối tượng người dùng. Ví dụ hệ thống nhân sự, kế toán, tiền lương. Mỗi hệ thống có 1 ngữ cảnh riêng gọi là “bounded contexts”, nơi mà nó hệ thống con đó chỉ có hiểu biết về ngữ cảnh, nghiệp vụ nó đảm nhiệm.

Two subsystems commonly serve very different user communities.

Eric Evans 2014, Domain-Driven Design Reference

Các bounded contexts xác định một ngữ cảnh áp dụng một phần riêng biệt của mô hình nghiệp vụ. Việc cô lập này có thể đạt được bằng cách tách các logic kỹ thuật, tách biệt codebase, tách biệt giản đồ cơ sở dữ liệu (database schema) và về tổ chức team. Mức độ cô lập bounded context, như thường lệ, phụ thuộc vào tình hình thực tế: nhu cầu và khả năng chúng ta có.

Một điểm thú vị, đây không phải là một khái niệm hoàn toàn mới. Ivar Jacobson đã viết về các hệ thống con (subsystems) trong cuốn sách của mình (Object-Oriented Software Engineering: A Use Case Driven Approach), trở lại vào năm 1992, mười một năm trước Eric Evans!

fig_7_27_subsystems

Ivar Jacobson, 1992

Khi đó, ông đã có một vài ý tưởng rất cụ thể về chủ đề này:

  • Hệ thống do vậy bao gồm một số các hệ thống con có thể chứa các hệ thống con của chính nó. Ở dưới cùng của phân cấp như vậy là các đối tượng phân tích (analysis objects). Các hệ thống con là một cách để cấu trúc hệ thống cho việc phát triển và bảo trì.
  • Nhiệm vụ của các hệ thống con là đóng gói các đối tượng sao để làm giảm đi sự phức tạp.
    Tất cả các đối tượng đảm nhiệm các phần cụ thể của chức năng sẽ được đặt trong cùng một hệ thống con
  • Mục đích là để có một gắn kết chức năng mạnh mẽ trong một subsystem và một sự liên kết lỏng lẽo giữa các subsystem (ngày nay được gọi là low coupling and high cohesion)
  • [Một hệ thống con] nên tốt hơn nên được sử dụng bởi chỉ một actor, vì thay đổi thường được gây ra bởi một actor.
  • […] bắt đầu bằng cách đặt các đối tượng điều khiển trong một subsystem, và sau đó đặt các đối tượng thực thể liên kết chặt chẽ (strongly coupled) và các đối tượng giao diện (interface objects) trong cùng một subsystem.
  • Tất cả các đối tượng có gắn kết chức năng mạnh mẽ (strong mutual functional coupling) sẽ được đặt trong cùng một subsystem […]
    • Liệu những thay đổi trong một đối tượng dẫn đến những thay đổi trong đối tượng kia? (Điều này bây giờ được gọi là Nguyên tắc The Common Closure Principle – Classes được xuất bản bởi Robert C. Martin trong bài báo “Granularity” năm 1996, 4 năm sau cuốn sách Ivar Jacobson)
    • Liệu chúng có giao tiếp với cùng một actor?
    • Có phải cả hai đều phụ thuộc vào một đối tượng thứ ba, chẳng hạn như một interface object hay một entity? Liệu một đối tượng thực hiện một số hoạt động trên đối tượng kia? (Điều này được gọi là Nguyên tắc The Common Reuse Principle – Classes, được sử dụng cùng nhau được đóng gói cùng nhau của Robert C. Martin trong bài báo “Granularity” năm 1996, 4 năm sau cuốn sách Ivar Jacobson)
  • Một tiêu chí khác cho việc phân chia là phải có ít thông tin trao đổi giữa các hệ thống con khác nhau càng tốt (low coupling)
  • Đối với các dự án lớn, có thể có các tiêu chí khác cho phân hệ thống con, ví dụ:
    • Các nhóm phát triển khác nhau có năng lực hoặc nguồn lực khác nhau và có thể phân phối các công việc phát triển phù hợp (các nhóm cũng có thể được tách biệt về mặt địa lý)
    • Trong một môi trường phân tán, một hệ thống phụ có thể được yêu cầu ở mỗi logical node (SOA, web services và micro services) Nếu một sản phẩm hiện có có thể được sử dụng trong hệ thống này, điều này có thể được coi là một subsystem (các libraries mà hệ thống phụ thuộc vào, ví dụ như ORM).

ANTI-CORRUPTION LAYER

Một Anti-Corruption Layer cơ bản là một middleware giữa hai hệ thống con. Nó được sử dụng để cô lập hai hệ thống con, làm cho chúng phụ thuộc vào layer này thay vì phụ thuộc trực tiếp vào nhau. Bằng cách này, nếu chúng ta tái cấu trúc hoặc thay thế hoàn toàn một trong các hệ thống con thì chúng ta sẽ chỉ phải cập nhật layer này để các hệ thống con khác không bị ảnh hưởng.

Điều này đặc biệt hữu ích khi có một hệ thống mới mà chúng ta cần phải tích hợp với một hệ thống có sẵn. Để không để những hệ thống cũ chịu sự ảnh hưởng từ việc thêm mới các hệ thống con mới, chúng ta tạo ra một Anti-Corruption Layer sẽ điều chỉnh API của hệ thống cũ cho các nhu cầu của hệ thống con mới.

Có 3 mối quan tâm chính:

  1. Điều chỉnh các API hệ thống con với những gì các client subsystems cần;
  2. Translate data và commands giữa các hệ thống con;
  3. Thiết lập trao đổi (communication) theo một hoặc nhiều hướng, nếu cần

fig_14_8_anticorruption_layer

Eric Evans, 2003

Đây là một kỹ thuật được sử dụng hợp lý khi chúng ta không kiểm soát một hoặc tất cả các hệ thống con, nhưng cũng có thể sử dụng nó khi chúng ta kiểm soát tất cả các hệ thống con liên quan, ngay cả khi chúng được thiết kế tốt nhưng đơn giản có các model rất khác nhau và chúng ta muốn ngăn chặn sự rò rỉ từ model này sang model khác (thay đổi một hệ thống con để phù hợp với nhu cầu của một hệ thống con khác).

SHARED KERNEL

Trong một số trường hợp, bất chấp mong muốn của chúng ta để có các thành phần tách biệt hoàn toàn và tách rời, vẫn có một số trường hợp buộc ta phải tách một số domain code ra để chia sẻ cho nhiều component khác sử dụng.

Điều này sẽ cho phép các component vẫn giữ được tính phân tách và độc lập với các component khác mặc dù sử dụng chung những mã chia sẻ cùng (shared code), ta gọi các mã chia sẻ này với cái tên “shared kernel”.

Trường hợp ví dụ, với các events được kích hoạt bởi một component và lắng nghe bởi một hoặc một số component khác. Và tương tự cho các service interfaces and thậm chí là các entities.

Tuy nhiên, nên giữ phần Shared Kernel này càng nhỏ càng tốt, và cẩn thận khi thay đổi nó vì chúng ta có thể một cách vô tình gây ảnh hưởng đến những chỗ khác đang sử dụng nó. Điều quan trọng là mã trong Shared Kernel sẽ không nên bị thay đổi nếu không có sự tham gia và hiểu biết của tất cả các nhóm phát triển khác sử dụng nó.

GENERIC SUBDOMAIN

Một Subdomain là một phần rất biệt lập của domain. Generic Subdomain là một Subdomain không liên quan đến ứng dụng của chúng ta mà có thể được sử dụng trong bất kỳ ứng dụng nào tương tự.

Vì vậy, nếu có một ứng dụng có một phần của nó là về finance, có lẽ chúng ta có thể sử dụng một thư viện finance hiện có trong ứng dụng. Nhưng dù sao đi nữa, ngay cả khi không thể sử dụng thư viện hiện có và cần xây dựng riêng của chúng ta, nếu nó là một Generic Subdomain thì đó không phải là hoạt động cốt lõi và nó cần phải được coi là cần thiết nhưng không quan trọng. Đây không phải là phần quan trọng nhất trong ứng dụng nên không phải là nơi các chuyên gia giỏi nhất nên tập trung và thậm chí phải rõ ràng bên ngoài mã nguồn chính, nó có thể được cài đặt với một công cụ quản lý sự phụ thuộc (dependency management tool).

KẾT LUẬN

Các khái niệm DDD tôi đã chọn để tiếp cận ở đây là, một lần nữa, chủ yếu về single responsibility, low coupling, high cohesion, isolating logic để ứng dụng của chúng ta trở nên nhất quán, dễ dàng và nhanh chóng hơn để thay đổi và thích ứng với nhu cầu của doanh nghiệp.

SOURCES

1992 – Ivar Jacobson – Object-Oriented Software Engineering: A use case driven approach

1996 – Robert C. Martin – Granularity

2003 – Eric Evans – Domain-Driven Design: Tackling Complexity in the Heart of Software

2014 – Eric Evans – Domain-Driven Design Reference

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

Domain-Driven Design

Tổng hợp bởi edwardthienhoang

Bài viết gốc được đăng tải tại edwardthienhoang.wordpress.com

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Nên học lập trình web cơ bản ở nhà hay ở trung tâm?

Nên học lập trình web cơ bản ở nhà hay ở trung tâm?

Bài viết được sự cho phép của smartjob.vn

Học lập trình web cơ bản ở đâu?

Với mỗi sinh viên IT, việc đưa ra quyết đưa ra quyết định học lập trình web ở đâu là một lựa chọn ảnh hưởng lớn tới tương lai sau này. Tại các trường đại học ở Việt Nam, lập trình web thường chỉ dừng ở mức cơ bản, đủ để sinh viên nắm bắt được lý thuyết chứ chưa thực sự làm chủ được các ngôn ngữ lập trình, chưa được trực tiếp làm các công việc thực tế. Cho nên việc lựa chọn giữa tự học hay đi học ở các trung tâm làm cho các bạn sinh viên hết sức băn khoăn. Đây cũng là câu hỏi thường gặp ở nhiều diễn đàn IT và bây giờ, chúng ta hãy cùng đi tìm lời giải cho bài toán này.

Có rất nhiều ý kiến được đưa ra:

Nên đi học ở trung tâm

Nếu bạn chưa quen với việc lập trình thì mình khuyên bạn nên tìm một trung tâm uy tín để học. Dưới đây là một số lý do bạn cần đến trung tâm để học:

Thứ nhất: Học ở trung tâm bạn sẽ được dạy theo một bộ giáo trình nhất định từ cơ bản đến nâng cao. Khi đó bạn sẽ có được những kiến thức cơ bản nhất và tránh được việc bị hổng kiến thức.

Thứ hai: Bạn sẽ có một môi trường làm việc nhóm nơi bạn có thể trao đổi thông tin và rèn luyện kỹ năng một cách tốt nhất. Bạn sẽ không mất nhiều công sức để tìm lời giải thích cho một lỗi sai nào đó hay để tìm tài liệu cho những vấn đề bạn quan tâm.

Thứ ba: Bạn sẽ được làm việc với những người có nhiều kinh nghiệm và được chia sẻ nhiều kiến thức thực tế bổ ích có liên quan trực tiếp tới công việc của bạn sau này.

Thứ tư: Nhiều trung tâm sẽ cấp chứng chỉ sau các khóa học, điều này sẽ góp phần làm đẹp thêm cho bộ hồ sơ xin việc của bạn sau này.

Sau khi có đầy đủ kiến thức về lập trình, các bạn có thể đọc thêm các Ebook hay xem các video trên mạng, tham gia các nhóm lập trình trên Facebook. Bạn hoàn toàn có thể tạo một trang web riêng và code từ một trình soạn thảo, như vậy kỹ năng của bạn sẽ được cải thiện rất nhiều.

  25 thuật ngữ bạn nhất định phải biết khi lập trình web
  8 tools cần có để tăng workflow khi lập trình web

Tự học

Khi bạn đã biết lập trình web cơ bản, bạn làm chủ được kiến thức của mình và đã có một ngôn ngữ lập trình riêng để theo đuổi thì cũng không cần thiết phải tốn tiền vào các trung tâm. Điều quan trọng là bạn cần có khả năng tự học, tự mày mò hoặc đã có chỗ để thực tập trong thời gian còn ngồi trên ghế nhà trường. Một kế hoạch cụ thể sữ giúp cho bạn có được hiệu quả tốt nhất trong việc học.

Đầu tiên bạn cần xác định loại ngôn ngữ bạn sẽ học. Theo mình, nên bắt đầu từ ngôn ngữ R hay Python bởi nó sẽ giúp ích cho ngành học của bạn hơn. Còn nếu bạn muốn làm được nhiều việc thì nên chọn C#. Tiếp đến là Java, PHP hay Ruby tùy theo sở thích của bạn. Sau khi có được kiến thức lập trình cơ bản, bạn cần dành nhiều thời gian cho việc thực hành để tránh các lỗi và để nắm vững ngôn ngữ đó.

Một việc nữa các bạn cần lưu ý khi tự học là cân đối giữa việc học ở trường và việc tự học của bạn. Cần xem trước kế hoạch học ở trường (bạn đang học ngôn ngữ nào, bạn sắp học ngôn ngữ nào,…) để có sự chuẩn bị tốt nhất cho việc tự học. Bên cạnh đó, nếu bạn có một người nhiều kinh nghiệm hướng dẫn là tốt nhất. Đôi khi chúng ta không chạy được chương trình và không biết lỗi ở đâu nên rất cần một người có kinh nghiệm để thường xuyên trao đổi.

Khi bạn đã thành thạo một ngôn ngữ, bạn có thể làm một số công việc thực tế để tích lũy kinh nghiệm đồng thời tìm hiểu sâu hơn về ngôn ngữ đó. Nếu bạn làm tốt thì chỉ cần 2 đến 5 tháng là sử dụng nhuần nhuyễn một ngôn ngữ. Sau đó, bạn có thể chuyển sang một ngôn ngữ mới nhưng đừng quên thường xuyên ôn lại những kiến thức và kỹ năng đã học nếu không bạn sẽ rất chóng quên.

Học theo cách này rất tốn thời gian, không dành cho những người dễ nản chí. Bạn có thể lên rất nhiều kế hoạch nhưng lại không thực hiện được bởi nhiều lý do cho nên hãy cân nhắc kỹ trước khi lựa chọn phương án tự học.

Tự học online

Học lập trình online cũng có rất nhiều chuyên gia truyền đạt lại các kinh nghiệm thực tế. Đây là cách bạn có thể lựa chọn để tiết kiệm cả thời gian và chi phí so với hai cách nêu trên. Các kênh mà bạn có thể lựa chọn là học qua Skype, học qua facebook (những người chuyên viết blog về lập trình, học qua các nhóm,…), học lập trình web từ các diễn đàn,… Ngoài ra bạn có thể đăng ký các khóa học trực tuyến qua các trang imicrosoft.edu.vn; standford.com.vn; itech.edu.vn;…

Dù học theo cách nào thì tự học và tự thực hành là những kỹ năng cần thiết nhất đối với một lập trình viên. Và thêm một lời khuyên cho các bạn sinh viên là nên đi làm thêm vào năm 2 hoặc năm 3 là tốt nhất. Nếu đã có kinh nghiệm, rất dễ để các bạn có được một vị trí “ngon lành” khi mới ra trường.

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev

Internet vạn vật (IoT) hoạt động như thế nào?

Internet vạn vật (IoT) hoạt động như thế nào?

Bài viết được sự cho phép của smartjob.vn

Internet vạn vật – Internet of things hay còn được biết đến với cái tên Internet of Everything (IoE), là tập hợp của tất cả các thiết bị có thể kết nối với các trang web, cho phép thu thập, gửi và xử lý thông tin ở môi trường xung quanh chúng. Các thiết bị này được tích hợp với các bộ cảm biến, bộ xử lý của máy tính và những phần mềm có thể tương tác với nhau. Các nhà khoa học gọi chúng là những thiết bị “được kết nối” hay những thiết bị “thông minh” (connected or smart devices). Dữ liệu từ “smart devices” được truyền tới các thiết bị khác tạo thành một quá trình được gọi là M2M (machine-to-machine).

  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++
  Cấu hình JSP views trong InternalResourceViewResolver với Spring Boot JAR file

Các thuật ngữ như Internet of Things hay M2M có lẽ không quá xa lạ với dân IT. Có rất nhiều cách định nghĩa về IoT và trên thực tế đây là một cụm từ khá trừu tượng nên không ít người không biết IoT hoạt động thế nào. Chúng ta hãy cùng đi tìm lời giải đáp.

Ban đầu, các chuyên gia sẽ  tương tác với các tiện ích để cài đặt những thiết bị IoT, cung cấp cho các thiết bị đó những hướng dẫn, cách lấy dữ liệu. Các thiết bị sẽ tự hoạt động trong hầu hết các khâu mà không cần tới sự can thiệp của con người. Chẳng hạn một thiết bị thu thập dữ liệu về thời tiết, các chuyên gia sẽ cài đặt làm sao để chúng tự cập nhật được nhiệt độ, độ ẩm, áp suất,… mà người dùng không phải thực hiện bất cứ một thao tác nào khác. Chúng ta chỉ cần bật điện thoại, ấn vào icon là các thông số về thời tiết sẽ hiện ngay ra màn hình.

Sự xuất hiện của những chiếc điện thoại thông minh cũng như mạng lưới internet trực tuyến đã dẫn đến sự ra đời của IoT. IoT tạo ra một lượng dữ liệu lớn trên Internet bao gồm các dữ liệu dùng để tạo ra các thiết bị hữu ích và cả phần lưu lượng được dùng cho những mục đích khác. Công nghệ này cho phép chúng ta tạo ra khối lượng thông tin không lồ trên thời gian thực tế, điều mà các nhà khoa học chưa từng làm được trước đó. Các bạn hoàn toàn có thể yên tâm khi ra khỏi nhà với những thiết bị giám sát; những tổ chức, doanh nghiệp sẽ cải thiện được quy trình làm việc, từ đó nâng cao sản lượng, tiết kiệm chi phí và giảm đáng kể các khoảng thời gian chết. Các thiết bị cảm biến trong thành phố có thể giúp giảm bớt tình trạng tắc nghẽn giao thông và cảnh báo chúng ta khi các công trình có nguy cơ sụp đổ. Hơn thế nữa, các thiết bị còn giúp chúng ta thay đổi điều kiện môi trường, cảnh báo về những thảm họa sắp xảy ra.

Ngày nay, IoT đã xuất hiện ở mọi nơi trên thế giới và chúng ta hoàn toàn có thể đem công nghệ này áp dụng cho các dự án của mình. Bất kể bạn đang hoạt động trong lĩnh vực nào, đang gặp khó khăn gì thì IoT sẵn sàng giúp bạn giải quyết mọi thứ.

 Phạm Bình (Theo howstuffworks.com)

Bài viết gốc được đăng tải tại smartjob.vn

Có thể bạn quan tâm:

Xem thêm Việc làm IT hấp dẫn trên TopDev