Home Blog Page 99

Mobile Developer làm gì? Lộ trình nghề nghiệp Mobile Developer như thế nào?

mobile developer làm gì

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

Web Developer và Mobile Developer là hai lĩnh vực đang nhận được sự ủng hộ nhiệt tình từ các bạn trẻ. Đặc biệt, Mobile Developer phát triển ứng dụng trên điện thoại di động vô cùng hot hiện nay. Vậy Mobile Developer là gì? Lộ trình nghề nghiệp Mobile Developer như thế nào? Tất cả các câu hỏi trên sẽ được giải đáp qua những chia sẻ dưới đây.

Mobile Developer là gì?

Để hiểu rõ hơn về Mobile Developer trước tiên cần tìm hiểu Mobile Developer là gì? Đây là một thuật ngữ chuyên môn để chỉ những lập trình viên phát triển ứng dụng trên thiết bị di động. Và các ứng dụng này sẽ được người dùng download hoặc mua về từ Google Play hoặc App Store. Công việc chủ yếu của Mobile Developer chính là xây dựng, thiết kế và tạo lập các ứng dụng, phần mềm chạy trên điện thoại hoặc máy tính bảng.

Mobile Developer làm gì? Lộ trình nghề nghiệp Mobile Developer như thế nào?

Lộ trình của một Mobile Developer sẽ như thế nào?

Mobile Developer hay còn có tên gọi khác là chuyên viên phát triển ứng dụng di động. Để có thể làm tốt công việc, người này không chỉ cần có trình độ kiến thức chuyên môn về lập trình mà cần phải tinh tế, biết nắm bắt thị hiếu người dùng trong giai đoạn hiện tại. Ngôn ngữ làm việc của Mobile Developer phổ biến nhất chính là Java, Swift và Objective-C. Và các ngôn ngữ này hoàn toàn phù hợp với Android, iOS, Windows Phone.

Việc làm Mobile Developer hấp dẫn trên TopDev

Mô tả công việc của Mobile Developer bao gồm:

    • Quản lý các dự án liên quan đến tạo lập và phát triển ứng dụng trên thiết bị di động
    • Tiếp nhận, chuyển giao công nghệ đối với các ứng dụng thiết bị
    • Nâng cấp, hoàn thiện và mở rộng các tính năng trên thiết bị di động
    • Nghiên cứu các công nghệ mới, ứng dụng vào lập trình thiết bị di động
    • Thực hiện các công việc được phân công trực tiếp từ cấp quản lí

Lộ trình để nghề nghiệp Mobile Developer như thế nào?

Để có thể trở thành một Mobile Developer trước khi bước bên cấp chuyên nghiệp cần bắt đầu từ những kiến thức căn bản. Người lập trình phải từng bước rèn luyện thêm nhiều kỹ năng, chủ động tư duy phát triển và tìm tòi thêm nhiều điều mới lạ về lĩnh vực này.

    • Thi tuyển vào trường chuyên môn về công nghệ thông tin: Đây là bước đầu tiên để có thể tiếp cận với môi trường kiến thức chuyên môn. Mặc dù bằng cấp không quá cần thiết tuy nhiên, nếu tốt nghiệp từ các trường Công nghệ thông tin sẽ là một lợi thế. Trường đại học sẽ là nơi đào tạo bày bản những kiến thức từ căn bản đến chuyên môn.
    • Chọn chuyên môn: Hiện nay, Mobile Developer phát triển trên các nền tảng chính là Android, Apple, Windows, Symbian và RIM (Blackberry). Người học mặc dù có thể học để lập trình trên tất cả các hệ điều hành. Tuy nhiên, để có thể tập trung vào một chuyên môn nhất định, hãy chọn riêng một chuyên môn để chuyên sâu. Hiện nay, Android và Apple là hai thị trường phát triển hàng đầu, đây sẽ là lĩnh vực rộng mở cho bất kỳ ai.

 

  5 tips cải tiến chất lượng phát triển Mobile App
  7 Tip tăng tương tác hiệu quả trên mobile
    • Tận dụng các chương trình phát triển Online: Trên các hệ điều này sẽ cung cấp các video hướng dẫn việc viết code. Ví dụ như Apple cung cấp iOS Dev Center còn Android có một trang web Android Developers Training để chuyên viên lập trình có thể học và tập sự. Bên cạnh đó, người học cũng có thể tìm hiểu thêm trên các nguồn khác hoặc săn những lớp học miễn phí.
    • Có thể đăng ký thêm lớp học về Marketing: Tưởng chừng không mấy liên quan nhưng thật chất các lớp học về Marketing rất thiết thực và cần thiết đối với Mobile Developer. Nếu muốn tự phát triển ứng dụng, lập trình viên cần có kỹ năng tự tiếp thị cho ứng dụng lập trình của mình.
    • Phát triển ứng dụng của riêng mình: Để có thể trở thành một phần của các công ty Công nghệ thông tin có tiếng, trước tiên cần phát triển riêng cho bản thân một ứng dụng. Có thể coi đây như cách vận dụng, thực hành những kiến thức và kỹ năng được học trên lớp. Và nếu có thể tư phát triển ứng dụng sẽ là một trong những điểm sáng trong tất cả các ứng cử viên.
    • Tập đưa ra ý tưởng cho các ứng dụng: Đưa ra ý tưởng cho các ứng dụng chính là bước tư duy để tìm ra những nhu cầu dịch vụ mới của khách hàng. Làm thế  nào để cho thể tạo ra một ứng dụng di động phù hợp với thị hiếu sử dụng của mọi người? Làm thế nào để ứng dụng của bản thân được đánh giá cao?… Đây đều là câu hỏi mà các Mobile Developer cần trả lời.
    • Tập trung vào tính thiết thực của ứng dụng di động: Nhiều người khi phát triển ứng dụng di động thường chỉ tập trung vào độ mới mẻ mà quên mất đi khả năng ứng dụng của app. Hãy thiết kế ra các ứng dụng di động có khả năng sử dụng cao, thiết thực với đời sống hằng ngày. Đặc biệt, các app này nên đơn giản hóa đến mức tối đa. Vì người dùng thường không thích những gì rắc rối.

Vậy là các bạn đọc đã phần nào hiểu được về Mobile Developer cũng như con đường của một Mobile Developer chuyên nghiệp. Hy vọng những chia sẻ trên đây có thể giúp ích cho những bạn đang hành trang trên con đường lập trình viên ứng dụng di động.

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

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

Freelancer Developer – được gì và mất gì?

Freelancer Developer – được gì và mất gì?

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

Gần đây có một số bạn có hỏi mình một số câu hỏi về Freelancer Developer đại loại như sau:

  • Làm Freelancer Developer thì có giàu không anh?. So ez
  • Em work from home làm Freelancer luôn được không?
  • Có khó không anh, tiếng anh của em hơi yếu thì sao?

Chính vì vậy, một chút ít kinh nghiệm làm việc Freelancer. Mình chia sẻ một vài suy nghĩ về Freelancer Developer. Anh em có gì thắc mắc cứ comment nha. Đừng ném đá nha!

  Freelancer IT là gì? Những điều thú vị về Freelancer lập trình
  Freelancer IT liệu có tồn tại sự tự do trong nghề?

1. Cần gì ở một Freelancer ngành IT?

Đầu tiên, rõ ràng mà nói thì không phải ai cũng trở thành freelancer được. Trước khi muốn trở thành một freelancer, bạn cần có một số điều kiện sau:

  • Có trình độ chuyên môn, kinh nghiệm làm việc các dự án thực tế.
  • Có khả năng giao tiếp với khách hàng (Tiếng Anh hoặc một ngôn ngữ khác).
  • Freelancer đòi hỏi sự tổng hợp của nhiều kĩ năng.

Rõ ràng mà nói, yêu cầu đầu tiên và cũng là tiên quyết của một Freelancer. Trước khi bắt đầu làm việc, cần có một quá trình làm việc để tăng kinh nghiệm của bản thân.

Hầu hết các trang freelancer đều có một quá trình kiểm tra trình độ khá gắt. Nếu không thể thực hiện các bài test, họ sẽ yêu cầu rất nhiều thông tin khác để xác thực kĩ năng của bạn. Một số hình thức phổ biến là

  • Review từ khách hàng, đánh giá từ sếp của bạn.
  • Các bài test chuyên môn về ngôn ngữ.
  • Profile từ các trang uy tín như linkedin.

Freelancer Developer – được gì và mất gì?
Trả tiền cho những gì mình biết – Biết nhiều sẽ trả tiền nhiều – Không biết thì không trả tiền. Trở thành Freelancer đôi khi không dễ dàng như nhiều bạn tưởng.

Chính vì vậy, không nên bắt đầu khi chưa có một số kinh nghiệm nhất định (về một số ngôn ngữ, một số framework, …).

Thứ hai, việc trở thành freelancer cũng đòi hỏi có khả năng giao tiếp tốt (Tiếng Anh). Do hầu hết các khách hàng tới từ các quốc gia nói tiếng anh. Trường hợp như mình làm việc cho các khách hàng Singapore hay Ấn độ cũng đều sử dụng tiếng anh.

2. Thu nhập khá nhưng phục thuộc vào may mắn

Trước tiên, một số ngôn ngữ sau đây hiện đang rất được săn đón, cũng là đang hot để trở thành một Freelancer Developer đít thịt. Ý lộn, đích thực:

Đúng vậy, nếu may mắn gặp đúng khách hàng với các dự án long-term. Bạn hoàn toàn có thể có cho mình những dự án longterm. Con số kiếm được có thể lên đến cả tỷ đồng.

Tiền, tất nhiên là nghề lập trình viên không hề nghèo

Không hề điêu. Một số bạn đã có thu nhập hơn 10 tỷ đông (500.000$) từ các dự án long-term làm theo giờ. Để có các dự án long-term và ngon lành, đòi hỏi kỹ năng tốt và một chút “may mắn”.


Một số dự án trên Truelancer.com có giá trị lớn hơn 500$. Một con số đáng để dành thời gian làm việc hàng ngày. Chỉ trường hợp có quá nhiều thời gian nhàn rỗi mình mới bid những dự án dưới 500$.

Nhìn thì tuyệt, con số không bé (10$/15 phút). Tuy nhiên, để liên tục có người thuê trở thành mentor đòi hỏi phải liên tục cập nhật kiến thức.

Tuy nhiên, nếu không siêng năng không phải lúc nào cũng có sẵn công việc để làm. Việc trở thành Fulltime freelancer developer đòi hỏi phải đánh đổi nhiều thứ. Riêng mình thì chỉ là Part-time freelancer.

Freelancer Developer – được gì và mất gì?
Thu nhập từ Freelancer đôi khi cũng khá hấp dẫn (10$/15 phút). Mình tính để cao hơn là 15$. Tuy nhiên 15-20$ cho 15 phút đòi hỏi kinh nghiệm ít nhất 6 năm.

Ngoài ra, trở thành FullTime Freelancer cũng gây áp lực về mặt tài chính khi không có jobs để bid, để làm. Đôi lúc sẽ đói nhăn răng hoặc nhàn hạ trong cả 2,3 tuần. Mà “nhàn cư thì vi bất thiện”.

Chính vì vậy, một số bạn lựa chọn cách an toàn hơn. Vừa làm việc ở công ty (có thu nhập cố định hàng tháng), kèm theo đó sẽ làm part-time freelancer để lấy thêm kinh nghiệm, …

3. Học hỏi mới là thứ quan trọng

Trở thành Freelancer Developer cũng đồng nghĩa với việc bạn phải luyện tập nhiều hơn. Từ cách giao tiếp với khách hàng cho tới kĩ năng chuyên môn.

Đầu tiên, các freelancer có xu hướng được thuê nhiều nhất là FullStack. Việc trở thành FullStack Developer đòi hỏi một quá trình dài học hỏi, tìm tòi.

Nói vậy không có nghĩa rằng các freelancer chuyên một kĩ thuật nào đó không được thuê. Dưới đây là profile của một anh trên Upwork. Cái title thôi đã thấy ngầu lòi (Only web scraping, nothing else).

Freelancer Developer – được gì và mất gì?
Title rất “ngầu lòi” – Chỉ chuyên một technoly nhất định không phải không tốt. Nhưng đó nên là thứ được nhiều người yêu cầu.

Việc chỉ tập trung chuyên môn hay theo hướng FullStack đều là do bản thân lựa chọn. Tuy nhiên, với mỗi dự án trải qua, các bạn sẽ tích lũy được rất rất nhiều kinh nghiệm.

  • Hầu hết các dự án freelancer là project thực tế -> biết được công nghệ đó sử dụng thực tế như thế nào?
  • Tìm hiểu các công nghệ mới nếu được khách hàng yêu cầu

4. Trải nghiệm tuyệt vời khi trở thành Freelancer Developer

Trở thành Freelancer developer giúp bạn có nhiều cơ hội khẳng định mình. Làm việc với nhiều khách hàng tới từ nhiều quốc gia.

Đặc biệt, vô cùng sướng khi luyện tiếng anh với các khách hàng. Ngoài ra, việc trở thành freelancer developer cũng giúp rèn luyện thêm các kĩ năng mềm khác như:

  • Kỹ năng thương thuyết với khách hàng.
  • Kỹ năng làm việc nhóm đa quốc gia. (nếu có team dev)
  • Kỹ năng trình bày và giải thích vấn đề. Nếu làm freelancer code mentor.

Ôi, viết tới đây là cạn cmn lời luôn rồi. Anh em nào có nhu cầu trở thành Freelancer, hoặc có câu hỏi gì có thể like page rồi contact qua page cho mình nha.

Cảm ơn anh em đã đọc bài – CHÀO THÂN ÁI VÀ QUYẾT THẮNG!

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

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

Xem thêm Tìm việc Developer hấp dẫn trên TopDev

Hướng dẫn cấu hình SPF và DKIM cho mail server để xác thực hợp lệ tránh vào spam

Hướng dẫn cấu hình SPF và DKIM cho mail server để xác thực hợp lệ tránh vào spam

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

Hiện nay một số nhà cung cấp dịch vụ mail như Gmail, Hotmail … thường kiểm tra hai bản ghi là SPF( SPF Record – Sender Policy Framework) và DKIM( DomainKeys Identified Mail) giảm bớt việc spam mail. Dù không chắc chắn 100% sau khi bạn làm đúng thì thư của bạn sẽ được các nhà cung cấp dịch vụ mail tự động lọc thư cho vào Inbox nhưng mình cùng có hướng dẫn cách để tăng khả năng tránh vào spam nhất có thể.

  Lấy email từ bình luận của bài viết trong Facebook
  Bí quyết phát triển hoạt động nhân sự qua email (Email Marketing) hiệu quả - Bạn đã biết?

1. Yêu cầu nền tảng:

2. Các bước cài đặt SPF Record và DKIM

1. Thêm SPF Record vào DNS:

  • Bước 1: Vào phần quản lý DNS của Domain
  • Bước 2: Thêm bản ghi mới:
    • Kiểu( Record Type): TXT
    • Địa chỉ( Address): v=spf1 a mx ip4:123.123.123.123 mx:example.com ?all

spf

2. Cài đặt DKIM và thêm DNS cho DKIM

Mình đang sử dụng Centos 7 nếu sử dụng phiên bản khác thì có thể câu lệnh start hoặc restart có thể khác đôi chút nhé.

1. Đầu tiên nên cập nhật Centos mới nhất nhé

yum update

2. Do openDKIM lưu thông tin cài đặt trên gói EPEL cho nên chúng ta cần cập nhật lại gói này.

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

3. Cài đặt Opendkim.

yum install -y opendkim 

4. Cấu hình cho opendkim

Lưu ý là bản cài đặt DKIM mình áp dụng cho multi domain nhé nếu sử dụng 1 domain thì bỏ đi cấu hình domain thứ 2 là OK!

Cấu hình Dkim: /etc/opendkim.conf

# Lưu ý chỉ cần chỉnh sửa các dòng sau còn lại thì comment
PidFile	/var/run/opendkim/opendkim.pid
Mode	sv
Syslog	yes
SyslogSuccess	yes
LogWhy	yes
UserID	opendkim:opendkim
Socket	inet:8891@127.0.0.1
Umask	002
SendReports	yes
SoftwareHeader	yes
Canonicalization	relaxed/simple
Domain	lcdung.top
Selector	default
MinimumKeyBits	1024
KeyTable	/etc/opendkim/KeyTable
SigningTable	refile:/etc/opendkim/SigningTable
ExternalIgnoreList	refile:/etc/opendkim/TrustedHosts
InternalHosts	refile:/etc/opendkim/TrustedHosts
OversignHeaders	From

Cấu hình KeyTable: /etc/opendkim/KeyTable

# Cấu hình cho domain mặc định sử dụng DKIM
default._domainkey.lcdung.top lcdung.top:default:/etc/opendkim/keys/default.private
# Cấu hình cho domain thứ 2 sử dụng DKIM
mail._domainkey.luxor.vn luxor.vn:mail:/etc/opendkim/keys/mail.private

Cấu hình SigningTable: /etc/opendkim/SigningTable

# Cấu hình cho domain mặc định
*@lcdung.top default._domainkey.lcdung.top
# Cấu hình cho domain thứ 2
*@luxor.vn mail._domainkey.luxor.vn

Cấu hình TrustedHosts: /etc/opendkim/TrustedHosts

127.0.0.1
::1
#host.example.com
#192.168.1.0/24
# Danh sách domain
*.lcdung.top
*.luxor.vn

Tạo khoá công khai và khoá bí mật.

# Tạo khóa mặc định dành cho domain mặc định là default.private và default.txt
opendkim-default-keygen

# Tạo khóa cho doamin thứ 2 với tên là mail.private và mail.txt
opendkim-genkey -s mail -d luxor.vn

# hoặc dùng lệnh này
opendkim-genkey -D /etc/opendkim/keys/ -d luxor.vn -s mail

Tạo quyền cho khóa để Postfix có thể truy cập đọc được

chown opendkim:opendkim mail.private

Lúc này bạn sẽ có 1 file .private và 1 file .txt. Mở file .txt để lấy thông tin khóa cấu hình trên DNS:

mail._domainkey	IN	TXT	( "v=DKIM1; k=rsa; " "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqGXwAE5jkB63eFI4VqkmODluyTTgRe/PdnqJoD9h9kLDwY081bxATuu78NAJm8R+fJ15gMWKgkpVVXcvV5I9rosSK6wwDonStfQIgiq4nEmbSxbuGYNnbmG3R2/1q9klQ7Lih/Kpaokv+53Wv82y3qBMWbqjQIDAQAB" )  ; 

Và bạn cấu hình DNS như sau:

spf

Tiếp theo cấu hình Postfix nhận openDKIM.

File: /etc/postfix/main.cf

Thêm đoạn mã sau ở cuối file cấu hình

smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = $smtpd_milters
milter_default_action = accept
milter_protocol = 2

Cuối cùng khởi động lại service Postfix và Opendkim

systemctl start opendkim; 
systemctl enable opendkim; 
systemctl restart postfix;

3. Kiểm tra lại SPF và DKIM:

Kiểm tra port 25 sau khi setup thành công:

  • Link kiểm tra: https://www.port25.com/authentication-checker/
  • Tạo email gửi tới: check-auth@verifier.port25.com
  • Sau đó bạn sẽ nhận 1 mail phẩn hồi thông tin port 25 cần nâng cấp thêm những gì.Trước khi cài SPF và DKIMSau khi cài đặt thành công

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

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

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

Xem thêm Jobs Developer hấp dẫn trên TopDev

Vuejs NextTick là gì? – sử dụng khi nào?

Vuejs NextTick là gì? – sử dụng khi nào?

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

Nay rảnh rỗi lướt Medium thấy có bài viết rất hay về Vuejs NextTick. Tiện đang code project trên công ty bằng Vuejs. Vietsub luôn cho anh em cùng tìm hiểu, trao đổi.

Năm nay dự là Vuejs hot khỏi bàn rồi. Bỏ xa AngularJs với đe dọa ngôi vương của ReactJs sớm thôi.

Vuejs năm nay dự rất HOT. Nhiều sao lắm rồi. Anh em nên “try hard” học thử

Thật sự thì Vuejs NextTick là gì?. Lúc nào nên sử dụng NextTick?. Có khác biệt gì với setTimeout hay setImmediate không?

Tuốt tuồn tuột được giải thích qua bài viết dưới đây.

  Call API trong VueJS theo cách thông minh nhất
  Những Vuejs concept bắt buộc phải nắm vững – Phần 1

1. Khái niệm

Theo như tài liệu ở trang chủ của Vuejs thì NextTick sinh ra để làm hai việc sau:

Defer the callback to be executed after the next DOM update cycle

Định nghĩa một function callback thực thi sau khi DOM kết thúc một cycle update.

Bạn nào chưa biết hoặc chưa nắm rõ về DOM (Document Object Model) có thể tham khảo qua bài viết – Browser đã render website như thế nào?. Hứa là đọc phát hiểu ngay DOM là cái vẹo gì?.

Ngoài ra, NextTick còn có thể được sử dụng để gọi ngay tức thời khi “vừa mới cập nhật data, nhưng chưa phản ánh thay đổi đó lên DOM

Use it immediately after you’ve changed some data to wait for the DOM update

Sử dụng ngay tức thời sau khi vừa thay đổi data, đang chờ để cập nhật lên DOM

2. Ví dụ

// Cú pháp đơn giản, callback function và context truyền vào.
Vue.nextTick([callback, context])

Vuejs NextTick cũng được sử dụng bất đồng bộ.

// Edit data in here
vm.msg = 'Hello'
// Data is change, but the DOM not updated
Vue.nextTick(function () {
// DOM updated
}

Promise, Async và Await sử dụng như sau:

// Promise with async await
Vue.nextTick()
.then(function () {
// DOM updated
})

Ờ, thì cũng hiểu sơ sơ rồi đấy. Nhưng mà sinh ra cái NextTick() này làm chi vậy?.

Đây, có ngay đây

3. Tại sao lại cần Vuejs NextTick?

3.1 Function đầu tiên sử dụng nextTick()

Xin lỗi, hình hơi nhỏ nhưng vẫn thấy mượt mà, không hề delay. Đây là có sử dụng NextTick. Tí xem ví dụ phía dưới sẽ không sử dụng. Khác ngay.

vuejs nexttickNguồn / Source: Medium What’s Vue.NextTick
// Create a directory
async handleFiles(fileList: FileList): Promise<void[]> {
// Việc gán giá trị cho cờ này chỉ được thực hiện sau khi các Promise được hoàn tất
this.isFileUploaded = true; 

// console.log(this.isFileUploaded) // true
await this.$nextTick(); 

const directory = await carfsModule.setupSubDirectory();
...
}

Đối với function UI upload image ở gif 1 có thể dễ thấy

  • Khi người dùng click button upload, function handleFiles được gọi để thực thi
  • Promise function này thực hiện tạo folder, upload files. Công việc upload tất nhiên là bất đồng bộ.
  • Giá trị isFileUploaded được thay đổi giá trị để bắt sự kiện (trigger) người dùng click button upload. Trông có vẻ khá mượt mà.

3.2 Implement thứ hai không sử dụng nextTick()

Má, cái hình nhỏ dữ cha. Chiu, giờ nó thế, biết sao được. Nhưng mà thấy điểm khác giữa cái một với cái số hai chưa?

vuejs nexttickNguồn / Source: Medium What’s Vue.NextTick
  • Khi người dùng ấn button upload, UI trông như bị treo (frozen)
  • Nguyên nhân là khi click button upload, giá trị this.isFileUploaded chưa hề được thay đổi -> UI không có thay đổi.
  • Tệ về mặt UX (User Experience) – người dùng không biết đã thực hiện hay chưa?

Đầu tiên, khi gặp vấn đề này, hầu hết để chọn cách gán giá trị cho isFileUploaded trước khi gọi createDirectory. Nhưng sự đời trớ trêu thay, không được thế.

  // Việc gán giá trị cho cờ này chỉ được thực hiện sau khi các Promise được hoàn tất
this.isFileUploaded = true; 

// console.log(this.isFileUploaded) // false
const directory = await carfsModule.setupSubDirectory();

Nếu không có nextTick, giá trị isFileUploaded không hề thay đổi thành true -> không có cập nhật ở UI.

À, ra là thế!. Hiểu rồi ba ơi, giờ lúc nào cần cập nhật gì đó tạm tạm thì dùng Vuejs NextTick. Trường hợp đang xử lý bất đồng bộ muốn cập nhật giá trị gì gì tạm thời thì NextTick là perfect, còn không thì thôi, đừng lạm dụng mất hay.

4. Độ ưu tiên – priority

// 
setTimeout(() => {
console.log('timeout');
}, 0);

Promise.resolve().then(() => console.log('promise'));

console.log('helloworld3');

process.nextTick(() => {
console.log('nextTick');
});

console.log('helloworld5');

Output khi run đây:

helloworld3
helloworld5
nextTick
promise
timeout

Cứ in ra console là biết ông nào được ưu tiên nhiều hơn. Ở đây, ông Vuejs NextTick lúc nào cũng ưu tiên chạy trước. Bất kể là gọi ổng ở đâu trong function.

Anh em cần nhớ vì trong những đoạn code xử lý bất đồng bộ phức tạp. Nếu không biết thứ tự thực hiện nhiều khi rất là rối. Có bug cũng chẳng biết kiếm ở đâu, giải quyết thế nào?.

5. Kết luận – tham khảo

Qua bài viết này mong anh em hiểu hơn về NextTick trong Vuejs. Biết sơ nhớ tạm công dụng mục đích cũng tốt. Sau này dev có việc gì cần sẽ biết cách research.

Cảm ơn anh em đã đọc bài, nhớ like và share Facebook page nha.

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 Developer hấp dẫn trên TopDev

Giới thiệu công cụ kiểm thử tự động Selenium

Giới thiệu công cụ kiểm thử tự động Selenium

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

Như các bạn đã biết, Selenium là một trong những công cụ kiểm thử phần mềm tự động mã nguồn mở (open source test automation tool) mạnh mẽ nhất hiện nay cho việc kiểm thử ứng dụng Web. Selenium script có thể chạy được trên hầu hết các trình duyệt như IE, Mozilla FireFox, Chrome, Safari, Opera; và hầu hết các hệ điều hành như Windows, Mac, Linux.

Trong loạt bài viết về Selenium, mình sẽ giới thiệu công cụ kiểm thử tự động Selenium ở mức cơ bản dành cho những bạn lần đầu đến với công cụ Selenium này dựa trên những kinh nghiệm mà bản thân mình đã trải qua.

Giới thiệu công cụ kiểm thử tự động Selenium

Đầu tiên, Selenium là một nguyên tố hóa học với số nguyên tử 34 và ký hiệu hóa học Se. Nó là một phi kim, về mặt hóa học rất giống với lưu huỳnh. Từ Selenium xuất phát từ tiếng hy lạp “selene”, có nghĩa là mặt trăng. Cách đặt tên trên có liên quan đến sự phản quang của Selenium được nhân lên khoảng 1000 lần khi Selenium được đưa từ bóng tối ra ánh sáng mặt trời….

Hi… Just joking…..

Selenium

Selenium là một công cụ kiểm thử phần mềm tự động, được phát triển bởi ThoughtWorks từ năm 2004 với tên ban đầu là JavaScriptTestRunner. Đến năm 2007, tác giả Jason Huggins rời ThoughtWorks và gia nhập Selenium team, một phần của Google và phát triển thành Selenium như hiện nay.

Về cấu trúc thì Selenium có 4 phần

  • Selenium IDE
  • Selenium RC (Selenium 1 – Selenium Remote Control)
  • Selenium Gird
  • Selenium WebDriver (Selenium 2)

Selenium Suite

Selenium IDE (Integrated Development Environment) là một công cụ cho phép chúng ta Record/Playback một test script. Đây là một add-on hỗ trợ cho FireFox. Chúng ta chỉ có thể Record trên trình duyệt FireFox, nhưng bù lại, chúng ta có thể Playback trên các trình duyện khác như là IE, Chrome….

Selenium Gird là một hệ thống hỗ trợ người dùng thực thi test script trên nhiều trình duyệt một cách song song mà không cần phải chỉnh sửa test script.

Selenium RC, Selenium WebDriver là một thư viện cho phép chúng ta lập trình (scripting) test script trên các ngôn ngữ lập trình khác nhau như Python, Java, C#, Ruby.

Các đặc điểm của Selenium

  1. Mã nguồn mở. Phải nói điểm này là điểm mạnh nhất của Selenium khi so sánh với các test tool khác. Vì là mã nguồn mở nên chúng ta có thể sử dụng mà không phải lo lắng về phí bản quyền hay thời hạn sử dụng.
  2. Cộng đồng hỗ trợ. Vì là mã nguồn mở nên Selenium có một cộng đồng hỗ trợ khá mạnh mẽ. Bên cạnh đó, Google là nơi phát triển Selenium nên chúng ta hoàn toàn có thể yên tâm về sự hổ trợ miễn phí khi có vấn đề về Selenium. Tuy nhiên, đây cũng là một điểm yếu của Selenium. Cơ bản vì là hàng miễn phí, cộng đồng lại đông nên một vấn đề có thể nhiều giải pháp, và có thể một số giải pháp là không hữu ích. Mặc khác, chúng ta không thể hối thúc hay ra deadline cho sự hỗ trợ.
  3. Selenium hỗ trợ nhiều ngôn ngữ lập trình.
  4. Selenium hỗ trợ chạy trên nhiều OS khác nhau với mức độ chỉnh sửa script hầu như là không có. Thực sự thì điều này phụ thuộc phần lớn vào khả năng viết script của chúng ta.
  5. Chạy test case ở backround. Khi chúng ta thực thi một test scrpit, chúng ta hoàn toàn có thể làm việc khác trên cùng một PC. Điều này hỗ trợ chúng ta không cần tốn quá nhiều tài nguyên máy móc khi chạy test script.
  6. Không hỗ trợ Win app. Selenium thực sự chỉ hỗ trợ chúng ta tương tác với Browser mà không hỗ trợ chúng ta làm việc với các Win app, kể cả Win dialog như Download/Upload – ngoại trừ Browser Alarm. Vậy nên, để xử lý các trường hợp cần tương tác với hệ thống hay một app thứ ba, chúng ta cần một hay nhiều thư viện khác như AutoIt hay Coded UI.

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

Kiến thức kiểm thử phần mềm cho người mới bắt đầu

Kiến thức kiểm thử phần mềm cho người mới bắt đầu

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

Kiểm thử là một thành phần chính của phát triển phần mềm để đảm bảo độ tin cậy và chất lượng của phần mềm. Lĩnh vực này rất rộng lớn với rất nhiều cơ hội cho cả kỹ sư kiểm thử có và chưa có kinh nghiệm. Để trở thành một kỹ sư kiểm thử bạn nên thành thạo với các khái niệm và thuật ngữ khác nhau của kiểm thử. Bên cạnh đó, bạn cần phải có kỹ năng nhất định và kiên trì để thành công trong lĩnh vực này. Dưới đây là một số trong những khía cạnh quan trọng của kiểm thử phần mềm cho người mới bắt đầu.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  5 xu hướng của ngành kiểm thử tự động trong năm 2024

Software Testing

Software Testing

Trước khi bạn “thí mạng” vào nghề kiểm thử phần mềm.

Đối với những người có một nền tảng về lĩnh vực CNTT, không có nhiều khó khăn vì bạn đã biết các thuật ngữ kỹ thuật và các thuật ngữ khác nhau, mặc dù sẽ là tốt hơn nếu bạn có thể tham gia một khóa học về kiểm thử phần mềm để có được một kiến thức chuyên sâu về các khái niệm. Tuy nhiên, những người không có một nền tảng kỹ thuật vững chắc, thực sự có thể khá khó khăn cho họ để hiểu những thuật ngữ có liên quan.

Lĩnh vực khoa học máy tính và công nghệ phần mềm là rất lớn, bạn phải đi qua những điều cơ bản để giúp bạn bắt đầu. Tìm hiểu về các thuật ngữ khác nhau được sử dụng trong công nghệ phần mềm và các lĩnh vực lập trình. Làm quen với thuật ngữ kỹ thuật khác nhau như, phần mềm, hướng dẫn, chương trình, thực thi, lỗi, phát triển và chu kỳ thử nghiệm.v.v sẽ giúp bạn có được đủ động lực để làm việc trong lĩnh vực kiểm thử. Bạn cũng sẽ nhận được một tổng quan về các phương pháp phát triển khác nhau như mô hình thác nước, mô hình xoắn ốc .v.v

Sau khi bạn hoàn thành bước đầu tiên, bắt đầu đọc một số cuốn sách về các khái niệm khác nhau và các nguyên tắc cơ bản của thủ tục kiểm thử và làm thế nào để đưa chúng vào thực tế. Hiểu các loại kiểm thử, chiến lược, phương pháp .v.v Mặc dù hầu hết các định nghĩa / thuật ngữ rất đơn giản và khá dễ dàng để giải thích, bạn nên cố gắng tạo ra một thư mục định nghĩa nhỏ, nó sẽ có ích cho bạn bất cứ lúc nào bạn cần. Việc tham gia vào một lớp đào tạo bài bản sẽ giúp bạn có được một sự hiểu biết tốt hơn về các phương pháp kiểm thử. Bạn sẽ có đủ kiến thức để có thể được thăng tiến nhanh trong lĩnh vực kiểm thử phần mềm.

Tổng quan về kiểm thử phần mềm

Là một kỹ sư kiểm thử phần mềm, bạn cần phải thiết kế trường hợp kiểm thử, các kịch bản và thực hiện chúng để đánh giá kết quả của những phương pháp kiểm thử khác nhau. Bạn cần phải biết trường hợp kiểm thử là gì, mục tiêu của kiểm thử, các phương pháp kiểm thử, mức độ kiểm thử, và các phương pháp tiếp cận… Chúng ta hãy cố gắng hiểu từng khái niệm một.

Mục tiêu (objective): Để kiểm tra xem phần mềm đáp ứng nhu cầu của khách hàng và phù hợp với các đặc tả và đảm bảo chất lượng và tính chính xác của ứng dụng.

Phương pháp kiểm thử (Testing Methods): Có hai phương pháp phổ biến của kiểm thử phần mềm – kiểm tra hộp trắng và kiểm tra hộp đen. Trong kiểm thử hộp màu trắng, cấu trúc mã hoặc thuật toán của chương trình được đưa vào xem xét. Các trường hợp kiểm thử được thiết kế dựa vào cấu trúc mã hoặc cách thức làm việc của chương trình, trong khi đó kiểm thử hộp đen không yêu cầu kỹ sư kiểm thử cần phải có bất kỳ kiến thức về mã hoặc thuật toán của chương trình. Nó kiểm tra các chức năng của hệ thống tức là những gì hệ thống được cho là cần phải làm dựa trên các đặc tả. Các trường hợp kiểm thử thường được xây dựng xung quanh đó.

Mức độ kiểm thử (Testing Levels): được phân loại thành ba loại: kiểm thử đơn vị (unit testing), kiểm thử tích hợp (integration testing) và kiểm thử hệ thống (system testing). Trong kiểm thử đơn vị các đơn vị khác nhau hoặc các thành phần của ứng dụng đang được kiểm thử để kiểm tra các chức năng của các đoạn mã. Trong kiểm thử tích hợp, việc kiểm thử được thực hiện bằng cách tích hợp các mô-đun khác nhau, trong khi đó trong kiểm thử hệ thống toàn bộ hệ thống được kiểm thử cả về chức năng và yêu cầu hệ thống để kiểm tra hành vi của hệ thống ở các cấp độ khác nhau.

Phương pháp tiếp cận kiểm thử  (Testing Approach): Nó có hai loại, phương pháp tiếp cận từ trên xuống và từ dưới lên. Trong phương pháp tiếp cận từ trên xuống, các thành phần cấp cao nhất được kiểm thử đầu tiên đi xa hơn xuống các cấp thấp hơn, trong khi ở dưới lên tiếp cận các thành phần thấp nhất được thử nghiệm đầu tiên tiến dần tới mức cao hơn

Trường hợp kiểm thử (Test Case): Một trường hợp kiểm thử là một tập hợp các điều kiện được sử dụng để xác định xem một ứng dụng đang làm việc tốt hay không. Trường hợp kiểm thử có thể là tích cực hay tiêu cực. Trường hợp kiểm thử tích cực được thiết kế để kiểm tra xem ứng dụng có hoạt động như cách mà nó được dự kiến sẽ hoạt động hay không, trong khi các trường hợp kiểm thử tiêu cực được thiết kế để kiểm tra cách hệ thống phản ứng với chuỗi bất thường của các hành động hoặc giá trị bất ngờ. Một yêu cầu kiểm thử trong một ứng dụng phải có ít nhất hai trường hợp kiểm thử nghiệm – một tích cực và một tiêu cực.

Làm thế nào để trở thành một kỹ sư kiểm thử giỏi

  • Mở rộng kiến thức và sự hiểu biết của bạn về lĩnh vực này, chiều sâu tư duy và sáng tạo.
  • Đảm bảo rằng tất cả các vấn đề được xác định và xử lý trong giai đoạn đầu để tiết kiệm thời gian.
  • Phát triển kỹ năng phân tích và kỹ thuật của bạn, và cố gắng tìm hiểu những mẹo và thủ thuật mới giúp bạn nổi bật trong đám đông.
  • Kiểm tra các hệ thống để tìm ra càng nhiều lỗi, cho kết quả tốt nhất. Cải tiến quy trình bằng cách đưa ra các đề xuất.
  • Bạn cần phải có kỹ năng ngoại giao tuyệt vời và duy trì tốt các mối quan hệ với các kỹ sư lập trình. Mục đích chính là để phát triển một sản phẩm chất lượng.
  • Tìm kiếm lỗi trong một hệ thống đòi hỏi phải có sự tò mò, một con mắt phê phán, giao tiếp tốt với đội ngũ phát triển, và kinh nghiệm.
  • Nếu công việc không chạy, khắc phục sự cố để tìm hiểu lý do. Điều này sẽ phát triển sự tự tin của bạn và giúp bạn tiến về phía trước trong sự nghiệp của bạn.
  • Phát triển kỹ năng giao tiếp của bạn và lịch thiệp. Báo cáo các lỗi cho kỹ sư lập trình một cách xây dựng.
  • Học cách làm việc độc lập. Điều này sẽ giúp bạn có hiệu quả hơn trong việc phát hiện lỗi.
  • Hãy tổ chức và duy trì các tập tin và tài liệu của bạn để ghi lại những phát hiện của bạn.
  • Cập nhật những công cụ kiểm thử và kỹ thuật mới nhất.
  • Học từ những sai lầm của bạn để bạn không lặp lại chúng trong tương lai.

Mẹo và thủ thuật cho các bạn mới bắt đầu

  • Bạn cần phải nắm rõ các đặc tả trước khi bạn bắt đầu kiểm thử.
  • Đừng kiểm thử một hệ thống mà bạn không biết các yêu cầu. Lý do đơn giản là- bạn không biết những gì cần phải có trong hệ thống và những gì không nên có!
  • Nếu bạn thực sự cần kiểm thử một hệ thống mà bạn không có các yêu cầu, bạn hãy sử dụng monkey testing. Bạn không biết gì về hệ thống! Vì vậy, bất cứ điều gì bạn nghĩ một cách hợp lý có thể là một lỗi tiềm năng trong hệ thống, bạn có thể báo cáo.
  • Bạn cần phải biết yêu cầu về phần mềm và phần cứng của ứng dụng mà bạn đang làm việc.
  • Đừng phỏng đoán bất cứ điều gì trong khi kiểm thử một ứng dụng cụ thể.
  • Thực hiện theo các chuẩn mực của công ty bạn về các công cụ và thủ tục kiểm thử, bảo trì tập tin, tài liệu, .v.v
  • Kiểm tra các ứng dụng theo quan điểm của khách hàng.
  • Việc kiểm thử một hệ thống một cách toàn bộ / hoàn toàn là không thể vì các yêu cầu có thể bị thay đổi bất cứ lúc nào.

Có cần thiết phải tìm hiểu công cụ kiểm thử tự động?

Lĩnh vực kiểm thử phần mềm đang phát triển với một tốc độ ngày càng cao hơn. Mặc dù kiểm thử thủ công giúp tìm thấy lỗi tuy nhiên nó có thể tốn nhiều thời gian. Vì vậy, một kiến thức tốt về các công cụ kiểm thử tự động sẽ giúp bạn kiểm thử các ứng dụng nhanh hơn và đáng tin cậy hơn. Bạn càng biết về các công cụ kiểm thử tự động, cơ hội tốt hơn để bạn đánh dấu sự hiện diện của bạn trong ngành công nghiệp này hơn những người khác. Việc này cũng phụ thuộc vào loại dự án bạn đang làm việc. Nếu công việc của bạn đòi hỏi bạn phải hiểu và sử dụng một công cụ kiểm thử tự động, bạn sẽ phải tìm hiểu nó.

Kiểm thử phần mềm là một lĩnh vực rộng lớn với cơ hội nghề nghiệp phong phú. Tuy nhiên, biết khả năng, sở thích của bạn, và kỹ năng trước khi quyết định đi sâu vào trong lĩnh vực này.

VNTesters tổng hợp và biên dịch từ Buzzle

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

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

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

Vuejs data flow – tam chủng thần khí cần biết

Vuejs data flow – tam chủng thần khí cần biết

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

DEV: Thưa bụt, con đang học Vuejs, bụt biết Vuejs data flow không?

BỤT: Tao là thần chứ có phải “đi ven lốp bờ” như m đâu. Biết thế đ** nào được!

DEV: Nhưng mà con muốn học, muốn trở thành dev lương 3k

BỤT: Ta không giúp được, nhưng có 3 món bảo vật (gọi là tam chủng thần khí) có thể giúp con. Nhớ học và thực hành nhuần nhuyễn từng loại thì kiểu gì cũng có người yêu (nhầm, lương cao).

Tìm việc làm VueJS lương cao cho bạn

1. Props và emit

1.1 Ai cũng nên dùng

Một Vuejs Application tất nhiên sẽ chia ra làm nhiều component. Component cha, component con. Trường hợp số lượng component không quá nhiều Emit và Props là hai món bảo vật nên biết cách để sử dụng:

  • Dễ hiểu, dễ sử dụng
  • Khuyến khích sử dụng cho các component quan hệ cha – con (parent – child)
  • Không nên sử dụng khi Application có quan hệ rối rắm
  • Bắt buộc phải biết sử dụng khi học Vuejs

Trong Vuejs, data flow dễ nắm bắt nhất giữa các component là emit và props. Props sử dụng để pass data giữa các component khác nhau. Trong khi đó emit được dùng để gửi các event (có thể kèm data) từ component con lên component cha.

  Cách sử dụng các plugins jQuery trong VueJS
  Call API trong VueJS theo cách thông minh nhất

1.2 Mục sở thị bảo vật

Props và Emit trong Vuejs data flow có thể được hiện thực hóa như sau:

// Component account nhận vào props username
// Do nhận prop nên chỗ này in ra 2000$
<template>
<div id='salary-info'>
{{salary}}
</div>
</template>

<script>
export default {
props: ['salary']
}
</script>
// Component cha gửi qua prop user name
// Chỗ dấu : được hiểu là gửi props
<template>
<div>
<salary-info :salary="user.salary" />
</div>
</template>

<script>
import SalaryInfo from "@/components/SalaryInfo.vue";

export default {
components: {
SalaryInfo
},
data() {
return {
user: {
salary: '2000$'
}
}
}
}
</script>

Đấy, nhẹ nhàng dễ dàng như đẩy xe hàng dưới 500kg

2. EventBus

2.1 Lợi hại không kém

Nhắc tới EventBus thì chỉ cần nhớ trong đầu cái slogan bất tử “From Anywhere to Anywhere”. Gửi tới đâu cũng được.

Sử dụng: Chỉ khi có nhiều hơn 15,20 component với flow phức tạp. Quan hệ parent child phức tạp. Nghe tên thôi là đủ biết bảo bối này cũng khá mạnh.

Nếu cần emit bất cứ sự kiện nào từ component con của parent 1 đến child component của parent 100 vẫn có thể dùng EventBus. Không quá khó để nhớ và hiểu cách sử dụng, EventBus như tuyến Bus nhanh BRT đi khắp Hà Nội, chuyên chở event tới tất cả các component.

Tuy nhiên, thực tế trong quá trình làm việc mình thấy có hai lưu ý nhỏ như sau:

  • Chỉ sử dụng khi các event gửi từ child đến parent lớn hơn 4 cấp. (Emit lúc đó sẽ gây rối rắm)
  • Khuyến khích sử dụng khi Component tree không quá 5 cấp (Nếu số lượng component không lớn – Vuex khó hiểu, rối source)

2.2 Mục sở thị bảo vật

EventBus trong Vuejs data flow có thể được hiện thực hóa như sau:

// Eventbus.js
// Đăng kí sử dụng eventbus
import Vue from 'vue';
export const EventBus = new Vue();
// Component cha gửi qua prop user name
<template>
<div class="pleeease-click-me" @click="emitGlobalClickEvent()"></div>
</template>

<script>
// Import the EventBus we just created.
import { EventBus } from './event-bus.js';

export default {
data() {
return {
clickCount: 0
}
},

methods: {
emitGlobalClickEvent() {
this.clickCount++;
// Send the event on a channel (i-got-clicked) with a payload (the click count.)
// Sử dụng ở đây, arg1 là name, 2 là value
EventBus.$emit('i-got-clicked', this.clickCount);
}
}
}
</script>
}
</script>
// Ở chỗ js khác thì lấy về, không có gì khác
import { EventBus } from './event-bus.js';

// Listen for the i-got-clicked event and its payload.
// Bắt sự kiện on listen
EventBus.$on('i-got-clicked', clickCount => {
console.log(`Oh, that's nice. It's gotten ${clickCount} clicks! :)`)
});

Chi tiết hơn về sử dụng EventBus có thể xem thêm ở Digital Ocean – Creating a Global Event Bus with Vue.js

3. Vuex

3.1 Thật sự quyền năng

Nhắc tới Vuex cũng chỉ cần nhớ tới 3 chữ “Our state manager“. Vuex là nơi chứa tất cả state của một application.

Nói “Quyền năng” bởi vì Vuex như là kho chứa tổng, chứa tất cả các state của các component. Ngoài “Quyền năng”, Vuex còn được support tận răng với Vue dev tools extension. Xem mọi thứ đang diễn ra trong kho chứa như thế nào?

3.2 Mục sở thị bảo vật

Vuex trong Vuejs data flow có thể được hiện thực hóa như sau:

Lời khuyên là đối với các application phức tạp. Việc cập nhật state của các component diễn ra liên tục thì nên sử dụng Vuex.

// Đăng kí store
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
// Lưu state biến count, initial là 0
state: {
count: 0
},
// Lúc nào state thay đổi
mutations: {
increment (state) {
state.count++
}
}
})
// Store không phải muốn đụng là đụng
// Phải commit các kiểu hẳn hoi
store.commit('increment')
// Lưu vào rồi thì cứ this.store là lấy ra thôi
console.log(store.state.count) // -> 1

Một khi ứng dụng trở nên phức tạp với nhiều commponent. Sử dụng emit sẽ khiến component trở nên rối rắm, khó quản lý. Việc truyền dữ liệu giữa các component lại càng khó khăn hơn. Props trở nên quá tải, không thể theo dõi.

Tuy nhiên, với bảo vật thứ ba này, chỉ với mutations, mapGetter, mapActions, việc cập nhật state và data vào component đã trở nên đơn giản hơn nhiều.

  • Cập nhật state và data ở bất cứ đâu
  • Truy xuất value từ store dễ dàng với mapGetter
  • Đồng bộ hóa dữ liệu xuyên suốt trong flow của application

4. Nên sử dụng cái nào trong Vuejs data flow?

Không có bảo vật nào được ưu tiên cao nhất sử dụng trong Vuejs Data flow. Thật sự mỗi bảo vật có một sức mạnh riêng. Có thể chứng tỏ bản thân trong từng tình huống cụ thể.

Yêu cầu chung là phải nắm rõ tường tận các cách này. Một số lưu ý khi sử dụng đúc kết ra như sau:

4.1 Props và emit

  • Sử dụng tốt trong quan hệ trực tiếp giữa parent và child component
  • Không sử dụng được cho các component không có relationship
  • Vue Application không quá phức tạp, không có nhiều component

4.2 Eventbus

  • Như một chuyến xe bus, chuyên chở khắp nơi
  • Sử dụng cho application lớn hơn một cấp
  • Nếu có xử lý active, notification giữa các component không có relation và cách xa, có thể sử dụng

4.2 Vuex

  • Sử dụng cho các application từ medium cho tới large.
  • Nếu phức tạp và có sử dụng value từ API -> nên sử dụng.
  • Kết hợp tốt giữa mutations và actions cho ra kết quả hoàn hảo

5. Tham khảo

Hết rồi. Cảm ơn anh em đã đọc bài. Nhớ like và share Facebook page nha!

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 Developer hấp dẫn trên TopDev

NGINX Amplify là gì? Giới thiệu về NGINX Amplify

NGINX Amplify là gì? Giới thiệu về NGINX Amplify

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

Nginx Amplify là hệ thống giám sát hoạt động của server và hỗ trợ việc cấu hình cho nền tảng nginx. Nó là 1 module cài vào Nginx kết nối với api được cung cấp bởi nginx.com để bạn dể dàng theo dõi hoạt động của hệ thống, nhận thông báo về  tình trạng cấu hình trên Nginx và các đề nghị tối ưu dành cho Nginx. Tính năng khá giống với Elasticsearch, Logstash và Kibana (ELK Stack). Cụ thể mình sẽ tìm hiểu rõ hơn bên dưới với các tính năng có trong Nginx Amplify và hướng dẫn cài đặt.

  Hướng dẫn xử lý lỗi 502 Bad Gateway Nginx
  Cách Engineer Nhật Bản thực hiện test như thế nào

Nginx Amplify là một công cụ để giám sát cơ sở hạ tầng phân phối cho ứng dụng của bạn.Với nginx Amplify bạn có thể chủ động xác định các vấn đề trước khi chúng ảnh hưởng lớn đến bất kỳ người dùng đang sử dụng ứng dụng của bạn, cũng như:

  • Hiển thị trực quan chính xác tình trạng server như máy chủ bị quá tải hoặc tiềm năng bị tấn công DDoS
  • Cải thiện và tối ưu hóa hiệu suất Nginx với lời khuyên và gợi ý thông minh
  • Nhận thông báo khi có lỗi xảy ra trong quá trình vận hành và cung cấp các ứng dụng của bạn
  • Dự đoán về khả năng và hiệu suất hoạt động cho các ứng dụng web
  • Theo dõi cùng lúc nhiều hệ thống chạy Nginx

Các tính năng nổi bật NGINX Amplify

1. Biểu đồ

Biểu đồ hiển thị hệ thống NGINX AmplifyBiểu đồ hiển thị hệ thống NGINX Amplify

Với dashboard trực quan bạn dễ dàng, nhanh chóng chọn xem các biểu đồ số liệu ngay lập tức theo khung giờ mình muốn về số liệu hoạt động CPU, RAM, Bộ nhớ ổ đĩa, băng thông,…

2. Báo cáo

Báo cáo hệ thống NGINX AmplifyBáo cáo hệ thống NGINX Amplify

Với bảng báo cáo hệ thống này bạn sẽ khám phá được nhiều hơn kiến thức về Nginx với những đề nghị về cấu hình để cải thiện hiệu suất, tốc độ, và bảo mật các Server (cơ sở hạ tầng) dùng Nginx của bạn. Nó cho bạn biết chính xác vấn đề phát sinh ở đâu, tại sao nó là một vấn đề, và cần làm những gì để khắc phục

3. Thông báo thời gian thực

Thông báo thời gian thực NGINX AmplifyThông báo thời gian thực NGINX Amplify

NGINX Amplify cho phép bạn thiết lập thông báo với các tùy chỉnh cho các số liệu được thu thập trong hệ thống. Để bạn có thể nhận thông báo tức thời về các thông tin thiết yếu và các cảnh báo tức thời trong khi giám sát hệ thống của bạn từ đó dể bạn có những bước xử lý kịp thời tiếp theo. Thông báo sẽ gửi qua mail lúc thiết lập cho từng server.

Nếu bạn thấy quan tâm đến NGINX Amplify Agent bạn cần phải đăng ký tài khoản để xem trên giao diện web của Nginx Amplify tại đây và xem cách cài đặt tại đây.

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

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

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

Hiểu đúng về hai bên “cán cân” của một Project Lead

công việc của project lead
Hiểu đúng về hai bên “cán cân” của một Project Lead

Về diễn giả

  • Anh Mai Vui đã có kinh nghiệm hơn 10 năm làm việc trong lĩnh vực phần mềm.
  • Hiện tại anh đang công tác tại công ty Persol Process & Technology Vietnam, trụ sở chính tại Nhật và mình làm việc tại chi nhánh ở TPHCM.
  • Công việc chính là các dự án tuyển dụng nhân sự – “săn đầu người”, dự án được triển khai cho cả khu vực châu Á – Thái Bình Dương ở nhiều quốc gia như Ấn Độ, Malaysia, Indonesia, Singapore.

Anh có thể giới thiệu rõ hơn về công ty và công việc của mình được không?

Lĩnh vực hoạt động chính của công ty là phần mềm cung cấp các giải pháp về công nghệ thông tin, cung cấp các phần mềm ứng dụng cho thị trường, chủ yếu là thị trường Nhật Bản. Hiện nay công ty cũng đã khai phá thêm các thị trường khác ở châu Âu. Bên cạnh đó công ty cũng cung cấp các giải pháp công nghệ thông tin một cách toàn diện ở các lĩnh vực tài chính, quản lý doanh nghiệp.

Anh có thể chia sẻ đôi chút về dự án anh và team đang thực hiện không? Chẳng hạn như những dự án, kỷ niệm vui nào khiến cả team phải “vùi đầu” vào?

Hiện anh đang làm dự án về tuyển dụng nhân sự, mục đích chính là để tư vấn viên có thể tìm được những ứng viên phù hợp cho job của mình. Dự án đã được triển khai và hoạt động ở khá nhiều nước.

Dĩ nhiên là dự án nào cũng sẽ có điểm phức tạp riêng, dự án này không khó bằng dự án trước đây mình làm là thiết kế hệ thống kiểm soát các thiết bị trong tòa nhà cho một công ty ở Mỹ. Dự án này không quá khó nhưng đòi hỏi tính bảo mật rất cao. Từ lúc sản phẩm bắt đầu cho đến khi nó hoàn thiện, sau 3 năm hoạt động nó nằm trong top 3 sản phẩm bán chạy của thị trường Mỹ.

Anh có sử dụng mô hình nào để quản lý công việc của team không?

Mình đã áp dụng mô hình scrum để quản lý công việc trong hơn 5 năm rồi. Những lợi ích khi quản lý bằng mô hình scrum giúp mình dự đoán được khoảng thời gian làm việc của một dự án, mình sẽ biết được thời điểm cần hoàn thiện của mỗi task, assign tasks cho các member rất rõ ràng. Chỗ nào, vấn đề nào đang gặp khó khăn, mình có cần join vào để giúp các bạn hay không, tất cả các tính năng giúp project của mình hoạt động rất trôi chảy. Mình sẽ không gặp vấn đề mà các công ty outsourcing hay gặp là release, khiến mình chậm tiến độ trong việc bàn giao sản phẩm cho khách hàng.

Ở góc nhìn cá nhân cùng kinh nghiệm của bản thân, anh có nghĩ Machine Learning là lĩnh vực tiềm năng khi làm outsource không?

Đây là khái niệm đang rất phổ biến. Công nghệ phần mềm đang phát triển mạnh, thế giới đã phát triển machine learning rất nhiều rồi trong khi ở Việt Nam mình chỉ mới bắt đầu thôi, mình tin là khoảng 2, 3 năm nữa thôi nó sẽ nở rộ ở Việt Nam. Machine Learning không khó nhưng đòi hỏi sự đón nhận từ người dùng thì mới có thị trường để phát triển.

Hiện tại nhu cầu cho các sản phẩm có ứng dụng machine learning ở Việt Nam như thế nào so với quốc gia khác?

Theo mình thì hiện tại machine learning vẫn chưa được ứng dụng nhiều do nhiều nguyên nhân:

  • Thứ nhất là lực lượng làm việc trong mảng machine learning chưa cao, chủ yếu vẫn là nghiêng về lĩnh vực làm việc truyền thống.
  • Thứ hai là thị trường cần các sản phẩm machine learning này chưa nhiều, trước tiên là cần có phần mềm chuyên biệt. Hy vọng sắp tới Việt Nam sẽ có nhiều sự thay đổi hơn để áp dụng machine learning nhiều hơn vào lĩnh vực phần mềm.

Đơn cử như hệ thống thu phí trên đường cao tốc, với một phần mềm bình thường chắc chắn sẽ không thể nào làm được. Vì khi chụp hình ở tốc độ cao do xe không dừng để lấy được biển số sẽ rất khó nên mình phải làm để có thể ứng dụng machine learning vào đọc hình ảnh. Kể cả là chữ số bị nhòe nhưng máy vẫn nhận diện được biển số vì đã được học rồi.

Hoặc chẳng hạn trong lĩnh vực ngân hàng, hiện tại mỗi người đều có rất nhiều thẻ ngân hàng, nếu trong thời gian tới mình có thể ứng dụng machine learning vào để rút tiền hay thao tác bằng cách nhận diện gương mặt sẽ đơn giản hơn rất nhiều. Theo mình biết hiện nay đang có một ngân hàng tại Việt Nam đang triển khai hệ thống này.

Hiện nay team anh có đang outsourcing ứng dụng nào liên quan đến machine learning không?

Hiện nay ở team Việt Nam thì vẫn chưa có, còn site bên Nhật đã có ứng dụng rồi.

Hiện tại anh đang sử dụng công nghệ nào trong quá trình làm việc?

May mắn cho mình là từ lúc ra trường đến giờ mình không phải chuyển đổi công nghệ nhiều, chủ yếu là sử dụng DockNET. Mình tiếp cận DockNET từ lúc còn là sinh viên, ra trường đi làm và cho đến giờ vẫn chỉ sử dụng DockNETthôi. Đây vừa là ưu điểm cũng vừa là nhược điểm. Ưu điểm là mình sẽ hiểu biết rất sâu về công nghệ đó nhưng hạn chế là ngoài DockNET, mình sẽ không biết nhiều đến các ứng dụng khác.

Theo anh, sinh viên mới ra trường nên học rộng hay học sâu (về các ngôn ngữ lập trình, công nghệ)?

Theo quan điểm của anh thì nên học sâu. Nếu em muốn biết nhiều thì trong quá trình em đi làm việc ở công ty em sẽ học được nhiều thứ hơn. Với dự án này em làm công nghệ này, dự án kia em làm công nghệ kia thì tự động trong quá trình làm việc em sẽ được tích lũy nhiều công nghệ khác nhau, kiến thức về phần mềm sẽ rộng hơn.

Còn nếu không học sâu em sẽ không có nền tảng để tự học được. Mà với ngành công nghệ thông tin, nhất là lĩnh vực công nghệ phần mềm, nếu em không tự học được thì tự động em bị đào thải. Vì công nghệ phát triển liên tục và không ai dạy em những điều đó cả.

Anh có lời khuyên nào về career path cho các bạn học lập trình mới ra trường hoặc có kinh nghiệm 2 – 3 năm không?

Theo anh thì khi mới ra trường các bạn nên tham gia vào những công ty nào mang tính thách thức một chút, đòi hỏi khả năng sáng tạo nhiều hơn thay vì chỉ làm theo những công việc đã được setup sẵn. Vì nó sẽ khiến bạn không thể nâng cao được kỹ năng của mình.

Bạn nên chọn những công ty có nhiều project để có cơ hội và môi trường để nâng cao kỹ năng của mình, đồng thời sẽ được học những công nghệ mới. Vì có nhiều dự án sẽ đòi hỏi các công nghệ mới để áp dụng và thực hiện.

Nếu theo career path như anh gợi ý thì sau bao lâu có thể trở thành Project Lead?

Điều này phụ thuộc khá nhiều vào kỹ năng cá nhân. Trước tiên là bạn cần có nền tảng cơ bản về lập trình, sau đó bắt đầu vào làm ở các dự án trong khoảng 2 – 3 năm, lúc này bạn đã có background khá tốt về mặt công nghệ rồi. Nhờ vậy bạn sẽ có kỹ năng làm việc tốt, khả năng quản lý task cũng khá ổn và học hỏi thêm được các kinh nghiệm từ leader và những người đi trước. Với một lộ trình như thế thì anh nghĩ em sẽ mất khoảng 5 năm thật sự cố gắng làm việc, học hỏi và nghiên cứu để lên vị trí Project Lead.

Theo anh kỹ năng quản lý là điều cần có cho một Project Lead tốt hay chỉ cần kỹ năng chuyên môn tốt la đủ?

Thật ra để có thể làm một project lead tốt chắc chắn sẽ đòi hỏi em ở 2 khía cạnh là kỹ năng cứng và kỹ năng mềm. Có thể bạn nghĩ rằng khi mình đã là lead thì không cần phải làm nữa mà chỉ cần bàn giao và giám sát tasks của mọi người là được thì không hẳn. Bạn vẫn cần phải biết về technical vì sẽ có các vấn đề phát sinh trong project mà bạn cần tìm ra hướng giải quyết, phải dự đoán được có khả năng xảy ra bug hay không, và phải fix bug như thế nào.

Do đó, điều kiện cần là một leader phải giỏi về technical và điều kiện đủ chính là kỹ năng mềm. Bạn phải có kỹ năng quản lý tasks tốt để có thể bàn giao task cho người phù hợp nhất, để đến khi kết thúc thì các task có thể bổ trợ cho nhau và hoàn thành được dự án.

Trong quá trình làm outsourcing với khách hàng, anh có kỷ niệm hay bài học đáng nhớ nào không?

Làm outsourcing thật sự sẽ không được “êm đềm” như khi tạo ra product cho chính công ty của mình. Outsourcing đồng nghĩa với việc sẽ có rất nhiều dự án cần phải chuẩn bị và áp lực về deadline cũng rất lớn. Đôi khi sẽ gặp phải trường hợp đã đến deadline trả product nhưng vẫn chưa hoàn thành project do bị bug. Nên mình phải vận động các staff tăng ca cùng mình để giải quyết.

Việc OT chắc chắn sẽ ảnh hưởng nhiều đến vấn đề cá nhân của các devs, nên là một người lead bạn cũng cần có kỹ năng để thuyết phục nhân viên cùng giải quyết vấn đề với mình. Mình cũng từng gặp trường hợp này khi phải làm việc đến 3 giờ sáng để hoàn thành dự án và release kịp tiến độ vào sáng hôm sau. Đôi khi làm dự án mình phải chấp nhận những đánh đổi và hi sinh như thế.

Anh có thể chia sẻ kinh nghiệm phỏng vấn vị trí Project Leader?

Trước tiên là bạn cần chịu khó chỉnh sửa lại CV chỉnh chu hơn, update lại những thông tin gần nhất mà bạn đang làm, ưu tiên những dự án mới để người phỏng vấn có thể dễ dàng quan sát được kinh nghiệm của bạn. Và tự tin là một trong những yếu tố quan trọng của buổi phỏng vấn thành công.

Bên cạnh đó, bạn cũng nên tìm hiểu sơ qua về thông tin công ty và vị trí đang ứng tuyển đòi hỏi những kỹ năng gì, tự đánh giá xem mình có thể đáp ứng được những kỹ năng đó không. Tốt nhất nên từ 70% trở lên, vì nếu dưới 70% thì sẽ khó khăn hơn cho bạn vì với vị trí leader, những kỹ năng đòi hỏi rất cao và việc phỏng vấn tuyển chọn cũng rất kỹ.

Ngành CNTT chưa bao giờ hết nóng, song các doanh nghiệp vẫn gặp khó khăn trong việc tuyển dụng lập trình viên phù hợp. Theo anh nguyên nhân của vấn đề nằm ở đâu?

Lượng nhân lực làm việc trong lĩnh vực công nghệ phần mềm của Việt Nam hiện tại rất nhiều và số lượng trường đại học đào tạo ngành CNTT cũng rất lớn, tuy nhiên chất lượng đầu ra lại không cao. Có nhiều lý do khác nhau cho vấn đề này, thứ nhất là không có nhiều thời gian để học chuyên sâu vào một lĩnh vực vì quá nhiều môn học dàn trải. Thứ hai vì người học chưa thật sự chăm chỉ tự research để tìm hiểu và nghiên cứu thêm, và nguyên nhân thứ 3 có thể là trở ngại về tiếng Anh vì đa phần tài liệu của ngành CNTT đều là tiếng Anh.

Do đó, khi tìm việc, các bạn sẽ không được nhà tuyển dụng đánh giá cao vì không thật sự hiểu rõ một lĩnh vực như những gì họ mong đợi. Tùy theo nhu cầu tuyển fresher hay senior của công ty mà ứng viên có thể lựa chọn để phù hợp nhất với khả năng của mình.

Tuy nhiên, đa phần các công ty outsourcing sẽ không ưu tiên fresher vì sẽ mất thời gian để training trong khi dự án phải được hoàn thành chỉ trong vài tháng. Mĩnh nghĩ đó là một số nguyên nhân khiến dù lượng nhân lực khá lớn nhưng việc tuyển dụng vẫn gặp khó khăn.

Hệ thống 23 mẫu Design Patterns

Hệ thống 23 mẫu Design Patterns

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

Hệ thống các mẫu design pattern hiện có 23 mẫu được định nghĩa trong cuốn “Design patterns Elements of Reusable Object Oriented Software” (PDF).

Các tác giả của cuốn sách là Erich GammaRichard HelmRalph Johnson và John Vlissides, hay còn được biết đến với các tên “Gang of Four”hay đơn giản là “GoF“. Hệ thống các mẫu này có thể nói là đủ và tối ưu cho việc giải quyết hết các vấn đề của bài toán phân tích thiết kế và xây dựng phần mềm trong thời điểm hiện tại.

  30 tiện ích Chrome cho designer và dev
  9 công cụ siêu tiện lợi cho cả Developer và Designer

Hệ thống các mẫu design pattern được chia thành 3 nhóm: nhóm Creational (5 mẫu), nhóm Structural (7 mẫu) và nhóm Behavioral (11 mẫu).

Danh sách hệ thống 23 mẫu Design Patterns

STT Tên Mục đích
Nhóm Creational (nhóm kiến tạo)
1 Abstract Factory Cung cấp một interface cho việc tạo lập các đối tượng (có liên hệ với nhau) mà không cần qui định lớp khi hay xác định lớp cụ thể (concrete) tạo mỗi đối tượng
Tần suất sử dụng: cao
2 Builder Tách rời việc xây dựng (construction) một đối tượng phức tạp khỏi biểu diễn của nó sao cho cùng một tiến trình xây dựng có thể tạo được các biểu diễn khác nhau.
Tần suất sử dụng: trung bình thấp
3 Factory Method Định nghĩa Interface để sinh ra đối tượng nhưng để cho lớp con quyết định lớp nào được dùng để sinh ra đối tượng Factory method cho phép một lớp chuyển quá trình khởi tạo đối tượng cho lớp con.
Tần suất sử dụng: cao
4 Prototype Qui định loại của các đối tượng cần tạo bằng cách dùng một đối tượng mẫu, tạo mới nhờ vào sao chép đối tượng mẫu này.
Tần suất sử dụng: trung bình
5 Singleton Đảm bảo 1 class chỉ có 1 instance và cung cấp 1 điểm truy xuất toàn cục đến nó.
Tần suất sử dụng: cao trung bình
Nhóm Structural (nhóm cấu trúc)
6 Adapter Do vấn đề tương thích, thay đổi interface của một lớp thành một interface khác phù hợp với yêu cầu người sử dụng lớp.
Tần suất sử dụng: cao trung bình
7 Bridge Tách rời ngữ nghĩa của một vấn đề khỏi việc cài đặt ; mục đích để cả hai bộ phận (ngữ nghĩa và cài đặt) có thể thay đổi độc lập nhau.
Tần suất sử dụng: trung bình
8 Composite Tổ chức các đối tượng theo cấu trúc phân cấp dạng cây; Tất cả các đối tượng trong cấu trúc được thao tác theo một cách thuần nhất như nhau.
Tạo quan hệ thứ bậc bao gộp giữa các đối tượng. Client có thể xem đối tượng bao gộp và bị bao gộp như nhau -> khả năng tổng quát hoá trong code của client -> dễ phát triển, nâng cấp, bảo trì.
Tần suất sử dụng: cao trung bình
9 Decorator Gán thêm trách nhiệm cho đối tượng (mở rộng chức năng) vào lúc chạy (dynamically).
Tần suất sử dụng: trung bình
10 Facade Cung cấp một interface thuần nhất cho một tập hợp các interface trong một “hệ thống con” (subsystem). Nó định nghĩa 1 interface cao hơn các interface có sẵn để làm cho hệ thống con dễ sử dụng hơn.
Tần suất sử dụng: cao
11 Flyweight Sử dụng việc chia sẻ để thao tác hiệu quả trên một số lượng lớn đối tượng “cở nhỏ” (chẳng hạn paragraph, dòng, cột, ký tự…).
Tần suất sử dụng: thấp
12 Proxy Cung cấp đối tượng đại diện cho một đối tượng khác để hỗ trợ hoặc kiểm soát quá trình truy xuất đối tượng đó. Đối tượng thay thế gọi là proxy.
Tần suất sử dụng: cao trung bình
Nhóm Behavioral (nhóm tương tác)
13 Chain of Responsibility Khắc phục việc ghép cặp giữa bộ gởi và bộ nhận thông điệp; Các đối tượng nhận thông điệp được kết nối thành một chuỗi và thông điệp được chuyển dọc theo chuỗi nầy đến khi gặp được đối tượng xử lý nó.Tránh việc gắn kết cứng giữa phần tử gởi request với phần tử nhận và xử lý request bằng cách cho phép hơn 1 đối tượng có có cơ hội xử lý request . Liên kết các đối tượng nhận request thành 1 dây chuyền rồi “pass” request xuyên qua từng đối tượng xử lý đến khi gặp đối tượng xử lý cụ thể.
Tần suất sử dụng: trung bình thấp
14 Command Mỗi yêu cầu (thực hiện một thao tác nào đó) được bao bọc thành một đối tượng. Các yêu cầu sẽ được lưu trữ và gởi đi như các đối tượng.Đóng gói request vào trong một Object , nhờ đó có thể nthông số hoá chương trình nhận request và thực hiện các thao tác trên request: sắp xếp, log, undo…
Tần suất sử dụng: cao trung bình
15 Interpreter Hỗ trợ việc định nghĩa biểu diễn văn phạm và bộ thông dịch cho một ngôn ngữ.
Tần suất sử dụng: thấp
16 Iterator Truy xuất các phần tử của đối tượng dạng tập hợp tuần tự (list, array, …) mà không phụ thuộc vào biểu diễn bên trong của các phần tử.
Tần suất sử dụng: cao
17 Mediator Định nghĩa một đối tượng để bao bọc việc giao tiếp giữa một số đối tượng với nhau.
Tần suất sử dụng: trung bình thấp
18 Memento Hiệu chỉnh và trả lại như cũ trạng thái bên trong của đối tượng mà vẫn không vi phạm việc bao bọc dữ liệu.
Tần suất sử dụng: thấp
19 Observer Định nghĩa sự phụ thuộc một-nhiều giữa các đối tượng sao cho khi một đối tượng thay đổi trạng thái thì tất cả các đối tượng phụ thuộc nó cũng thay đổi theo.
Tần suất sử dụng: cao
20 State Cho phép một đối tượng thay đổi hành vi khi trạng thái bên trong của nó thay đổi , ta có cảm giác như class của đối tượng bị thay đổi.
Tần suất sử dụng: trung bình
21 Strategy Bao bọc một họ các thuật toán bằng các lớp đối tượng để thuật toán có thể thay đổi độc lập đối với chương trình sử dụng thuật toán.Cung cấp một họ giải thuật cho phép client chọn lựa linh động một giải thuật cụ thể khi sử dụng.
Tần suất sử dụng: cao trung bình
22 Template method Định nghĩa phần khung của một thuật toán, tức là một thuật toán tổng quát gọi đến một số phương thức chưa được cài đặt trong lớp cơ sở; việc cài đặt các phương thức được ủy nhiệm cho các lớp kế thừa.
Tần suất sử dụng: trung bình
23 Visitor Cho phép định nghĩa thêm phép toán mới tác động lên các phần tử của một cấu trúc đối tượng mà không cần thay đổi các lớp định nghĩa cấu trúc đó.
Tần suất sử dụng: thấp
 
Bài viết gốc được đăng tải tại lcdung.top
Có thể bạn quan tâm:
Xem thêm việc làm Developer Hà Nội hấp dẫn trên TopDev

Vue conditional rendering – những điều cần biết

Vue conditional rendering – những điều cần biết

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

Đã làm việc với Vue hay VueJs thì không thể không biết tới conditional rendering (các điều kiện để render trên component).

Tại sao lại cần cái này?. Tất nhiên, không có sao ẩn hiện button, sao xử lý hiện ẩn notification?. Việc nắm chắc các điều kiện render trên component gần như là điều bắt buộc với những lập trình viên Front End muốn nắm chắc về Vue.

Hãy cùng KieBlog tìm hiểu qua về các điều kiện render – Vue conditional rendering nhé!

  3 phút làm quen với Vue.js
  8 câu điều kiện khi render trong React

1. Thường dùng nhất v-if, v-else

1.1 V-if

V-if và V-else là hai điều kiện thường được sử dụng nhất khi nhắc tới Vue conditional rendering. Nếu không có thì không thể nhắc tới từ conditional. V-if có thể sử dụng để render một thẻ div, hoặc cả một code block

// Handle để render một text, một thẻ div
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>

// Cũng có thể sử dụng để handle một block
<h1 v-if="awesome">
<div>K</div>
<div>I</div>
<div>E</div>
<div>B</div>
<div>L</div>
<div>O</div>
<div>G</div>
</h1>
<h1 v-else>Oh no 😢</h1>

V-if cũng có thể được sử dụng đối với cả component (sử dụng với template)

// Nếu !ok cả component chứa teamplate sẽ không render
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>

1.2 V-else

Đã nhắc tới v-if tất nhiên không thể không nhắc tới v-else.

// Nếu !ok cả component chứa teamplate sẽ không render
<div v-if="Math.random() > 0.5">
Now you see me
</div>
<div v-else>
Now you don't
</div>

Nếu các điều kiện render có nhiều và cần các điều kiện render chính xác. Vue cũng hỗ trợ sẵn v-else-if

Đôi khi việc sử dụng quá nhiều v-if và v-else gây ra sự rối rắm, khó chịu và khó maintainance. Nhưng v-else-if chỉ xuất hiện trên Vue từ bản 2.1.0+

// Nếu v-if và v-else không handle nổi các case
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>

2. V-show

Cũng sử dụng nhiều không kém và V-show. Để hiển thị ẩn hiện các item trên component, Vue conditional rendering hỗ trợ khá tốt điều kiện ẩn hiện.

// V-show có thể check một biến boolean hoặc các điều kiện phức tạp
<h1 v-show="ok">Hello!</h1>

Điều kiện check trong v-show luôn luôn là boolean. Biến có thể được khai báo, nhận từ props, hoặc là các điều kiện check để render trên component.

// V-show có thể check một biến boolean hoặc các điều kiện phức tạp
<h1 v-show="ok">Hello!</h1>

3. V-if và V-show

Nhắc tới Vue conditional rendering mà quên không so sánh giữa V-if và V-show thì thật là một sai lầm to lớn.

Hiểu rõ và phân biệt được V-if và V-show là cực kì quan trọng. Dễ để nhớ nhất chỉ có hai dòng khi nói về V-if và V-show như sau:

Generally speaking, v-if has higher toggle costs while v-show has higher initial render costs. So prefer v-show if you need to toggle something very often, and prefer v-if if the condition is unlikely to change at runtime.

Nói chung, V-if có chi phí thay đổi cao (làm nhiều thứ để thay đổi), V-show lại có chi phí khởi tạo ban đầu cao (xem xét sự thay đổi của giá trị). Chính vì thế, sử dụng V-show khi một giá trị nào đó thay đổi thường xuyên và sử dụng V-if khi điều kiện không thay đổi khi chạy.

Chạy ở đây không có nghĩa là trong cả application, nếu component cần load lại với thay đổi giá trị A -> sử dụng V-if (component render lại). Nếu component không reload mà giá trị B thay đổi liên tục (sử dụng V-show) để trigger sự thay đổi đó.

Việc hiểu đúng bản chất và phân biệt được V-show và V-if rất quan trọng. Sử dụng đúng tốt cho cả performance, cả review code. Lợi cả trăm bề.

4. Vue conditional rendering rất quan trọng

Rõ ràng mà nói, nắm chắc các kiến thức cơ bản luôn là điều cần thiết.

Nắm chắc các điều kiện render trên Vue (Vue conditional rendering) sẽ giúp:

  • Sử dụng linh hoạt các điều kiện render.
  • Tăng performance cho application.
  • Xử gọn các điều kiện render rối rắm (khi bussiness phức tạp)

5. Tham khảo

Hết rồi. Cảm ơn anh em đã đọc bài. Nhớ like và share Facebook page nha!

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 Developer hấp dẫn trên TopDev

Giới thiệu về Java Module System

Giới thiệu về Java Module System

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

Java Module System được Java giới thiệu từ Java 9 để giải quyết 1 số vấn đề của Java mà nếu các bạn để ý sẽ thấy nó thật cần thiết như thế nào?

  • Lỗi NoClassDefFoundError: lỗi này xảy ra lúc chương trình Java của chúng ta đang chạy, JVM không thể tìm thấy class cần thiết để execute một tác vụ nào đó. Mặc dù hiện tại chúng ta có các tool để build và fetch tất cả dependencies cần thiết để chạy ứng dụng như Maven, Gradle, … nhưng các bạn có đồng ý với Khanh là: sometime chúng ta cũng gặp lỗi này.
  • Bất kỳ một class hay method nào được định nghĩa với public hoặc protected access modifier trong class Java library mà nằm trong classpath của project của ứng dụng, chúng ta đều có thể access tới chúng. Không có cách nào để các Java library này che giấu chúng, chỉ để các class của các package nằm trong library truy cập được mà thôi.
  • Và còn nhiều vấn đề khác nữa …

Tìm việc Java hấp dẫn lương cao

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java
  11 mẹo đơn giản để tăng hiệu suất Java cấp tốc

Java Module System được giới thiệu để giải quyết những vấn đề trên:

  • Nó giúp chúng ta có thể quản lý được những module nào sẽ được sử dụng trong code của chúng ta, những module này sẽ được include trong quá trình chúng ta build module, bằng cách sử dụng module directive requires.
  • Chúng ta cũng có thể quyết định được ai, package nào được sử dụng code của mình, bằng cách sử dụng từ khóa module directive exports.

Trong bài viết này, mình sẽ giới thiệu với các bạn tổng quan về Java Module System với một ví dụ nhỏ về cách tạo mới một Java module các bạn nhé!

Đầu tiên, các bạn hãy cài đặt JDK từ Java 9 trở đi nhé.

Hãy mở command line rồi nhập dòng lệnh:

java --list-modules

để xem tất cả những module được cung cấp mặc định bởi Java các bạn nhé!

Kết quả:

khanh@Khanhs-MacBook-Pro ~ % java --list-modules
java.base@15
java.compiler@15
java.datatransfer@15
java.desktop@15
java.instrument@15
java.logging@15
java.management@15
java.management.rmi@15
java.naming@15
java.net.http@15
java.prefs@15
java.rmi@15
java.scripting@15
java.se@15
java.security.jgss@15
java.security.sasl@15
java.smartcardio@15
java.sql@15
java.sql.rowset@15
java.transaction.xa@15
java.xml@15
java.xml.crypto@15
jdk.accessibility@15
jdk.aot@15
jdk.attach@15
jdk.charsets@15
jdk.compiler@15
jdk.crypto.cryptoki@15
jdk.crypto.ec@15
jdk.dynalink@15
jdk.editpad@15
jdk.hotspot.agent@15
jdk.httpserver@15
jdk.incubator.foreign@15
jdk.incubator.jpackage@15
jdk.internal.ed@15
jdk.internal.jvmstat@15
jdk.internal.le@15
jdk.internal.opt@15
jdk.internal.vm.ci@15
jdk.internal.vm.compiler@15
jdk.internal.vm.compiler.management@15
jdk.jartool@15
jdk.javadoc@15
jdk.jcmd@15
jdk.jconsole@15
jdk.jdeps@15
jdk.jdi@15
jdk.jdwp.agent@15
jdk.jfr@15
jdk.jlink@15
jdk.jshell@15
jdk.jsobject@15
jdk.jstatd@15
jdk.localedata@15
jdk.management@15
jdk.management.agent@15
jdk.management.jfr@15
jdk.naming.dns@15
jdk.naming.rmi@15
jdk.net@15
jdk.nio.mapmode@15
jdk.sctp@15
jdk.security.auth@15
jdk.security.jgss@15
jdk.unsupported@15
jdk.unsupported.desktop@15
jdk.xml.dom@15
jdk.zipfs@15

Ở đây, Java chia ra 2 loại modules là những standard modules và các non-standard modules. Standard modules là những module hiện thực Java SE  specification với tên module được bắt đầu với java.* còn những non-standard modules là những module nằm trong Java Development Kit được bắt đầu với jdk.*. Các bạn có thể thấy rõ điều này trong phần kết quả sau khi mình execute câu lệnh “java –list-modules” trên.

Mỗi module name sẽ bao gồm tên module và Java version cho chúng ta biết là module đó thuộc về Java version nào. Như các bạn thấy, mình đang sử dụng Java 15 và trong tên module, các bạn có thể thấy, chúng được kết thúc với @15.

Để xem thông tin về một module nào đó, các bạn có thể sử dụng câu lệnh sau:

java --describe-module <module-name>

Ví dụ, để xem thông tin của module java.logging, mình sẽ nhập câu lệnh sau:

java --describe-module java.logging

Kết quả:

Giới thiệu về Java Module System

Thông tin của một module sẽ bắt đầu với tên module, và tiếp theo là những module directives mà mình có đề cập ở trên như exports, requires, provides, … như các bạn thấy trong hình trên. Tất cả những thông tin này sẽ được định nghĩa trong một tập tin tên là module-info.java các bạn nhé!

Mỗi module directive có tác dụng định nghĩa cách mà module sẽ được build và sử dụng, ví dụ như directive exports giúp chúng ta định nghĩa một package nào đó trong module này được access bởi ai hay directive provides có mục đích chỉ rõ module này đang implement một interface nào đó cho các class khác có thể sử dụng, … Chúng ta sẽ tìm hiểu rõ hơn về từng module directive sau các bạn nhé!

Trong output của ví dụ trên, các bạn có thể thấy module java.logging đang sử dụng một dependency là module java.base. Để xem tất cả các dependencies mà một module đang sử dụng, các bạn cũng có thể sử dụng câu lệnh với công cụ jdeps như sau:

jdeps --print-module-deps --module <module-name>

Hoặc có thể viết tắt –module bằng -m như sau:

jdeps --print-module-deps -m <module-name>

Ví dụ, để xem dependencies mà module java.logging đang sử dụng, mình sẽ chạy câu lệnh như sau:

jdeps --print-module-deps -m java.logging

Kết quả:

Giới thiệu về Java Module System

Bây giờ, mình sẽ hướng dẫn cho các bạn cách tạo mới một module cơ bản các bạn nhé!

Đầu tiên, mình sẽ tạo mới một Java project để làm ví dụ.

Mình sẽ sử dụng Spring Tool Suite để làm điều này.

Trong quá trình tạo mới project, các bạn sẽ thấy Spring Tool Suite hỗ trợ chúng ta tạo mới tập tin module-info.java luôn.

Giới thiệu về Java Module System

và:

Giới thiệu về Java Module System

Như mình nói ở trên, đây là tập tin định nghĩa thông tin của một Java Module.

Kết quả:

Giới thiệu về Java Module System

Nội dung của tập tin module-info.java lúc này các bạn có thể thấy như sau:

module huongdanjava.module.example {
}

Bây giờ mình sẽ thêm một class với phương thức sayHello(), return về chữ “Hello World” như sau:

package huongdanjava.module.example;

public class Example {

public String sayHello() {
return "Hello World!";
}

}

Và export package của class này trong tập tin module-info.java để các module khác có thể sử dụng class Example như sau:

module huongdanjava.module.example {
exports huongdanjava.module.example;
}

Bây giờ, mình sẽ tạo mới một Java module project khác:

Giới thiệu về Java Module System

Mình sẽ khai báo module huongdanjava.module.example.test sử dụng module huongdanjava.module.example bằng cách click chuột phải vào project huongdanjava.module.example.test chọn Build Path, xong chọn Configure Build Path… Trong cửa sổ Java Build Path, mình sẽ select module huongdanjava.module.example để sử dụng như sau:

Giới thiệu về Java Module System

Module huongdanjava.module.example.test này sẽ khai báo directive requires tới package huongdanjava.module.example trong tập tin module-info.java để sử dụng class Example của module huongdanjava.module.example:

module huongdanjava.module.example.test {
requires huongdanjava.module.example;
}

và in ra dòng chữ “Hello World” khi chạy chương trình như sau:

package huongdanjava.module.example.test;

import huongdanjava.module.example.Example;

public class Application {

public static void main(String[] args) {
Example e = new Example();
System.out.println(e.sayHello());
}

}

Kết quả khi chạy chương trình này như sau:

Giới thiệu về Java Module System

Nếu bây giờ trong tập tin module-info.java của module huongdanjava.module.example, mình xoá dòng

exports huongdanjava.module.example;

các bạn sẽ thấy Spring Tool Suite báo lỗi class Application ngay như sau:

Giới thiệu về Java Module System

Đó là bởi vì lúc này, chúng ta không cho phép bất kỳ class nào trong các module khác sử dụng package huongdanjava.module.example của module huongdanjava.module.example nữa!

Chúng ta sẽ tìm hiểu thêm về các module directives trong Java Module trong bài viết sau của Hướng Dẫn Java các bạn nhé.

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

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

Xem thêm tuyển dụng ngành it hấp dẫn trên TopDev

Kiểm thử phần mềm là gì? Các phương pháp kiểm thử được áp dụng nhiều nhất

kiểm thử phần mềm
Kiểm thử phần mềm là gì? 10 phương pháp kiểm thử được áp dụng nhiều nhất

Tác giả: Nahla Davies

Kiểm thử phần mềm đang phát triển ngày một nhanh và đòi hỏi người tester phải kịp thời nắm bắt các vấn đề mới nhất.

Tháp công thức kiểm thử phần mềm

Software Testing Pyramid

Công thức kiểm thử phần mềm được mô tả ở trên bao gồm tất cả các giai đoạn của vòng đời phát triển phần mềm (Software Development Life Cycle – SDLC). Nó mở rộng từ unit test ở phần đáy tháp, đến test tích hợp ở phần giữa và kết thúc với test chức năng ở đỉnh.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  5 xu hướng của ngành kiểm thử tự động trong năm 2024

Unit testing là gì?

Kiểm thử đơn vị liên quan đến việc kiểm tra các thành phần code riêng lẻ thay vì toàn bộ code. Nó xác minh hoạt động tính logic của tất cả thành phần để xác định sớm các lỗi trong SDLC, cho phép bạn sửa lỗi trước khi làm tiếp các bước tiếp theo.

Kiểm thử đơn vị được gọi là kiểm thử “hộp trắng”, vì kiểm thử diễn ra với đầy đủ kiến ​​thức về cấu trúc và môi trường của ứng dụng.

Một ví dụ về kiểm thử đơn vị là tạo các đối tượng giả để kiểm tra các phần code, chẳng hạn như các hàm với các biến chưa được tạo.

const mocha = require('mocha')
const chai = require('chai')  // It is an assertion library
describe('Test to check add function', function(){
  it('should add two numbers', function(){
    (add(2,3)).should.equal(5)  //Checking that 2+3 should equal 5 using the given add function
  });
});

Integration testing là gì?

Bước tiếp sau kiểm thử đơn vị là kiểm tra tích hợp, kết hợp các thành phần riêng lẻ và kiểm tra chúng theo nhóm. Kiểm tra tích hợp xác định các vấn đề trong cách các thành phần riêng lẻ tương tác với nhau để xem liệu code có đáp ứng tất cả các thông số kỹ thuật chức năng của nó hay không.

Kiểm thử tích hợp khác với kiểm thử đơn vị ở chỗ nó tập trung vào các mô-đun và thành phần hoạt động độc lập trong mối quan hệ với nhóm tổng thể. Mặt khác, kiểm thử đơn vị tập trung vào việc cô lập các module hoặc thành phần trước khi kiểm thử.

Điểm của kiểm thử tích hợp là để lộ ra bất kỳ vấn đề hoặc lỗ hổng nào trong phần mềm giữa các module hoặc thành phần được tích hợp. Như một ví dụ đơn giản hơn, nếu bạn thực hiện kiểm tra tích hợp của dịch vụ email mà bạn đang xây dựng, bạn sẽ cần kiểm tra các thành phần riêng lẻ như Soạn thư, Lưu bản nháp, Gửi, Chuyển đến Hộp thư đến, Đăng xuất,…

Trước tiên, bạn sẽ thực hiện kiểm tra đơn vị của các tính năng riêng lẻ, sau đó là kiểm tra tích hợp cho từng chức năng có liên quan.

End-to-end Testing – kiểm thử đầu cuối

Việc cuối cùng của testing là kiểm tra end-to-end (E2E). Đúng như tên gọi của nó, kiểm tra end-to-end tái tạo toàn bộ hoạt động của ứng dụng để kiểm tra tất cả các kết nối và phụ thuộc của ứng dụng. Điều này bao gồm kết nối mạng, truy cập cơ sở dữ liệu và các phụ thuộc bên ngoài.

Bạn tiến hành kiểm tra E2E trong môi trường mô phỏng môi trường người dùng thực tế. Bạn có thể xác định mức độ thành công của kiểm tra E2E bằng cách sử dụng một số chỉ số, bao gồm Trạng thái kiểm tra (được theo dõi bằng hình ảnh, chẳng hạn như biểu đồ) và Trạng thái và Báo cáo (phải hiển thị trạng thái thực thi và bất kỳ lỗ hổng hoặc lỗi nào được phát hiện).

Các loại kiểm thử phần mềm

Kiểm tra bảo mật ứng dụng

Một trong những loại kiểm thử quan trọng nhất đối với các ứng dụng là kiểm thử bảo mật ứng dụng. Kiểm tra bảo mật giúp bạn xác định các lỗ hổng ứng dụng có thể bị tin tặc khai thác và sửa chúng trước khi bạn phát hành sản phẩm hoặc ứng dụng của mình.

Có một loạt các bài kiểm tra bảo mật ứng dụng có sẵn cho bạn với các bài kiểm tra khác nhau có thể áp dụng ở các phần khác nhau của vòng đời phát triển phần mềm.

Bạn có thể tìm thấy các loại thử nghiệm bảo mật ứng dụng khác nhau ở các cấp độ khác nhau của kim tự tháp thử nghiệm. Mỗi bài kiểm tra đều có điểm mạnh và điểm yếu riêng. Bạn nên sử dụng các loại thử nghiệm khác nhau cùng nhau để đảm bảo tính toàn vẹn tổng thể của chúng.

Static Application Security Testing (SAST) – Kiểm tra bảo mật ứng dụng tĩnh

Bạn nên sử dụng thử nghiệm bảo mật ứng dụng tĩnh (SAST) sớm trong SDLC. Đây là một ví dụ về kiểm thử đơn vị. SAST phản ánh kiến ​​thức của nhà phát triển, bao gồm thiết kế và triển khai. SAST tự phân tích code thay vì ứng dụng cuối cùng và bạn có thể chạy nó mà không thực sự triển khai code.

Theo định nghĩa của các nhà phân tích bảo mật tại Cloud Defense:

“SAST kiểm tra code của bạn xem có vi phạm các quy tắc bảo mật hay không và so sánh các lỗ hổng được tìm thấy giữa các nhánh nguồn và đích… sau đó bạn sẽ nhận được thông báo nếu các phụ thuộc dự án của bạn bị ảnh hưởng bởi các lỗ hổng mới được tiết lộ.”

Khi bạn đã biết về các lỗ hổng, bạn có thể giải quyết chúng trước khi xây dựng ứng dụng cuối cùng.

Dynamic Application Security Testing (DAST) – Kiểm tra bảo mật ứng dụng động

Một phần khác là kiểm tra bảo mật ứng dụng động (DAST), kiểm tra ứng dụng được biên dịch đầy đủ. Bạn thiết kế và chạy các bài kiểm tra này mà không có bất kỳ kiến ​​thức nào về cấu trúc hoặc code cơ bản.

Bởi vì DAST áp dụng quan điểm của tin tặc, nó được gọi là hộp đen, hoặc bên ngoài trong, thử nghiệm. DAST hoạt động bằng cách tấn công những code đang chạy và tìm cách khai thác các lỗ hổng tiềm ẩn. DAST có thể sử dụng các kỹ thuật tấn công phổ biến như kịch bản trang web chéo và chèn SQL.

DAST được sử dụng muộn trong SDLC và là một ví dụ về thử nghiệm bảo mật tích hợp. Mặc dù chậm (kiểm tra DAST hoàn chỉnh của một ứng dụng hoàn chỉnh có thể mất trung bình từ năm đến bảy ngày), nhưng nó sẽ tiết lộ cho bạn những lỗ hổng có khả năng xảy ra nhất trong các ứng dụng của bạn mà tin tặc sẽ khai thác.

Interactive Application Security Testing – Kiểm tra bảo mật ứng dụng tương tác

Kiểm tra bảo mật ứng dụng tương tác (IAST) là một phương pháp kiểm tra mới hơn kết hợp tính hiệu quả của SAST và DAST trong khi khắc phục các vấn đề liên quan đến các thử nghiệm được thiết lập nhiều hơn này.

IAST tiến hành quét ứng dụng theo thời gian thực liên tục để tìm lỗi và lỗ hổng bảo mật bằng cách sử dụng tác nhân giám sát được chèn. Mặc dù IAST hoạt động trong một ứng dụng đang chạy, nó được coi là một quá trình kiểm tra SDLC sớm.

Bất kể loại phần mềm bạn đang muốn kiểm tra là gì, IAST được sử dụng tốt nhất trong môi trường QA (Đảm bảo chất lượng) hoặc môi trường được thiết kế để tái tạo sản xuất càng gần càng tốt mà không cần khách hàng hoặc khách hàng của bạn thực sự truy cập vào nó.

Compatibility Testing – Kiểm tra khả năng tương thích

Kiểm tra khả năng tương thích đánh giá cách ứng dụng của bạn hoạt động và mức độ an toàn của ứng dụng trên các thiết bị và môi trường khác nhau, bao gồm cả thiết bị di động và trên các hệ điều hành khác nhau.

Kiểm tra khả năng tương thích cũng có thể đánh giá xem phiên bản phần mềm hiện tại có tương thích với các phiên bản phần mềm khác hay không. Thử nghiệm phiên bản có thể quay ngược trở lại hoặc quay về phía trước.

Ví dụ về kiểm tra tính tương thích bao gồm:

  • kiểm tra trình duyệt (kiểm tra để đảm bảo trang web hoặc trang web di động của bạn hoàn toàn tương thích với các trình duyệt khác nhau)
  • thử nghiệm di động (đảm bảo ứng dụng của bạn tương thích với iOS và Android)
  • kiểm tra phần mềm (nếu bạn định tạo nhiều ứng dụng phần mềm cần tương tác với nhau, bạn sẽ cần tiến hành kiểm tra khả năng tương thích để đảm bảo rằng chúng thực sự làm như vậy).

Một số cách thức kiểm thử khác

Performance Testing – Kiểm tra hiệu suất phần mềm

Bạn cần biết ứng dụng sẽ hoạt động như thế nào trong nhiều điều kiện khác nhau và đây là mục đích của việc kiểm tra hiệu suất. Kiểm tra hiệu suất có thể mô hình hóa vấn đề loading và hiệu suất khác nhau để đánh giá mức độ mạnh mẽ của ứng dụng. Loại kiểm tra hiệu suất dựa trên các điều kiện được áp dụng.

Một ví dụ về hiệu suất hoạt động là kiểm tra tốc độ loading, xác định khả năng load tối đa được áp dụng cho hệ thống tại thời điểm xảy ra sự cố.

Mặt khác, một ví dụ khác như kiểm tra khả năng mở rộng, áp dụng tải tăng dần lên hệ thống để đánh giá các cách thích ứng với các ứng suất hệ thống được thêm vào. Và thử nghiệm tăng đột biến đánh giá ảnh hưởng của việc áp dụng các thay đổi tải trọng lớn đột ngột lên hệ thống.

Bạn nên tiến hành kiểm tra hiệu suất trên bất kỳ hệ thống phần mềm nào trước khi đưa nó ra thị trường. Kiểm tra tính ổn định, khả năng mở rộng và tốc độ để bạn có thể xác định những gì cần khắc phục trước khi phát trực tiếp.

Usability Testing – Kiểm tra khả năng phần mềm

Kiểm tra thực tế sử dụng giao diện ứng dụng là một nhiệm vụ quan trọng. Đó là một điều cần hiểu nếu ứng dụng hoạt động như thiết kế. Đó là một điều khác để hiểu xem bản thân thiết kế có được người dùng chấp nhận hay không. Đây là lúc thử nghiệm khả năng sử dụng được đưa vào.

Với kiểm tra khả năng sử dụng, các nhà phát triển có thể đánh giá phản ứng của người dùng đối với các tính năng và chức năng của ứng dụng cụ thể. Điều này bao gồm các tính năng mà bạn có thể biết trước sẽ ít được mong muốn hơn từ góc độ người dùng nhưng cần thiết để bảo mật mạnh mẽ và hoạt động thích hợp (như yêu cầu mật khẩu mạnh).

Kiểm tra khả năng sử dụng không phải là quá nhiều về các vấn đề thẩm mỹ hoặc sửa lỗi ngữ pháp trong bất kỳ văn bản viết nào (mặc dù cả hai vấn đề đó chắc chắn đều quan trọng theo đúng nghĩa của chúng). Thay vào đó là việc người dùng cuối sử dụng ứng dụng đã hoàn thành dễ dàng như thế nào.

Phỏng dịch theo bài viết gốc được đăng tải tại freecodecamp.org

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

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

Lập trình IOS: Triển khai MVVM cho project swift (phần 5): Tạo ứng dụng offline bằng realm database (tiếp theo)

lập trình ios
Lập trình IOS: Triển khai MVVM cho project swift (phần 5)

Bài viết được sự cho phép của tác giả Lê Xuân Quỳnh

Xin chào! Trong bài hôm trước chúng ta đã viết xong lớp base để xử lý realm database rồi. Và bài hôm nay chúng ta sẽ tiến hành viết các service kế thừa từ lớp này để sử dụng realm database 1 cách linh hoạt.

Lớp RealmGithubService của chúng ta sẽ có nhiều vụ sau:

  • Lưu trữ kết quả từ server trả về, cụ thể model GithubSearchResponse
  • Vì với mỗi keyword sẽ có 1 response khác nhau, đồng thời mỗi keyword này tùy vào số page gửi lên mà 1 kết quả khác nhau. Do vậy chúng ta cần lưu response này với khóa chính kết hợp giữa keyword và page
  • Lấy response đã lưu dựa vào keyword đã search và page tương ứng
  • Xóa hay update response
  • Xóa toàn bộ response
  3 sai lầm các iOS Developers thường mắc phải
  5 bài học quí giá về việc phát triển ứng dụng iOS

Từ những phân tích trên, chúng ta tiến hành tạo 1 protocol như sau:

Lập trình IOS: Triển khai MVVM cho project swift (phần 5): Tạo ứng dụng offline bằng realm database (tiếp theo)

Tôi đã đặt tên sát với từng ý mà tôi đã phân tích ở trên. Tuy nhiên để model GithubSearchResponse tích hoạt realm thì chúng ta cần sửa đổi nó. Hãy cùng xem lớp này có gì nhé:

Triển khai MVVM cho project swift
Lớp GithubSearchItem

Đầu tiên là lớp GithubSearchItem:

Dòng 49 tôi sử dụng @objcMembers để chỉ định rằng toàn bộ class này có thể truy cập được từ objective-C. Lý do mà tôi làm vậy vì realm được code từ C++, nên nó cần cho phép objective-C truy cập. Thông thường, C++ không thể truy cập trực tiếp vào swift, mà phải thông qua Objective-C. Cũng như bên java muốn truy cập được C++ thì cần JNI vậy 😝 Sau này bạn nhận ra 1 điều là bạn cũng có thể truy cập React native từ swift thông qua Objective-C.

Tôi muốn class GithubSearchItem vừa có thể dùng để nhận kết quả từ API, vừa có thể dùng nó như realm. Tham lam thật, nhưng chúng ta sẽ làm được điều đó bằng cách chỉnh sửa làm sao nó có thể hoạt động đồng thời cả với realm và codable.

  • dynamic var: Các cột trong bảng của realm bắt đầu bằng từ khóa này. Mỗi 1 thuộc tính là 1 cột. Ở đây tôi tạo ra 4 cột để lưu các thuộc tính này vào bảng của realm, gồm id, name, htmlURL, itemDescription.
  • override class func primaryKey: Hàm trả về khóa chính cho bảng. Một bảng có thể có khóa chính hoặc không nên hàm trả về kiểu optional. Tuy nhiên tôi muốn bảng này phải có khóa chính để sau này cập nhật. Trong SQL, khóa chính là tồn tại để định danh từng dòng trong bảng, duy nhất và khác nhau giữa các dòng. Realm cũng hoạt động tương tự. Ở đây ta thấy id có các tính chất như vậy nên ta chọn làm khóa chính.
  • required init(from decoder: Decoder) throws: Hàm dịch response của API thành object codable. Hàm này có mục đích là để mỗi khi decode xong json -> object, thì tôi tạo luôn realm cho object này. Chính là ở dòng này:
Triển khai MVVM cho project swift
Tạo realm sau khi decode xong

Do vậy bạn có thể dùng cả codable và Object của realm. Xịn chưa 👌🥳

Lập trình IOS: Triển khai MVVM cho project swift (phần 5): Tạo ứng dụng offline bằng realm database (tiếp theo)
  • extension cho codable tương ứng với mỗi thuộc tính và key response tương ứng.

Tiếp theo chúng ta sẽ xem xét class GithubSearchResponse, chứa class GithubSearchItem trên:

Triển khai MVVM cho project swift
class GithubSearchResponse
  • Tương tự, class này cũng chứa các thuộc tính có thể thao tác với realm nên ta define nó là @objcMembers
  • Ở đây, vì nó chứa list GithubSearchItem. Chúng ta bắt buộc phải sử dụng RealmSwift.List vì realm không hỗ trợ array thông thường của swift.
  • Ở đây tôi custom 1 khóa chính tên là keyword. Lý do là class này chưa có khóa chính, và vì với mỗi GithubSearchResponse trả về. Do đó tôi sẽ nghĩ ngay nó là khóa chính. Thứ 2 khóa chính này phụ thuộc vào page gửi lên, do vậy khóa chính sẽ là gộp của keyword và page.
  • Các extension và hàm init tương tự class GithubSearchItem

Vậy là bạn đã hoàn thành xong lớp GithubSearchResponse đảm bảo có thể lưu vào realm database. Việc của chúng ta tiếp theo là viết lớp RealmGithubService.😎

Triển khai MVVM cho project swift
Định nghĩa lớp RealmGithubService
  • Như tôi đã trình bày ở bài trước, thì mọi class muốn kế thừa từ lớp RealmManager, đều phải khóa chính uid để có thể cập nhật hay xóa được. Do vậy bạn sẽ thấy đoạn code sau:
Triển khai MVVM cho project swift
  • Tiếp theo, lớp RealmGithubService kế thừa các hàm của RealmGithubServiceProtocol, chúng ta sẽ định nghĩa các hàm này theo logic của app.
  • saveRepositoryResponse: Hàm này lưu response vào database. Trước khi lưu bạn cần gán keyword để làm khóa chính cho nó:
repoList.keyword = keyword
Triển khai MVVM cho project swift
  • getRepositoryResponse: Hàm này sẽ tiến hành query toàn bộ model trong realm database, sau đó tìm model nào có keyword bằng keyword truyền vào, lấy thằng đầu tiên(first) và trả về.
Triển khai MVVM cho project swift
  • deleteRepositoryResponse: Hàm xóa respone theo keyword. Tôi lấy model có khóa chính là keyword xong gọi hàm xóa. Rất đơn giản!
  • deleteAllRepositoryResponses: Xóa toàn bộ model GithubSearchResponse trong database
Triển khai MVVM cho project swift
  • Ở đây tôi tạo class singleton. Nó đảm bảo trong 1 thời điểm chỉ có duy nhất 1 lớp có thể truy cập tới RealmGithubService.

Mọi thứ đã gần xong, giờ bạn hãy làm 1 cốc cà phê, ra ban công ngắm nhìn phố phường rồi tiếp tục sau nhé.

Chỉnh sửa GithubViewModel

Bây giờ chúng ta hãy tiến hành chỉnh sửa view model này. Hãy xem xét hàm requestRepositories đã có.

  • Mỗi khi tiến hành request API, chúng ta cần kiểm tra xem kết quả với từ khóa đó đã tồn tại trong database hay chưa bằng dòng code sau:
Triển khai MVVM cho project swift

Ở đây bạn sẽ dùng hàm RealmGithubService.shared.getRepositoryResponse(with: keyword) để lấy response tương ứng với keyword gồm language + page. Nếu như nó đã tồn tại thì tiến hành các logic bình thường như sau khi API đã trả về kết quả. Còn nếu không, chúng ta sẽ tiến hành request API như bình thường. Tôi có dùng hàm  print(“from local”) để đánh dấu việc lấy data từ databse, print(“from network”) để đánh dấu lấy data từ server.

Khi request các bạn sẽ thấy log ở Xcode như sau:

Lập trình IOS: Triển khai MVVM cho project swift (phần 5): Tạo ứng dụng offline bằng realm database (tiếp theo)

Thật tuyệt vời, bạn hãy thử tắt luôn mạng internet để check cho chắc cú là nó đã lấy data từ realm nha. Tôi chỉ đùa vậy thôi! 😄

Okey, finally vậy là mọi thứ đã xong. Giờ đây bạn có thể tạo 1 ứng dụng cho phép sử dụng offline như facebook, không cần kết nối internet vẫn có thể thao tác với dữ liệu cũ, để tăng tính trải nghiệm người dùng, làm cho ứng dụng của bạn chuyên nghiệp hơn. Ứng dụng của chúng ta còn đơn giản, chưa nhiều logic phức tạp. Xong chắc hẳn tôi nghĩ bạn cũng đã hiểu được phần nào các làm 1 ứng dụng offline rồi phải hông? Và các bạn thấy được các tiện ích mà realm mang lại. Xin chào và hẹn gặp lại!😘😍

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

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

Xem thêm Việc làm ios, việc làm database hấp dẫn trên TopDev

                                Tuyển dụng swift lương cao mới nhất trong tháng

Xây dựng nội dung trang HTML

Xây dựng nội dung trang HTML

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

Nội dung là phần quan trọng nhất của trang HTML, đây chính là phần người dùng có thể đọc được khi xem các trang web trên trình duyệt. Trong nội dung trang HTML có thể có rất nhiều các thành phần như  các tiêu đề, các đoạn nội dung, hình ảnh, liên kết, các bảng thông tin… Trước khi bắt đầu tìm hiểu kiến thức các thành phần của nội dung trang HTML bạn cần nắm được cấu trúc chung của một trang HTML, vì trong bài viết này chúng ta sẽ xoay quanh nội dung nằm trong thẻ . Các thẻ HTML được giới thiệu trong bài viết này phần lớn đã có từ các phiên bản trước HTML5, chúng thường xuyên được sử dụng vì vậy bạn cần ghi nhớ chúng.

  Dùng Emmet để Code HTML/CSS nhanh hơn
  HTML cơ bản toàn tập cho người mới phần 1

1. Tiêu đề trong HTML

Tiêu đề là những dòng văn bản đầu tiên bạn đọc được, nó rất quan trọng trong nội dung trang web. Một tin tức có được người dùng nhấp vào xem chi tiết hay không là ở tiêu đề. Trong HTML tiêu đề được chia thành 6 cấp độ: h1, h2, h3, h4, h5, h6. Tiêu đề h1 sẽ là quan trọng nhất và mức độ quan trọng sẽ giảm dần cho đến h6.

[jsfiddle url=”https://jsfiddle.net/allaravel/r4s1jvxf/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

Mỗi thẻ tiêu đề có một kích thước mặc định khác nhau, thẻ h1 có kích thước chữ là lớn nhất và h6 là nhỏ nhất. Bạn có thể thay đổi kích thước chữ mặc định này bằng cách thiết lập thuộc tính CSS font-size thông qua thuộc tính style của thẻ tiêu đề.

<h1 style="font-size:20px;">Thẻ h1</h1>
<h2 style="font-size:20px;">Thẻ h2</h2>
<h3 style="font-size:20px;">Thẻ h3</h3>
<h4 style="font-size:20px;">Thẻ h4</h4>
<h5 style="font-size:20px;">Thẻ h5</h5>
<h6 style="font-size:20px;">Thẻ h6</h6>

[jsfiddle url=”https://jsfiddle.net/allaravel/ogdqv4b9/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

6 thẻ trong kết quả trông giống nhau, nhưng đấy là bạn đứng ở góc độ người xem, còn các bộ máy lọc và phân tích nội dung thì khác, chúng nhìn thấy sự khác nhau của 6 tiêu đề. Tiêu đề trong HTML là rất quan trọng Tiêu đề gần như là một mô tả ngắn gọn nhất, súc tích nhất cho toàn bộ nội dung phía sau. Chính vì vậy các tiêu đề thường ngắn và nên trong khoảng 70 ký tự để giúp cho các bộ máy tìm kiếm như Google chẳng hạn hiển thị tốt nhất trên kết quả tìm kiếm. Trong một trang web chỉ nên có duy nhất một thẻ h1, điều này cũng dễ hiểu thôi, cái gì cũng là quan trọng nhất thì không có gì là quan trọng cả.

2. Đoạn văn bản trong HTML

Xây dựng nội dung trang HTML

Trong một văn bản thường chúng ta trình bày thành nhiều đoạn khác nhau với nội dung được tách ra nhằm giúp người đọc nhanh chóng nắm bắt được nội dung của cả văn bản. Thẻ <p> (paragraph) được sử dụng để tạo ra các đoạn văn bản.

<h1>Thẻ p trong HTML</h1>
<p>Thẻ p sử dụng để tạo ra các đoạn văn bản trong nội dung. Với các văn bản dài, việc tách ra thành các đoạn văn bản giúp cho người đọc dễ dàng nắm bắt được nội dung tổng thể.</p>
<p>Trong một trang HTML có thể có nhiều thẻ p, các thẻ p được mặc định cách nhau một khoảng giúp cho việc tìm đoạn văn bản dễ dàng.</p>

[jsfiddle url=”https://jsfiddle.net/allaravel/57t5u2c8/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″] Khi sử dụng thẻ

có một số chú ý:

  • Các khoảng trống nhiều hơn 1 khoảng trống sẽ thay thế bởi một khoảng trống.
  • Các dòng trống sẽ được bỏ qua.

Như vậy nếu bạn có ý định trình bày một bài thơ thì không thể viết theo kiểu như thế này được:

<h1>Cháu ngoại họ Cao</h1>
<p>
    Thằng này nó rất là ngoan
    Học hành chăm chỉ lại toàn điểm cao
    Ông bà thì rất tự hào
    Có thằng cháu ngoại họ Cao lại lùn
</p>

Kết quả hiển thị không được như ý muốn.

[jsfiddle url=”https://jsfiddle.net/allaravel/7v3z324u/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

vì toàn bộ các khoảng trống lớn hơn 1 ký tự trống được đưa về thành 1 ký tự trống, các ký tự xuống dòng cũng được loại bỏ. Trong HTML nếu bạn muốn xuống dòng, bạn sẽ phải sử dụng thẻ <br>(break). Chúng ta cùng điều chỉnh lại đoạn code bài thơ trên xem thế nào?

<h1>Cháu ngoại họ Cao</h1>
<p>
    Thằng này nó rất là ngoan<br>
    Học hành chăm chỉ lại toàn điểm cao<br>
    Ông bà thì rất tự hào<br>
    Có thằng cháu ngoại họ Cao lại lùn<br>
</p>

[jsfiddle url=”https://jsfiddle.net/allaravel/7v3z324u/1/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

Ngoài ra, HTML có thẻ <pre>, nó sẽ hiển thị văn bản nguyên trạng mà không bị định dạng lại như thẻ <p>, thẻ <pre> mặc định dùng font chữ Courier.

<h1>Cháu ngoại họ Cao</h1>
<pre>
    Thằng này nó rất là ngoan
    Học hành chăm chỉ lại toàn điểm cao
    Ông bà thì rất tự hào
    Có thằng cháu ngoại họ Cao lại lùn
</pre>

[jsfiddle url=”https://jsfiddle.net/allaravel/7v3z324u/2/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

3. Danh sách trong HTML

Xây dựng nội dung trang HTML

Danh sách là một thành phần dùng rất thường xuyên trong nội dung, nó có thể là mục lục bài viết, danh sách các tính năng… Danh sách được chia thành ba loại:

  • Danh sách không sắp xếp
  • Danh sách sắp xếp
  • Danh sách tự định nghĩa

4. Định dạng văn bản trong HTML

Văn bản khi được hiển thị thông thường sẽ khó đọc hơn, đặc biệt khi có những đoạn cần nhấn mạnh, những đoạn hội thoại hay trích dẫn… Định dạng lại văn bản giúp cho người đọc hiểu nội dung tốt hơn, nhanh hơn. Trong các nội dung HTML để định dạng văn bản có hai cách:

  • Định dạng văn bản bằng CSS
  • Sử dụng các thẻ HTML được cung cấp sẵn để định dạng

Trở lại khái niệm về CSS, bạn đã được giới thiệu sơ qua về ngôn ngữ giúp “trang điểm” thêm cho nội dung website trong bài Giới thiệu về HTML. Các kiến thức về CSS là khá nhiều và chúng ta sẽ nghiên cứu một cách chi tiết trong Khóa học CSS3 cơ bản sẽ được phát hành trong thời gian tới.

Trong khuôn khổ về kiến thức HTML, chúng ta sẽ liệt kê các cách thức định dạng văn bản bằng CSS mà không đi vào chi tiết. Có 3 cách để định dạng văn bản bằng CSS:

  • Sử dụng thuộc tính style để định dạng từng thẻ HTML cụ thể (cách này còn gọi là inline CSS).
  • Sử dụng thẻ HTML style để định dạng chung cho cả trang web (internal CSS).
  • Liên kết đến một file CSS ở ngoài thông qua thẻ HTML link (external CSS).

Lựa chọn cách thức định dạng nào tùy thuộc từng tình huống, có thể sử dụng đồng thời nhiều cách thức với nhau. Nếu bạn thiết kế website từ đầu thì nên sử dụng các thẻ HTML kết hợp với liên kết file CSS từ bên ngoài, cách này có nhiều lợi điểm:

  • Cung cấp thêm ngữ nghĩa cho các bộ máy tìm kiếm, giúp có thứ hạng cao hơn trong kết quả tìm kiếm của Google, Cốc cốc…
  • Tăng hiệu năng do trình duyệt sẽ lưu lại file CSS trong bộ nhớ riêng giúp tăng tốc tải trang web và nhanh hơn khi render trang.
  • Mã CSS dễ kiểm soát hơn và đơn giản khi chỉnh sửa, bảo trì mã nguồn.

Nếu bạn chỉnh sửa nhanh một website mà chưa nắm rõ về cấu trúc tổng thể thì cách Inline CSS là một lựa chọn tốt, cần chú ý Google khuyến cáo là không nên sử dụng Inline css bởi nó gây ra dư thừa code không cần thiết.

4.1 Định dạng văn bản với CSS

Ngôn ngữ CSS mang lại màu sắc và kiểu cách cho nội dung HTML, cách sử dụng CSS khá đơn giản, nó bao gồm một cặp thuộc tính CSS:giá trị CSS (property:value).

Ví dụ: color:blue sẽ thiết lập màu xanh cho các thẻ HTML được lựa chọn, font-family: arial thiết lập font chữ Arial cho các thẻ HTML được lựa chọn.

Chú ý: Kiến thức về CSS khá nhiều vấn đề, trong thời lượng một bài của Khóa học HTML5 cơ bản không thể giới thiệu hết do vậy, có những phần bạn sẽ hơi khó hiểu chút, nhưng không sao các kiến thức này sẽ được giới thiệu trong Khóa học CSS3 sắp tới.

4.1.1 Định dạng văn bản với thuộc tính style trên thẻ HTML – Inline CSS

Cú pháp định dạng văn bản với thuộc tính style như sau:

<tagname style="property:value;">

Trong đó:

  • tagname: Thẻ HTML cần định dạng, có thể là thẻ <h1>, .., <h6><p><a>
  • property: thuộc tính CSS
  • value: giá trị CSS

Chúng ta thường dùng thuộc tính CSS như font-family, font-style, font-weight, font-size, color, background-color, text-align để định dạng văn bản, ví dụ:

<h1 style="color:red;">Thẻ HTML H1 màu đỏ</h1>
<p style="font-weight:bold;">Đoạn văn bản quan trọng cần bôi đậm</p>

Cách này thường dùng khi bạn chỉnh sửa một trang web có sẵn, ví dụ bạn muốn điều chỉnh màu hoặc độ lớn của tiêu đề bạn có thể thực hiện thay đổi thẻ h1 như sau:

<h1 style="color:green; font-size: 14px;">

Tuy nhiên khi thiết kế không sử dụng kiểu này do rất dễ bị dư thừa. Ví dụ khi bạn có hai thẻ <h2> trong trang và bạn muốn tô đậm và bôi màu vàng cho nó chẳng hạn, bạn phải thực hiện định dạng cả hai thẻ h2 này:

<h2 style="font-weight:bold; color:yellow;">Thẻ h2 thứ nhất</h2>
...
<h2 style="font-weight:bold; color:yellow;">Thẻ h2 thứ hai</h2>

Để tránh dư thừa code CSS không cần thiết, người ta lựa chọn đến các thẻ h2 và thiết lập CSS trong thẻ HTML style.

4.1.2 Định dạng văn bản với thẻ style – Internal CSS

Các thẻ HTML cần được định dạng giống nhau thì sẽ được nhóm lại và thiết lập thuộc tính CSS chung trong thẻ style, ví dụ về định dạng hai thẻ h2 ở trên có thể được viết lại như sau:

<body>
  ...  
  <style>
    h2 {
      font-weight: bold,
      color: yellow
    }
  </style>
  <h2>Thẻ h2 thứ nhất</h2>
  ...
  <h2>Thẻ h2 thứ hai</h2>
  ...
</body>

Cách định dạng thứ hai đã không còn bị dư thừa code CSS, khi cần thay đổi định dạng của cả hai thẻ h2 chúng ta chỉ cần điều chỉnh mã CSS tại một chỗ. Chú ý: HTML không giới hạn số lượng thẻ style có trong nội dung.

4.1.3 Định dạng văn bản với file CSS ở ngoài – External CSS

Nội dung định dạng CSS ở trên có thể tách ra một file riêng với phần mở rộng là .css và được liên kết với HTML thông qua thẻ HTML <link>. Thực hiện cách định dạng này với ví dụ ở phần trên, chúng ta tạo một file main.css có nội dung như sau (để cùng trong thư mục chứa file HTML hoặc gần nó để tiện tham chiếu đến):

h2 {
  font-weight: bold,
  color: yellow
}

Sau đó trong file HTML chúng ta liên kết đến file main.css thông qua thẻ <link> được đặt trong phần <head>:

<!DOCTYPE html>
<html>
  <head>
    <link href="main.css">
  </head>
  <body>
    ...
    <h2>Thẻ h2 thứ nhất</h2>
    ...
    <h2>Thẻ h2 thứ hai</h2>
    ...
  </body>
</html>

Kết quả hiển thị trên trình duyệt không có gì thay đổi, tuy nhiên cách này giúp tăng tốc cho các lần tải trang tiếp theo, file main.css sẽ được lưu lại trên bộ đệm trình duyệt dẫn đến trong các lần tải tiếp theo trình duyệt không cần tải code CSS về nữa.

4.1.4 Độ ưu tiên trong định dạng văn bản với CSS

Các cách định dạng văn bản ở trên có thể dùng lẫn với nhau, vậy nếu thiết lập CSS ở các chỗ khác nhau thì kết quả hiển thị trên trình duyệt sẽ như thế nào? Mỗi cách định dạng có độ ưu tiên khác nhau, do vậy bạn yên tâm là không có sự xung đột về thiết lập CSS:

  • Độ ưu tiên cao nhất: Inline CSS – Sử dụng thuộc tính style của thẻ HTML.
  • Internal CSS – Sử dụng thẻ HTML style.
  • Độ ưu tiên thấp nhất: External CSS – Sử dụng file CSS ở ngoài và liên kết qua thẻ HTML <link>.

Như vậy nếu code CSS có ở 3 chỗ thì inline CSS sẽ được lấy để thiết lập kết quả hiển thị trên trình duyệt, chúng ta cùng kiểm tra ví dụ sau đây:

Bước 1: Tạo file main.css có nội dung

h1 {
  font-size: 10px;
  color: yellow
}

Bước 2: Tạo file HTML có nội dung, trong cùng thư mục với file main.css

<!DOCTYPE html>
<html>
  <head>
    <link href="main.css">
  </head>
  <body>
    <style>
      h1 {
        font-size: 20px,
        color: red
      }
    </style>
    <h1 style="font-size: 30px; color: green">Kiểm tra độ ưu tiên trong các cách định dạng văn bản bằng CSS</h2>
  </body>
</html>

Bước 3: Mở file HTML trên trình duyệt. Kết quả chúng ta có một thẻ h1 màu xanh và có kích thước font chữ là 30px do Inline CSS được ưu tiên cao nhất. Đây cũng chính là lý do mọi người hay sử dụng Inline CSS để chỉnh sửa nhanh một website mà chưa nắm rõ cấu trúc của nó.

4.2 Định dạng văn bảng bằng các thẻ HTML

Trong HTML cũng có một số thẻ giúp định dạng văn bản, việc sử dụng các thẻ HTML để định dạng cho kết quả hiển thị không khác gì so với sử dụng CSS nhưng sử dụng các thẻ này giúp cho bộ máy tìm kiếm như Google hiểu hơn về nội dung của bạn. Ví dụ cùng là in đậm chữ trong thẻ h1 như sau nhưng bộ máy tìm kiếm sẽ hiểu khác nhau:

<h1 style="font-weight: bold;">Thẻ HTML h1</h1>
<h1><b>Thẻ HTML h1</b></h1>

Bảng danh sách các thẻ HTML sử dụng định dạng văn bản:

Thẻ HTML Mô tả
<b> In đậm nội dung
<em> In nghiêng nội dung được nhấn mạnh
<i> In nghiêng nội dung
<small> In nội dung với kích thước chữ nhỏ hơn
<strong> In đậm nội dung được nhấn mạnh
<sub> In nội dung theo kiểu chỉ số ở dòng dưới
<sup> In nội dung theo kiểu chỉ số ở dòng trên (kiểu số mũ)
<ins> Nội dung được chèn thêm vào, có gạch chân
<del> Nội dung được xóa đi, có gạch ngang nội dung
<mark> Highlight nội dung
<big> In nội dung với kích thước chữ lớn hơn
<u> Gạch chân nội dung
<strike> Gạch ngang nội dung

Ví dụ sử dụng các thẻ HTML để định dạng văn bản:

<h1><small>Công thức</small> Rượu etylic</h1>
<h2>Tính chất vật lý</h2>
<p><b>Rượu etylic</b> C<sub>2</sub>H<sub>5</sub>OH là <i>chất lỏng không màu</i>, <mark>sôi ở 78.3<sup>o</sup>C</mark>, nhẹ hơn nước và tan vô hạn trong nước. Rượu etylic có thể hòa tan được nhiều chất như iot, benzen...</p>
<h2>Điều chế</h2>
<h3>Phương pháp sinh học</h3>
<p>Tinh bột hoặc đường lên men, quá trình nuôi cấy được gọi là ủ rượu và xuất hiện khoảng 20% rượu và sau đó nồng độ có thể tăng nhờ chưng cất. Công thức quá trình lên men: C<sub>6</sub>H<sub>10</sub>O<sub>2</sub>->2 CH<sub>3</sub>CH<sub>2</sub>OH + 2 CO<sub>2</sub></p>
<h3>Phương pháp công nghiệp</h3>
<p><strike>Cho etylen cộng hợp với nước với axit làm xúc tác.</strike> CH<sub>2</sub>=CH<sub>2</sub> + H<sub>2</sub>O -> C<sub>2</sub>H<sub>5</sub>OH</p>

Kết quả như sau:

[jsfiddle url=”https://jsfiddle.net/allaravel/j97v5o9L/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

5. Bảng dữ liệu trong HTML

Bảng dữ liệu là một thành phần không thể thiếu trong nội dung, bạn có thể gặp các bảng này trong danh sách người dùng, hóa đơn bán hàng… Chúng ta cùng tìm hiểu về các thành phần của một bảng dữ liệu:

  • Caption – Tiêu đề của bảng dữ liệu: mô tả ngắn gọn nội dung của bảng (thẻ <caption>)
  • Table header: Nhóm nội dung cho phần đầu bảng, ví dụ tên từng cột (thẻ <thead>)
  • Table body: Nội dung của bảng dữ liệu, trong nội dung có các thành phần sau (thẻ <tbody>)
    • Row: Dòng trong bảng dữ liệu (thẻ <tr>)
    • Column: Cột trong trong bảng dữ liệu (thẻ <col>)
    • Cell: Các ô dữ liệu (thẻ <td>)
  • Table footer: Nhóm nội dung cho phần cuối bảng dữ liệu, ví dụ các tổng kết (thẻ <tfoot>)

Với mỗi thành phần của bảng dữ liệu chúng ta đều có các thẻ HTML để xây dựng, các bước sau đây giúp bạn tạo bảng dữ liệu dễ dàng:

Xây dựng nội dung trang HTML

Bước 1: Định nghĩa bảng dữ liệu với thẻ <table>

Bước 2: Tạo tiêu đề cho bảng dữ liệu với thẻ <caption>

Bước 3: Tạo dòng tiêu đề cho từng cột với <thead>

  • Bước 3.1: Trong bảng dữ liệu, muốn xây dựng một ô dữ liệu thì trước hết phải xây dựng dòng trong bảng bằng thẻ <tr>.
  • Bước 3.2: Sau khi xây dựng dòng dữ liệu, xây dựng ô dữ liệu bằng thẻ hoặc bên trong thẻ <tr> (Trong tiêu đề sử dụng thẻ <th> để định nghĩa ô dữ liệu tiêu đề, trong phần thân thì dùng thẻ để định nghĩa ô dữ liệu)

Chú ý: Nếu có nhiều dòng tiêu đề thì chỉ cần sao chép và sửa lại thông tin.

Bước 4: Tạo phần thân bảng dữ liệu với <tbody>

  • Bước 4.1: Trước tiên xây dựng dòng dữ liệu bằng thẻ <tr>
  • Bước 4.2: Xây dựng các ô dữ liệu bên trong dòng dữ liệu bằng thẻ <td>

Khi có nhiều dòng dữ liệu, chúng ta chỉ việc sao chép và chỉnh sửa lại thông tin.

Bước 5: Tạo phần cuối bảng dữ liệu với <tfoot>

Kết quả bảng dữ liệu trên khi xem trên trình duyệt:

[jsfiddle url=”https://jsfiddle.net/allaravel/a1f4nea2/1/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

Trong bảng dữ liệu đôi khi chúng ta cần gộp một số ô dữ liệu theo hàng hoặc theo cột sử dụng thuộc tính rowspan hoặc colspan với giá trị là số ô cần gộp như trong ví dụ trên chúng ta có:

<td rowspan="2"></td>
<td colspan="5"><b>Tổng cộng</b></td>

6. Hình ảnh trong HTML

6.1 Chèn hình ảnh vào nội dung

Hình ảnh là nội dung không thể thiếu trong các tài liệu, nó không những làm tài liệu trở nên hấp dẫn mà một hình ảnh có thể nói lên nhiều thông tin hơn cả văn bản. Các file hình ảnh có thể chèn vào văn bản thông qua thẻ <img>. Thẻ này cần thuộc tính src (source) để chỉ dẫn đến file ảnh cần hiển thị. Các dạng file ảnh phổ biến hiện nay có th:ể hiển thị tốt trên trình duyệt web:

  • JPEG (Joint Photographic Experts) hỗ trợ màu sắc 24-bit cho phép ảnh hiển thị lên đến hàng triệu màu. JPEG thường sử dụng cho các ảnh phức tạp như ảnh chụp, đồ họa sử dụng nhiều màu, các hình ảnh có nhiều chi tiết. File JPEG có phần mở rộng là .jpg.
  • PNG (Portable Network Graphics) là định dạng hỗ trợ nhiều màu sắc và cho phép nén ảnh tốt. Giống JPEG, PNG hỗ trợ màu 24 bit nhưng có thể được lưu trữ với số lượng màu ít hơn. File ảnh PNG có phần mở rộng là .png.
  • GIF (Graphics Interchange Format) hỗ trợ 256 màu, ảnh GIF sử dụng cho các ảnh đơn giản như logo, các đồ họa chứa các hình cơ bản và các đường thẳng. Có thể đưa các hoạt cảnh vào ảnh GIF, do vậy ảnh GIF động được sử dụng nhiều trong quảng cáo.
  • SVG (Scalable Vector Graphics) là định dạng ảnh sử dụng XML để mô tả ảnh, đặc điểm ảnh SVG là phóng to hay thu nhỏ thì hình ảnh vẫn rất sắc nét.

Ví dụ chèn một ảnh vào trang web:

<img src="url">

Ở đây url là đường dẫn đến ảnh, đường dẫn này có thể là đường dẫn tuyệt đối, ví dụ <img src=”/storage/app/media/uploads/2018/05/html-5-logo-200×200.png”>. Url cũng có thể là đường dẫn tương đối ví dụ <img src=”public\image\test-image.jpg”>.

Một số chú ý khi sử dụng thẻ <img>:

  • Ảnh cần được sử dụng đúng kích thước, ví dụ khung hiển thị là 300×200 px thì chọn ảnh đúng 300×200 do nếu ảnh có kích thước lớn hơn ảnh hưởng đến thời gian tải ảnh và ảnh hưởng đến xếp hạng trong tìm kiếm Google. Kích thước ảnh có thể được thiết lập bằng các thuộc tính width và height của thẻ <img>. Ví dụ <img src=”test-image.jpg” width=”300″ height=”200″>. Bạn cũng có thể sử dụng CSS để định dạng kích thước ảnh: <img src=”test-image.jpg” style=”width: 300px;height: 200px;>. Mỗi cách định dạng đều có ưu điểm riêng, với định dạng CSS chúng ta có thể định dạng hàng loạt ảnh, còn sử dụng thuộc tính width, height của thẻ <img> lại giúp Google hiểu về nội dung hơn.
  • Ảnh cần được tối ưu trước về kích thước, do trên trình duyệt mắt thường không thể phân biệt được các chi tiết ảnh quá nhiều nên có thể tối ưu hóa ảnh, có những công cụ tối ưu dung lượng ảnh lên đến 70-80%. Bạn tưởng tượng nếu website của bạn có 1GB ảnh, như vậy nếu qua công cụ tối ưu dung lượng lưu trữ sẽ còn 200MB, thật không tưởng. Bạn có thể tham khảo TinyPNG hoặc bài viết Giảm dung lượng ảnh với TinyPNG trong Laravel.
  • Ảnh cần được mô tả bằng thuộc tính alt, ví dụ <img src=”test-image.jpg” alt=”Ảnh thử nghiệm”>, thuộc tính này là rất cần thiết vì khi đường dẫn ảnh bị sai hoặc ảnh bị xóa trên máy chủ thì nó sẽ hiển thị văn bản trong thuộc tính alt.
  • Thuộc tính title giúp tạo ra văn bản mô tả và khi bạn di chuột vào ảnh thì văn bản này hiện ra, ví dụ <img scr=”test-image.jpg” alt=”Ảnh thử nghiệm” title=”Ảnh sử dụng cho thử nghiệm”>
  • Có rất nhiều các thuộc tính CSS để định dạng hiển thị một ảnh và chúng ta sẽ tìm hiểu sau bên Khóa học CSS3 cơ bản.

6.2 Sử dụng ảnh làm ảnh nền cho trang web

Trong quá trình sử dụng Internet chúng ta thấy có rất nhiều website có ảnh nền đằng sau, ảnh nền giúp website trở lên lung linh hơn hoặc giúp chữ dễ đọc hơn. Sử dụng ảnh làm nền cho trang web rất đơn giản bằng cách sử dụng thuộc tính style trong thẻ <body>:

<body style="background-image:url('anh-nen.jpg')">
  ...
  <h2>Trang web có ảnh nền</h2>
  ...
</body>

Với cách này, bạn hoàn toàn có thể đưa ảnh nền vào cho từng đoạn văn bản:

<body>
  ...
  <p style="background-image:url('anh-nen-van-ban.jpg')">
  Đây là đoạn văn bản có ảnh nền
  </p>
  ...
</body>

6.3 HTML5 có gì mới trong sử dụng ảnh

HTML5 cung cấp thêm một thẻ HTML mới là <picture>, nó giúp cho việc lựa chọn ảnh linh hoạt với từng điều kiện khác nhau. Bạn biết đấy hiện nay, smart phone, tablet đã rất phổ biến, các thiết bị này có kích thước màn hình hiển thị khác nhau, do vậy với thẻ <picture> trình duyệt sẽ lựa chọn ảnh phù hợp với thiết bị. Công việc này được thực hiện thông qua thẻ <source>. Ví dụ:

<picture>
  <source media="(min-width: 650px)" srcset="img_pink_flowers.jpg">
  <source media="(min-width: 465px)" srcset="img_white_flower.jpg">
  <img src="img_orange_flowers.jpg" alt="Flowers" style="width:auto;">
</picture>

Thẻ HTML5 picture

Chú ý, luôn có một thẻ  là thành phần cuối cùng của thẻ <picture>, thẻ <img> được sử dụng bởi các trình duyệt không hỗ trợ HTML5 <picture> hoặc nếu không có thẻ <source> nào phù hợp.

7. Liên kết trong HTML

Xây dựng nội dung trang HTML

Liên kết (hyperlink hoặc link) là sức mạnh của siêu văn bản, dựa vào liên kết có thể chuyển từ trang web này sang một trang web hoặc một dịch vụ một cách nhanh chóng. Liên kết được ví như mối quan hệ trong cuộc sống hàng ngày, chính vì vậy một nội dung được đánh giá cao là một nội dung có

  • Các liên kết trong chính website đó (internal link)
  • Các liên kết từ trang ra các website bên ngoài (external link)
  • Các liên kết từ website bên ngoài vào trang web (backlink )

Khái niệm liên kết là hết sức đơn giản nhưng lại cực kỳ quan trọng trong được đánh giá và xếp hạng trong bảng kết quả tìm kiếm từ các bộ máy tìm kiếm như Google, Cốc cốc…

7.1 Liên kết dạng văn bản

Liên kết dạng văn bản có tần suất xuất hiện nhiều nhất, các liên kết này giúp điều hướng từ trang web này sang trang web khác một cách nhanh chóng. Thẻ HTML <a> định nghĩa các liên kết (a là viết tắt của anchor – mỏ neo).

Liên kết văn bản có hai loại:

  • Liên kết đến tài liệu (trang web) khác.
  • Liên kết đến một phần nội dung xác định của tài liệu (trang web) hiện tại hoặc trang web khác.
  • Liên kết tải tài liệu

7.1.1 Liên kết đến tài liệu (trang web) khác

Khi liên kết trên trang là liên kết đến trang khác thì địa chỉ của trang khác được chỉ ra trong thuộc tính href của thẻ <a>:

Xem chi tiết <a href="https://allaravel.com/tutorials/lap-trinh/khoa-hoc-html-tu-co-ban-den-nang-cao/">Khóa học HTML5 từ cơ bản đến nâng cao</a>.

Thuộc tính href của thẻ <a> giúp trình duyệt biết được địa chỉ tài liệu cần liên kết đến. Địa chỉ này có thể có nhiều dạng:

  • Địa chỉ tuyệt đối là địa chỉ đầy đủ không cần tham chiếu đến tài liệu hiện tại, ví dụ:
<a href="https://allaravel.com/tutorials/lap-trinh/khoa-hoc-html-tu-co-ban-den-nang-cao/>Khóa học HTML</a>

là địa chỉ tuyệt đối và bạn chỉ cần gõ địa chỉ này vào là trình duyệt có thể hiển thị được.

  • Địa chỉ tương đối là địa chỉ cần tham chiếu đến tài liệu hiện tại, ví dụ:
<a href="html-co-ban/html-la-gi.html">Khóa học HTML</a>

Khi bạn mở một liên kết, có thể bạn muốn nội dung của trang liên kết này sẽ ở trang một cửa sổ mới hoặc một tab mới hoặc đôi khi bạn muốn nội dung mới hiển thị đè lên nội dung cũ trong chính cửa sổ hiện tại hoặc tab hiện tại. Để thiết lập cách thức mở trang liên kết bạn sử dụng thuộc tính target, thuộc tính này có một số giá trị như sau:

  • _blank: mở tài liệu liên kết trong cửa sổ hoặc tab mới
  • _self: mở tài liệu liên kết trong cửa sổ hoặc tab hiện tại (tại đó bạn nhấp vào liên kết) – giá trị mặc định
  • _parent: mở tài liệu liên kết trong frame cha
  • _top: mở tài liệu liên kết trong phần thân của cửa sổ
  • framename: mở tài liệu liên kết trong frame có tên

Có một thuộc tính cực kỳ quan trọng của thẻ <a> là thuộc tính rel (relationship), nó định nghĩa mối quan hệ giữa trang hiện tại và trang liên kết đến. Thuộc tính này cũng có một số giá trị như sau:

<a href="html-co-ban/html-la-gi.html" rel="nofollow">HTML cơ bản</a>
Giá trị của thuộc tính rel Ý nghĩa
alternate Cung cấp một liên kết thay thế cho tài liệu (trang web) hiện tại, ví dụ: trang để in ấn, trang được dịch sang tiếng nước ngoài…
author Cung cấp liên kết đến trang về tác giả của tài liệu hiện tại.
bookmark URL lâu dài sử dụng cho bookmark
external Đánh dấu tài liệu được tham chiếu không phải là một phần của cùng website với tài liệu hiện hành.
help Cung cấp liên kết đến tài liệu trợ giúp.
license Cung cấp liên kết đến thông tin bản quyền.
next Cung cấp thông tin đến tài liệu tiếp theo trong một danh sách các tài liệu.
nofollow Liên kết đến tài liệu không được chứng thực, ví dụ liên kết trả tiền. Nofollow được sử dụng bởi Google để xác định xem công cụ dò tìm có tiếp tục dò tìm trang liên kết không?
noreferrer Yêu cầu trình duyệt không gửi header HTTPR tham chiếu nếu người dùng nhấp vào liên kết.
noopener Requires that any browsing context created by following the hyperlink must not have an opener browsing context
prev Mở tài liệu trước đó.
search Liên kết đến công cụ tìm kiếm tài liệu.
tag Liên kết là một thẻ (từ khóa) của tài liệu hiện tại

Trong các giá trị này thì nofollow là giá trị quan trọng nhất, nếu một liên kết dạng backlink có rel=”nofollow” thì sẽ được Google đánh giá thấp hơn rất nhiều so với liên kết thông thường.

Chú ý: Các liên kết mặc định có định dạng khác nhau tùy thuộc văn cảnh:

  • Liên kết chưa được vào lần nào thì nó sẽ gạch chân và có màu xanh da trời
  • Liên kết đã được vào thì nó sẽ gạch chân và có màu tía
  • Liên kết khi được nhấn sẽ gạch chân và có màu đỏ

Chú ý: Nội dung bên trong thẻ nên mô tả tài liệu mà nó liên kết đến, tránh các nội dung kiểu “ở đây”, “click vào đây”… nó làm cho các bộ máy tìm kiếm bối rối và bạn bị mất điểm rồi đấy.

7.1.2 Liên kết đến phần xác định của một trang web

Xây dựng nội dung trang HTML

Một trang web có nội dung dài thì cần có phần mục lục và mỗi khi bấm vào một mục trên đó, trình duyệt sẽ đưa bạn đến phần nội dung phù hợp trên trang hiện tại. Để thực hiện được liên kết này, bạn cần phải thực hiện khai báo hai bước.

Bước 1: Khai báo id cho phần tử HTML nơi mà nội dung bạn muốn đến khi nhấn vào liên kết (ví dụ nội dung này là của trang web-page.html)

<h3 id="text-link">Liên kết dạng văn bản</h3>
<!-- Nội dung phần liên kết văn bản ở đây -->
<h3 id="image-link">Liên kết dạng hình ảnh</h3>
<!-- Nội dung phần liên kết hình ảnh ở đây -->
<h3 id="other-link">Liên kết khác</h3>
<!-- Nội dung phần liên kết khác ở đây -->

Bước 2: Khai báo liên kết

<h3>Nội dung chính bài viết</h3>
<ol>
  <li><a href="web-page.html#text-link">Liên kết dạng văn bản</a></li>
  <li><a href="web-page.html#image-link">Liên kết dạng hình ảnh</a></li>
  <li><a href="web-page.html#other-link">Liên kết dạng khác</a></li>
</ol>

Chú ý: nếu liên kết này nằm trên cùng trang web-page.html thì phần địa chỉ có thể bỏ đi phần địa chỉ trang web-page.html:

<a href="#text-link">Liên kết dạng văn bản</a>

Chú ý: Phiên bản trước sử dụng thuộc tính name để định nghĩa phần nội dung cần nhảy đến, tuy nhiên HTML5 không hưởng ứng việc này mà thay vào đó sử dụng thuộc tính id, lý do là id là một chuỗi định danh duy nhất nên không có việc xung đột khi nhấp vào một liên kết mà có hai nội dung được gán thẻ phù hợp.

7.1.3 Liên kết tải tài liệu

Một số trang web muốn đưa thẻ liên kết đến một file tài liệu để người dùng có thể tải về, ví dụ các tài liệu này có thể là dạng PDF, Microsoft Word, Excel, RAR… rất đơn giản chúng ta chỉ việc đưa tài liệu lên máy chủ web và tạo liên kết đến tài liệu này.

<a href="http://bigi.vn/public/files/Bao-gia-KLASS-86-KV1.docx">Tải báo giá dòng sản phẩm KLASS 86KV1</a>

7.2 Liên kết dạng hình ảnh

Hình ảnh chứa đựng nhiều thông tin hơn văn bản và tăng sức hấp dẫn làm cho người dùng muốn nhấp vào hơn, tuy nhiên không phải ai cũng biết được ảnh này là một liên kết nếu như không di chuột lên đó. Liên kết dạng hình ảnh thay vì đưa một đoạn văn bản vào, chúng ta đưa vào đó một ảnh thông qua thẻ <img>:

<a href="html5-co-ban.html">
  <img src="hinh-anh-html5-co-ban" alt="HTML5 cơ bản"/>
</a>

Liên kết dạng hình ảnh ở trên là toàn bộ bức ảnh, tức là bạn nhấp vào đâu trên bức ảnh thì trình duyệt cũng chuyển bạn đến trang liên kết. Một dạng liên kết hình ảnh thứ hai là sử dụng một vùng xác định trên hình ảnh để liên kết, ví dụ trên bức ảnh có một số biểu tượng của Vue.js, Laravel, HTML5 khi nhấp vào từng biểu tượng thì trình duyệt chuyển đến khóa học phù hợp.

<img src="/storage/app/media/uploads/2018/05/cac-khoa-hoc-hien-co-tren-allaravel.com_.jpg" alt="Các khóa học lập trình trên Allaravel" usemap="#coursemap" width="734" height="277">
<map name="coursemap">
  <area shape="rect" coords="16,71,230,256" alt="Khóa học Vue.js cơ bản" href="https://allaravel.com/tutorials/lap-trinh/vuejs-framework/khoa-hoc-vue-js-2-mien-phi/" target="_blank">
  <area shape="circle" coords="350,144,120" alt="Khóa học HTML5 cơ bản" href="https://allaravel.com/tutorials/lap-trinh/khoa-hoc-html-tu-co-ban-den-nang-cao/" target="_blank">
  <area shape="rect" coords="448,71,715,256" alt="Khóa học Laravel cơ bản" href="https://allaravel.com/laravel-tutorials/khoa-hoc-laravel-5-mien-phi/" target="_blank">
</map>

Kết quả như sau

[jsfiddle url=”https://jsfiddle.net/allaravel/dvx7yLLa/” height=”400px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

7.3 Liên kết đến các dịch vụ khác

Trên mạng internet không chỉ có các trang web mà còn có rất nhiều các dịch vụ khác, như vậy việc liên kết không chỉ dừng lại ở việc liên kết các tài liệu mà nó còn cho phép liên kết đến các dịch khác nhau.

Liên kết đến tài khoản email: Khi nhấp vào nếu thiết bị có ứng dụng email nó sẽ tự động bật ra để soạn thảo email gửi đi.

Gửi đến địa chỉ email<a href="mailto: my_email@allaravel.com">My_email@Allaravel.com</a>

Liên kết đến số điện thoại: Khi nhấp vào nếu thiết bị có thể thực hiện cuộc gọi nó sẽ gọi đến số điện thoại được cung cấp (bạn có thể thử trên smart phone)

Gọi số <a href="tel: 0904666888">0904-666-888</a> để được tư vấn

Liên kết đến skype để chat

<a href="skype: kiendc0308g?chat">Chat skype</a> để được tư vấn

8. Trích dẫn, diễn giải, thêm ngữ nghĩa nội dung trong HTML

8.1 Trích dẫn trong HTML

Trong phần tiếp theo này chúng ta sẽ tìm hiểu những nội dung ít quan trọng hơn trong trang HTML, tuy nhiên khi sử dụng đúng mục đích các thẻ HTML trong phần này sẽ là gia vị cho món ăn của chúng ta thêm ngon hơn. Ví dụ, trích dẫn nội dung từ các trang uy tín, lời nói từ những người nổi tiếng có sức thuyết phục rất lớn, việc trích dẫn giống như “mượn gió bẻ măng” giúp cho nội dung được người đọc ghi nhớ lâu hơn. Trong HTML có hai kiểu trích dẫn, trích dẫn ngắn thường là trích dẫn câu nói sử dụng thể <q> và trích dẫn đầy đủ với thẻ <blockquote>.

<p>Tôn tử nói: <q>Biết mình biết ta, trăm trận trăm thắng.</q></p>

[jsfiddle url=”https://jsfiddle.net/allaravel/54fbxek2/” height=”100px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

ví dụ tiếp theo về trích dẫn đầy đủ:

<p>Định nghĩa về HTML từ Wikipedia</p>
<blockquote>HTML viết tắt của Hypertext Markup Language là ngôn ngữ tiêu chuẩn đánh dấu siêu văn bản, nó tạo ra các rtrang web, các ứng dụng web. Với CSS (Cascading Style Sheets) và JavaScript, nó tạo nên nền tảng công nghệ cho Mạng diện rộng toàn cầu (World Wide Web)</blockquote>

[jsfiddle url=”https://jsfiddle.net/allaravel/qhdsndsu/” height=”200px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

8.2 Viết tắt trong HTML

Viết tắt là không tránh khỏi khi soạn thảo văn bản, đặc biệt các cụm từ được lặp đi lặp lại nhiều lần, ví dụ như trong bài viết này chúng ta thường xuyên dùng HTML thay cho cụm từ đầy đủ là Hypertext Markup Language. Với người đọc có thể hiểu được văn bản viết tắt nhưng với các bộ máy tìm kiếm là rất khó khăn, do vậy với thẻ <abbr>, nội dung viết tắt được cung cấp thêm thông tin giúp giải thích cụm từ viết tắt chuẩn xác hơn.

<p>Ngôn ngữ <abbr title="Hypertext Markup Language">HTML</abbr> là một tất yếu khách quan khi nhu cầu xây dựng các siêu văn bản ngày càng lớn.</p>

[jsfiddle url=”https://jsfiddle.net/allaravel/jztgkdLy/” height=”100px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

8.3 Thêm thông tin tác giả tài liệu

Thẻ <address> được sử dụng từ HTML4.01 để định nghĩa các thông tin về tác giả của tài liệu hay bài viết, nếu thẻ này nằm trong thẻ <article> thì nó thể hiện thông tin liên hệ cho bài viết đó. Văn bản trong thẻ <address> thường được in nghiêng khi hiển thị. Ví dụ:

<article>
  <h1>Khóa học HTML từ cơ bản đến nâng cao</h1>
  <p>Các nội dung cơ bản nhất của HTML sẽ được giới thiệu đến bạn đọc trong 4 bài đầu tiên. Sau đó các kiến thức mới nhất về HTML5 cũng như các kỹ thuật thường được sử dụng cho phát triển web hiện đại sẽ được giới thiệu trong phần nâng cao về HTML5.</p>
  <p>Thông tin tác giả khóa học HTML5:</p>
  <address>
    Biên soạn: <a href="https://allaravel.com/author/kiendc/">FirebirD</a><br>
    Học hàm: <cite>Giáo sư đại số</cite> (Chuyên nghiên cứu các con số trong phạm vi từ 00 đến 99 :D)
  </address>
</article>

[jsfiddle url=”https://jsfiddle.net/allaravel/wztorzhj/1/” height=”300px” include=”result,html,js” font-color=”39464E” menu-background-color=”FFFFFF” code-background-color=”f3f5f6″ accent-color=”1C90F3″]

Một số chú ý khi sử dụng <address>:

  • KHÔNG sử dụng thẻ <address> để mô tả các địa điểm trừ khi địa điểm này là một phần của thông tin liên hệ.
  • Thẻ <address> thường được đưa vào phần thông tin trong thẻ <footer>.

Trong ví dụ trên chúng ta có thêm thẻ <cite> sử dụng để mô tả chức danh công việc.

8.4 Diễn giải code trong HTML

Có lẽ đây là phần vô tác dụng nhất với người đọc nhưng lại rất hữu ích với người lập trình web, nếu code không có các đoạn diễn giải, thật khó để hiểu ý nghĩa của từng đoạn code cụ thể. Nội dung Diễn giải (comment) mã HTML được đưa vào giữa nhóm các ký tự sau:

<!-- Bắt đầu phần danh sách sản phẩm -->
<section>
  ... Mã liệt kê danh sách sản phẩm cỡ 1000 dòng không biết kết thúc ở đâu
</section>
<!-- Kết thúc phần liệt kê danh sách sản phẩm. May mà có diễn giải mới biết chỗ này là kết thúc -->

Ngoài ý nghĩa diễn giải nội dung cho một đoạn mã HTML, chúng ta có thể sử dụng cách thức này để bỏ qua tạm thời những đoạn mã HTML không muốn trình duyệt xử lý. Ví dụ:

<!-- Trình duyệt sẽ bỏ qua phần này vì khóa học này đang biên soạn
  <a href="khoa-hoc-css3.html">Khóa học CSS3</a>
-->

9. Hiển thị code, ký tự đặc biệt trong HTML

9.1 Hiển thị code trong HTML

Trong các tài liệu về kỹ thuật hoặc đặc biệt là tài liệu công nghệ thông tin có rất nhiều các đoạn mã, việc hiển thị code trong văn bản về cơ bản được HTML5 hỗ trợ nhưng khi hiển thị trên trình duyệt không quá mỹ mãn như suy nghĩ. Trong thực tế, chúng ta có thể áp dụng các thư viện css, javascript giúp việc highlight code đẹp và hiệu quả hơn. Cơ bản HTML5 sử dụng thẻ <code> để hiển thị mã, ví dụ:

<code>
  x = 5;
  y = 6;
  z = x + y;
</code>

Chú ý: khi hiển thị trên trình duyệt sẽ bỏ qua các ký tự xuống dòng, vì vậy thông thường chúng ta kết hợp thẻ <pre> với thẻ <code> để giữ nguyên định dạng.

<pre>
  <code>
    x = 5;
    y = 6;
    z = x + y;
  </code>
</pre>

Hiển thị phím hoặc tổ hợp phím trong nội dung văn bản:

<p>Sử dụng tổ hợp phím <kbd>Ctrl + C</kbd> để sao chép nội dung.</p>

Hiển thị biến trong code sử dụng thẻ <var>

<p>Công thức tính năng lượng của Einstein: <var>E</var> = <var>mc</var><sup>2</sup></p>

9.2 Các ký tự đặc biệt trong mã HTML

HTML sử dụng các ký tự < và > để đánh dấu các thẻ do vậy các ký tự này không được sử dụng trong nội dung, nếu bạn muốn sử dụng ký tự <> cho các biểu thức kiểu như 5 < 9 chúng ta phải sử dụng một nhóm các ký tự để trình duyệt có thể hiển thị đúng.

<p>5 < 9</p>

Các ký tự đặc biệt được liệt kê trong bảng dưới đây:

Ký tự hiển thị Mô tả Nhóm ký tự
Ký tự cách trống (ký tự này không bị trình duyệt bỏ qua khi có nhiều hơn 1 ký tự cách trống)  
< Ký tự nhỏ hơn <
> Ký tự lớn hơn >
& Ký tự và &
Dấu nháy kép "
Dấu nháy đơn &apos;
¢ Ký tự cent ¢
£ Ký tự pound Anh £
¥ Ký tự Yên Nhật ¥
Ký tự tiền Euro
© Ký tự bản quyền ©
® Ký tự đăng ký thương hiệu ®

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 Developer hấp dẫn trên TopDev

Những lập trình viên giỏi nhất thế giới đương đại – Phần 3

Những lập trình viên giỏi nhất thế giới đương đại – Phần 3

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

Như vậy là 10 gương mặt lập trình viên xuất sắc nhất đã xuất hiện cùng với những lời nhận xét tốt đẹp nhất từ phía các nhà khoa học máy tính, các đồng nghiệp của họ. Trong phần cuối, chúng ta sẽ chỉ còn 5 cái tên có mặt ở danh sách này. Hãy cùng chúng tôi tiếp tục khám phá.

  10 nguyên tắc lập trình nền tảng mà lập trình viên nào cũng cần biết
  100 Tips cho Lập trình viên siêu giỏi

Lập trình viên Fabrice Bellard – Người tạo ra QEMU

QEMU là một trong những máy ảo giống như VMWare, Vitual PC, Bochs. Nó có thể chạy tốt trên cả Linux lẫn Window. Có thể nói Fabrice là cha đẻ của nền tảng này. Không chỉ có vậy, ông còn tạo ra rất nhiều chương trình phần mềm với mã nguồn mở khác. Năm 2000 và 2001, ông đoạt giải Obfuscated C Code Contest và tiếp tục nhận giải Google-O’Reilly Open Source trong năm 2011. Ngoài ra, ông đã từng nắm giữ kỷ lục thế giới cho việc tính toán số lượng chữ số trong Pi.

Nhận xét:

“Tôi thấy những gì Fabrice Bellard đã làm thật ấn tượng.” Raphinou

“Fabrice Bellard là lập trình viên hiệu quả nhất thế giới.” Pavan Yara

“Ngài như Nicola Tesla của kỹ thuật phần mềm.” Michael Valladolid

“Anh ấy đã nối tiếp thành công từ những năm 1980.” Michael Biggins

Lập trình viên Jon Skeet – Đóng góp lớn cho trang Stack Overflow huyền thoại

Những lập trình viên giỏi nhất thế giới đương đại – Phần 3

Ông là kiến trúc sư của Google đồng thời là tác giả của C# trong Depth. Giữ điểm số uy tín cao nhất trên stack overflow.com (trang web hỏi đáp về lập trình uy tín nhất). Trung bình mỗi tháng ông tiếp nhận và trả lời 390 câu hỏi.

Nhận xét:

“Jon Skeet không cần một trình gỡ rối, ông chỉ cần nhìn xuống lỗi cho đến khi những đoạn mã chạy được” Steven A. Lowe

“Ông thường dùng những đoạn code sai để chỉ ra lỗi của người lập trình.” Dan Dyer

“Code của Jon Skeet không phải một thứ code thông thường. Đó là một thể loại code thực sự bình dân.” Anonymous

Lập trình viên Adam D’Angelo – Đồng sáng tạo Quora

Những lập trình viên giỏi nhất thế giới đương đại – Phần 3

Là một kỹ sư của Facebook, là người xây dựng cơ sở ban đầu cho nguồn tin của mạng xã hội này. Ông trở thành Giám đốc công nghệ của Facebook trước khi rời đi và là một trong những người góp công lớn tạo ra Quora(cũng là một trang web hỏi đáp về lập trình nổi tiếng). Giữ vị trí thứ 8 trong Cuộc thi khoa học máy tính Mỹ Olympiad khi còn học phổ thông năm 2001. Ông là thành viên của Học viện công nghệ California và đã đạt huy chương bạc trong Hội thảo lập trình ACM International Collegiate năm 2004. Và trong năm 2005, ông đã vô địch Cuộc thi Mã hóa thuật toán của Topcoder Collegiate Challege.

Nhận xét:

“ Một trong những lập trình viên chuyên nghiệp” Anonymous

“Khi mới chỉ 6 tuổi, anh ta đã làm được mọi thứ tôi có thể làm.” Mark Zuckerberg

Lập trình viên Petr Mitrechev – Một trong những lập trình viên có sức cạnh tranh cao nhất mọi thời đại

Sinh năm 1985, là một lập trình viên xuất sắc người Nga. Anh đã 2 lần đoạt huy chương vàng tại Olympic tin học quốc tế (2000 và 2002). Trong năm 2006, anh đã trở thành người lập trình của Google và vô địch Giải TopCoder Algorithm mở rộng. Thêm vào đó là hai lần chiến thắng trong Cup Facebook Hacker (2011, 2013). Hiện tại, anh đang nắm giữ vị trí thứ 2 trên Topcoder đồng thời cũng đứng thứ 2 trên Codeforces.

Nhận xét: “ Anh ấy là một thần tượng trong giới lập trình viên ngay cả ở đây – Ấn Độ” Kavish Dwivedi

Lập trình viên Gennady Korotkevich – Thần đồng lập trình

Những lập trình viên giỏi nhất thế giới đương đại – Phần 3

Lập trình viên cực kỳ tài năng người Belarus. Người nhỏ tuổi nhất tham gia Cuộc thi Tin học quốc tế (11 tuổi) và đã 6 lần đoạt giải trong kỳ thi này (từ năm 2007 đến 2012). Là thành viên của đội đoạt giải ACM ICPC năm 2013 và vô địch Cup Facebook Hacker 2014. Vào thời điểm này, thanh niên trẻ tuổi đang giữ vị trí số 1 trên Codeforces đồng thời cũng đứng số 1 ở Topcoder.

Nhận xét:

“Gennady thực sự rất tuyệt vời và đó là lý do cho thấy tại sao tôi có một đội ngũ phát triển hùng hậu tại Belarus.” Chris Howard

“Một thần đồng lập trình.” Prateek Joshi

“Đó là một thiên tài” Nuka Shrinivas Rao

Bài viết được dịch và tổng hợp từ ITWorld

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

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

Tìm việc IT lương cao, đãi ngộ tốt trên TopDev

Internationalization trong Spring MVC

Internationalization trong Spring MVC

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

Internationalization là tính năng của các ứng dụng web hiện đại, có khả năng hiển thị giao diện trên nhiều ngôn ngữ từ các quốc gia khác nhau. Ví dụ như nếu ứng dụng web của bạn có thể hiển thị tiếng Anh, tiếng Việt, tiếng Đức, tiếng Hàn, tiếng Nhật thì người dùng biết một trong các ngôn ngữ này, có thể chọn lựa ngôn ngữ mà họ rành nhất. Nếu các bạn đang sử dụng Spring MVC cho ứng dụng web của mình thì có thể đọc bài viết này. Mình sẽ hướng dẫn các bạn cách hiện thực Internationalization trong Spring MVC các bạn nhé!

  Cho phép tùy chọn Giao diện trong Spring Web MVC framework
  Giải thích mô hình MVC thông qua … cốc trà đá

Đầu tiên, mình sẽ tạo mới một Spring MVC project sử dụng Spring Tool Suite 3 để làm ví dụ:

Kết quả:

Internationalization trong Spring MVC

Mình sẽ sử dụng Maven Jetty Plugin để chạy project này.

<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.40.v20210413</version>
<configuration>
<webApp>
<contextPath>/springmvc-internationalization</contextPath>
</webApp>
</configuration>
</plugin>

Kết quả khi mình chạy project này sẽ như sau:

Để hiện thực internationalization trong Spring MVC, các bạn cần cấu hình các thông tin liên quan về messageSource, localeResolver và localeChangeInterceptor. Nói nôm na thì messageSource là nơi chúng ta sẽ định nghĩa đường dẫn tới các tập tin chứa các chuỗi sẽ hiển thị trong ứng dụng web ở nhiều ngôn ngữ khác nhau (nếu các bạn đã làm việc với internationalization của Java sử dụng class ResourceBundle thì messageSource cũng tương tự như vậy đó các bạn!), localeResolver sẽ xác định ngôn ngữ mà người dùng đang sử dụng là gì còn localeChangeInterceptor sẽ giúp chúng ta detect việc người dùng có đang change ngôn ngữ mà họ muốn sử dụng không?

messageSource

Spring cung cấp cho chúng ta interface MessageSource để hiện thực mục đích của messageSource. Interface MessageSource này có một sub-interface là

HierarchicalMessageSource với 2 implementation là ReloadableResourceBundleMessageSource và ResourceBundleMessageSource đó các bạn!

ResourceBundleMessageSource implementation sử dụng ResourceBundle của Java, nó sẽ load hết tất cả các chuỗi được định nghĩa và chúng ta không thể thay đổi nội dung của các chuỗi này trong suốt quá trình ứng dụng chạy. Còn ReloadableResourceBundleMessageSource implementation thì cũng tương tự như ResourceBundleMessageSource nhưng chúng ta có thể cấu hình thêm cho nó tự reload lại nội dung của các chuỗi được định nghĩa sau một khoảng thời gian nào đó.

Để cấu hình MessageSource, mình sẽ định nghĩa các tập tin .properties chứa các chuỗi với nhiều ngôn ngữ khác nhau như khi chúng ta làm việc với ResourceBundle trong Java đó các bạn!

Mình sẽ thêm mới 2 tập tin message.properties và message_vi.properties trong thư mục src/main/resources để định nghĩa cho ngôn ngữ mặc định của ví dụ của mình là tiếng Anh, ngoài ra ứng dụng này còn hỗ trợ cả tiếng Việt.

Trong ứng dụng ví dụ ở trên, mình sẽ internationalization 2 câu là “Hello World” với “The time on the server is” nên mình sẽ định nghĩa nội dung của tập tin message.properties và message_vi.properties như sau:

message.properties

app.lang.vi=Vietnamese
app.lang.en=English
app.welcome=Hello world
app.time=The time on the server is

message_vi.properties

app.lang.vi=Ti\u1EBFng Vi\u1EC7t
app.lang.en=Ti\u1EBFng Anh
app.welcome=Xin chào
app.time=Gi\u1EDD c\u1EE7a server lúc này là

Bây giờ, mình sẽ sử dụng ReloadableResourceBundleMessageSource implementation và định nghĩa nó trong Spring container (tập tin src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml) như sau:

<beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<beans:property name="basename" value="classpath:i18n/messsage" />
</beans:bean>

Như các bạn thấy, thuộc tính basename của class ReloadableResourceBundleMessageSource được dùng để khai báo đường dẫn tới các tập tin .properties.

localeResolver

Như mình nói, localeResolver dùng để xác định ngôn ngữ mà người dùng đang sử dụng là gì để hiển thị cho đúng với ngôn ngữ đó. Spring sử dụng interface LocaleResolver để làm việc này.

Interface LocaleResolver có nhiều implementation khác nhau:

  • AcceptHeaderLocaleResolver: resolver này sẽ detect ngôn ngữ mà người dùng đang sử dụng dựa vào header “accept-language” của HTTP request.
  • FixedLocaleResolver: chúng ta dùng resolver này khi chúng ta cố định locale cho ứng dụng của chúng ta.
  • SessionLocaleResolver: resolver này sử dụng attribute locale trong user session, nếu không có attribute này thì nó sẽ fallback sử dụng header “accept-language” của HTTP request như AcceptHeaderLocaleResolver.
  • CookieLocaleResolver: sử dụng locale được lưu trữ trong cookie của trình duyệt mà user đang sử dụng.

Chúng ta sẽ sử dụng CookieLocaleResolver cho ví dụ của mình trong bài viết này các bạn nhé:

<beans:bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>

localeChangeInterceptor

Khi người dùng muốn thay đổi ngôn ngữ hiển thị trên ứng dụng web, chúng ta phải có cơ chế để xử lý yêu cầu này. LocaleChangeInterceptor là một  class của Spring cho phép chúng ta xử lý những yêu cầu này.

Class LocaleChangeInterceptor hiện thực interface HandlerInterceptor cho phép chúng ta chặn tất cả request của user để thêm logic xử lý. Class LocaleChangeInterceptor sẽ lấy giá trị của một request parameter mà chúng ta cấu hình để xử lý request change ngôn ngữ của người dùng.

Các bạn có thể đọc thêm code của phương thức preHandle() trong class LocaleChangeInterceptor để thấy điều này:

Chúng ta sẽ cấu hình LocaleChangeInterceptor trong tập tin src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml như sau:

<interceptors>
<beans:bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<beans:property name="paramName" value="lang" />
</beans:bean>
</interceptors>

Ở đây, mình đang cấu hình request parameter mà LocaleChangeInterceptor sẽ lấy giá trị ngôn ngữ là “lang”.

Đến đây là chúng ta đã hoàn thành việc cấu hình các bean, các interceptor cần thiết trong Spring container để hiện thực internationalization trong Spring MVC. Bây giờ, chúng ta sẽ đi chỉnh sửa các tập tin view để chúng có thể hiển thị nhiều ngôn ngữ khác nhau được các bạn nhé!

Mình sẽ chỉnh sửa tập tin home.jsp trong thư mục src/main/webapp/WEB-INF/views/home.jsp như sau:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<a href="<c:url value="?lang=vi"/>">
<spring:message code="app.lang.vi" />
</a> |
<a href="<c:url value="?lang=en"/>">
<spring:message code="app.lang.en" />
</a>

<h1>
<spring:message code="app.welcome" /> !
</h1>

<P>
<spring:message code="app.time" /> ${serverTime}.
</P>
</body>
</html>

Ở đây, mình đã thêm mới một taglib mới của Spring framework để làm việc với internationalization:

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>

Nếu bạn nào chưa biết về taglib thì mình có thể nói nôm na như thế này, nó là JSP Standard Tag Library hay viết tắt là JSTL, một bộ các thẻ HTML giúp chúng ta có thể làm nhiều việc với các tập tin JSP. Như các bạn thấy, mặc định, tập tin home.jsp đã định nghĩa JSTL core tags:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

JSTL core tags này giúp chúng ta có thể loop data để được truyền từ Controller để hiển thị chúng trong trang JSP. Chúng ta cũng có thể thêm các điều kiện logic, catch exception, chuyển tiếp (forward) hoặc chuyển hướng (redirect), định nghĩa URL như mình đã làm ở trên với tag <c:url />, …

Spring hỗ trợ taglib trên, một trong số các tag trong bộ taglib này giúp chúng ta có thể hiển thị thông tin trên nhiều ngôn ngữ khác nhau là <spring:message />. Tag <spring:message /> có nhiều attribute, chúng ta có thể khai báo attribute code với value là property key trong các tập tin message properties để hiện thực internationalization. Trong trường hợp property key mà chúng ta khai báo trong attribute code không tồn tại, các bạn có thể set default value bằng cách khai báo thêm attribute text trong thẻ <spring:message /> này. Ví dụ như:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

Nếu cả 2 attribute này đều không tồn tại thì output sẽ là null các bạn nhé!

Bây giờ, chạy lại ví dụ các bạn sẽ thấy kết quả như sau:

Internationalization trong Spring MVC

Click vào Vietnamese link, các bạn sẽ thấy kết quả như sau:

BrSE chỉ “có đất dụng võ” ở thị trường Nhật?

kỹ sư cầu nối
BrSE chỉ “có đất dụng võ” ở thị trường Nhật?

Về diễn giả

  • Anh Nguyễn Văn Hải, sinh năm 1990, hiện đang là Phó Giám đốc trung tâm phát triển phần mềm số 6 tại Rikkeisoft Hà Nội.
  • Anh đã có khoảng thời gian 4 năm làm việc tại Nhật trải qua các vị trí từ dev, tech lead, BrSE, BM và hiện tại mình đang làm vị trí Division Manager.

Anh có thể giải thích rõ hơn về công việc, vai trò của một kỹ sư cầu nối – Bridge Software Engineer (BrSE)?

BrSE là một công việc đặc thù trong các công ty cung cấp các giải pháp công nghệ thông tin outsourcing cho thị trường Nhật Bản, đặc thù ở thị trường Nhật Bản. Nơi làm việc hiện tại của mình là Rikkeisoft cũng là công ty top về outsourcing.

BrSE nội dung chính là truyền đạt thông tin và giải pháp giữa 2 bên Nhật Việt để đảm bảo công việc cho dự án được thuận lợi và kết nối dễ dàng hơn, cân bằng được yêu cầu giữa 2 bên.

Tham khảo thêm việc làm Brse lương cao tại Topdev.vn

Công việc hàng ngày và vai trò của một Division Manager trong một dự án là gì?

Thật ra có 2 người đảm nhiệm trong 1 vị trí Division, anh hiện tại là vị trí Phó Giám đốc. Một trung tâm sẽ có rất nhiều dự án, vị trí của anh hiện tại có các công việc khác nhau như quản lý tiến độ của nhiều dự án, họp với khách hàng để báo cáo tiến độ, họp cải thiện các dự án vào cuối tuần, trao đổi với các key members để lắng nghe về nguyện vọng, tình hình hiện tại tâm tư của anh em ra sao, lên kế hoạch cho nhân sự trong tháng tới, công việc tháng tới sẽ như thế nào và điều chỉnh nhân sự cho phù hợp. Đấy là công việc hàng ngày của vị trí Division Manager.

Vậy ở Rikkeisoft, ngoài 2 vị trí BrSE và Division Manager như chúng ta đã đề cập còn những vai trò gì khác trong một vị trí outsourcing hay không?

Trong một dự án sẽ có rất nhiều các vị trí như PM, Tester, developer, BA,… tiếp theo là các vị trí quan trọng như Bridge BM hoặc Senior PM.

Có quan điểm cho rằng một BrSE giống như một BA & PM “của khách hàng”, theo anh BrSE có phải là người đặt trách nhiệm với khách hàng lên trên hết không?

Mình nghĩ là không đúng vì nếu nghĩ vậy thì rõ ràng là offshore sẽ mất lợi thế, dev người Việt mình sẽ rất yếu thế, anh nghĩ nó phải là mối quan hệ hợp tác win – win giữa mình và khách hàng. Mình không phải là người làm thuê mà là người bán sản phẩm, là người bán trí tuệ cho khách hàng. Vậy nên đây là quan hệ đôi bên cùng hợp tác và mục đích quan trọng nhất là cho dự án đó thành công.

  5 Ngộ nhận về nghề BrSE
  BrSE Cần Học Công Nghệ Gì?

Vậy theo anh trách nhiệm lớn nhất của BrSE là gì? Người BrSE cần có những hiểu biết, kiến thức hay kĩ năng mềm gì để có thể dung hòa các bên với nhau?

Anh nghĩ trách nhiệm lớn nhất để 2 bên khách hàng và offshore hoàn thành dự án tốt nhất nó bao gồm những việc như truyền đạt đúng yêu cầu, mong muốn của khách hàng, truyền đạt giải pháp, cách thực thi từ offshore cho khách hàng.

Để làm được điều này thì kiến thức của BrSE phải bao gồm nhiều thứ như hiểu về nghiệp vụ, có kỹ năng cơ bản về kỹ thuật lập trình và ngoại ngữ để đảm bảo giao tiếp ở mức hiểu đúng và hiểu đủ, các kỹ năng mềm như lắng nghe, đàm phán khi dự án có những vấn đề rắc rối. Lúc này mình không chỉ truyền đạt đúng những gì 2 bên trao đổi mà còn phải hiểu thêm về khó khăn của offshore, hiểu được nguyên nhân của vấn đề của cả đôi bên, để giải quyết mâu thuẫn và đàm phán xem làm thế nào để tốt nhất cho 2 bên.

Tiếp theo là khi mình muốn truyền đạt một kỹ thuật nào đó cho khách hàng nó còn liên quan đến khả năng trình bày vấn đề. Và để dự án hoạt động suôn sẻ thì khả năng teamwork cũng khá cần thiết, đặc biệt là khi BrSE ngồi ở phía khách hàng ở Nhật chẳng hạn, với khoảng cách xa như vậy thì khả năng teamwork càng quan trọng hơn. Bên cạnh đó là kỹ năng quản lý về checking task, quản lý nhân sự làm sao để motivate các dev có động lực làm việc tốt nhất, tạo tinh thần ham học hỏi, cầu tiến hơn nữa trong công việc cho mọi người.

Để trở thành một BrSE thì yêu cầu tối thiểu về Nhật ngữ bên mình như thế nào?

Thật sự ở đây bằng cấp không quan trọng. Có đôi khi khách hàng chưa hợp tác với mình lần nào thì họ có thể dựa trên bằng cấp để họ đánh giá nhưng khi họ thật sự cần mình hoặc là trong thời điểm BrSE vẫn còn khan hiếm này thì mình chỉ cần thể hiện năng lực của mình làm sao để khách hàng hiểu mình và mình hiểu khách hàng là được.

Offshore và Nearshore, mặc dù là những thuật ngữ không mới nhưng anh có thể khái quát lại một lần nữa để khán giả hiểu rõ hơn được không ạ?

Offshore là hình thức hợp tác với 1 công ty bên ngoài, cách xa về địa lý và thời gian như giữa Nhật với Việt chẳng hạn. Nearshore là hình thức hợp tác với công ty bên ngoài khá gần với khoảng cách địa lý và múi giờ của mình như Việt với Lào hay trong nước với nhau.

Hiện tại Rikkeisoft đang áp dụng offshore như thế nào: Phía Nhật Bản sẽ tiến hành define requirements, tạo design document và bên Việt Nam phát triển product?

Thật ra việc này sẽ phụ thuộc vào đặc thù của mỗi dự án. Có những dự án khách hàng sẽ design rất rõ ràng từ requirement, design và mình chỉ việc code thôi. Nhưng cũng có những dự án khách hàng chỉ đơn giản yêu cầu tôi muốn cái này, tôi muốn cái kia thì mình phải đưa ra đề xuất của mình và thuyết phục khách hàng. Mình sẽ được quyền design, làm document, làm từ A đến Z tất cả các giai đoạn luôn, design UI, design coding đến coding, testing.

Ở Rikkeisoft hiện tại đủ khả năng đáp ứng các loại dự án như vậy và hiện tại cũng đang tham gia vào các dự án từ phát triển yêu cầu đến lúc bàn giao thực thi cho khách hàng.

Không biết ở Rikkeisoft có cung cấp dịch vụ Onsite hay không và khách hàng Nhật liệu họ có sẵn sàng cho dịch vụ này hay họ chỉ cần một team làm Offshore?

Thật ra thì Rikkeisoft đã thành lập một chi nhánh bên Nhật Bản đặt tại Osaka và dự kiến tương lai sẽ mở nhiều chi nhánh hơn tại Nhật, nghĩa là Rikkeisoft có cung cấp dịch vụ onsite. Khách hàng ngày nay hầu hết đều yêu cầu onsite, vì onsite thuận tiện cho việc giao tiếp, quản lý từ phía khách hàng, giảm airforce quản lý cho khách hàng, khách hàng sẽ không phải trực tiếp quản lý offshore nữa. Những việc đó sẽ giao cho một lead ngồi cạnh khách hàng và xây dựng niềm tin khách hàng, nhất là trong lần đầu hợp tác.

Vì lần đầu làm việc họ sẽ không biết trình độ offshore như thế nào, văn hóa làm việc ở Việt Nam ra sao, họ sẽ cần một người làm sao để họ tin tưởng. Tiếp theo nó sẽ nâng cao level bridge cho nhân viên, vì khi ngồi cạnh khách hàng mình sẽ được giao tiếp tiếng Nhật nhiều hơn, mình được làm việc trực tiếp, được học hỏi công nghệ, kỹ thuật từ khách hàng luôn.

Xem thêm Những Nguyên Tắc Cơ Bản Của BrSE

Thường sẽ mất bao lâu tính từ lúc khách hàng liên hệ cho đến khi bàn giao sản phẩm cuối cùng cho khách hàng?

Tùy thuộc vào yêu cầu của khách hàng, mức độ rõ ràng của yêu cầu và sự phức tạp của hệ thống thì nó sẽ có thời gian bàn giao khác nhau. Quy trình làm dự án sẽ có các bước như sau:

  • Đầu tiên, mình phải nghe hiểu yêu cầu khách hàng rồi đưa ra các đề xuất, giải pháp, lên báo giá.
  • Sau đó sẽ trình bày kế hoạch với khách hàng, sau khi khách hàng đồng ý với kế hoạch đó mình mới nhận dự án.
  • Sau khi nhận dự án mình sẽ lên plan chi tiết, thiết kế, coding, testing và bàn giao. Nếu có điểm nào khách hàng chưa hài lòng thì mình phải xem xét và revise lại. Một bridge sẽ tham gia nhiều nhất ở 3 công đoạn là làm rõ yêu cầu, tức là đọc hiểu tài liệu tiếng Nhật và trao đổi với khách hàng.
  • Tiếp theo là thiết kế và bàn giao, mình sẽ là người “chốt chặn” để đảm bảo chất lượng dự án trước khi bàn giao cho khách hàng.

Theo anh BrSE có còn là “hot job” nữa hay không và nhận định của anh về ngành nghề này ở Việt Nam trong 5 năm tới như thế nào?

Mình cũng đã gặp rất nhiều bạn trẻ hỏi những câu như vậy. Thật sự mình thấy nó vẫn hot, BrSE vẫn sẽ là nghề còn hot trong 5 năm tới. Đặc thù của ngành này là khách hàng khá là kĩ tính, khó tính, họ sẽ luôn luôn cần một người có thể hiểu được văn hóa của họ, ngôn ngữ của họ. Họ cần một dev như là cầu nối trong công việc để trơn tru hoạt động giữa 2 bên nên có thể khẳng định đây là nghề không bao giờ hết hot cả.

Liệu có phải vị trí BrSE chỉ xuất hiện trong các công ty outsourcing và chỉ khi công ty outsourcing làm việc với khách hàng/thị trường Nhật Bản?

Thuật ngữ kỹ sư cầu nối xuất phát từ các kỹ sư làm cho thị trường Nhật nhưng mình nghĩ vói các thị trường khác thì khách hàng đều mong muốn có người hiểu được ngôn ngữ của mình nên anh nghĩ ở thị trường nào cũng cần vị trí này cả, chẳng qua là tên gọi của nó có thể khác đi thôi.

Đối với những dev không mạnh về kỹ năng mềm có phải là rào cản để trở thành BrSE không?

Nó đúng là rào cản nhưng mình nghĩ càng là rào cản mình càng phải cố gắng vượt qua nó. Nó là một kỹ năng hoàn toàn có thể rèn luyện được vì với thời đại hiện nay một coder cũng cần có kỹ năng giao tiếp. Một dự án không chỉ một, hai người làm mà là cả một team nên rõ ràng tinh thần teamwork là rất cần thiết, giao tiếp tốt và BrSE còn phải giao tiếp với nhiều đối tượng khác nhau nữa nên đây thật sự là một kỹ năng rất quan trọng. Vì nó quan trọng như vậy nên không còn là rào cản nữa mà sẽ là một tiêu chuẩn, để mọi người nhìn vào đấy mà rèn luyện.

Theo anh các bạn dev có background nào thì dễ chuyển sang làm BrSE nhất? Trình độ coding nên ở level nào?

BrSE có nhiều level và nó còn phụ thuộc vào các yêu cầu của khách hàng nên mình thấy dev nên ở trình độ từ junior trở lên, kinh nghiệm đi làm từ khoảng 2 năm đổ lên. Vì lúc này bạn đã đủ kinh nghiệm trải qua các dự án rồi, đủ kiến thức nền tảng về kỹ thuật cũng như các kỹ năng mềm để làm việc với các dự án trơn tru hơn và không mắc phải các lỗi cơ bản nữa.

Và ngược lại, với những bạn có mindset BA tốt, management tốt, kỹ năng giao tiếp tốt nhưng lại không xuất thân là dev mà muốn trở thành “người kết nối” trong một công ty outsourcing thì theo anh có khả thi không?

Theo mình thì rất khả thi luôn. Những bạn có nghiệp vụ tốt sẽ được giao cho những dự án khá lớn, độ phức tạp cao hơn. Ở những dự án đó đòi hỏi ít hơn các kỹ năng về coding mà nó đòi hỏi những kỹ năng mềm nhiều hơn, về quản lý tiến độ, giao tiếp với khách hàng, kỹ năng mềm về autivation trong team. Những kỹ năng đó sẽ giúp đưa dự án đến thành công nên những bạn có mindset tốt như vậy sẽ được trọng dụng nhiều hơn cả trong ngành này.

  Những Nguyên Tắc Cơ Bản Của BrSE
  Tản Mạn Về Con Đường Trở Thành BrSE

Anh có kỷ niệm nào trong quá trình làm việc với khách hàng muốn chia sẻ với mọi người chứ?

Mình cũng đã từng thất bại nhiều lần vì thời điểm mới bắt tay vào làm bridge, mình khá là chủ quan, tự tin vào khả năng giao tiếp, tự tin vào tiếng Nhật của mình, nghĩ là mình đã hiểu những gì khách hàng chia sẻ. Rõ ràng là nếu quá tự tin như vậy mình sẽ luôn cho rằng ý nghĩ của mình như vậy là đúng.

Sai lầm ở đây là khi khách hàng đưa ra yêu cầu mình luôn luôn nói rằng tôi hiểu rồi trong khi thật sự yêu cầu của khách hàng vẫn chưa rõ ràng và đôi khi nó vẫn ẩn chứa nhiều rủi ro. Nên khi bắt tay vào làm thực tế mình mới phát hiện ra nó không dễ dàng như vậy, những gì mình hiểu chỉ là bề nổi thôi, có thể mình đã hiểu sai và kết quả là bàn giao sản phẩm sai, dẫn đến hậu quả khá nghiêm trọng.

Mình nghĩ đó cũng là một bài học mà các BrSE khi mới bắt đầu đều dễ mắc phải, thậm chí có những BrSE lâu năm cũng mắc phải. Lời khuyên của mình là các BrSE nên cẩn trọng khi nói những câu như “Tôi đồng ý”, “Tôi đã hiểu, “Tôi hiểu rõ rồi”,… Mình nên confirm lại các ý của khách hàng và hỏi xem tôi nói như vậy có đúng không, nếu chưa hiểu hoàn toàn thì nên Q&A đến lúc không còn gì để hỏi nữa thì mới tự tin là mình đã hiểu rồi. Khi nào mình vẫn còn lăn tăn trong đầu, vẫn còn phải phán đoán thì cứ thoải mái hỏi để hiểu rõ vấn đề.

Anh có thể chia sẻ lời khuyên khi phỏng vấn cho vị trí BrSE?

Với kinh nghiệm phỏng vấn của mình thì mình nghĩ khả năng giao tiếp và sự cầu tiến, tinh thần ham học hỏi của một BrSE cần phải được đặt lên hàng đầu. Khi phỏng vấn mình thường sẽ hỏi những câu như Giới thiệu về bản thân, kinh nghiệm làm việc ở các dự án trước, kinh nghiệm làm việc với người Nhật, dự án thành công, dự án thất bại thì rút ra bài học gì. Và mình nghĩ để trả lời tốt những câu hỏi này thì ứng viên nên trả lời thành thật, tự tin, bình tĩnh, không cần phải dùng những từ tiếng Nhật quá khó, hãy dùng những từ ngữ đơn giản, dễ hiểu miễn diễn tả được ý nghĩ của mình là được.

Hãy mạnh dạn hỏi lại người phỏng vấn nếu có vấn đề gì mình không hiểu, tự tin hỏi về công ty, phạm vi công việc, mong đợi của họ ở vị trí công việc bạn đang ứng tuyển là gì. Từ đó mình có thể trình bày là mình có gì để đáp ứng được những mục tiêu đó, lộ trình tương lai mình đặt ra để làm việc là gì. Một điểm cần lưu ý là khi phỏng vấn vị trí BrSE mình có phỏng vấn cả tiếng Nhật.

Anh có thể chia sẻ nguồn tài liệu nào để các bạn tham khảo học ngoại ngữ không, đặc biệt là với từ vựng chuyên ngành lập trình?

Thật ra có rất nhiều nguồn, nếu ai học ngoại ngữ thường xuyên sẽ biết đến phần mềm quizlet.com. Đây là phần mềm có rất nhiều các bài đã được soạn sẵn, có đến hơn 1000 bài từ vựng tiếng Nhật, muốn tìm từ vựng IT tiếng Nhật mình search IT Tocobaga sẽ có rất nhiều. Thứ hai là mọi người nên đọc báo như NHK, NHKYJ tùy theo trình độ của mỗi người. Hoặc là các video youtube nói về cách giao tiếp trong ngành IT, xem qua để mình thấy được phong thái nói chuyện, làm việc của họ để sau này tiếp xúc sẽ đỡ bỡ ngỡ hơn. Thứ 4 là mọi người có thể xin bản tóm tắt các từ vựng của những người đã làm việc với phía Nhật rồi, đây là một nguồn rất hữu dụng.

Inversion of Control nguyên lý của các nguyên lý

Inversion of Control nguyên lý của các nguyên lý

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

1. Nguyên lý Inversion of Control là gì?

Trước khi đến với định nghĩa Inversion of Control là gì? bạn hãy cùng tôi làm vài cốc trà đá chém gió tí. Trong ghế nhà trường có lẽ ai cũng sợ nhất môn Triết học bởi mấy lý do, khó hiểu (trìu tượng), nhiều định nghĩa cần học thuộc. Thế nhưng Triết học lại là khoa học của mọi khoa học bởi nó trìu tượng ở một tầng cao nhất. Bản thân tôi cũng đã quên tất cả những gì học được (nói đúng hơn là thuộc được) trong Triết học ngay sau khi thi xong môn này, thế nhưng sau một thời gian khá dài bộn bề lo toan với công việc và cuộc sống, những khái niệm, quy luật ngày xưa thuộc trong Triết học tự nhiên cứ lẩn vẩn trong đầu và rồi ngẫm lại, đúng thật! Điểm lại chút về 2 nguyên lý, 3 quy luật và 6 cặp phạm trù trong Triết học, có thể trong phạm vi hiểu biết của mình và những trải nghiệm đến hiện tại nó đã làm nên tất cả những gì đang diễn ra xung quanh ta. Sở dĩ viết vài câu chuyện phiếm ở đây hầu chuyện các bạn vì các khái niệm mà chúng ta bàn thảo trong bài viết này khá là trìu tượng, nó cũng như triết học là nguyên lý của các nguyên lý. Một trong những quy luật mà tôi hay chiêm nghiệm nhất là quy luật lượng chất:

Những thay đổi đơn thuần về lượng, đến một mức độ nhất định, sẽ chuyển hóa thành những sự khác nhau về chất.

Friedrich Engels

Bạn học một cái gì đó, hoặc làm một cái gì đó có thể không hiểu ngay nhưng đến khi có một lượng kiến thức, kinh nghiệm nhất định, bạn sẽ đột nhiên hiểu ra nó. Do vậy, nếu các định nghĩa về Inversion of Control dưới đây quá trìu tượng, khó hiểu bạn cũng đừng quá quan tâm, đến một ngày nào đó khi bạn lập trình đủ 100 dự án, có 10 năm “giờ bay” trong lập trình… tự nhiên sẽ hiểu. Chuyện phiếm vậy thôi, giờ chúng ta cùng vào phần chính của bài viết nhé. Định nghĩa nguyên lý Inversion of Control

Inversion of Control (IoC) là một nguyên lý thiết kế trong công nghệ phần mềm với các đoạn code khi đưa vào một framework sẽ nhận được luồng điều khiển từ framework hay nói một cách khác là được framework điều khiển. Kiến trúc phần mềm với thiết kế này sẽ đảo ngược quyền điều khiển so với lập trình hướng thủ tục truyền thống. Trong lập trình truyền thống các đoạn code thêm vào sẽ gọi các thư viện nhưng với IoC, framework sẽ gọi các mã thêm vào.

Martin Fowler

Nói thật, tôi cũng cố gắng đưa ra định nghĩa này về ngôn ngữ con người có thể hiểu được nhưng nó vẫn quá trìu tượng hoặc do tôi chưa đủ “giờ bay” nên cũng chỉ dừng lại ở một định nghĩa như vậy. Tôi cũng đã thử tìm hiểu các định nghĩa khác trên Internet nhưng cũng chỉ nhận được một câu: “Tốt nhất bạn nên quên nó đi”. Lại nói về cách nhận thức một vấn đề, theo quan điểm phép duy vật biện chứng, hoạt động nhận thức của con người đi từ trực quan sinh động đến tư duy trừu tượng, và từ tư duy trừu tượng đến thực tiễn. Tóm lại nếu chúng ta đi vào cái định nghĩa chết tiệt này ngay thì là một sai lầm trong cách tìm hiểu về một vấn đề.

Chém gió thôi nhé, Triết học ngày xưa mình thi lại đến lần thứ 3 mới qua :).

  Inversion of Control và Dependency Injection
  Thay đổi tư duy về kiểm thử theo Nguyên lý Agile

2. Trực quan sinh động về IoC

Inversion of Control là một sự “thi phường” trong việc mở rộng một framework, một đặc tính trong các framework. Chúng ta cùng xem một ví dụ đơn giản về chương trình nhập thông tin người dùng theo kiểu thủ tục truyền thống:

<?php
function process_name ($name) {
    echo "Your name: " . $name;
}
function process_job ($job) {
    echo "Your job: " . $job;
}
echo "What is your name?";
$answer = rtrim(fgets(STDIN));
process_name($answer);

echo "What is your job?";
$answer = rtrim(fgets(STDIN));
process_job($answer);

Khi chạy ứng dụng này trong màn hình dòng lệnh, các dòng code của chúng ta đang có quyền kiểm soát, nó quyết định được khi nào đặt câu hỏi, khi nào đọc dữ liệu người dùng nhập vào và khi nào xử lý các kết quả này.

Inversion of Control nguyên lý của các nguyên lý

Tiếp tục, chúng ta viết lại ứng dụng sử dụng framework Laravel ở dạng giao diện đồ họa. Sự khác biệt lớn nhất giữa hai ứng dụng này là luồng điều khiển (flow of control). Trong chương trình dòng lệnh, chúng ta kiểm soát được khi nào các phương thức được gọi, nhưng trong trong chương trình dạng đồ họa thì không. Framework sẽ kiểm soát việc đó bằng một vòng lặp liên tục kiểm tra xem có dữ liệu nào được nhập vào không? Có thể bạn nhập nghề nghiệp trước khi nhập tên. Như vậy, trong ứng dụng thứ hai quyền điều khiển đã bị đảo ngược, quyền kiểm soát đã được về framework.

Inversion of Control nguyên lý của các nguyên lý

Đây là một ví dụ trực quan về nguyên lý Inversion of Control, nguyên lý này làm người ta liên tưởng đến một nguyên tắc khi làm việc trong Hollywood “Đừng gọi cho chúng tôi, chúng tôi sẽ gọi cho bạn”. Bạn đã hiểu được IoC là gì? nhưng tôi thì chưa, thật sự nó vẫn …éo thể hiểu được. Tạm thời gác qua việc đó, chúng ta cần thêm “lượng” để đến với bước nhảy vọt về “chất” ở cuối bài.

Một đặc điểm quan trọng của framework là các phương thức được định nghĩa bởi người dùng thông thường được gọi từ trong bản thân framework chứ không phải từ code ứng dụng của người dùng. Framework đóng vai trò của chương trình chính trong việc điều phối và sắp xếp hoạt động ứng dụng. Sự đảo ngược quyền kiểm soát này tạo ra cho framework sức mạnh thông qua việc mở rộng. Các phương thức được viết bởi người dùng định nghĩa các thuật toán trong framework cho một tính toán cụ thể. Inversion of Control cho thấy sự khác biệt giữa một framework và một thư viện.

  • Một thư viện chỉ là tập hợp các tính năng mà bạn có thể sử dụng, nó được tổ chứ thành các class. Sau mỗi lần gọi một phương thức, thư viện sẽ làm một số việc và sau đó trả quyền điều khiển về cho người dùng.
  • Framework là một biểu hiện của thiết kế trìu tượng với nhiều hành vi được xây dựng sẵn bên trong, để sử dụng nó bạn cần chèn các hành vi của bạn vào các nơi khác nhau trong framework bằng các class hoặc plugin. Code của framework sẽ gọi đến code của bạn tại những điểm cần thiết.

Có nhiều cách để bạn đưa thêm mã vào framework, trong ví dụ trên chúng ta sử dụng một textbox, bất kỳ khi nào, textbox phát hiện sự kiện người dùng nhập liệu, nó sẽ gọi đến các code trong một “bao đóng”. Một cách khác để làm điều này là để framework định nghĩa các sự kiện và code người sẽ đăng ký vào các sự kiện này. Trong Laravel, bạn có thể phát sinh một sự kiện khi thao tác với một đoạn code của mình và framework có cơ chế kiểm soát các sự kiện đó, hay nói cách khác bạn đã ủy quyền lại cho framework.

Các phương pháp tiếp cận là rất tốt, nhưng thỉnh thoảng bạn muốn kết hợp nhiều lời gọi phương thức trong một đơn vị mở rộng, framework cần định nghĩa một interface để client code phải thực thi nó cho các lời gọi phương thức liên quan. Đây chính là nguyên lý đóng mở trong nguyên lý SOLID cho thiết kế hướng đối tượng.

Thực sự bạn nào đọc được đến đoạn này tôi phải rất cảm phục vì sự kiên nhẫn của bạn, nhưng một lần nữa cặp phạm trù nguyên nhân và kết quả rất đáng để chúng ta phải cố gắng. Nguyên nhân: bạn kiên nhẫn tống vào đầu mớ lý thuyết trìu tượng này, kết quả: đến cuối bài bạn hiểu được “Inversion of Control là gì?”.

Trong cái trực quan có cái trực quan hơn, vậy tìm cái dễ nhất để hiểu trước rồi hiểu cái phức tạp sau. Nếu bạn đã tìm hiểu sơ lược về IoC trên mạng, bạn sẽ thấy có cả một rừng các thuật ngữ liên quan như Dependency Inversion Principle (DIP), Dependency Injection Pattern (DI), IoC Container. Khá là khó để phân biệt các khái niệm này, chúng ta cần một khẩu quyết chứa đựng cả một tàng thư.

DI is about wiring, IoC is about direction, and DIP is about shape.

IoC là hướng đi và DIP là định hình cụ thể của hướng đi còn DI là một thực hiện cụ thể.

Khẩu quyết này tạm vẽ thành hình ảnh cho dễ nhớ.

Inversion of Control nguyên lý của các nguyên lý

Đến đây chắc bạn đã đồng tình với tôi: “Inversion of Control là nguyên lý của các nguyên lý”.

3. Inversion of Control được hình thành như thế nào?

Đôi khi chúng ta tự hỏi, các nguyên lý như IoC, SOLID… được hình thành như thế nào? Tại sao người ta có thể nghĩ ra chúng? Quay trở lại với lập trình hướng đối tượng là một cách giải quyết các vấn đề theo tư duy hướng đối tượng. Cách thức này mô phỏng hệt như thế giới ngoài đời, do vậy các nguyên lý thiết kế trong cuộc sống thật hoàn toàn có thể đưa vào trong lập trình. Tiếp theo đây là một ví dụ tôi đọc được từ cuốn Dependency Injection in .NET, một cuốn sách giải thích khá hay về các khái niệm IoC, DI, DIP…

Trong nguyên lý cuối cùng Dependency Inversion của SOLID chúng ta có nói đến một ví dụ về một chiếc đèn bàn có dây điện được đấu nối trực tiếp vào ổ điện trong tường mà không qua ổ cắm và phích cắm, còn trong ví dụ này chúng ta thay nó bằng cái máy sấy tóc. Trường hợp này cho thấy vấn đề rất lớn khi các đối tượng phụ thuộc chặt chẽ với nhau trong thiết kế.

Inversion of Control nguyên lý của các nguyên lý

Trong một lần đi nhà nghỉ cùng bạn gái (giả tưởng thôi nhé), tôi đã giật mình khi nhìn thấy hình ảnh chiếc máy sấy được nối trực tiếp vào trong ổ điện mà không thông qua ổ cắm và phích cắm. Mục đích thì đã rõ, những kẻ thích táy máy sẽ “tắt điện” khi nhìn thấy cảnh này. Nhưng chuyện gì sẽ xảy ra khi chiếc máy sấy này hỏng, dù nó có là hàng Nhật xịn nhưng cũng có lúc hỏng chứ.

Để sửa chữa là khá phức tạp, đầu tiên chúng ta phải ngắt át-tô-mát, sau đó mở cái hộp điện ra và thay chiếc máy sấy mới vào. Ông thợ nào không cẩn thận có thể không bật điện lên để test xem cái máy mới thay có hoạt động không. Trong lập trình cũng vậy, nếu các module phụ thuộc chặt chẽ vào nhau (thường dùng thuật ngữ tightly coupled) thì khi một module có vấn đề, cả hệ thống sẽ rối tung, rất khó để duy trì và phát triển.

Inversion of Control nguyên lý của các nguyên lý

Thông thường, chẳng ai chạy dây các thiết bị điện trực tiếp vào hệ thống điện, thay vào đấy là sử dụng một phích cắm và ổ cắm. Một ổ cắm là một interface với chuẩn cắm phải phù hợp với hình dạng phích cắm. Như vậy, máy sấy tóc với ổ cắm và phích cắm đã hình thành một kết nối không phụ thuộc (loosely coupled). Có thể có nhiều cách kết hợp các thiết bị điện này với nhau để ra một hệ thống. Trong lập trình việc kết hợp này có thể so sánh với design pattern và các nguyên lý thiết kế.

Máy sấy tóc sẽ không còn ràng buộc với hệ thống điện, nếu chúng ta cần ổ điện cho laptop, đơn giản là rút máy sấy ra và cắm laptop vào ổ cắm. Các nhà thiết kế ổ cắm không quan tâm đến thiết bị điện như laptop, điện thoại, tivi… nhưng các thiết bị này vẫn hoạt động tốt khi cắm vào. Các thiết bị khác nhau có thể cắm vào ổ cắm mà không ảnh hưởng gì tương tự như nguyên lý thay thế Liskov trong thiết kế phần mềm. Trong Dependency Inject, nguyên lý Liskov là một trong những nguyên lý quan trọng, nó cho phép đáp ứng những yêu cầu trong tương lai thậm chí chúng ta chưa biết gì về nó trong hôm nay. Cũng giống như trong thực tế, nếu 10 năm nữa có một thiết bị điện mới thì nó vẫn cắm vào cái ổ cắm này mà không cần phải thay đổi bên trong.

Inversion of Control nguyên lý của các nguyên lý

Khi pin laptop đầy, bạn sẽ rút phích cắm của máy laptop ra và chuyển sang dùng pin. Trong lập trình, chúng ta luôn mong muốn một service/module/class nào đó là đang tồn tại, nếu thành phần đó đã được gỡ bỏ, chúng ta sẽ gặp lỗi NullReferenceException, với tình huống này chúng ta sẽ tạo ra một interface mà nó không làm gì. Đây là một design pattern được biết đến với tên là Null Object, nó đáp ứng việc rút phích cắm ra khỏi tường.

Inversion of Control nguyên lý của các nguyên lý

Mọi điều có thể xảy ra, nếu như hệ thống điện của cả khu đang gặp vấn đề, bạn sẽ cần đến một bộ lưu điện UPS để vẫn hoạt động được thêm một thời gian. Máy laptop và bộ lưu điện có những nhiệm vụ khác nhau, đây chính là nguyên lý đơn chức năng (single responsibility) trong thiết kế phần mềm. Cả UPS và laptop đều được sản xuất bởi các nhà máy khác nhau, được mua ở những thời điểm khác nhau nhưng có thể sử dụng kết hợp được với nhau, thậm chí bạn có thể cắm cả máy sấy tóc khi laptop không cắm vào bộ lưu điện.

Inversion of Control nguyên lý của các nguyên lý

Một thực tế là các nhu cầu luôn thay đổi, các hệ thống luôn mở rộng và cần thêm tính năng, việc mở rộng đôi khi chỉ là cách lắp ghép các thành phần với nhau theo những cách khác nhau. Decorator pattern là mẫu lập trình giúp thêm tính năng cho một class mà không cần viết lại hoặc thay đổi các code có sẵn. Một cách khác để thêm tính năng mới vào một code có sẵn là tổng hợp các implement hiện có cửa một interface sử dụng Composite pattern. Với việc sử dụng ổ cắm dài, chúng ta có thể thêm vào hoặc bớt đi các thiết bị điện cần chạy. Với cùng cách này Composite pattern dễ dàng thêm bớt tính năng bằng cách thay đổi tập các interface.

Inversion of Control nguyên lý của các nguyên lý

Đôi khi chúng ta có một thiết bị được mua ở nước ngoài với chuẩn đầu cắm khác với ổ cắm đang có, chúng ta cần một bộ chuyển đổi. Adapter pattern cũng thực hiện cùng một nhiệm vụ với các bộ chuyển đổi. Chỉ với một ví dụ thực tế về hệ thống điện đơn giản, chúng ta đã thấy có rất nhiều các ý tưởng đã được thực hiện ở trong thế giới hướng đối tượng trong lập trình.

4. Tại sao dùng Inversion of Control

Chuyện phiếm, chém gió kèm theo bao nhiêu cốc trà đá rồi mà vẫn không thể hiểu được đang nói về cái gì? Hic…

Ngay chính trong định nghĩa Inversion of Control đã nói nên mục đích chính của nguyên lý này đó là tính mở rộng của một hệ thống. Quay lại với câu chuyện về máy sấy tóc, các thiết kế ở ngoài đời giúp cho việc mở rộng một hệ thống là quá đơn giản. Trong lập trình cũng vậy, nhờ thực hiện những định hình cụ thể từ các nguyên lý, một hệ thống ứng dụng sẽ có tính mở rộng. Nhưng để đạt được tính mở rộng cho một ứng dụng thì trước tiên ứng dụng này cần loại bỏ sự phụ thuộc giữa một đối tượng này với một đối tượng khác.

Tính mở rộng có thể mở rộng ra hơn nữa ở góc độ duy trì và phát triển ứng dụng. Một hệ thống có thiết kế đơn giản sẽ dễ mở rộng hơn một hệ thống phức tạp. Hơn nữa các hệ thống áp dụng nguyên lý Inversion of Control sẽ dễ dàng trong kiểm thử ứng dụng do các thành phần có sự độc lập nhất định.

5. Quán đến giờ đóng cửa, hết trà đá!

“Em ơi! Anh thêm cốc nữa đê…”, không một tiếng đáp lại, miệng khô đắng, giọng gằn lên “Chủ quán…”, mịa nó chứ vẫn im lặng như tờ, cúi xuống định vớ đại con Chaco 81 lỗ quăng vào… Úi quá nửa đêm roài, con mưa ảnh hưởng bão cũng đã tạnh, chỉ còn chút gió vi vu… “Quán đến giờ đóng cửa, hết trà đá!” giọng nói lanh lảnh cất lên từ một khuôn mặt bây bi con bà chủ quán.

Mải chém gió, giờ mới nhớ ra, mới được nửa chặng đường từ trực quan đến tư duy trìu tượng. Thế còn từ tư duy trìu tượng đến thực tiễn, thôi hẹn bữa khác mạn đàm tiếp…

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 Developer hấp dẫn trên TopDev

iOS là gì? Giới thiệu lập trình ios

iOS là gì? Giới thiệu lập trình ios

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

iOS là gì? Giới thiệu lập trình ios.

1. IOS là gì?

  • IOS là hệ điều hành dành cho thiết bị di động được cung cấp và phát triển bới Apple.
  • Được phân phối và phát hành vào năm 2007 dành cho Iphone, Ipad và Apple TV.
  3 sai lầm các iOS Developers thường mắc phải
  5 bài học quí giá về việc phát triển ứng dụng iOS

2. Phần mềm và ngôn ngữ lập trình

Các phần mềm trên iOS thông thường được người dùng tải về từ App Store – kho ứng dụng của Apple.

iOS là gì? Giới thiệu lập trình ios

  • Các phần mềm này được viết bằng các ngôn ngữ lập trình Objective-C và sau này được thay thế bằng Swift.
  • Để phát hành phần mềm, nhà phát triển phải đăng ký 1 tài khoản Developer để được cấp phép phát hành phần mềm. Apple có thu phí cho loại tài khoản Developer này.
  • Objective-C hoặc Swift được lập trình bằng  IDE Xcode:

iOS là gì? Giới thiệu lập trình ios

3. Các yêu cầu để bạn có thể học được iOS

iOS là một phần trong hệ sinh thái của Apple nên bạn chỉ có thể lập trình iOS trên hệ điều hành MacOS. Đo đó bạn cần có một chiếc máy tính cài đặt MacOS hoặc sử dụng máy ảo MacOS

(Lời khuyên của mình, nếu bạn muốn trở thành một lập trình viên Swift hay lập trình viên iOS, mà xem đó là nghề của bạn, thì bạn nên mua một chiếc máy tính Macbook.)

Yêu cầu về phần cứng khi cài đặt Mac OS X chi tiết như sau

  • Ram: Tối thiểu 4Gb. Đề xuất 8Gb.
  • CPU: Intel Core i3, Core i5 hoặc Core i7 (Hỗ trợ Intel Virtualization VT-x).
  • HDD (Hard drive): Đề xuất SSD. Tuy nhiên SATA cũng có thể chấp nhận.

Và đặc biệt các bạn đã biết 1 ít về các giải thuật trong lập trình.

Có tinh thần trách nhiệm và chịu khó thì mới có thể trở thanh lập trình giỏi.

4. Cơ hội nghề nghiệp lớn và lương cao

Bạn có thể tìm các trang tuyển tuyển dụng trên https://itviec.com/ thì thấy nhu cầu đối với nghề IOS cực kỳ lớn và mức lương cũng cao hơn lập trình web.

Hoặc bạn cũng có thể kiếm tiền với  IOS ngoài việc làm ở công ty:

  • Bạn đã biết nhiều người kiếm tiền doanh thu lơn nhất hiện nay từ đâu và đặc biệt là anh Nguyễn Hà Đông với game flappybird là họ đã tích hợp admob vào app.
  • Bạn có thể làm các dự án Freelance có thể kiếm tiền tương đối lớn.

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

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

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