Home Blog Page 126

XML là gì? Tìm hiểu cú pháp và các thao tác với file XML

XML là gì? Ưu nhược điểm của XML

Trong lập trình ứng dụng web, XML được sử dụng nhiều nhất là xây dựng các API Service. Các API sẽ trả kết quả về dạng XML hoặc JSON để các hệ thống khác có thể nói nói chuyện với nhau được. Hiện nay tuy JSON được sử dụng phổ biến hơn, nhưng XML cũng vẫn đang được dùng bởi nhiều hệ thống lớn. Cùng TopDev tìm hiểu XML là gì thật chi tiết trong bài viết dưới đây!

XML là gì?

XML là từ viết tắt của từ Extensible Markup Language là ngôn ngữ đánh dấu mở rộng được thiết kế để lưu trữ và truyền tải dữ liệu một cách có cấu trúc. Tác dụng chính của XML là đơn giản hóa việc chia sẻ dữ liệu giữa các nền tảng và các hệ thống được kết nối thông qua mạng Internet.

XML

Ngôn ngữ XML do Tổ chức World Wide Web Consortium (W3C) đề xuất, được tạo ra để hỗ trợ việc xây dựng các dịch vụ API. XML có khả năng truyền và đọc nhiều loại dữ liệu khác nhau. Kết quả từ API thường được trả về dưới dạng XML, cho phép các hệ thống khác nhau dễ dàng giao tiếp với nhau.

Ví dụ khi ta xây dựng một ứng dụng bằng php và một ứng dụng bằng Java thì hai ngôn ngữ này không thể hiểu nhau, vì vậy ta sẽ sử dụng XML để trao đổi dữ liệu. Chính vì vậy, XML có tác dụng rất lớn trong việc chia sẻ, trao đổi dữ liệu giữa các hệ thống.

Ưu và nhược điểm của XML

Ưu điểm của XML

Ưu điểm lớn nhất của XML là sự độc lập. XML được sử dụng để mô tả dữ liệu dưới dạng text, nên hầu hết các phần mềm hay các chương trình bình thường đều có thể đọc được chúng.

XML có thể đọc và phân tích nguồn dữ liệu khá dễ dàng nên nó được sử dụng với mục đích chính là trao đổi dữ liệu giữa các chương trình, các hệ thống khác nhau. XML được sử dụng cho Remote Procedure Calls nhằm phục vụ cho các dịch vụ của website.

Tương thích tốt với các công nghệ khác: XML dễ dàng tích hợp với các ngôn ngữ và công nghệ khác như HTML, CSS, JavaScript, và đặc biệt là các giao thức web như SOAP (Simple Object Access Protocol) để trao đổi dữ liệu.

Hỗ trợ tốt cho cấu trúc dữ liệu phân cấp: XML có khả năng biểu diễn các cấu trúc dữ liệu phân cấp, chẳng hạn như cây dữ liệu. Điều này giúp XML lý tưởng cho việc mô tả các cấu trúc phức tạp như cấu trúc thư mục hoặc tài liệu.

Nhược điểm của XML

Tốn kém tài nguyên: XML có cú pháp dài và phức tạp, điều này dẫn đến tệp XML thường lớn hơn nhiều so với các định dạng khác như JSON. Kích thước lớn làm cho XML ít hiệu quả khi cần truyền tải dữ liệu qua mạng hoặc lưu trữ trên thiết bị có dung lượng giới hạn.

Tốc độ xử lý chậm: Do XML yêu cầu cú pháp phức tạp và cấu trúc dữ liệu phân cấp, việc phân tích và xử lý các tệp XML tốn thời gian và tài nguyên hơn so với các định dạng đơn giản hơn như JSON. Điều này có thể gây ra vấn đề về hiệu suất trong các ứng dụng thời gian thực.

Thiếu tính năng xử lý trực tiếp: XML không có cơ chế xử lý trực tiếp các kiểu dữ liệu khác nhau (như số nguyên, số thực, boolean) như JSON. Tất cả dữ liệu trong XML đều ở dạng chuỗi, điều này đòi hỏi việc chuyển đổi dữ liệu thủ công, gây ra rắc rối cho các nhà phát triển.

Xem thêm so sánh XML và JSON từ W3Schools: https://www.w3schools.com/js/js_json_xml.asp

So sánh XML với HTML

Không giống như HTML, XML không nhằm mục đích hiển thị dữ liệu mà tập trung vào việc mô tả, tổ chức và trao đổi dữ liệu giữa các hệ thống khác nhau.

So sánh XML với HTML

XML và HTML giống nhau đều là các thẻ (tag)

XML HTML
XML cho phép người dùng tạo biểu tượng đánh dấu riêng để mô tả nội dung, tạo một biểu tượng không giới hạn và tự định nghĩa Được định nghĩa trước và người dùng phải tuân thủ
Được thiết kế để chuyển tải và lưu trữ dữ liệu Được thiết kế để hiển thị dữ liệu

Tuy nhiên XML không phải là sự thay thế cho HTML.

  • Ví dụ:
<?xml version="1.0" encoding="UTF-8"?>
     <article>
         <title>XML là gì</title>
         <author>TopDev Blog</author>
         <year>2021</year>
     </article>

XML thường được sử dụng làm cơ sở cho các định dạng tài liệu khác. Dưới đây là một số định dạng bạn có thể biết:

  • RSS
  • Microsoft .NET sử dụng XML cho các file cấu hình của nó.
  • Sitemap

Cú pháp của XML

Một XML đầy đủ:

<?xml version="1.0"?>
<contact-info>
<name>Nhat</name>
<company>TopDev</company>
<phone>(084) 123-4567</phone>
</contact-info>

Bạn để ý trong ví dụ trên có hai loại thông tin:

  • Thông tin đánh dấu, như <contact-info> và
  • Text, hoặc dữ liệu là ký tự, như TopDev(084) 123-4567.

Sơ đồ sau minh họa qui tắc cú pháp để viết các kiểu đánh dấu và text khác nhau trong một tài liệu XML.

 

Chúng ta đi vào giải thích chi tiết cho từng phần:

1. Khai báo XML (XML Declaration)

Tài liệu XML có thể tùy ý có một phần khai báo XML. Nó được viết như sau:

<?xml version="1.0" encoding="UTF-8"?>

Ở đây, version là phiên bản XML và encoding xác định mã hóa ký tự được sử dụng trong tài liệu.

2. Các qui tắc cú pháp để khai báo XML

  • Khai báo XML (XML declaration) là phân biệt kiểu chữ và phải bắt đầu với “<?xml>” ở đây “xml” viết ở dạng chữ thường.
  • Nếu tài liệu chứa khai báo XML, thì nó phải là lệnh đầu tiên của tài liệu XML.
  • Khai báo XML phải là lệnh đầu tiên của tài liệu XML.
  • Một HTTP Protocol có thể ghi đè giá trị của encoding mà bạn đặt trong khai báo XML.

3. Tags và Elements

Một XML file được cấu thành bởi một số phần tử XML (Element), còn được gọi là XML-node hoặc XML-tags. Tên các phần tử XML được bao trong các dấu < > như sau:

<element>

4. Qui tắc cú pháp (Syntax Rules) cho các thẻ và phần tử

Cú pháp phần tử: Mỗi phần tử XML cần được bao trong hoặc với phần tử bắt đầu hoặc kết thúc như sau:

<element>....</element>

Hoặc đơn giản theo cách:

<element/>

Lồng các phần tử: Một phần tử XML có thể chứa nhiều phần tử XML khác như là con của nó, nhưng các phần tử con này phải không đè lên nhau, ví dụ: Một thẻ đóng của một phần tử phải có cùng tên như thẻ mở kết nối với nó.

Ví dụ sau minh họa các thẻ lồng nhau sai cú pháp:

<?xml version="1.0"?>
<contact-info>
<company>TopDev
<contact-info>
</company>

Ví dụ sau minh họa các thẻ lồng nhau đúng cú pháp:

<?xml version="1.0"?>
<contact-info>
<company>TopDev</company>
<contact-info>

Phần tử gốc (Root Element): Một tài liệu XML có thể chỉ có một phần tử gốc. Ví dụ sau minh họa một tài liệu XML sai cú pháp, bởi vì cả hai phần tử x và y xuất hiện ở cấp cao nhất mà không phải là một phần tử gốc.

<x>...</x>
<y>...</y>

Còn đây là ví dụ về đúng cú pháp:

<root>
   <x>...</x>
   <y>...</y>
</root>

Phân biệt kiểu chữ: Tên của các phần tử XML là phân biệt kiểu chữ. Nghĩa là tên của thẻ mở và thẻ đóng phải cùng kiểu.

Ví dụ, <contact-info> là khác với <Contact-Info>.

5. Thuộc tính (Attributes)

Một thuộc tính xác định thuộc tính cho phần tử, sử dụng một cặp tên/giá trị. Một phần tử XML có thể có một hoặc nhiều thuộc tính. Ví dụ:

<a href="https://topdev.vn/">TopDev</a>

Ở đây href là tên thuộc tính và https://topdev.vn/ là giá trị thuộc tính.

6. Qui tắc cú pháp cho thuộc tính trong XML

    • Tên thuộc tính trong XML là phân biệt kiểu chữ (không giống như HTML). Tức là, HREF và href là hai thuộc tính khác nhau trong XML.
    • Cùng một thuộc tính không thể có hai giá trị trong một cú pháp. Ví dụ sau là sai cú pháp bởi vì thuộc tính b được xác định hai lần:
<a b="x" c="y" b="z">....</a>
    • Tên thuộc tính được định nghĩa không có sự trích dẫn, trong khi giá trị thuộc tính phải luôn luôn trong các dấu trích dẫn. Ví dụ sau là sai cú pháp:
<a b=x>....</a>

Trong ví dụ này, giá trị thuộc tính không được định nghĩa trong các dấu trích dẫn.

7. Tham chiếu trong XML

Tham chiếu (References) thường cho phép bạn thêm hoặc bao phần text hoặc phần đánh dấu bổ sung trong một tài liệu XML. Các tham chiếu luôn luôn bắt đầu với biểu tượng “&” , đây là ký tự dành riêng và kết thúc với ký tự “;”. XML có hai kiểu tham chiếu:

Tham chiếu thực thể (Entity Reference): Một tham chiếu thực thể chứa một tên giữa dấu tách mở và dấu tách đóng. Ví dụ: &amp; có amp là tênTên tham chiếu tới một chuỗi văn bản hoặc đánh dấu đã được định nghĩa trước.

Tham chiếu ký tự (Character Reference): Chứa các tham chiếu, ví dụ &#65;, chứa một dấu băm (#) được theo sau bởi một số. Số này luôn luôn tham chiếu tới mã hóa Unicode của ký tự. Trong ví dụ này, 65 tham chiếu tới chữ cái “A”.

8. Text trong XML

  • Tên của phần tử XML và thuộc tính XML là phân biệt kiểu chữ, nghĩa là tên của phần tử mở và phần tử đóng phải ở được viết cùng kiểu.
  • Để tránh các vấn đề về mã hóa ký tự, tất cả XML file nên được lưu ở dạng Unicode UTF-8 hoặc UTF-16.
  • Các ký tự whitespace như khoảng trắng, tab và ngắt dòng giữa các phần tử XML và giữa các thuộc tính XML sẽ bị bỏ qua.
  • Một số ký tự được dành riêng trong cú pháp XML. Vì thế, chúng không thể được sử dụng một cách trực tiếp. Để sử dụng chúng, một số thực thể thay thế được sử dụng, các thực thể này được liệt kê trong bảng dưới:
Ký tự không được phép sử dụng Thực thể thay thế Miêu tả
< &lt; Nhỏ hơn
> &gt; Lớn hơn
& &amp;
&apos; Dấu nháy đơn
&quot; Trích dẫn kép

Bạn có thể tham khảo video tóm tắt về XML:

Mặc dù vẫn tồn tại một số nhược điểm, XML vẫn là một công cụ mạnh mẽ và phổ biến trong việc lưu trữ và trao đổi dữ liệu, đặc biệt trong các ứng dụng yêu cầu tính linh hoạt và cấu trúc rõ ràng. Hi vọng qua bài viết này của TopDev, bạn đã hiểu được XML là gì, cú pháp cũng như ưu nhược điểm của XML. Theo dõi TopDev để cập nhật kiến thức công nghệ mỗi ngày!

Xem việc làm IT mới nhất tại TopDev

Tại sao ứng viên của bạn “bốc hơi” trong buổi phỏng vấn?

CV IT Administrator
CV IT Administrator

CV IT chưa hoàn hảo có phải là nguyên nhân khiến ứng viên e dè buổi interview? Nhà tuyển dụng cũng bị “bỏ rơi”, tại sao không? Thực tế, đó vẫn là một vấn đề nan giải của chuyện tuyển dụng. Nhiều nhà tuyển dụng đã phải chờ đợi ứng viên trong vô vọng khi thấy họ “mất tích” trong buổi phỏng vấn. Và vấn đề về thư mời phỏng vấn cũng là một trong những thắc mắc đáng quan tâm. Có rất nhiều giả thiết đã được đặt ra cho sự vắng mặt của các ứng viên. Cùng TopDev phân tích một số lý do khiến ứng viên “bốc hơi” và các giải pháp được đề xuất.

Ứng viên có nhiều hơn 1 sự lựa chọn

CV IT Administrator
Ứng viên có nhiều sự lựa chọn hơn trong việc “thả” CV IT Administrator cho nhiều doanh nghiệp

Một ứng viên tài năng chắc chắn họ không chỉ có một sự lựa chọn. Họ thường nộp CV cho nhiều công ty khác nhau. Thậm chí nhiều vị trí khác nhau như freelancer it,… Chẳng hạn, bạn nộp nhiều CV IT Administrator cho cùng một vị trí là ở nhiều doanh nghiệp khác nhau. Điều đó làm gia tăng các cơ hội và sự lựa chọn của họ. Thực tế, doanh nghiệp của bạn có thể vuột mất ứng viên tiềm năng chỉ vì các lợi thế khác từ đối thủ: offer mức lương cao hơn, môi trường năng động, dễ phát triển,…

Xem thêm các vị tri tuyển dụng IT nổi bật tại LASTMILE

Giải pháp

Hãy quan tâm đến việc tối ưu hóa thời gian tuyển dụng. Đồng thời, cần đầu tư cho việc phát triển xây dựng thương hiệu tuyển dụng. Nếu khoanh vùng được các ứng viên tiềm năng, hãy sắp xếp phỏng vấn họ càng sớm càng tốt. Đừng chần chờ vì bạn không biết được rằng họ đã onboard tại một công ty khác hay chưa. 

Chưa sẵn sàng về kinh nghiệm và kỹ năng

Đây là những ứng viên thường do dự. Họ vì một lý do nào đó mà chưa có những tìm hiểu kỹ về vị trí công việc, môi trường – văn hóa doanh nghiệp. Và điều quan trọng là họ vẫn còn chưa tự tin về năng lực của bản thân liệu có đáp ứng được nhu cầu công việc hay không? Điều đó làm họ có cảm giác lo sợ cho buổi phỏng vấn trực tiếp…Vậy nên bốc hơi đối với họ là giải pháp tốt nhất.

IT Programmer CV
Kinh nghiệm còn “non” là một trong những nguyên nhân khiến ứng viên e ngại về sự thể hiện của mình.

Thực tế cho thấy, kinh nghiệm và kỹ năng của bạn được phản ánh rõ qua CV. Ví dụ, bạn ứng tuyển vị trí ngành CNTT thông qua IT Programmer CV hay CV IT Administrator. Tuy vậy, CV của bạn chị đạt mức trung bình đối với nhà tuyển dụng. Đây cũng là một nỗi lo lắng mà nhiều ứng viên tự viễn cảnh ra cho mình. Từ đó, sự áp lực đã khiến họ thiếu đi sự tự tin.

Ngoài ra, trường hợp này sẽ bao gồm những ứng viên còn ít kinh nghiệm, đặc biệt là các sinh viên mới ra trường. Đôi khi, họ đã đến nơi phỏng vấn nhưng thiếu can đảm. Hoặc vì những khó khăn được vẽ ra từ nhiều nguồn làm họ có chút do dự, thiếu sự quyết đoán trong việc có nên phỏng vấn hay không.  

Giải pháp 

  • Thiết lập bản mô tả công việc (Job Description) cần đảm bảo các thông tin chi tiết về vị trí công việc, các kỹ năng cần thiết,… Đồng thời lưu ý gợi nhắc ứng viên về việc đầu tư CV vì CV cho sinh viên IT mới ra trường dường như còn nhiều mặt hạn chế (do chưa nhiều kinh nghiệm). Một thư mời phỏng vấn chuyên nghiệp sẽ tạo dấu ấn tốt hơn đối với ứng viên.
  Thư mời phỏng vấn? Bật mí tips viết thư mời phỏng vấn hiệu quả 
  • Nên có những ghi chú về các yêu cầu để ứng viên có sự chuẩn bị tốt nhất
  • Phỏng vấn qua Skype, Hangouts,… để nắm bắt nhu cầu trước buổi phỏng vấn chính thức. Nếu địa điểm gần, hãy nhắc ứng viên trước buổi phỏng vấn. Đồng thời quan tâm đến thư mơi phỏng vấn. Nếu địa điểm ở xa, thảo luận về việc lựa chọn hình thức phỏng vấn trực tuyến tại nhà hoặc một địa điểm thuận lợi với ứng viên, tương ứng với khung thời gian phù hợp. 

Ứng viên bận hoặc quên mất lịch trình phỏng vấn

Hầu hết các ứng viên đều liên lạc để thông báo với nhà tuyển dụng về việc không tham gia phỏng vấn. Thế nhưng, không tránh những trường hợp ứng viên quên buổi phỏng vấn. Ví dụ bạn có một buổi interview cho vị trí freelancer it, App Mobile Developer. Tuy vậy, bạn đã quên mất đi việc đó vì nhiều lý do phát sinh. Cho đến khi có email follow-up thì họ mới nhớ CV IT Administrator.

CV cho sinh viên IT mới ra trường
Ứng viên có thể quên buổi interview với nhiều lý do phát sinh khác nhau.

Điều này càng làm cho phía nhân sự tuyển dụng đặc biệt quan tâm đến việc take care các ứng viên trong danh sách cần phỏng vấn. Đôi khi, một nhà tuyển dụng rất nghiêm khắc sẽ loại ngay ứng viên quên buổi phỏng vấn. Tất nhiên, đây là cách thức phù hợp nếu số lượng ứng tuyển quá nhiều. Song, việc đó có thể khiến bạn vô tình làm mất đi các ứng viên tài năng. Nhiều vị trí

Giải pháp 

Nhà tuyển dụng cần linh hoạt hơn trong công tác phỏng vấn ứng viên. Cụ thể, việc dời lịch phỏng vấn sang một thời điểm khác là cách thức phù hợp nhất. Điều này cho thấy chính nhà tuyển dụng đang tạo ra cơ hội cho chính ứng viên và cả tổ chức/doanh nghiệp của mình.

Đồng thời, để hạn chế tình trạng này, phía nhân sự cần chủ động nhắc nhở ứng viên trước buổi phỏng vấn từ 1-2 ngày. Hoăc doanh nghiệp có thể sử dụng các phần mềm quản lý tuyển dụng để tối ưu hóa quy trình.

Lời kết

Thực tế, có rất nhiều lý do tác động khiến các ứng viên không thể tham gia buổi phỏng vấn. Và tất nhiên, các doanh nghiệp nói chung và phìa nhà tuyển dụng nói riêng vẫn có những chiến lược phù hợp nhằm khắc phục trình trạng này. Mọi nỗ lực sẽ có kết quả nếu họ thật sự quan tâm đến các ứng viên của mình. TopDev hi vọng bài viết đã có những phân tích giúp mọi người nhìn nhận vấn đề này một cách rõ ràng hơn. Từ đó tim kiếm các cách thức kiểm soát quy trình phỏng vấn ứng viên thật hiệu quả.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

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

Xem thêm việc làm it lương cao cho Developers hàng đầu tại TopDev

DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

dom là gì
DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

Với lập trình web, kiến thức về DOM và khả năng thao tác DOM là hai yếu tố quan trọng nhất. DOM cho bạn khả năng thay đổi mọi thứ của trang web, khi mà mọi nội dung đều có thể được thêm bớt xóa sửa để mang lại trải nghiệm và nội dung tốt nhất.

Và Javascript là một ngôn ngữ được sử dụng trên các Browser nên nó đóng một vai trò quan trọng trong các website. Javascript giúp cho việc thao tác với các tài liệu HTML kết hợp với các cú pháp riêng của nó để tạo nên các trải nghiệm thân thiện của web. Để thao tác được với các thẻ HTML thì nó phải thông qua một cơ chế ta gọi là DOM.

DOM là gì?

DOM là tên gọi viết tắt của (Document Object Model – tạm dịch Mô hình Các Đối tượng Tài liệu). Là một chuẩn được định nghĩa bởi W3C (Tổ Chức Web Toàn Cầu – World Wide Web Consortium). DOM được dùng để truy xuất và thao tác trên các tài liệu có cấu trúc dạng HTML hay XML bằng các ngôn ngữ lập trình thông dụng như Javascript, PHP…

DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

Trong mỗi thẻ HTML sẽ có những thuộc tính (Properties) và có phân cấp cha – con với các thẻ HTML khác. Sự phân cấp và các thuộc tính của thẻ HTML này ta gọi là selector và trong DOM sẽ có nhiệm vụ xử lý các vấn đề như đổi thuộc tính của thẻ, đổi cấu trúc HTML của thẻ.

Có thể thấy tất cả các thẻ HTML sẽ được quản lý trong đối tượng document. Thẻ cao nhất là thẻ html, tiếp theo là phân nhánh body và head. Bên trong head thì có những thẻ như styletitle,… và bên trong body thì là vô số các thẻ HTML khác. Như vậy trong Javascript, để thao tác với các thẻ HTML ta phải thông qua đối tượng document.

  JavaScript là gì? Làm thế nào để trở thành lập trình viên JavaScript?

HTML DOM là gì?

HTML DOM giúp thao tác dữ liệu theo mô hình hướng đối tượng. Các phần tử bên trong 1 tài liệu có cấu trúc được định nghĩa thành các đối tượngphương thức và thuộc tính để có thể truy xuất dễ dàng mà vẫn đảm bảo tính cấu trúc.

Mỗi phần tử là một đối tượng, sở hữu các thuộc tính và các phương thức để làm việc với các thuộc tính đó như thêm, xóa, sửa, cập nhật. Bên cạnh đó, bạn cũng có thể thêm bớt các phần tử tùy thích, giúp cho nội dung và cấu trúc của trang web luôn cập nhật động. Nó định nghĩa sau đây:

  • HTML elements như là objects
  • properties của tất cả HTML elements
  • methods để truy cập đến tất cả HTML elements
  • events cho tất cả HTML elements

Tham khảo tin tuyển dụng lập trình viên Javascript mới nhất trên TopDev

Cây cấu trúc DOM

Node

Đối với HTML DOM, mọi thành phần đều được xem là một node (nút), được biểu diễn trên 1 cây cấu trúc dạng cây gọi là DOM Tree. Các phần tử khác nhau sẽ được phân loại node khác nhau nhưng quan trọng nhất là 3 loại: node gốc (document node), node phần tử (element node), node văn bản (text node).

  • Node gốc: chính là tài liệu HTML, thường được biểu diễn bởi thẻ <html>.
  • Node phần tử: biểu diễn cho 1 phần tử HTML.
  • Node văn bản: mỗi đoạn kí tự trong tài liệu HTML, bên trong 1 thẻ HTML đều là 1 node văn bản. Đó có thể là tên trang web trong thẻ <title>, tên đề mục trong thẻ <h1>, hay một đoạn văn trong thẻ <p>.
  • Ngoài ra còn có node thuộc tính (attribute node) và node chú thích (comment node).
DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

Quan hệ giữa các node

  • Node gốc (document) luôn là node đầu tiên.
  • Tất cả các node không phải là node gốc đều chỉ có 1 node cha (parent).
  • Một node có thể có một hoặc nhiều con, nhưng cũng có thể không có con nào.
  • Những node có cùng node cha được gọi là các node anh em (siblings).
  • Trong các node anh em, node đầu tiên được gọi là con cả (firstChild) và node cuối cùng là con út (lastChild).

DOM là gì? Tìm hiểu và thao tác DOM trong Javascript

Các loại DOM trong Javascript

Javascript cung cấp cho chúng ta nhiều loại DOM để xử lí HTML và CSS dễ dàng hơn.

  • DOM document: lưu trữ toàn bộ các thành phần trong documents của website.
  • DOM element: truy xuất tới thẻ HTML nào đó thông qua các thuộc tính như tên class, id, name của thẻ HTML.
  • DOM HTML: thay đổi giá trị nội dung và giá trị thuộc tính của các thẻ HTML.
  • DOM CSS: thay đổi các định dạng CSS của thẻ HTML.
  • DOM Event: gán các sự kiện như onclick()onload() vào các thẻ HTML.
  • DOM Listener: lắng nghe các sự kiện tác động lên thẻ HTML.
  • DOM Navigation dùng để quản lý, thao tác với các thẻ HTML, thể hiện mối quan hệ cha – con của các thẻ HTML
  • DOM Node, Nodelist: thao tác với HTML thông qua đối tượng (Object).
  Crawl dữ liệu bằng JavaScript ngay trên trình duyệt

Thao tác với DOM

Mọi nội dung đều có thể được cập nhật động thông qua các thuộc tính và phương thức của DOM. Từ thay đổi định dạng chữ, nội dung chữ đến thay đổi cấu trúc các node và cả thêm node mới. Bạn cần hiểu rõ cách thao tác DOM và ý nghĩa của từng thuộc tính, phương thức.

Các Thuộc tính và Phương thức thường gặp

Thuộc tính:

  • id: Định danh – là duy nhất cho mỗi phần tử nên thường được dùng để truy xuất DOM trực tiếp và nhanh chóng.
  • className: Tên lớp – Cũng dùng để truy xuất trực tiếp như id, nhưng 1 className có thể dùng cho nhiều phần tử.
  • tagName: Tên thẻ HTML.
  • innerHTML: Trả về mã HTML bên trong phần tử hiện tại. Đoạn mã HTML này là chuỗi kí tự chứa tất cả phần tử bên trong, bao gồm các node phần tử và node văn bản.
  • outerHTML: Trả về mã HTML của phần tử hiện tại. Nói cách khác, outerHTML = tagName + innerHTML.
  • textContent: Trả về 1 chuỗi kí tự chứa nội dung của tất cả node văn bản bên trong phần tử hiện tại.
  • attributes: Tập các thuộc tính như id, name, class, href, title…
  • style: Tập các định dạng của phần tử hiện tại
  • value: Lấy giá trị của thành phần được chọn thành một biến.

Phương thức:

  • getElementById(id): Tham chiếu đến 1 node duy nhất có thuộc tính id giống với id cần tìm.
  • getElementsByTagName(tagname): Tham chiếu đến tất cả các node có thuộc tính tagName giống với tên thẻ cần tìm, hay hiểu đơn giản hơn là tìm tất cả các phần tử DOM mang thẻ HTML cùng loại. Nếu muốn truy xuất đến toàn bộ thẻ trong tài liệu HTML thì hãy sử dụng document.getElementsByTagName('*').
  • getElementsByName(name): Tham chiếu đến tất cả các node có thuộc tính name cần tìm.
  • getAttribute(attributeName): Lấy giá trị của thuộc tính.
  • setAttribute(attributeName, value): Sửa giá trị của thuộc tính.
  • appendChild(node): Thêm 1 node con vào node hiện tại.
  • removeChild(node): Xóa 1 node con khỏi node hiện tại.

Mặt khác, các phần tử DOM đều là các node trên cây cấu trúc DOM. Chúng sở hữu thêm các thuộc tính quan hệ để biểu diễn sự phụ thuộc giữa các node với nhau. Nhờ các thuộc tính quan hệ này, chúng ta có thể truy xuất DOM gián tiếp dựa trên quan hệ và vị trí của các phần tử:

Thuộc tính quan hệ:

  • parentNode: node cha
  • childNodes: Các node con
  • firstChild: node con đầu tiên
  • lastChild: node con cuối cùng
  • nextSibling: node anh em liền kề sau
  • previousSibling: node anh em liền kề trước

Bạn có thể xem danh sách đầy đủ ở W3SCHOOLS

  Callback hell là gì? 6 cách “trị” callback hell trong javascript

Truy xuất các phần tử trong mô hình DOM

Chúng ta có thể truy xuất mọi phần tử html bằng cách sử dụng các phương thức :

  • document.getElementById()
  • document.getElementsByTagName()
  • document.getElementsByClass()

Ví dụ:

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>DOM</title>

</head>

<body>

<h1 id="txt1">Truy xut bng id</h1>

<script type="text/javascript">

var x = document.getElementById('txt1');

// Truy xuất thẻ h1 có id 'txt1'

x.innerHTML = "Thay đổi";

//Thay đổi nội dung của thẻ h1

</script>

</body>

</html>

ở ví dụ trên mình đã truy xuất và thay đổi nội dung của thẻ h1 bằng phương thức document.getElementById().

<!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>DOM</title>

</head>

<body>

      <h1 id="txt1">Truy xut bng TagName</h1>

      <script type="text/javascript">

        var x = document.getElementsByTagName('h1');

        //Truy xuất các thẻ có TagName là h1

        x[0].innerHTML = 'Thay đổi';

        //Thay đổi nội dung của thẻ h1 đầu tiên trong html

      </script>

</body>

</html>

ở ví dụ này đã truy xuất và thay đổi nội dung của thẻ h1 bằng document.getElementsByTagName()

Chú ý: 

  • Truy xuất bằng  document.getElementById() giá trị trả về chính là phần tử có id đó.
  • Truy xuất bằng  document.getElementsByTagName() hoặc document.getElementsByClass() giá trị trả về sẽ là một mảng, vậy nên ta cần truy xuất phần tử của mảng để xác định được phần tử mong muốn.

Tham khảo các công việc IT lương cao cho bạn tại Topdev.vn

Tái cấu trúc mã nguồn: Trừu tượng hóa

Tái cấu trúc mã nguồn: Trừu tượng hóa
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Bao gói các trường của lớp để ép người dùng phải dùng thông các cách truy xuất dán tiếp như các phương thức.

Việc bao gói dữ liệu giúp tăng tính an toàn của dữ liệu, che dấu dữ liệu, giúp cho lớp con có thể dễ dàng ghi đè các lấy dữ liệu.

  Chiến lược "Mưa dầm thấm lâu" thay đổi tư duy lập trình mà nhà quản lý nào cũng cần biết
  Tái cấu trúc mã nguồn: Chuẩn hóa mã

Các bước:

  1. Tạo phương thức setter/getter cho dữ liệu đó.
  2. Thay tất cả các tham chiếu bằng getter/ setter tương ứng.
  3. Chuyển dữ liệu đó thành private (riêng tư).
  4. Kiểm tra lại lần cuối xem còn có tham chiếu nào không.
  5. Biên dịch và kiểm thử lại lần cuối.
[sourcecode language=”java”] private int low, height;

public boolean isIn(int arg){
return (low&gt;=arg)&amp;&amp;(arg&lt;=height);
}

[/sourcecode]

Hình 1. Mã chưa được bao gói

[sourcecode language=”java”] private int low, height;

public boolean isIn(int arg){
return (getLow()&gt;=arg)&amp;&amp;(arg&lt;=getHeight());
}

public int getHeight() {
return height;
}

public int getLow() {
return low;
}

[/sourcecode]

Hình 2. Mã đã được bao gói

  • Tạo một kiểu chung cho những kiểu có chung mã.

    Từ những kiểu cụ thể, tạo ra một kiểu chung chứa thuộc tính và phương thức chung cho tất cả các kiểu cụ thể. Mã bị lặp là nguyên nhân chính làm ta phải tiến hành việc tái cấu trúc này.

    Việc tái cấu trúc này làm chúng ta phải viết ít mã hơn, nhiều mã được chia sẻ hơn, nên việc bảo trì, đọc cũng dễ dàng hơn.

  • Thay các câu lệnh điều kiện bằng các sử dụng tính đa hình.

    Khi bạn có một câu lệnh điều kiện phụ thuộc vào loại của đối tượng. Vấn đề lớn nhất của câu lệnh điều kiện này là xuất hiện ở nhiều nơi, và mỗi lần mà bạn muốn thêm một loại mới vào thì bản phải cập nhật ở tất cả những nơi này. Khi đó tính đa hình của lập trình hướng đối tượng sẽ giúp bạn.

    Cách thức tiến hành việc tái cấu trúc: Tạo một phương thức trừu tượng ở lớp cha và chuyển khối lệnh ở lệnh điều kiện vào phương thức ghi đè ở mỗi lớp con.

    [sourcecode language=”java”] double getSpeed() {
    switch (type) {
    case EUROPEAN:
    return getBaseSpeed();
    case AFRICAN:
    return getBaseSpeed() – getLoadFactor() *
    _numberOfCoconuts;
    case NORWEGIAN_BLUE:
    return (_isNailed) ? 0 : getBaseSpeed(_voltage);
    }
    throw new RuntimeException ("Should be unreachable");
    }[/sourcecode]

Hình 4. Mã dùng lệnh điều kiện

Hình 5. Thiết kế sau có dùng tính đa hình

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

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

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

Hàm replace() xài với callback

Hàm replace() xài với callback

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

Hàm replace() của một chuỗi trong JavaScript có một biến thể dùng kèm với một callback. Cái này thì không mới, đã ghi trong document từ rất lâu rồi, nhưng kì thực thì mình chưa bao giờ cần phải replace thứ gì phức tạp tới mức phải dùng tới callback, nên cũng chả quan tâm gì mấy. Chỉ đơn giản là theo cú pháp:

input.replace([từ khóa], [nội dung thay thế])
// ví dụ
"hello".replace("ll", "r") // -> "hero"
// hoặc
"hello".replace(/l/g, "r") // -> "herro"

Cú pháp dùng callback thì có dạng:

input.replace([từ khóa], (matched, index, original) => {
    ...
})

Hàm callback sẽ được gọi mỗi lần chúng ta tìm ra một nội dung được khớp với từ khóa, với 3 tham số là matched (nội dung trùng khớp), index (vị trí của matched trong chuỗi input) và original (chính là chuỗi input). Giá trị trả về của callback sẽ được replace vào vị trí xuất hiện của matched.

Sử dụng callback như thế này sẽ giúp cho chúng ta thực hiện được các thao tác phức tạp hơn nhiều lần so với cách replace thông thường.

Ví dụ: Chúng ta cần replace kí tự "a" xuất hiện ở vị trí thứ 2 trong chuỗi "abcabc" thành kí tự "$".

Trong trường hợp này thì bạn sẽ viết regex như thế nào nếu dùng với cú pháp mặc định ở đầu bài? Rồi nếu yêu cầu thay đổi từ vị trí thứ 2 sang một ví trí thứ n nào đó thì sao? Đoạn regex bạn viết ra liệu có phức tạp không? Sau vài tháng liệu bạn đọc lại đoạn regex đó thì có còn hiểu gì nữa không? Hay lỡ mà bạn nghỉ việc, rồi thằng developer xấu số nào đó nhận maintain cái đống code của bạn, nó có gọi điện cho bạn để chửi, hay thậm chí là dọa giết luôn không? 

Còn nếu dùng callback của hàm replace(), bạn chỉ cần viết thế này:

"abcabc".replace(/a/g, (matched, index, original) => {
    if (index !== 0) {
        return "$";
    } else {
        return matched;
    }
});

Hoặc viết theo cách tổng quát hơn cho trường hợp vị trí thứ n bất kì, thì ta phải đếm, như này:

const replaceNth = (input, search, replacement, nth) => {
    let occurrence = 0;
    return input.replace(search, matched => {
        occurrence++;
        if (occurrence === nth) return replacement;
        return matched;
    });
};

Dùng như này:

replaceNth("abcabcabcabcabcabcabc", /a/g, "$", 5)

Output: "abcabcabcabc$bcabcabc"
         -  -  -  -  ^
         1  2  3  4  5

Mặc dù dài dòng, nhưng cách viết dùng callback trên rõ ràng là dễ hiểu hơn và có khả năng maintainable cao hơn, cho chính người viết ra nó hoặc người khác phải làm việc với nó.

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

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

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

System Design Cơ Bản: HTTPS, SSL, AND TLS

HTTPS, SSL, AND TLS

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

SSL là chữ viết tắt của Secure Sockets Layer (Lớp socket bảo mật). Một loại bảo mật giúp mã hóa liên lạc giữa website và trình duyệt. Công nghệ này đang lỗi thời và được thay thế hoàn toàn bởi TLS.

TLS là chữ viết tắt của Transport Layer Security, nó cũng giúp bảo mật thông tin truyền giống như SSL. Nhưng vì SSL không còn được phát triển nữa, nên TLS mới là thuật ngữ đúng nên dùng.

  Bài toán đồng thuận trong Distributed Systems
  System Design Cơ Bản - Consistent Hashing

HTTPS là phần mở rộng bảo mật của HTTP. Website được cài đặt chứng chỉ SSL/TLS có thể dùng gaio thức HTTPS để thiết lập kênh kết nối an toàn tới server. Tóm lại, các điều cơ bản bạn cần nắm rõ về SSL là:

  • Mục tiêu của SSL/TLS là bảo mật các thông tin nhạy cảm trong quá trình truyền trên internet như, thông tin cá nhân, thông tin thanh toán, thông tin đăng nhập.
  • Nó là giải pháp thay thế cho phướng pháp truyền thông tin văn bản dạng plain text, văn bản loại này khi truyền trên internet sẽ không được mã hóa, nên việc áp dụng mã hóa vào sẽ khiến cho các bên thứ 3 không xâm nhập được bào thông tin của bạn, không đánh cắp hay chỉnh sửa được các thông tin đó.
  • Hầu hết mọi người đều quen thuộc với các chứng chỉ SSL/TLS, đang được dùng bởi các website lớn và các webmaster nghiêm túc trong việc bảo vệ các giao dịch người dùng.
  • Bạn có thể biết được website có đang dùng chứng chỉ bảo mật SSL/TLS hay không đơn giản bằng cách nhìn vào icon trong URL ngay trong thanh địa chỉ.

Vậy trước tiên, hãy cùng nhau tìm hiểu về chứng chỉ SSL nhé.

CHỨNG CHỈ SSL/TLS HOẠT ĐỘNG NHƯ THẾ NÀO?

Chứng chỉ SSL/TLS hoạt động bằng cách tích hợp key mã hóa vào thông tin định danh công ty. Nó sẽ giúp công ty mã hóa mọi thông tin được truyền mà không bị ảnh hưởng hoặc chỉnh sửa bởi các bên thứ 3.

12-1

SSL/TLS hoạt động bằng cách sử dụng public và private key, đồng thời các khóa duy nhất của mỗi phiên giao dịch. Mỗi khi khách truy cập điền vào thanh địa chỉ SSL thông tin web browser hoặc chuyển hướng tới trang web được bảo mật, trình duyệt và web server đã thiết lập kết nối.

Trong phiên kết nối ban đầu, public và private key được dùng để tạo session key, vốn được dùng để mã hóa và giải mã dữ liệu được truyền đưa. Session key sẽ được sử dụng trong một khoảng thời gian nhất định và chỉ có thể dùng cho phiên giao dịch này.

Nếu có khóa màu xanh ngay đầu địa chỉ web thì tức là website đã thiết lập đúng SSL/TLS. Bạn có thể nhấn vào nút màu xanh đó để xem ai là người giữ chứng chỉ này.

KHI NÀO VÀ VÌ SAO SSL/TLS LÀ MỘT ĐIỀU BẮT BUỘC?

SSL/TLS là yếu tố bắt buộc khi bạn cần xử lý các thông tin nhạy cảm như thông tin đăng nhập và mật khẩu, hoặc khi phải xử lý các thông tin thanh toán.

Mục tiêu của SSL/TLS là đảm bảo chỉ có một người nhận mà người gửi chỉ định mới có thể truy cập vào thông tin dữ liệu được truyền đi. Việc này đặc biệt quan trọng khi có rất nhiều thiết bị và server mà thông tin phải đi qua từ lúc gửi đến lúc chính thức tới đúng nơi.

12-2

Có 3 lý do chính mà một website hiện đại buộc phải có SSL/TLS:

  • Khi bạn cần chứng thực: Bất kỳ server nào cũng có thể giả dạng là server của bạn, đánh cắp thông tin được truyền đưa. SSL/TLS cho phép bạn xác thực danh tính của server để người dùng biết chắc họ đang giao tiếp với đúng người mà họ muốn giao tiếp.
  • Để tăng độ tin cậy: Nếu bạn đang chạy một site ecommerce mà bạn cần người dùng đưa các thông tin quan trọng đối với họ, thì ít nhất họ cần biết thông tin họ gửi phải được bảo mật trước thì họ mới tin bạn. Sử dụng SSL/TLS là cách dễ nhất để cho khách truy cập tin tưởng, hơn bất kỳ lời cam kết nào được đưa ra từ phía bạn.
  • Khi bạn cần tuân thủ chuẩn của ngành của bạn: Trong một số ngành nhất định, như ngành tài chính, bạn sẽ bắt buộc áp dụng một số chuẩn bảo mật. Bạn cũng có thể tham khảo chỉ dẫn về Payment Card Industry (PCI) mà bạn cần tuân thủ nếu bạn muốn nhận thanh toán qua thẻ tín dụng trên website của bạn. Một trong số các yêu cầu thiết yếu là việc sử dụng chứng chỉ SSL/TLS.

Hãy nhớ là SSL có thể được dùng trên hầu hết mọi thiết bị, giúp nó trở thành chuẩn bảo mật linh hoạt nhất trong thời đại công nghệ đa thiết bị hiện nay. Ưu điểm của SSL chỉ có tăng lên theo gian, giá thành lại giảm đi rất nhiều cho tới mức thấp nhất như hiện tại, vậy bạn đâu có gì để mất đâu phải không, mà còn không thiết lập ngay SSL cho website của bạn?

SSL/TLS CÓ GÂY ẢNH HƯỞNG CHO SEO KHÔNG?

Câu trả lời ngắn là: vâng, có.

Google đổi thuật toán xếp hạng từ năm 2014 để ưu tiên xếp những website sử dụng SSL certificate trước, và sau đó Google liên lục nhấn mạnh tầm quan trọng của SSL certificate. Chính thức xác nhận rằng các site có SSL đã xếp hạng cao hơn những website chưa có áp dụng chuẩn bảo mật tương tự, mặc dù các site bảo mật chỉ chiếm 1% kết quả tìm kiếm, nhưng 40% các site có chứng chỉ SSL lại nằm ở trang đầu tiên.

12-3

Trong hầu hết các trường hợp thực tế, SSL tạo ra sự khác biện nhỏ về vấn đề tối ưu hóa tìm kiếm (SEO), việc cài đặt một chứng chỉ SSL vào một website chưa có chứng chỉ nào sẽ có hiệu quả thấp hơn so với việc tạo ra một bài nội dung mạnh thu hút lượng lớn link đổ về. Nhưng không có nghĩa là bạn nên xem nhẹ yếu tố này.

Hãy nhớ yếu tố quan trọng mà trình tìm kiếm xác định website nào lên hạng cao. Một trong các yếu tố đó là cách mọi người được đưa về site của bạn, có một chứng chỉ SSL sẽ quyết định xem người đó có click vào link của bạn khi thấy bạn trên trìm kiếm không, hoặc bỏ qua kết quả có bạn. Rất nhiều yếu tố tăng hạng sẽ bị ảnh hưởng bởi vệc bạn có hay không có sử dụng chứng chỉ SSL.

Thiết lập một chứng chỉ SSL là một trong các cách giúp tăng hiệu quả SEO, nhưng không chỉ có vậy. Khách truy cập sẽ cảm thấy yên tâm hơn, thời gian onsite sẽ lâu hơn, tất cả các yếu tố liên quan đến bảo mật đều được cải thiện, và vì vậy đó là chính là lý do thăng hạng thực sự của website của bạn.

SSL/TLS THÌ LIÊN QUAN GÌ TỚI HTTPS?

Khi bạn thiết lập chứng chỉ SSL, bạn sẽ cần cấu hình nó truyền dữ liệu qua HTTPS. 2 công nghệ này đi đôi với nhau mà bạn không thể chỉ dùng 1 trong 2.

URLs sử dụng 1 trong 2 giao thức là HTTP (Hypertext Transfer Protocol)hay HTTPS (Hypertext Transfer Protocol Secure). Giao thức này sẽ quyết định lượng dữ liệu được truyền đi và ghi nhận như thế nào.

12-4

Có nghĩa là hễ bạn truy cập URL, nếu bạn truy cập từ HTTPS thì có nghĩa là kết nối HTTP đó đang được bảo vệ bởi chứng chỉ SSL.

CHROME XÁC ĐỊNH WEBSITE CÓ SỬ DỤNG SSL/TLS KHÔNG

Hầu hết các trình duyệt lớn như Google, Firefox hay Mircrosoft Edge sẽ tự hiển thị những site nào họ truy cập có an toàn không. Giả sử như Chrome, bạn sẽ thấy ô khóa màu xanh ghi chử “secure”. Người dùng có thể xem thêm thông tin chi tiết của chứng chỉ SSL bằng cách click vào nó.

12-5

Hơn nữa, trong phiên bản Chrome 68 phát hành tháng Bảy 2018, website không có chứng chỉ SSL/TLS sẽ hiện cảnh bảo “không an toàn” như sau:

12-6

Các trình duyệt sẽ ngày càng mạnh tay hơn trong việc hiển thị website có bảo mật không, vậy nên cách tốt nhất là các website owner nên tự tìm cách gia tăng tính bảo mật cho website từ bây giờ là tốt nhất. Bằng cách này, khách truy cập sẽ luôn biết được rằng site của họ rất an toàn mỗi khi truy cập.

LÀM THẾ NÀO ĐỂ THÊM SSL/TLS VÀO WEBSITE CỦA BẠN?

Thêm chứng chỉ SSL/TLS vào website là một quá trình phức tạp và thường chỉ nên thực hiện nếu bạn là chuyên viên website.

Bước đầu tiên là truy cập SSH access trước khi cài đặt client ACME. Vào lúc này, bạn có thể tạo ra certificate SSL/TLS và cài nó vào khu vực quản trị trong web host của bạn. Chúng tôi đã viết bài hướng dẫn chi tiết tại đây, bạn có đọc qua và tự thực hiện được ngay.

Nếu bạn đang tìm nhà cung cấp chứng chỉ SSL/TLS, vậy không cần tìm đâu xa ngoài Hostinger. Chúng tôi có chứng chỉ SSL/TLS trọn đời cho bạn, bạn chỉ cần thanh toán một lần. Ngoài ra, chứng chỉ miễn phí cũng được tặng khi mua gói Hosting Doanh Nghiệp của chúng tôi.

Khi bạn có chứng chỉ này, bạn có thể buộc chạy HTTPS bằng cách dán code snippet vào trong file .htaccess của bạn.

Theo hostinger.vn

Đọc thêm: https://howhttps.works/episodes/

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

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

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

Cài đặt Kibana trên CentOS

Cài đặt Kibana trên CentOS

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

Kibana là một công cụ giao diện dùng để search và hiển thị log được cung cấp bởi Elasticsearch. Trong bài viết này, mình sẽ hướng dẫn các bạn cài đặt công cụ này trên CentOS các bạn nhé!

  10 Công cụ Go-To Tech dành riêng cho các Software Developer
  10 tips để trở thành Java Developer xịn hơn

Đầu tiên, cũng giống như khi cài đặt Elasticsearch, vì mặc định CentOS không chứa package cài đặt của Kibana, nên các bạn cần thêm repository của Kibana vào.

Nếu các bạn đã cài đặt Elasticsearch trước đó rồi sử dụng repo với baseUrl là https://artifacts.elastic.co/packages/7.x/yum thì không cần làm bước này các bạn nhé.

Nếu các bạn chưa cài đặt Elasticsearch thì các bạn cần thêm Kibana public signing key vào máy của mình để package manager trust package từ Kibana repository:

Kết quả của mình như sau:
Cài đặt Kibana trên CentOS

Tiếp theo, các bạn cần tạo mới một tập tin để thêm Kibana repository:

rồi thêm vào tập tin này nội dung như sau:

Bây giờ thì các bạn có thể chạy câu lệnh sau để cài đặt Kibana rồi:

Cài đặt Kibana trên CentOS

Nhập “Y” để tiếp tục các bạn nhé!

Kết quả cài đặt:

Cài đặt Kibana trên CentOS

Các bạn cần start Kibana lên sau khi cài đặt xong, bằng câu lệnh:

Nếu muốn start nó khi khởi động máy thì chạy câu lệnh sau các bạn nhé:

Mặc định thì Kibana sẽ chạy ở port 5601 và chỉ truy cập được bằng localhost nên sau khi đã start Kibana, các bạn có thể truy cập tới nó sử dụng URL sau: http://localhost:5601.

Kết quả của mình như sau:

Cài đặt Kibana trên CentOS

Nếu các bạn đã có data để display, thì có thể nhấn vào lựa chọn Explore on my own để cấu hình, còn không thì nhấn vào Try our sample data để xem Kibana work như thế nào nhé!

Mình sẽ chọn Try our sample data.

Cài đặt Kibana trên CentOS

Chọn Add data cái nào cũng được các bạn nhé!

Installed:

Cài đặt Kibana trên CentOS

Các bạn có thể nhấn vào View data rồi chọn Dashboard để bắt đầu vọc nhé! 😀

Cài đặt Kibana trên CentOS

Tail Call Optimization là gì? Và tại sao bạn không cần quan tâm đến nó?

Tail Call Optimization là gì? Và tại sao bạn không cần quan tâm đến nó?

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

Chỉ nếu như bạn sử dụng JavaScript

Tail call là từ được cấu thành từ hai chữ, chữ tail và chữ call.

tail /teɪl/
call /kɔːl/ (in UK) or /kɑl/ (in US)

Chữ tail Hài hước tí, nếu các bạn không thấy zui thì nên tự xem lại óc hài hước của mình. À không, ý mình là của các bạn. có nghĩa là đuôi, còn chữ call có nghĩa là gọi, hợp lại ta có chữ gọi đuôi, hay gọi đằng đuôi. Trong môn khoa học máy tính, gọi đằng đuôi có nghĩa là lời gọi tới một hàm con tại vị trí cuối cùng trong một hàm cha nào đó, đằng sau lời gọi này, hàm cha không còn làm bất cứ một việc gì khác nữa.

  Front end Optimization – 9 tips để cải thiện Web Performance
  View Hierarchy, Optimize Layout và Custom View (Phần 1)!

Kiểu như này:

function sum(a, b) {
    return a + b;
}

// Ví dụ 1
function add(a, b) {
    return sum(10, 20); // đây là tail call
}

// Ví dụ 2
function add(a, b) {
    return 10 + sum(10, 20); // đây không phải là tail call
}

// Ví dụ 3
function add(a, b) {
    let result = sum(10, 20); // đây không phải là tail call
    return result;
}

Như trên ta thấy, chỉ có lời gọi hàm sum() ở ví dụ 1 là tail call, còn hai ví dụ còn lại thì không.


Trước khi nói tiếp về tail call optimization, chúng ta hãy nói qua một chút về call stack.

Call stack là một cấu trúc dữ liệu kiểu ngăn xếp (stack) được sử dụng để lưu vị trí hoạt động của một chương trình, khi có một lời gọi hàm (call) xảy ra, thì stack sẽ được đẩy thêm vào (push) một phần tử, sau khi hàm đó xử lý xong thì nó sẽ bị gỡ ra (pop). Việc này giúp cho máy tính biết được nó đang đứng ở đâu trước khi một lời gọi hàm xảy ra, và có thể quay về sau khi hàm đó kết thúc.

Ở ví dụ 3, đầu tiên, khi chương trình thực hiện, thì call stack của chúng ta sẽ biến đổi như sau:

Đầu tiên, hàm add(a, b) sẽ được push vào call stack, vì đây là hàm vừa được gọi:

Khi đi vào hàm này, chúng ta bắt gặp lời gọi đến hàm sum(), lúc này trong call stack sẽ được push vào một frame mới cho hàm sum, việc call stack được push thêm frame mới gọi là call stack growth:

Đi vào hàm sum, giá trị của biểu thức 10 + 20 sẽ được tính và trả về:

Sau khi hàm sum() trả về kết quả, nó sẽ bị pop khỏi call stack, chương trình lúc này tiếp tục sau khi đã tính toán được giá trị của biến result:

Sau khi lệnh return result được hoàn thành, thì hàm add cũng đã được thực hiện xong, nó cũng sẽ được pop ra khỏi call stack, và call stack lúc này không còn gì nữa:


Tail Call Optimization là một kĩ thuật tối ưu mà compiler sẽ làm cho Compiler làm điều này như thế nào thì các bạn có thể xem thêm ở cuối bài.việc thực thi code không xảy ra call stack growth.

Cụ thể, với tail call optimization, thì call stack của chúng ta sẽ biến đổi như sau khi thực thi code ở ví dụ 1:

Đầu tiên chúng ta cũng bắt đầu với hàm add() nằm trong call stack:

Và khi gặp lời gọi hàm sum() thì chuyện gì sẽ xảy ra? Lưu ý lúc này, hàm sum() được gọi khi chúng ta return về giá trị của nó, có nghĩa là hàm add() đã xong nhiệm vụ:

Chính vì thế, add() sẽ bị loại khỏi call stack, và sum() sẽ được đưa vào thay thế. Lưu ý là, stack frame trước đó dành cho add() có thể sẽ được sử dụng lại cho sum() luôn. Nói chung là không xảy ra call stack growth.

Tiếp tục thực thi, chúng ta tính toán biểu thức 10 + 20:

Rồi return luôn, hàm sum() lúc này sẽ bị pop khỏi call stack, và chương trình kết thúc tại đây:

Việc thực thi mà không làm call stack phình ra, chúng ta gọi đó là zero stack growth.


Vậy compiler đã làm gì để khi thực thi chúng ta có zero stack growth? Chúng ta đều biết, compiler sẽ biên dịch chương trình về mã máy, có thể biểu diễn bằng code Assembly, điều này đúng với cả JavaScript mặc dù để giải thích thì dài dòng lắm, nên mình sẽ để dành cho một bài viết sau.

Các bạn đừng lo khi thấy phần này bắt đầu nói về Assembly, mình cũng đâu có biết Assembly đâu . Chúng ta chỉ cần biết rằng, khi máy tính thực thi code Assembly, nó sẽ có một con trỏ, gọi là program counter, chạy từ đầu tới cuối của chương trình đó, đụng lệnh nào thì thực thi lệnh đó (giống khi ta đọc sách mà lấy tay chỉ vào từng dòng để đánh vần vậy).

Và để tìm hiểu về kĩ thuật tail call optimization của compiler, chúng ta chỉ cần biết 2 lệnh, đó là:

  • call: lệnh điều khiển cho program counter tạm thời nhảy đến một vị trí nào đó trong chương trình để xử lý, sau khi xử lý xong thì nó sẽ quay về, và tiếp tục xử lý lệnh kế tiếp, nghe như ném boomerang nhỉ. Ví dụ đoạn code sau có lệnh call, sẽ được thực thi theo thứ tự từ trên xuống, và nhảy tứa lưa như mấy mũi tên trong hình:
  • jmp: là jump, lệnh điều khiển program counter nhảy từ vị trí hiện tại sang một vị trí được chỉ định, nhảy xong thì đi luôn chứ không quay về nữa.

Như vậy, theo như hiểu biết về call stack ở phần trước, ta cũng có thể hình dung ra rằng, khi call được gọi thì sẽ có call stack growth xảy ra.

Và khi thực hiện tail call optimization, compiler sẽ sinh code đại loại như sau trong trường hợp ví dụ 3, không có tail call:

fn_add:       # hàm add
call fn_sum   # call hàm sum
ret           # rồi quay lại return kết quả

Và trong trường hợp có tail call của ví dụ 1 thì sẽ như sau:

fn_add:      # hàm add
jmp fn_sum   # jump tới sum luôn

Quá dễ hiểu, đúng không? 


OK, vậy tại sao đầu bài lại nói là không cần quan tâm đến tail call optimization khi dùng JavaScript?

Đơn giản, là vì JavaScript không có tail call optimization!

Mặc dù trong đặc tả ES6 có mô tả về nó, hầu như không có một JavaScript engine nào implement nó cả, trừ Safari .

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

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

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

Những tựa sách nổi tiếng dành cho Software Developer – Phần 2

sách cho Software Developer
Những tựa sách cho Software Developer - Phần 2

Tác giả: Andrew

Giới thiệu

Sách là một nguồn tài nguyên vô tận để các dev dùng làm tài liệu tham khảo trong công việc. Nguồn sách nước ngoài luôn có giá trị bao phủ đối với các vấn đề thường gặp khi làm việc, nhất là với các Software Developer. Bài viết dưới đây sẽ tiếp tục chuỗi giới thiệu những tựa sách nổi tiếng dành cho Software Developer mà các dev có thể tham khảo.

software developer
Có nhiều tựa sách nổi tiếng cho Software Developer

Những cuốn sách được các Software Developer lựa chọn nhiều nhất

8. Programming Pearls – Jon Bentley

Programming Pearls là cuốn sách có nội dung không hoàn toàn là những vấn đề kỹ thuật lập trình khô khan mà nó mà nó đi sâu vào sự hiểu biết và sáng tạo trong khi làm kỹ thuật. Người lập trình viên và sản phẩm của họ được ví như “pearl” – ngọc trai. Giống như ngọc trai tự nhiên được hình thành từ những hạt cát bên trong vỏ hàu, những viên ngọc trai khi lập trình này phát triển từ những vấn đề thực tế khiến các lập trình viên thực sự cảm thấy khó khăn và cần phải học hỏi. Các kiến thức này rất thú vị và chúng dạy các kỹ thuật lập trình quan trọng và các nguyên tắc thiết kế cơ bản.

Xem thêm các việc làm KMS tuyển dụng

9. Peopleware: Productive Projects and Teams – Tom DeMarco and Timothy Lister

Peopleware là một cuốn sách phổ biến về quản lý tổ chức phần mềm. Ngay trong phần đầu tiên của cuốn sách đã cho thấy “Các vấn đề chính về công nghệ sẽ không được chúng tôi đề cập quá nhiều”. Các tác giả của cuốn sách đã trình bày hầu hết các chủ đề dưới dạng các nguyên tắc được hỗ trợ bởi một số câu chuyện cụ thể hoặc thông tin khác liên quan đến vấn đề lập trình dự án và làm việc theo nhóm.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer
  Hướng dẫn viết CV bất khả chiến bại dành cho Software Engineer

10. Soft Skills: The Software Developer’s Life Manual – John Sonmez

Cuốn sách cho Software Developer này là một chuỗi các hướng dẫn để người đọc có một cuộc sống toàn diện và hài lòng với tư cách là một chuyên viên trong lĩnh vực công nghệ. Trong đó, John Sonmez – một lập trình viên cao cấp đã đưa ra lời khuyên cho các dev về các chủ đề “mềm” quan trọng như sự nghiệp và năng suất, tài chính cá nhân và đầu tư, thậm chí cả thể lực và các mối quan hệ.

Xem thêm các việc làm tuyển dụng Tester chưa có kinh nghiệp tại TopDev

11. The Clean Coder: A Code of Conduct for Professional Programmers – Robert C. “Uncle Bob” Martin

Để trở thành một lập trình viên chuyên nghiệp, việc thực hành build chương trình chắc chắn là phần không thể thiếu trong việc làm quen và giải quyết vấn đề. Trong cuốn sách này, chuyên gia phần mềm nổi tiếng Robert C. Martin giới thiệu tới người đọc các nguyên tắc, kỹ thuật, công cụ và thực hành làm việc của công việc liên quan đến phần mềm.

Xem thêm 32 cuốn sách học lập trình bạn nhất định phải đọc

Cuốn sách này chứa đựng những lời khuyên thực tế – về mọi thứ từ ước tính và viết mã đến cấu trúc lại và kiểm thử. Nó bao hàm nhiều thứ hơn là kỹ thuật: Đó là về thái độ. Martin chỉ ra cách tiếp cận phát triển phần mềm với tính danh dự, lòng tự tôn và tự hào; làm việc tốt và làm việc sạch sẽ; giao tiếp và ước tính trung thực; đối mặt với những quyết định khó khăn với sự rõ ràng và trung thực; và hiểu rằng kiến ​​thức sâu rộng đi kèm với trách nhiệm hành động.

12. Don’t Make Me Think: A Common Sense Approach to Web Usability – Steve Krug

Don’t Make Me Think là một cuốn sách của Steve Krug nói về sự tương tác giữa con người với máy tính và khả năng sử dụng web. Tiền đề của cuốn sách là một chương trình phần mềm hoặc một trang web tốt phải cho phép người dùng hoàn thành nhiệm vụ dự định của họ một cách dễ dàng và trực tiếp nhất có thể. Krug chỉ ra rằng những người giỏi thỏa mãn hoặc sử dụng giải pháp có sẵn đầu ti

sách công nghệ
Tìm hiểu nhiều đầu sách khác nhau giúp bạn có thêm kiến thức lập trình phần mềm

13. Cracking the Coding Interview: 189 Programming Questions and Solutions – Gayle Laakmann McDowell

Đầu sách này chứa đựng gần 189 câu hỏi phỏng vấn lập trình, từ những điều cơ bản đến những vấn đề thuật toán phức tạp nhất để bạn tham khảo. Hướng dẫn các dev cách tìm ra từng giải pháp để bạn có thể tự học cách đạt được điều đó. Gợi ý về cách giải quyết từng câu hỏi trong số 189 câu hỏi, giống như những gì bạn sẽ nhận được trong một cuộc phỏng vấn thực sự.

Tham khảo tuyển dụng software engineer lương cao trên TopDev

Ngoài ra, trong cuốn sách này cũng bao gồm 5 chiến lược đã được chứng minh để giải quyết các câu hỏi thuật toán, để bạn có thể giải quyết các câu hỏi mà bạn chưa thấy. Nó bao quát rộng rãi các chủ đề thiết yếu, chẳng hạn như thời gian O lớn, cấu trúc dữ liệu và thuật toán cốt lõi. Và cung cấp một cái nhìn hậu trường về cách các công ty hàng đầu như Google và Facebook thuê các nhà phát triển.

  5 cuốn sách hay dẫn lối tư duy phản biện

14. Head First Design Patterns: A Brain-Friendly Guide – Eric Freeman, Elizabeth Robson, Kathy Sierra, and Bert Bales

Bất cứ lúc nào các dev cũng có thể sẽ phải vật lộn với các vấn đề liên quan đến thiết kế phần mềm. Và, rất có thể, người khác đã giải quyết vấn đề của bạn một cách gọn gàng trước đó rồi. Ấn bản này của Head First Design Patterns sẽ được cập nhật cho Java 8, cung cấp cho bạn các mô hình đã được thử nghiệm và được các nhà phát triển sử dụng để tạo phần mềm chức năng, có thể tái sử dụng và linh hoạt. Khi đọc xong cuốn sách này, bạn sẽ có thể tận dụng các kinh nghiệm và kiến thực có trong thực tiễn thiết kế tốt nhất của mình và áp dụng thành công trong công việc của mình.

Xem thêm các việc làm hấp dẫn KMS Technology tuyển dụng 2020

Kết luận

Sách không thể cung cấp hoàn toàn đầy đủ về những kiến thức cần có trong lập trình phần mềm. Tuy nhiên nếu chịu khó tìm kiếm chắc chắn bạn sẽ tìm được nhiều thông tin quan trọng, hiếm có ở những nguồn thông tin khác. Chờ đón phần tiếp theo để tìm thêm cho mình những cuốn sách hấp dẫn nhất cho Software Developer nhé.

Happy Coding!

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

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

Xem thêm việc làm tuyển dụng IT hấp dẫn tại TopDev

[XP] Mã kiểm thử đơn vị đầu tiên

[XP] Mã kiểm thử đơn vị đầu tiên
Bài viết được sự cho phép của BBT Tạp chí Lập trình
Sở hữu tập thể mã nguồn

Khi tạo kiểm thử ngay đầu tiên, trước khi viết mã, bạn sẽ thấy việc viết mã dễ dàng và nhanh hơn. Tổng thời gian để viết kiểm thử, và mã để vượt qua kiểm thử xấp xỉ thời gian lập trình một cách trực tiếp. Nhưng nếu đã có kiểm thử đơn vị, bạn không cần phải tạo ra chúng sau khi viết mã, điều đó giúp tiết kiệm được nhiều thời gian hơn cho hiện thời và rất nhiều về sau.

  10 bước để bắt đầu áp dụng kiểm thử tự động vào dự án
  Các trường hợp kiểm thử OTP

Việc tạo kiểm thử đơn vị giúp nhà phát triển thực sự quan tâm tới những gì cần hoàn thành. Các yêu cầu bài toán được làm rõ thông qua kiểm thử. Không có sự hiểu sai một đặc tả bài toán ở mã thực thi.

Ngoài ra, các kiểm thử đơn vị sẽ gửi những phản hồi tức thì khi bạn làm việc. Những phản hồi thường không rõ ràng một khi nhà phát triển đã hoàn thành các chức năng cần thiết. Sự tăng đột biến về phạm vi như sự mở rộng hay điều kiện lỗi cần phải được xem xét. Nếu chúng ta tạo ra các kiểm thử đơn vị đầu tiên, thì khi tất cả các kiểm thử đơn vị chạy không có nghĩa là chúng ta đã hoàn thành.

Ngoài ra, kiểm thử đơn vị còn có lợi cho thiết kế hệ thống. Việc kiểm thử đơn vị các hệ thống phần mềm gặp khó khăn xảy ra rất thường xuyên. Những hệ thống này thường có mã xây dựng trước và mã kiểm thử triển khai sau – thường do một nhóm khác phát triển. Bằng cách tạo ra các kiểm thử đầu tiên, mong muốn kiểm tra mọi thứ có giá trị với khách hành sẽ ảnh hưởng tới thiết kế. Do đó thiết kế của bạn sẽ dễ kiểm thử.

Có nhịp để phát triển phần mềm với kiểm thử đơn vị trước. Bạn tạo ra một kiểm thử để xác định một khía cạnh nhỏ của vấn đề. Sau đó, bạn viết mã đơn giản nhất để vượt qua kiểm thử. Sau đó, bạn viết kiểm thử thứ hai. Và bây giờ, bạn thêm vào mã để hoàn thiện kiểm thử mà bạn vừa tạo ra. Bạn tiếp tục cho tới khi không còn vấn đề nào cần giải quyết nữa. Một ví dụ viết bằng Java: Các vấn đề của máy pha cà phê.

Mã mà bạn viết ra thật đơn giản và ngắn gọn, chỉ thực hiện các chức năng bạn muốn. Nhà phát triển khác có thể xem cách sử dụng mã mới thông qua các kiểm thử. Khi giá trị đầu vào cho kết quả không xác định sẽ bị loại bỏ trong bộ kiểm thử.

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

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

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

Cài đặt MySQL Community Server trên macOS

Cài đặt MySQL Community Server trên macOS

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

Trong bài viết này, mình sẽ hướng dẫn các bạn cách cài đặt MySQL Community Server trên macOS các bạn nhé!

Đầu tiên, các bạn cần phải đi đến địa chỉ https://dev.mysql.com/downloads/mysql/ để download tập tin cài đặt của MySQL dành cho macOS:

Cài đặt MySQL Community Server trên macOS

Có nhiều lựa chọn khác nhau, nhưng các bạn nên chọn tập tin .dmg để cài đặt vì nó có giao diện, sẽ dễ dàng hơn.

Sau khi download xong, hãy nhấp vào tập tin download để bắt đầu cài đặt MySQL các bạn nhé!

Ứng tuyển các vị trí tuyển dụng unity developer HCM lương cao trên TopDev

Cài đặt MySQL Community Server trên macOS

Click vào icon trong cửa sổ trên để tiếp tục nha các bạn.

Cài đặt MySQL Community Server trên macOS

Nhấp vào Continue nha các bạn.

Cài đặt MySQL Community Server trên macOS

Continue tiếp.

Cài đặt MySQL Community Server trên macOS

Continue tiếp.

Cài đặt MySQL Community Server trên macOS

Agree nha các bạn.

Cài đặt MySQL Community Server trên macOS

Đến đây thì các bạn có thể nhấn nút Install để bắt đầu cài đặt MySQL vào máy tính của mình rồi.

Cài đặt MySQL Community Server trên macOS

Nhập mật khẩu để cài đặt software mới trong macOS.

Cài đặt MySQL Community Server trên macOS

  Cấu hình đồng bộ hai database mysql server MySQL Replication
  Kinh nghiệm vận hành MySQL - Chú ý khi chọn MySQL làm database

Trong quá trình cài đặt, các bạn cần cấu hình mật khẩu của user root đăng nhập vào MySQL. Hãy chọn cách mà các bạn thiết lập mật khẩu trong hình trên các bạn nhé. Chúng ta nên chọn “Use Strong Password Encryption” rồi nhấn Next.

Cài đặt MySQL Community Server trên macOS

Với cách chọn này, các bạn bắt buộc phải đặt mật khẩu với ít nhất 8 ký tự, bao gồm cả chữ, số, và một số ký tự đặc biệt.

Sau khi đã đặt mật khẩu xong thì nhấn nút Finish các bạn nhé!

Ứng tuyển ngay các việc làm Unity mới nhất trên TopDev

Cài đặt MySQL Community Server trên macOS

Cần phải nhập password của user macOS để hoàn thành việc cài đặt mật khẩu cho user root này.

Cài đặt MySQL Community Server trên macOS

Nhấn nút Close để kết thúc các bạn nhé!

Các bạn có thể vào System Preferences

Cài đặt MySQL Community Server trên macOS

để quản lý việc start, stop MySQL các bạn nhé!

Cài đặt MySQL Community Server trên macOS

Bài viết gốc được đăng tải tại huongdanjava.com
Có thể bạn quan tâm:

System Design Cơ Bản: Long-Polling vs Websockets vs Server-sent Events

long polling

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Long-polling, WebSockets hay Server-Sent là những cách giao tiếp phổ biến giữa Client và Server ví dụ những giữa Web-Browser và Web-Server. Đầu tiên ta hãy đi tìm hiểu về HTTP và các bước của nó trên môi trường Web như thế nào.

  1. Client sẽ mở ra một kết nối (connection) à yêu cầu (request) dữ liệu từ Server
  2. Server sẽ nhận yêu cầu và tính toán kết quả trả về
  3. Server sẽ trả về (response) kết quả cho Client vừa mở connection đó

11-1

Xem thêm: Thông tin tuyển dụng designer hấp dẫn trên TopDev

AJAX POLLING:

Polling là một kỹ thuật được sử dụng trong các ứng dụng AJAX, ý tưởng của nó là client sẽ liên tục gọi tới server để yêu cầu dữ liệu mới (polls/requests data). Client sẽ tạo ra một request và đợi kết quả trả về từ Server, nếu Server không tìm thấy hoặc trả kết quả về hoặc kết quả là rỗng (empty), thì một empty response sẽ được gửi về.

  1. Client sẽ mở một connection và request dữ liệu từ Server thông qua cổng kết nối HTTP.
  2. Những request trên sẽ được gửi đến Server theo định kỳ (intervals), ví dụ mỗi 1 giây sẽ có một request gửi đi.
  3. Server sẽ tính toán và trả về dữ liệu cũng thông qua kết nối HTTP.
  4. Client sẽ lặp lại cả 3 bước trên để liên tục cập nhật được dữ liệu mới nhất từ Server.

11-2

Vấn đề của Ajax Polling là Client phải liên tục gửi request tới Server, do đó sẽ tạo ra rất nhiều request với không có response nào trả về, gây lãng phí HTTP traffic của hệ thống.

HTTP LONG-POLLING

Đây là một biến thể của HTTP Polling truyền thống bằng cách cho phép Server chủ động đẩy (push) thông tin tới Client khi có dữ liệu mới, bằng cách Client sẽ gửi request tới Server mà không cần Server phải trả dữ liệu về ngay lập tức mà sẽ làm theo logic như bên dưới:

  • Nếu Server không có dữ liệu mới, thay vì không trả về hay trả về dữ liệu rỗng, vì Server sẽ giữ request đó và đợi cho tới khi có dữ liệu mới về.
  • Khi dữ liệu đã sẵn sàng thì Server sẽ gửi trả (response) về cho Client. Ngay lúc đó Client lại tiếp tục gửi một request tới Server, vì thế ở phía Server sẽ luôn luôn có một request mà nó có thể sử dụng để luôn cập nhật dữ liệu về phía Client.

Và một vòng đời của một HTTP Long-Polling sẽ như sau:

  1. Client tạo một HTTP request về phía Server và chờ đợi tới khi có response trả về.
  2. Server sẽ chờ cho tới khi có dữ liệu trả về hoặc quá thời gian time-out.
  3. Khi có dữ liệu Server sẽ trả về cho Client (HTTP respone)
  4. Client sau khi nhận được dữ liệu trả về hoặc quá time-out sẽ gửi tiếp một HTTP Long-Polling đến Server. Lúc này sẽ có một khoảng thời gian trễ giữa lúc client nhận và gửi request mới, nhưng thời gian trễ này tạm chấp nhậnd được.
  5. Mỗi HTTP Long-Polling sẽ có một khoảng time-out, nếu quá thời time-out connection sẽ đóng lại và mở lại một connection mới.

11-3

WEB-SOCKET

Websocket là giao thức chuẩn cho trao đổi dữ liệu hai chiều giữa client và server hay còn gọi là kênh Full Duplex. Giao thức WebSocket không chạy trên HTTP, thay vào đó nó thực hiện trên giao thức TCP.

Nó cung cấp một phương thức liên tục giữa Client và Server mà cả hai bên có thể gửi dữ liệu cho nhau bất kỳ lúc nào. Client kết nối với Server thông qua Websocket bằng một cú bắt tay (WebSocket handshake), nếu nó thành công thì dữ liệu có thể được trao đổi từ hai hướng bất kỳ lúc nào.

Người ta thường dùng Websocket thay vì HTTP cho những trường hợp yêu cầu real time (thời gian thực) bởi vì gói tin của WebSockets nhẹ hơn HTTP rất nhiều, giảm độ trễ của network và không cần phải gửi request liên tiếp như HTTP.

Điều này được hiện thực bằng cung cấp môt chuẩn hóa truyền tin giữa Server và client thông qua cổng  hoặc  có thêm bảo mật. Và dữ liệu truyền đi chấp nhận kiểu String và Binary Type ( large objects (blobs), ArrayBuffers)

  System Admin là gì? Mô tả công việc vị trí System Administrator
  Giải mã bí ẩn "system load" trên Linux

SERVER-SENT EVENTS (SSES)

SSEs cũng gần giống với Long-Polling nhưng khác là connection sẽ được lưu trữ (persistent) sử dụng cho một thời gian dài (long-terms) mà không có time-out và chỉ có Server sẽ sử dụng connection này để gửi dữ liệu về cho Client, và client chỉ có request (GET) dữ liệu mà không được phép gửi dữ liệu (POST) lên Server.

Vòng đời của của SSEs

  • Client yêu cầu lữ liệu từ Server sử dụg kết nối HTTP thông thường.
  • Connection giữa client và server sẽ được mở và duy trì.
  • Bất kỳ khi nào máy chủ sẽ gửi dữ liệu tới Client bất cứ khi nào có thông tin mới.

SSEs cũng giống WebSocket là thích hợp với các ứng dụng thời gian thực (real time) nhưng khác là SSEs chỉ là một chiều (Half duplex) giữa Server tới Client.

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

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

10 tips để trở thành Java Developer xịn hơn

java developer

Nhân dịp có nhiều bạn gửi tin nhắn làm thế nào để trở thành Java Developer xịn hơn, nên học Java như thế nào, và dùng trong lĩnh vực nào, mình sẽ chia sẻ vài điểm sẽ giúp bạn thăng tiến trở thành Java programmer và application developer xịn hơn.

Truớc khi đi vào chi tiết thì mình sẽ đặt trong hoàn cảnh là các bạn đều giải quyết khá tốt những mảng như Coding, Cấu trúc dữ liệu và Thuật toán, những concepts Khoa học máy tính như networking, protocols, lập trình hướng đối tượng,…

Tuyển dụng lập trình viên Java lương cao cho bạn

Học các tool DevOps (Docker và Kubernetes)

Kiến thức về DevOps đóng vai trò rất quan trọng với các Java developer hiện nay. Tối thiểu một developer cần biết và nắm rõ continuous integration và continuous deployment (CI/CD – tích hợp và triển khai liên tục) và vai trò của Jenkins. Ngoài ra senior Java developer còn phải build DevOps như set code best practice và tạo environment, build scripts và guideline.

Mình thì gợi ý bạn dành thời gian tìm hiểu DevOps cơ bản và các tool như Docker, Chef, Kubernetes song song đó là Mavin và Jenkins. Trên Udemy cũng có khóa học, nếu bạn cần nguồn tư liệu bài bản hơn.

10 Tips to Become a Better Java Developer in 2020

Học Java tốt hơn (những tính năng JDK 8 đến JDK 13)

Java luôn liên tục update, và ra phiên bản mới mỗi sáu tháng nên việc cập nhật kiến thức cho bản thân là rất quan trọng và khá thử thách. Nhiều lập trình viên Java với 7 đến 10 năm kinh nghiệm chưa từng viết nổi 1 dòng code có tính năng Java 8 (như lambdas hay Stream API). Mình hiểu rằng việc tiếp nhận kiến thức ở vài thời điểm trong sự nghiệp sẽ trở nên rất chậm nhưng nếu bạn không update, thì bạn sẽ bị bỏ lại phía sau.

Hầu hết các job lập trình Java yêu cầu biết Java 8, và nếu như bạn không đạt được, thì bạn sẽ không được đánh giá cao trong các buổi phỏng vấn Java. Giờ nếu bạn phân vân chưa biết bắt đầu từ đâu thì bạn có thể tham khảo The Complete Java MasterClass trên Udemy.

  4 tips học Java cơ bản nhanh nhất dành cho Beginner Developer

  10 lý do cho thấy tại sao bạn nên theo học ngôn ngữ lập trình Java

Học Spring Framework (Spring Boot)

Học Spring framework dường như đã là điều bắt buộc hiện nay đối với Java developer vì hầu hết các công ty đều phát triển dựa trên Spring frameworks như Spring MVC, Spring Boot và Spring Clouder để phát triển web app, REST APIs Microservices. Ngoài ra nó còn cung cấp các best practices như là dependency injection, giúp app dễ test hơn – một trong những thứ rất quan trọng trong các ứng dụng hiện đại.

Nếu bạn là newbie Java developer, mình khuyên bạn bắt đầu với Spring tutorial để biết những điều cơ bản nhất trong framework này, sau đó hãy đến Spring Boot và Spring Cloud để phát triển các app cao cấp hơn.

Học Unit Testing (Junit và Mockito)

Sự khác biệt giữa Java Developer giỏi và một Java Developer thường đó là khả năng kiểm thử trên từng đơn vị – unit testing.

Testing đã có bước phát triển dài và hiện nay đã có vài tool có sẵn dành cho unit testing, integration testing và automation testing. Bạn có thể nâng cao testing skill với thư viện JUnit với phiên bản gần đây nhất là JUnit 5 rất là mạnh và linh hoạt

Học APIs và Libraries (Jackson, Log4j)

Một đặc điểm thường thấy ở senior Java dev là họ có kiến thức tổng quát về hệ sinh thái Java, trong đó API là phần quan trọng. Java là một trong những ngôn ngữ lập trình lâu đời và phổ biến nhất thế giới, có rất nhiều thư viên và API có sẵn để build tất cả mọi thứ. Tất nhiên là bạn không cần phải biết hết tất cả các thư viện và APIs này, nhưng bạn phải làm quen với JSON processing APIs như Jackson và GSON, XML processing APIs như JAXB và Xerces, thư viện Unit testing như Mockito and JUnit, …

Tìm Java job lương cao trên TopDev ngay!

Học JVM Internals

Xem thêm JVM là gì

Nếu nghiêm túc với sự nghiệp Java developer, bạn nên tìm hiểu về cấu trúc bên trong jvm, những thành phần trong JVM hoạt động như thế nào như JIT, JVM option, Garbage collections và collectors, JIT, JVM option, Garbage collections và collectors, v.v. Khi đã hiểu rõ JVM bạn có thể viết Java app mạnh và có hiệu suất cao hơn.

Ngoài ra bạn cũng nên biết audit lại Java app cũng như là objects nào đang chiếm nhiều tài nguyên nhất, đâu là nút thắt cổ chai trong performace, như objects nào đang chiếm nhiều memory nhất hay đang ăn CPU nhất.

Học Design Patterns (GOF Patterns)

Nếu bạn đang bắt đầu viết Java app thì hầu như bạn phải code theo hướng đối tượng, thực hành với design pattern và thử nghiệm những giải pháp cho những vấn đề phổ biến. Vì vậy càng biết và kết hợp design pattern vào code thì app sẽ càng linh hoạt và dễ thay đổi hơn trong tương lai, ngoài ra chất lượng code tổng thể cũng như tư liệu hóa cũng được cải thiện nhiều, nếu như các Java dev khác cũng quen thuộc với design pattern thì họ sẽ hiểu solution rất nhanh.

Tuy nhiên cũng đừng tập trung vào phần code, hãy nắm tinh thần chung và sáng tạo hơn nữa, sử dụng các tính năng Java 8 như lambdas và Streams để viết lại các pattern như Srategy pattern.

6. Learn Design Patterns to become better Java developer

Tham khảo Global CyberSoft tuyển dụng Fresher đãi ngộ tốt tại TopDev

Học Kotlin (Android)

Nhiều năm trước khi đọc qua cuốn The Well-Grounded Java Developer, mình đã được truyền cảm hứng học Scala, sau đó mình cũng thử qua Groovy vì chúng được dùng nhiều để build script và kiểm thử. Những trải nghiệm như thế giúp mình rất nhiều, và đó là lý do vì sao mình luôn khuyên các Java dev nên học thêm ngôn ngữ dựa trên JVM, và một trong số đó là Kotlin.

Công ty cuả Kotlin là JetBrains, đứng sau IntelliJ IDEA, Kotlin cũng là ngôn ngữ chính thức để phát triển Android theo như Google thông báo năm 2017, không những cải thiện hiệu suất mà còn giúp bạn đào sâu hơn về lĩnh vực phát triển Android.

Học về Microservices (Spring Cloud, MicroNaut)

Architecture là lĩnh vực không ngừng thay đổi, và càng nhiều công ty đang chuyển hướng từ monolithic sang microservice. Vì vậy đã đến lúc Java dev học về microservice architecture và làm thế nào để tạo microservice trong java để hưởng lợi từ cơn sóng này. Và Spring framework có Spring Cloud và Spring Boot để đơn giản hóa quá trình develop microservice trong Java.

Học về IDE (Eclipse hoặc IDEA)

Một trong những đặc điểm của các Java dev xịn là họ rất rành các tool mình sử dụng. Các IDE như Eclipse, NetBeans và IntelliJ IDEA là công cụ quan trọng nhất đối với Java dev cho nên bạn nên dành thời gian cho chúng nhiều để tìm hiểu kỹ càng hơn. Ngoài ra thì bạn cũng có thể tìm hiểu một số plugin hỗ trợ làm task hoặc một số phím tắt để nâng cao năng suất của mình.

Java tips 10 - Learn Your IDE Better

Những mẹo nhỏ này sẽ giúp cho công việc nhiều hơn bạn nghĩ đó.

Trên đây là các tips của mình để trở thành một Java dev xịn xò hơn năm 2020, và để follow hết những cái trên cũng khá là thử thách, nhưng điều đó cũng không cần thiết lắm đâu. Bạn có thể tập trung vào cái gì quan trọng với bản thân hơn, như học tính năng Java mới giữa Java 8 và Java 13, hoặc Spring Framework nếu chưa biết gì về nó. Nhưng nếu đã rành những cái này rồi thì cũng có thể chọn hướng khác, như unit testing, JVM hay DevOps.

Tham khảo bài viết gốc tại javarevisited

► Xem thêm việc làm Java Developer HCM hấp dẫn tại TopDev


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

10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

javascript là gì
10 tip tối ưu code trên JavaScript mà web developer nào cũng nên biết

Tác giả: Gert Svaiko

Giới thiệu

JavaScript là gì? Đây là một ngôn ngữ lập trình quen thuộc và được nhiều dev sử dụng. Nếu muốn tối ưu code trong ngôn ngữ JavaScript thì việc sử dụng những mẹo hack này chắc chắn sẽ giúp bạn rất nhiều. Nó vừa giúp code của bạn sạch hơn, vừa tiết kiệm thời gian và tối ưu thời gian lập trình.

Theo thống kê của RedMonk, JavaScript là ngôn ngữ lập trình phổ biến nhất thế giới hiện nay. Hơn nữa, SlashData ước tính rằng khoảng 12,4 triệu dev sử dụng JavaScript, bao gồm cả CoffeeScript và TypeScript của Microsoft.

tối ưu code
Tối ưu code trong JavaScript giúp code sạch hơn

Điều này có nghĩa là hàng triệu dev đang sử dụng JavaScript để làm việc thông qua các trang web như UpWork và Freelancer, hoặc thậm chí bắt đầu kinh doanh phát triển web của riêng họ.

Xem thêm các việc làm tuyển dụng Javascript hấp dẫn tại TopDev

10 tip tối ưu code trong JavaScript là gì?

Sử dụng phím tắt cho câu lệnh điều kiện

Phím tắt trong JavaScript là gì? Đó là những lệnh cho phép bạn sử dụng để viết hàm. JavaScript cho phép bạn sử dụng các phím tắt nhất định để làm cho code dễ nhìn hơn. Trong một số trường hợp đơn giản, bạn có thể sử dụng toán tử logic &&|| thay ifelse.

  10 câu hỏi javascript để nâng cao trình độ

Hãy xem && toán tử đang hoạt động với cách với đoạn code dưới đây

// instead of
if (accessible) {
console.log(“It’s open!);
}
// use
accessible && console.log(“It’s open!);

|| mang ý nghĩa là “hoặc” giúp bạn thực hiện câu lệnh điều kiện của mình đơn giản hơn

// instead of
if (price.data) {
return price.data;
} else {
return 'Getting the price’';
}
// use
return (price.data || 'Getting the price');

Chuyển đổi thành tích phân thông qua toán tử

Các dev có thể loại bỏ số thập phân để trả về kết quả là một tích phân bằng cách sử dụng math.floor hoặc math.round để sử dụng dữ liệu. Một cách hiệu quả hơn là sử dụng ~~

// instead of
math.round(math.random*50)
// use
~~(math.random*50)
You can also use the “~~” operator to convert anything into a number value.
Example snippet:
~~('whitedress') // returns 0
~~(NaN) // returns 0

Thay đổi kích thước hoặc làm trống mảng bằng cách sử dụng array.length

Đôi khi các dev sẽ cần điều chỉnh kích thước mảng của mình hoặc làm trống nó. Và cách hiệu quả nhất để làm điều này là sử dụng array.length

array.length = n
var array = [a, b, c, d, e, f, g, h, i , j];
console.log(array.length); // returns the length as 10
array.length = 4;
console.log(array.length); // returns the length as 4
console.log(array); // returns “a,b,c,d”

Bạn cũng có thể sử dụng array.length để xóa tất cả các giá trị khỏi một mảng được chỉ định.

var array = [a, b, c, d, e, f, g, h, i , j];
array.length = 0;
console.log(array.length); // returns the length as 0
console.log(array);

Hợp nhất mảng vẫn không gây quá tải dữ liệu cho máy chủ

Việc hợp nhất dữ liệu là vấn đề quan trọng, có thể gây ảnh hưởng nhiều đến máy chủ nếu khối lượng dữ liệu được hợp nhất quá lớn. Để giữ mọi thứ đơn giản và duy trì mức hiệu suất, hãy sử dụng các hàm array.concat()array.push.apply(arr1, arr2). Việc sử dụng một trong hai hàm này sẽ còn tùy thuộc vào kích thước mảng.

Hãy xem cách xử lý các mảng nhỏ:

var list1 = [a, b, c, d, e];
var list2 = [f, g, h, i, j];
console.log(list1.concat(list2)); // returns the merged values of both arrays (a, b, c, d, e,f, g, h, i, j)

Ngược lại, khi sử dụng array.concat() đối với các tập dữ liệu lớn hơn, nó sẽ tiêu tốn nhiều bộ nhớ trong khi tạo một mảng mới. Để tránh tình trạng giảm hiệu suất, hãy sử dụng cách array.push.apply(arr1, arr2) hợp nhất mảng thứ hai thành mảng đầu tiên mà không cần tạo mảng mới.

var list1 = [a, b, c, d, e];
var list2 = [f, g, h, i, j];
console.log(list1.push.apply(list1, list2)); // returns the merged values of both arrays (a, b, c, d, e,f, g, h, i, j)

Cách sử dụng filters với mảng

Lọc mảng rất hữu ích khi làm việc với nhiều cột dữ liệu tương ứng. Trong trường hợp này, bạn có thể tóm gọn hoặc loại trừ dữ liệu dựa vào hàm sau filter()

const cars = [
{ make: 'Opel', class: 'Regular' },
{ make: 'Bugatti', class: 'Supercar' },
{ make: 'Ferrari', class: 'Supercar' },
{ make: 'Ford', class: 'Regular' },
{ make: 'Honda', class: 'Regular' },
]
const supercar = cars.filter(h => h.class === 'Supercar');
console.table(supercar); // returns the supercar class data in a table format

Bạn cũng có thể sử dụng filter() cùng với Boolean để trả về tất cả các giá trị null hoặc không xác định từ mảng của bạn.

cars.filter(Boolean)

Xem thêm các việc làm KMS Technology tuyển dụng hấp dẫn tại TopDev

Cách xuất ra giá trị duy nhất

Giả sử bạn có một tệp dữ liệu gồm các giá trị lặp lại và bạn cần tạo ra các giá trị duy nhất từ ​​tập hợp này. Bạn có thể làm như vậy khi sử dụng lệnh syntax ... và kiểu đối tượng Set. Cách làm này có thể thực hiện với cả dữ liệu số và chữ.

const cars = ['Opel', 'Bugatti', 'Opel', 'Ferrari', 'Ferrari', 'Opel'];
var unrepeated_cars = [...new Set(cars)];
console.log(unrepeated_cars); // returns the values Opel, Bugatti, Ferrari

Cách sử dụng phím tắt để thay thế Function Shortcut

Hãy làm quen với hàm string.replace() để việc coding của bạn trở nên nhẹ nhàng hơn. Tuy nhiên, nó chỉ thay thế một chuỗi bằng một dòng được chỉ định một lần và dừng lại từ đó. Giả sử bạn có tập dữ liệu lớn hơn và bạn cần nhập hàm này nhiều lần, nó sẽ trở nên kém hiệu quả hơn.

coding với javascript
Coding với JavaScript hiệu quả hơn

Ngoài ra, để đơn giản hơn bạn cũng có thể thêm /g vào cuối regex, để hàm chạy và thay thế tất cả các điều kiện phù hợp mà không dừng lại ở điều kiện đầu tiên.

var grammar = "synonym synonym";
console.log(grammar.replace(/syno/, "anto")); // this returns "antonym synonym"
console.log(grammar.replace(/syno/g, "anto")); // this returns "antonym antonym"

Cách lưu các biến vào bộ nhớ cache

Khi bạn đang làm việc với các mảng lớn và cần phân loại các phần tử theo ID bằng cách sử dụng getElementById() hoặc theo tên lớp bằng cách sử dụng getElementsByClassName(), thì JavaScript chạy qua mảng trên một vòng lặp với mỗi yêu cầu phần tử tương tự. Điều này có thể chiếm rất nhiều tài nguyên.

Xem thêm các việc làm tuyển dụng Tester hấp dẫn tại TopDev

Tuy nhiên, bạn có thể tăng hiệu suất bằng cách lưu vào bộ nhớ đệm một biến nếu dữ liệu đó được bạn sử dụng thường xuyên.

var carSerial = serials.getElementById('serial1234');
carSerial.addClass('cached-serial1234');

Cách kiểm tra giá trị đối tượng

Khi bạn đang làm việc với nhiều object, sẽ khó theo dõi xem đối tượng nào chứa giá trị thực và đối tượng nào bạn có thể xóa. Đây là một thủ thuật nhanh về cách kiểm tra xem một đối tượng trống hoặc có giá trị với hàm Object.keys().

Object.keys(objectName).length // if it returns 0 then the Object is empty, otherwise it displays the number of values

Cách giảm độ lớn của tệp JavaScript

Các tệp JavaScript lớn sẽ ảnh hưởng đến hiệu suất tải và tốc độ phản hồi trang. Trong khi coding bạn có thể bị ảnh hưởng với các nhận xét và dead code không cần thiết. Tùy thuộc vào kích thước tệp của bạn, nó có thể trở nên nhiều hơn và nặng hơn với bộ nhớ của máy.

  JavaScript là gì? Internet có thể tồn tại mà không có JavaScript hay không?

Có một số công cụ giúp bạn làm sạch mã và làm cho các tệp JS nhẹ hơn – hoặc giảm độ lớn của file. Mặc dù việc thu nhỏ tệp JS không phải là một sự cố nghiêm trọng nhưng nó vẫn có lợi cho các dev hơn khi biết và thực hiện.

Một trong những ứng dụng đó là Google Closure Compiler của Google, nó cho phép người dùng phân tích cú pháp JavaScript, loại bỏ dead code, viết lại và giảm dung lượng những phần còn lại. Ứng dụng thứ hai là Microsoft Ajax Minifier cho phép cải thiện hiệu suất của ứng dụng web bằng cách giảm kích thước tệp JavaScript.

Kết luận

Trên đây là 10 thủ thuật hay ho mà các dev có thể sử dụng để code của mình sạch sẽ và gọn gàng hơn. Từ đó sẽ vừa tiết kiệm thời gian vừa duy trì khả năng lập trình tốt hơn trên máy chủ.

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 tuyển dụng IT hấp dẫn tại TopDev

Tips lời khuyên giúp nhà tuyển dụng phỏng vấn ứng viên hiệu quả

phỏng vấn
phỏng vấn

Tuyển dụng và phỏng vấn ứng viên không còn quá xa lạ. Vì nó là công việc đặc thù không riêng ngành nhân sự. Quan trọng nhất vẫn là sự phù hợp dựa vào sự đánh giá của nhà tuyển dụng.

Để giúp bạn tự tin hơn, TopDev sẽ chỉ ra một vài điều quan trọng cần ghi nhớ khi bạn thực hiện một cuộc phỏng vấn.

Hãy giữ một tâm trí cởi mở

Điều đầu tiên là giữ một tinh thần thoải mái. Điều này đảm bảo tất cả các bên tham gia vào quá trình tuyển dụng đạt hiệu quả cao nhất.  

phỏng vấn

Hãy tiếp cận cuộc phỏng vấn như cách tự tạo cho mình một cơ hội. Nhân sự có thể cảm nhận hướng sẽ học được nhiều điều từ họ. Một cuộc phỏng vấn thành công phải đạt được hiệu quả tương tác ở cả hai chiều. Và tất nhiên không nên có chỗ cho những phán xét.

Đừng quá lo lắng! Và hãy bắt đầu cuộc phỏng vấn bằng một thái độ tích cực, một tâm trí cởi mở, lạc quan nhất. Chia sẻ những mối quan tâm chung của ứng viên; đặt ra những câu hỏi tương tác là cách mở đầu khá hoàn hảo. Vì nó vừa làm dịu đi bầu không khí căng thẳng của buổi phỏng vấn. Đơn gian vì nó vừa tạo ra sự kết nối ban đầu – đó là yếu tố quan trọng.

Tập trung vào ứng viên

Người phỏng vấn có thể nghiên cứu hoặc nắm được những thông tin cơ bản. Nhưng phải chính xác về các ứng viên. Việc nhà tuyển dụng nắm các thông tin của các ứng viên trước đó sẽ giúp khoanh vùng và giới hạn một số ứng viên tạo được ấn tượng tốt. Từ đó, việc xem xét và phán đoán các ứng viên đáp ứng đủ nhu cầu về vị trí sẽ dễ dàng hơn.

Nhà tuyển dụng cần tập trung vào ứng viên. Đừng xao nhãng vào các vấn đề khác như hình thức bên ngoài. Tạo một không gian thoải mái nhất để ứng việc có thể tự tin chia sẻ mọi thứ về bản thân mình. Chính sự tập trung thông qua các mô tả của họ, nhà tuyển dụng freelancer it sẽ có thể hiểu được ít nhiều phần nào năng lực họ sở hữu.

Tạo CV Online mới nhất cho IT

Đặt câu hỏi cẩn thận

Hãy đặt câu hỏi một cách thận trọng. Đừng hỏi những câu hỏi hoặc đưa ra các lời bình luận ngụ ý về sự thiên vị; phân biệt đối xử; hoặc đi quá xa vào cuộc sống cá nhân của các ứng viên. Chẳng hạn như những vấn đề liên quan đến giới tính, tôn giáo, tình trạng hôn nhân hoặc kế hoạch hóa gia đình,… Đó đều là những vấn đề khá nhạy cảm và cần bạn lưu ý. 

Một điểm lưu ý nữa, là người trực tiếp phỏng vấn ứng viên, bạn không nên tham gia vào bất kỳ bình luận tiêu cực nào về sếp, đồng nghiệp hoặc công ty cũ của ứng viên.

  Rời bỏ công việc tại các doanh nghiệp nhỏ - Nguyên nhân và giải pháp

phỏng vấn

Trong cuộc phỏng vấn, các ứng viên sẽ chia sẻ nhiều thứ để thể hiện mình. Và tất nhiên, điều nhà tuyển dụng it cần làm là tương tácnắm bắt tốt những chia sẻ đó để có thể phân tích chính xác các khía cạnh khác nhau của một ứng viên.

Hãy lưu tâm: cách ứng viên họ mô tả về công việc quá khứ là cách tốt nhất để người phỏng vấn hiểu rõ hơn về lịch sử công việc và hành trình phát triển trong nghề nghiệp của họ.

Nắm bắt tốt tâm lý ứng viên

Ứng viên khó tránh khỏi những cảm giác căng thẳng trong quá suốt quá trình phỏng vấn. Một nụ cười đơn giản, một cái bắt tay hay một lời hỏi han sẽ có thể làm xoa dịu đi phần nào áp lực hiện tại của ứng viên. Đồng thời, giúp họ thoải mái hơn để trở về trạng thái cảm xúc cân bằng; sẵn sàng chinh phục buổi phỏng vấn. 

phỏng vấn

Nếu một ứng viên quá lo lắng đến mức họ không thể trả lời câu hỏi của bạn, người phỏng vấn nên đọc lại câu hỏi ; thêm một ví dụ minh họa hoặc giải thích chi tiết hơn về câu hỏi. Điều này không mất quá nhiều thời gian mà chỉ tạo cơ hội để ứng viên có đủ điều kiện bộc lộ hết những gì mình có.

Đôi khi nhiều do số lượng ứng viên quá nhiều, người phỏng vấn dường như quên mất việc giải thích. Điều này vô tình dẫn đến việc mặc định đánh giá ứng viên là thiếu chuyên nghiệp.

Tâm lý là điều quan trọng dẫn đến sự thành công của buổi phỏng vấn. Có thể bạn hơi sợ hãi lúc ban đầu. Những sau đó, bạn cho nhà tuyển dụng freelancer it thấy được sự cố gắng qua những câu trả lời đúng trọng tâm. Chắc chắn bạn không phải là ứng viên biết tư duy tốt về ngôn ngữ nhưng những gì bạn nói đều có giá trị. Đừng hoang mang mà hãy thể hiện đúng con người của bạn.

Lời kết

Hãy tin rằng một cuộc phỏng vấn tuyệt vời luôn là kết quả của một cuộc trò chuyện tuyệt vời. TopDev hi vọng đây là những chia sẻ bổ ích dành cho các bạn. Từ đó, các bạn sẽ có cho mình những lời khuyên thật sự có giá trị.


Tuyển Dụng Nhân Tài IT Cùng TopDev
Đăng ký nhận ưu đãi & tư vấn về các giải pháp Tuyển dụng IT & Xây dựng Thương hiệu tuyển dụng ngay!
Hotline: 028.6273.3496 – Email: contact@topdev.vn
Dịch vụ: https://topdev.vn/page/products

Có thể bạn quan tâm

Xem thêm Top vị trí tuyển dụng it trên TopDev

Những tựa sách nổi tiếng dành cho Software Developer – Phần 1

Những tựa sách nổi tiếng dành cho Software Developers

Tác giả: Andrew

Giới thiệu

Để thành công, không ai trong chúng ta không cần những lời khuyên giá trị từ những người đi trước. Những lời khuyên đó sẽ được đúc kết từ nhiều người, nhiều thế hệ và đã được chứng minh tính hợp lí của nó thông qua kết quả thực tế mà họ đạt được. Và sách chính là nơi chứa đựng những tinh túy ấy. Dưới đây tôi sẽ đề cập đến những tựa sách cho Software Developer đã được nhiều dev đánh giá là cực kỳ hữu ích với công việc hàng ngày của họ.

software developer
Những tựa sách chất lượng sẽ giúp bạn có thêm kiến thức về software developing

Những cuốn sách được các Software Developer lựa chọn nhiều nhất

1. Clean Code: A Handbook of Agile Software Craftsmanship – Robert C. “Uncle Bob” Martin

Robert C. Martin là một Software Developer nổi tiếng thế giới. Trong cuốn sách này, Robert cùng các đồng nghiệp của anh ấy ở Object Mentor đã giới thiệu về những mô hình mang tính cách mạng về cách làm sạch code, loại bỏ những code xấu một cách nhanh nhất để công việc của bạn trở nên hiệu quả hơn.

Xem thêm các việc làm Tester hấp dẫn tại TopDev

Nhiều người dùng đánh giá rằng cuốn sách này sẽ tạo ra những thách thức trong suy nghĩ của bạn về cách clean code và code như thế nào là code xấu. Quan trọng hơn, các Software Developer sẽ tìm được những thông tin hữu ích để đánh giá lại các giá trị trong nghề nghiệp và chuyên môn của mình.

  Biến Git và GitHub trở thành công cụ đắc lực cho Software Engineer
  Cách viết CV dành cho Software Developer

2. The Pragmatic Programmer: From Journeyman to Master – Andrew Hunt and Dave Thomas

Dev là những người làm việc dựa vào việc sử dụng một bộ công cụ nhất định (như trình chỉnh sửa, trình quản lý đối tượng, trình theo dõi phiên bản) để build một loại sản phẩm hay một chương trình trong một số môi trường (như các hệ điều hành trên các cụm phần cứng). Những gì mà các dev tạo ra được xem là các tài nguyên trí tuệ, hầu hết trong số đó không được dạy ở các trường học mà chúng được xem là thủ thuật giao dịch theo thời gian, thông qua thử nghiệm độc lập. Trong cuốn The Pragmatic Programmer, Andrew Hunt và David Thomas đã hệ thống hóa những sự thật mà họ đã khám phá ra trong sự nghiệp làm lập trình viên mà cụ thể là những Software Developer.

Xem thêm Software Developer và 5 bài học kinh nghiệm quan trọng

Cuốn sách cho Software Developer này sẽ thu hút bạn với hai lý do: Nó sẽ cho thấy những kiến thức mà bạn đã tích lũy được trong suốt thời gian qua hiện lên một cách rõ ràng hơn, và nó giới thiệu cho bạn những phương pháp làm việc mà bạn có thể chưa tính đến. Những Software Developer đang bắt đầu tiến trình đẩy nhanh công việc của mình sẽ là đối tượng phù hợp với cuốn sách này nhất.

Xem thêm các việc làm KMS Technology tuyển dụng hấp dẫn tại TopDev

3. Code Complete: A Practical Handbook of Software Construction – Steve McConnell

Được nhiều người coi là một trong những hướng dẫn thực hành tốt nhất khi học lập trình, đầu sách Code Complete của Steve McConnell đã giúp các dev viết phần mềm tốt hơn trong hơn một thập kỷ qua. Giờ đây, cuốn sách cổ điển này đã được cập nhật và sửa đổi đầy đủ với các tool và kỹ thuật tiên tiến hơn trong việc xây dựng phần mềm.

Nắm bắt toàn bộ kiến ​​thức có sẵn từ nghiên cứu, học thuật và thực hành tạo ra các sản phẩm thương mại hàng ngày, McConnell tổng hợp các kỹ thuật hiệu quả nhất và các nguyên tắc cần biết thành hướng dẫn rõ ràng, thực tế. Bất kể mức độ kinh nghiệm, môi trường phát triển hay quy mô dự án của bạn là bao nhiêu, cuốn sách này sẽ cung cấp thông tin và kích thích tư duy của bạn, đồng thời giúp bạn viết code chất lượng cao nhất.

tài liệu cho software developer
Những sách tốt sẽ cung cấp cho các dev giá trị hữu ích

4. Design Patterns: Elements of Reusable Object-Oriented Software – Erich Gamma, Richard Helm, and Ralph Johnson

Cuốn sách cho Software Developer này không phải là sản phẩm giới thiệu đơn thuần về công nghệ hoặc thiết kế trong hướng đối tượng. Cuốn sách này sẽ mang đến cho các Software Developers các mẫu thiết kế mô tả những giải pháp đơn giản và thanh lịch cho mỗi vấn đề cụ thể trong thiết kế phần mềm hướng đối tượng. Bạn sẽ có nhận thức mới hoàn toàn về vấn đề và những thông tin chi tiết có thể làm cho thiết kế của bạn trở nên linh hoạt và dễ hiểu.

5. Refactoring: Improving the Design of Existing Code – Martin Fowler

Trong hơn 20 năm qua, các lập trình viên có kinh nghiệm trên toàn thế giới đã dựa vào cuốn sách này của Martin Fowler để cải thiện thiết kế của code cũng như tăng cường khả năng bảo trì phần mềm, giúp code trở nên gọn gàng và dễ hiểu hơn.

Phiên bản tái bản lần này của Refactoring: Improving the Design of Existing Code giống với bản gốc. Trong đó nó sẽ giải thích tái cấu trúc là gì, tại sao bạn nên cấu trúc lại, cách nhận ra mã cần cấu trúc và làm thế nào để thực sự thực hiện thành công, bất kể bạn sử dụng ngôn ngữ nào.

  Sự thật ẩn giấu đằng sau những dòng code

6. The Mythical Man-Month: Essays on Software Engineering – Frederick P. Brooks

Phải khẳng định rằng có rất ít những cuốn sách nói về quản lý dự án phần mềm có tầm ảnh hưởng và vượt thời gian như The Mythical Man-Month. Với sự pha trộn giữa các thông tin thực tế về kỹ thuật phần mềm và các ý kiến mang tính tư duy của riêng tác giả, Fred Brooks đã cung cấp cho người đọc những thông tin chi tiết trong việc quản lý các dự án phức tạp.

Xem tuyển dụng software developer đãi ngộ tốt trên TopDev

7. Working Effectively with Legacy Code – Michael Feathers

Code bạn viết có dễ thay đổi không? Bạn có thể nhận được phản hồi gần như tức thời khi bạn thay đổi nó không? Bạn có thật sự hiểu nó không? Nếu câu trả lời của bạn là không, bạn có code kế thừa và nó đang tiêu hao thời gian và tiền bạc từ những nỗ lực phát triển của bạn.

Trong cuốn sách cho Software Developer này, Michael Feathers đưa ra đầy đủ các chiến lược để làm việc hiệu quả hơn với các cơ sở code kế thừa lớn chưa được kiểm tra. Cuốn sách này dựa trên tài liệu mà Michael đã tạo ra cho các cuộc hội thảo về Object Mentor nổi tiếng của mình: các kỹ thuật mà Michael đã sử dụng trong việc cố vấn để giúp hàng trăm nhà phát triển, nhà quản lý kỹ thuật và người kiểm tra đưa hệ thống kế thừa của họ vào tầm kiểm soát.

Kết luận

Những cuốn sách được đề xuất trên đây đều nằm trong top tìm kiếm và có lượt mua cao trên Google. Với các Software Developers, đây chắc chắn sẽ là nguồn tài nguyên thông tin hữu ích giúp các dev chinh phục công việc của mình mỗi ngày.

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

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

Xem thêm việc làm tuyển dụng lập trình viên hấp dẫn tại TopDev

Tìm hiểu về Headless Browser trong Selenium Webdriver

Tìm hiểu về Headless Browser trong Selenium Webdriver

Bài viết được sự cho phép của tác giả Vân Anh

Hôm nay sẽ cùng các bạn tìm hiểu về một dạng trình duyệt kỳ lạ được sử dụng trong automation, trong tiếng Việt nôm na nó là “trình duyệt không đầu” nhưng được biết đến rộng rãi hơn với cái tên quốc tế khá là trừu tượng giống như sự hiện diện của nó, đó là “headless browser” :v

Và không làm mất thời gian thêm nữa, cùng đi vào nội dung chính thôi nào.

  Redux selector và vấn đề sử dụng sao cho hiệu quả
  Selenium – Xác Định Đối Tượng UI

1. Headless Browsers trong Selenium Webdriver

Headless browser là chương trình giả lập một trình duyệt nhưng không có giao diện người dùng (UI less).

Cơ chế hoạt động của Headless browser tương tự như các trình duyệt thông thường khác, chỉ có điều là nó sẽ không xuất hiện hay hiển thị bất kì giao diện tương tác người dùng nào. Do đó, Selenium sẽ thực thi việc test với trình duyệt này ở chế độ nền (background).

Hiện nay có khá là nhiều các loại Headless browser, được biết đến nhiều hơn cả đó là:

  • Chrome
  • Firefox
  • HTMLUnit driver
  • PhantomJS
  • SlimerJS
  • TrifleJS

2. Headless testing là gì?

Việc thực hiện kiểm thử giao diện của ứng dụng web mà không cần mở ứng dụng trên giao diện người dùng của trình duyệt thì được gọi là headless testing. Một headless browser hoạt động giống như một trình duyệt web thông thường. Các tester có thể toàn quyền điều khiển các trang web được tải trên headless browser. Chỉ có một điều khác biệt là khi đó bạn sẽ không thể nhìn thấy bấy kì một giao diện đồ họa người dùng nào – giống như kiểu bạn đang đi trong đêm tối hoàn toàn không có ánh sáng nhưng mà bạn vẫn có thể đi những bước đi chính xác qua những đoạn cong queo, ngoằn nghoèo để đến được đích =))

3. Khi nào thì sử dụng headless browser testing?

Ta có thể sử dụng headless testing sau khi đã hoàn thành việc kiểm thử trên các trình duyệt thông thường khác và khi cần thực hiện việc kiểm thử hồi quy trong các phiên bản phát hành hoặc phát triển tích hợp liên tục sau đó.

Hoặc trong trường hợp máy test của bạn không thể cài đặt hay sử dụng trình duyệt GUI, thì headless browser testing có lẽ là lựa chọn ổn hơn cả. Ví dụ khi test trên Unix chẳng hạn. 😀

Bạn cũng nên sử dụng headless browser testing khi thực thi song song nhiều test cùng lúc, lúc này với các trình duyệt giao diện sẽ tiêu tốn nhiều bộ nhớ và tài nguyên. Headless browser testing có thể được sử dụng để kiểm tra hiệu năng của server (máy chủ).

Headless browser cũng có thể sử dụng khi bạn thực hiện smoke test ngay khi được bàn giao phiên bản mới, sẽ nhanh chóng kiểm tra và từ chối bàn giao nếu phát hiện vấn đề.

4. Một số nhược điểm của headless browser testing

Nhìn chung, headless browser không phải là một ý tưởng thực sự tốt. Nó có thể thực hiện các công việc tương tự nhưng một điều quan trọng là nó không mang được sự trực quan giống như một người dùng thực sự sẽ nhìn thấy và tương tác. Headless browser có thể che dấu những vấn đề mà chỉ khi sử dụng những trình duyệt thông thường bạn mới gặp phải.

Với headless browser sẽ khó debug để xác định các phần tử có vấn đề do page load quá nhanh.

Với trình duyệt thông thường, các chức năng được thực thi hoạt động ngay trước mắt, do đó ta có thể dễ dàng tương tác và phán hiện các điểm sai sót, cũng sẽ dễ dàng debug hơn nếu như có một vấn đề nào đó xảy ra.

Các mã code cho các headless browser không đảm bảo sẽ hoạt động bình thường khi chúng ta chuyển từ một headless browser nào đó sang HTMLUnit, ví dụ như bạn code cho Headless Chrome hay Firefox, và sau đó lại muốn thay đổi để code chạy cho Headless HTMLUnit, việc này đôi khi có thể làm cho code của chúng ta hoạt động không đúng nữa, nên hoặc là bạn không chuyển nữa hoặc là ngồi sửa code những đoạn nào không tương thích 😀 . Tuy nhiên giữa Chrome và Firefox thì lại khá là tương đồng, nên sẽ dễ dàng hơn nhiều nếu muốn nhảy từ cái này sang cái kia.

Tương tác trên Headless browser không thể đại diện cho một người dùng thật sự, vì chẳng người dùng nào lại có thể tương tác các tác vụ mà không nhìn thấy bất cứ một giao diện hay hình ảnh nào cả, và vì vậy ta sẽ không thể phát hiện ra vấn đề nếu như vấn đề đó liên quan đến các hình ảnh trên ứng dụng.

Trên thực tế headless brower không nhanh hơn trình duyệt thực, bởi vì phần lớn thời gian vẫn để tải dữ liệu phụ thuộc vào tốc độ mạng, htlm, Javascript, hình ảnh và CSS. Headless browser chỉ không cần tải màu cho màn hình mà thôi.

Việc quản lý và chụp ảnh màn hình khá là khó đối với Headless browser.

5. Headless browser automation trong Selenium Java

Chúng ta có thể thực hiện automation với headless browser, và chỉ có automation mới có thể thực thi được trên headless browser.

Đối với vai trò của một người dùng, họ sẽ chẳng quan tâm và cũng không có khái niệm nào về Headless browser hay UI less browser.  Vì với những khái niệm này trên thực tế rõ ràng là không thể trông thấy hay tương tác trực tiếp được.

Trên headless browser, có thể thực thi các test mà được tạo ra dựa trên việc thực hiện trên các trình duyệt UI thông thường, do đó việc debug cũng chỉ có thể thực hiện trên trình duyệt UI thông thường mà thôi.

Trong bài viết này chúng ta sẽ đi qua các Headless browser đó là:

  1. Chrome
  2. Firefox
  3. HtmlUnit browser
  4. PhantomJS

5.1. Headless Chrome trong Selenium

Headless Chrome được hỗ trợ bởi Chrome phiên bản 59+. Với Selenium webdriver, ta có thể sử dụng headless browser chrome bằng cách sử dụng class trong org.openqa.selenium.chrome.ChromeOptions

Với Mac và Linux từ Chrome 59 cũng đã có hỗ trợ headless browser mode, hệ điều hành Windows cũng đã hỗ trợ đến version 60.

Các bước để tạo headless Chrome:

1. Set path cho Chrome driver server sử dụng System.setProperty:

System.setProperty("webdriver.chrome.driver", 
                                "C:/Users/user/Pictures/chromedriver.exe");

2. Tạo một đối tượng cho ChromeOptions thuộc packet org.openqa.selenium.chrome.ChromeOptions: 

ChromeOptions options = new ChromeOptions ();

3. Tạo một method setHeadless từ đối tượng ChromeOptions, đặt paramenter = true. Medthod này sẽ tạo ra một trình duyệt chrome mà không có giao diện người dùng, chính là cái headless Chrome browser mà ta cần:

// set chrome as Headless
options.setHeadless(true);

Ta cũng có thể sử dụng method addArguments có sẵn trong đối tượng ChromeOption để tạo một headless chrome browser, ở đây ta cần thêm giá trị của parameter là “—headless” để khởi tạo trình duyệt không có UI với cú pháp như sau:

options.addArguments("--headless");

4. Bây giờ bạn sẽ tạo một đối tượng cho ChromeDriver và đừng quên truyền vào đó option vừa tạo bên trên vào hàm khởi tạo ChromDirver.

WebDriver driver = new ChromeDriver(options);

Sử dụng class Option chúng ta có thể thiết lập các tính năng theo yêu cầu cho một trình duyệt (như Chrome hay Firefox)

5.2. Headless Firefox Browser in Selenium

Với headless Firefox browser ta cũng thực hiện các tương tự các bước như khởi tạo một headless Chrome browser tóm tắt nhanh các cú pháp như sau:

//set driver server exe path
System.setProperty("webdriver.gecko.driver", 
                            "C:/Users/user/Pictures/geckodriver.exe"); 
//Khởi tạo đối tượng options thuộc FirefoxOptions:
FirefoxOptions options = new FirefoxOptions(); 

//Tạo trình duyệt headless với method setHeadless với parameter = true: 
options.setHeadless(true); 

//khởi tạo trình Web Driver
WebDriver driver = new FirefoxDriver(options);

5.3. HtmlUnitDriver in Selenium

HtmlUnitDriver là một trình duyệt headless được tích hợp sẵn trong Selenium webdriver, HtmlUnitDriver nằm trong package: org.openqa.selenium.htmlunit

Khác với Headless Firefox, Chrome, với HtmlUnitDriver chúng ta chỉ cần tạo một đối tượng của class để tạo một headless browser đó.

Cú pháp chỉ đơn giản như thế này:

HtmlUnitDriver driver = new HtmlUnitDriver();
driver.get("https://www.google.com");

5.4 .PhantomJS Headless browser

Dưới đây là đoạn code mà mình đã sử dụng để khởi tạo một trình duyệt PhantomJS. Tuy nhiên theo mình đọc được đâu đó thì chúng ta nên chuyển sang sử dụng Google chrome hơn là PhantomJS, vì tốc độ và độ ổn định được đánh giá tốt hơn so với PhantomJS.

File file = new File("C:/Program Files/phantomjs-2.1.1-windows/phantomjs-2.1.1-windows/bin/phantomjs.exe");
System.setProperty("phantomjs.binary.path", file.getAbsolutePath());
WebDriver browser = new PhantomJSDriver();

6. Dùng Headless browser nào nhanh hơn?

Để trả lời câu hỏi này không gì chính xác hơn là chính bạn tự kiểm chứng với môi trường thực thế của bạn. Và lựa chọn trình duyệt nào cho dự án của bạn, theo quan điểm của mình thì trước tiên cần cân nhắc đó là sự ổn định của công cụ sau đó mới đến các yếu tố khác như tốc độ hay các khả năng khác, tuy nhiên với độ phổ biến rộng rãi thì mình nghĩ rằng Chrome hay Firefox sẽ là những lựa chọn nên được ưu tiên. 😀

Hi vọng bài viết này sẽ mang lại chút hữu ích cho các bạn về Headless browser và sử dụng trong automation. Rất mong nhận được những đóng góp và góp ý của các bạn về chủ đề này.

Tham khảo thêm tại link dưới:

https://chercher.tech/java/headless-browsers-selenium-webdriver#headless

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

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

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

Str trong Python là gì? Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

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

Xử lý văn bản là công việc thường xuyên trong các ứng dụng hiện đại, văn bản có ở khắp mọi nơi, do vậy nắm vững kiến thức về kiểu chuỗi sẽ giúp bạn giải quyết được các vấn đề.

1. Kiểu dữ liệu chuỗi

Kiểu dữ liệu chuỗi – string trong Python là một trong những kiểu dữ liệu cơ bản và được sử dụng rất phổ biến trong Python, một từ, một đoạn văn bản đều là kiểu chuỗi.

Chuỗi (string) được đặt trong dấu ngoặc kép, có thể là dấu ngoặc kép đơn (”) hoặc dấu ngoặc kép đôi (“”). Ví dụ: "Hello, World!" hay 'Python'

str trong Python là một lớp (class) được sử dụng để biểu diễn và xử lý các chuỗi ký tự.

1.1 Chuỗi đơn giản

Chuỗi trong Python được đánh dấu bằng dấu nháy đơn ‘ hoặc nháy kép “, tuy nhiên nếu bắt đầu bằng dấu nào thì phải kết thúc bằng dấu đấy. Ví dụ:

first_name = "Nguyễn"
middle_name = 'Văn'

last_name = 'A" # Lỗi khi thực hiện do bắt đầu và kết thúc chuỗi khác nhau.

Khi muốn đưa các dấu nháy đơn và nháy kép vào trong chuỗi có hai cách:

Cách 1: Đóng mở chuỗi bằng dấu khác với loại dấu nháy cần đưa vào chuỗi.

speech = 'Một chuyên gia nói: "Python hiện là ngôn ngữ được nhiều người tìm hiểu nhất hiện nay", phát biểu tại Ngày hội Trí tuệ nhân tạo 2019'

sentence = "It 's my car"

Cách 2: Sử dụng dấu gạch chéo \, dấu này giúp Python nhận biết là phải bỏ qua ngữ nghĩa của ký tự ngay sau.

example = "Trong một câu có thể có nhiều dấu \" và dấu \' với số lượng tùy ý"

Tuyển dụng lập trình python lương cao cho bạn

1.2 Chuỗi ký tự nhiều dòng

Python hỗ trợ kiểu dữ liệu chuỗi có thể chứa đoạn văn với nhiều dòng bằng cách bắt đầu và kết thúc chuỗi bằng 3 dấu nháy kép “””. Ví dụ:

chuoi_nhieu_dong = """
Một chuyên gia phát biểu:

- \"Python là ngôn ngữ được yêu thích nhất hiện nay\".

Chuyên gia này phát biểu tại Ngày hội Trí tuệ nhân tạo 2019.
"""

Có thể áp dụng chuỗi ký tự nhiều dòng khi comment code, trong Python khi ghi chú thông tin chúng ta sử dụng dấu # ở đầu câu ghi chú, với ghi chú nhiều dòng chúng ta cần nhiều dấu # ở trước các dòng.

# Khóa học Python từ A đến Z
# Bài số 3: Kiểu dữ liệu chuỗi.

# Ví dụ 1: In ra chuỗi "Hello world"
loi_chao = "Hello world"
print(loi_chao)

Nếu đoạn ghi chú dài, việc sử dụng các dấu # là rất bất cập, chúng ta có thể sử dụng chuỗi đa dòng để ghi chú như sau:

""" 
Khóa học Python từ A đến Z
Bài số 3: Kiểu dữ liệu chuỗi.

Ví dụ 1: In ra chuỗi \"Hello world\"
"""
loi_chao = "Hello world"
print(loi_chao)
  Cú pháp cơ bản trong lập trình Python
  Biến và kiểu dữ liệu cơ bản trong Python

2. Thao tác với các biến kiểu chuỗi

2.1 Nối chuỗi

Chúng ta có thể nối các chuỗi với nhau thành một chuỗi thông qua toán tử +. Ví dụ:

first_name = "Nguyễn"
middle_name = 'Văn'
last_name = "A"

full_name = first_name + " " + middle_name + " " + last_name
print(full_name)

# Kết quả là Nguyễn Văn A

Chú ý, toán tử nối chuỗi chỉ thực hiện được khi các thành phần là chuỗi, ví dụ dưới đây sẽ gây ra lỗi:

age = 35

print("Tuổi của bạn là:" + age)

Do biến age là kiểu số, toán tử nối chuỗi sẽ bị lỗi, nếu muốn nối chuỗi bạn phải chuyển đổi kiểu số sang kiểu chuỗi với hàm str().

age = 35

print("Tuổi của bạn là:" + str(age))

2.2 Độ dài của chuỗi

Đôi khi chúng ta muốn xác định độ dài của một chuỗi để có thể cắt bớt hoặc xử lý cho phù hợp. Ví dụ, tiêu đề của một bài viết là dưới 70 ký tự khi đó chúng ta cần xác định độ dài tiêu đề bài viết. Trong Python sử dụng hàm len() để xác định độ dài chuỗi.

title = "Kiểu dữ liệu chuỗi ký tự và định dạng chuỗi trong Python"
print(len(title))

# Kết quả là 56

2.3 Các phương thức của str trong Python

Mọi chuỗi trong Python đều là đối tượng str, do đó bản thân nó có rất nhiều các hàm nội tại dùng để thao tác với nội dung của chuỗi. Cú pháp sử dụng các hàm str trong Python như sau:

variable_string = "Some thing"
variable_string.methodname(params)
  • str.lower(): Chuyển đổi tất cả các ký tự trong chuỗi thành chữ thường.
  • str.upper(): Chuyển đổi tất cả các ký tự trong chuỗi thành chữ hoa.
  • str.strip(): Loại bỏ các khoảng trắng từ đầu và cuối chuỗi.
  • str.replace(old, new): Thay thế tất cả các xuất hiện của chuỗi con old bằng chuỗi new.
  • str.split(separator): Tách chuỗi thành danh sách các chuỗi con dựa trên ký tự phân cách separator.
  • str.join(iterable): Kết hợp các chuỗi từ một iterable thành một chuỗi duy nhất với ký tự phân cách.
  • isalpha: trả về true nếu chuỗi chỉ chứa chữ cái A-Z và a-z.
  • isnumeric: trả về true nếu chuỗi chứa chỉ các chữ số 0-9.
  • find(x, [y.z]): trả về số lần chuỗi x được tìm thấy trong chuỗi gốc, tùy chọn [y.z] giới hạn vị trí tìm kiếm, trả về -1 nếu không tìm thấy.
  • replace(x, y): thay thế chuỗi x thành chuỗi y trong chuỗi gốc.

Ví dụ:

my_name = "Nguyen Van A"

print(my_name.isalpha) # trả về true
print(my_name.isnumeric) # trả về false
print(my_name.lower) # trả về nguyen van a
print(my_name.upper) # trả về NGUYEN VAN A
print(my_name.find("an")) # trả về 1
print(my_name.replace("Nguyen", "Tran")) # trả về Tran Van A

Tuyển dụng python Hồ Chí Minh mới nhất trên TopDev

3. Định dạng chuỗi

3.1 Định dạng với F-string

Định dạng f-string khá đơn giản khi sử dụng, tất cả những gì cần là một chữ f đứng trước một chuỗi thì tất cả các biểu thức (nằm trong cặp đóng mở ngoặc nhọn) sẽ được thực thi và chuyển đổi thành chuỗi và thay thế vào biểu thức đó. Trong ví dụ ở phần trên

age = 35

print("Tuổi của bạn là:" + str(age))

Chúng ta có thể sử dụng định dạng f-string như sau:

age = 35

print(f"Tuổi của bạn là: {age}")

Biểu thức trong {age} sẽ được tính toán và chuyển đổi thành chuỗi và thay thế lại vị trí cũ, do đó kết quả nhận được là “Tuổi của bạn là: 35”. Một ví dụ khác sẽ giúp bạn hiểu rõ hơn:

don_gia = 25000
chiet_khau = 0.25
so_luong = 3

print(f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong} VND")
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

print(f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong:,} VND")
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75,000 VND

print(f"Ban duoc chiet khau {chiet_khau:.2%}")
# Kết quả in ra: Ban duoc chiet khau 25%

F-string cũng cho phép chúng ta định dạng số với các dấu phân cách hàng nghìn (,) hoặc định dạng số theo phần trăm (.2%). Một điểm chú ý là f-string nếu sử dụng cho biến số sẽ không thay đổi giá trị khi các thành phần của biến số thay đổi.

don_gia = 25000
so_luong = 3
thong_bao = f"Bạn mua {so_luong} dia com het tong cong: {don_gia * so_luong} VND"

print(thong_bao)
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

don_gia = 35000
so_luong = 5

print(thong_bao)
# Kết quả in ra: Ban mua 3 dia com het tong cong: 75000 VND

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Bạn thấy đấy, khi thay đổi số lượng và đơn giá nhưng thông báo in ra vẫn giữ nguyên.

  Lệnh if, elif, if else trong Python là gì?

3.2 Định dạng chuỗi với phương thức format()

Bản thân biến dạng chuỗi là một đối tượng str có một hàm nội tại là format() dùng để định dạng nội dung. Ví dụ dưới đây sử dụng hàm format() trong Python:

ten_nguoi_dung = "Nguyen Van A"
cau_chao = "Chao ban {}!"
cau_chao_a = cau_chao.format(ten_nguoi_dung)
print(cau_chao_a)

Nếu bạn muốn có nhiều biến được đưa vào trong nội dung chuỗi, chúng ta cần phải đặt tên cho các vị trí này. Ví dụ:

don_gia = 25000
so_luong = 3
tong_tien = don_gia * so_luong
mau_thong_bao = "Bạn mua {so_luong} dia com het tong cong: {tong_tien} VND"

thong_bao = mau_thong_bao.format(so_luong=so_luong,tong_tien=tong_tien)
print(thong_bao)

don_gia = 35000
so_luong = 5
tong_tien = don_gia * so_luong
mau_thong_bao = "Bạn mua {so_luong} dia com het tong cong: {tong_tien} VND"

thong_bao = mau_thong_bao.format(so_luong=so_luong,tong_tien=tong_tien)
print(thong_bao)

Kết quả chúng ta đạt được như mong muốn.

Kiểu dữ liệu chuỗi và định dạng chuỗi trong Python

Trong một số ví dụ, tôi có sử dụng Jupyter Notebook chạy trên máy cá nhân, nếu bạn muốn tìm hiểu về phần mềm này có thể tham khảo bài viết Jupyter Notebook công cụ không thể thiếu khi học Python.

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

Xem thêm việc làm công nghệ thông tin hấp dẫn trên TopDev

Thực thi phương thức kiểm thử NUnit với Command Line

Thực thi phương thức kiểm thử NUnit với Command Line

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

Bên cạnh việc thực thi các phương thức kiểm thử NUnit với ứng dụng, chúng ta còn có thể ra lệnh thực thi các phương thức kiểm thử với Command Line. Điều này thật sự hữu ích khi chúng ta muốn thiết lập kiểm thử tự động theo lịch (schedule).

  NUnit – Kiểm thử Đơn vị trên Visual Studio
  Kiểm thử đơn vị trong C# với Nunit và .Net Core

Chương trình NUnit-Console

NUnit-Console là một chương trình DOS, không có giao diện, được gọi thông cửa sổ Command Line. Kết quả sau khi thực thi sẽ được trả về bằng một tập tin XML. Các lựa chọn (option) cho chương trình NUnit-Console này được chia làm 4 nhóm: Lựa chọn phương thức kiểm thử; Thiết lập quá trình thực thi; Thiết lập đầu ra (output) sau khi thực thi  Các lựa chọn khác.

Thực thi phương thức kiểm thử NUnit với Command Line

Lựa chọn phương thức kiểm thử để thực thi

Về mặc định, khi chúng ta gọi chương trình NUnit-Console với một tập tin, NUnit-Console sẽ chạy toàn bộ phương thức kiểm thử có trong tập tin đó. Loại tập tin được hỗ trợ bởi NUnit-Console là: dll, csproj và nunit. Những phương thức kiểm thử nào được đánh dấu Ignore sẽ không được thực thi. Khi gọi chương trình NUnit-Console, chúng ta có thể thực thi một lần nhiều tập tin, cách nhau bằng một khoảng trắng.

unit-console [tập tin dll/csproj/nunit]
unit-console [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit] [tập tin dll/csproj/nunit]

Thay vì thực thi toàn bộ phương thức kiểm thử có trong dự án kiểm thử, chúng ta có thể lựa chọn thực thi những không gian tên/lớp/phương thức kiểm thử nào chúng ta muốn với hai option: /run và /fixture. Để xác định một lớp/phương thức kiểm thử, chúng ta phải cung cấp tên của lớp/phương thức một cách đầy đủ, bắt đầu từ không gian tên.

Với /run, chúng ta có thể cung cấp nhiều hơn một phương thức/lớp/không gian tên để thực thi. Mỗi phương thức/lớp/không gian tên được cách nhau bằng một dấu phẩy (,).

nunit-console /run:[phương thức kiểm thử],[lớp kiểm thử],[không gian tên] [tập tin dll/csproj/nunit]

Thực thi phương thức kiểm thử NUnit với Command Line

Với /fixture, chúng ta có thể thực thi một lớp kiểm thử hoặc một tập hợp các phương thức kiểm thử thông qua từ khóa Suite (đã được nói tại đây).

Nếu việc nhớ tên của từng lớp/phương thức kiểm thử khi chạy chương trình gây khó khăn, chúng ta có thể để tên của lớp/phương thức kiểm thử vào một tập tin và gọi một cách trực tiếp với chương trình Nunit-Console với option /runlist.

nunit-console /runlist:[tập tin chứa tên lớp/phương thức kiểm thử] [tập tin dll/csproj/nunit]

Cuối cùng, NUnit-Console cho chúng ta hai option /include và /exclude để lựa chọn việc thực thi/không thực thi các phương thức kiểm thử theo Category.

nunit-console [tập tin dll/csproj/nunit] /include:[tên category]
nunit-console [tập tin dll/csproj/nunit] /exclude:[tên category]

Thiết lập quá trình thực thi

Trong phần này, NUnit cho chúng ta một số lựa chọn: /framework; /process; /domain; /apartment  /timeout. Ngoài lựa chọn /timeout với ý nghĩa thiết lập thời gian tối đa cho từng phương thức kiểm thử – với đơn vị là mili-giây, mình cảm thấy những lựa chọn khác không có nhiều ý nghĩa lắm. Đơn giản là vì chúng ta thực thi kiểm thử tự động trên từng máy khác nhau, và lúc đó, những giá trị như framework, domain hay apartment sẽ đi theo cấu hình từng máy, việc tái thiết lập trở nên không cần thiết.

Thiết lập đầu ra (output)

Về mặc định, sau khi thực thi chương trình Nunit-Console, một tập tin TestResult.xml sẽ được tạo ra và lưu kết quả của lần thực thi đó. Để có thể tạo tập tin kết quả này ở đúng thư mục và đúng tên theo chúng ta, /result được sử dụng.

nunit-console [tập tin dll/csproj/nunit] /result:[tên tập tin kết quả]

Trường hợp, nếu chúng ta không muốn có tập tin kết quả trả về, chúng ta có thể thiết lập /noresult.

Các lựa chọn khác

Chúng ta có một số lựa chọn đặc biệt khác như:

  • /out: lựa chọn này sẽ không ghi dữ liệu của Console.Writeline ra màn hình Console mà sẽ tạo một tập tin riêng để chứa những thông tin này.
  • /err: lựa chọn này sẽ ghi thông tin của lỗi trong quá trình thực thi ra tập tin.
  • /wait: lựa chọn này sẽ yêu cầu người dùng tác động trước khi kết thúc quá trình thực thi. Điều này có ý nghĩa khi chúng ta thực thi Nunit-Console từ tập tin batch, và muốn xem dữ liệu trước khi cửa sổ Console được đóng lại.
  • /help hay /?: lựa chọn này được dùng để xem cấu trúc và ý nghĩa của các lựa chọn mà NUnit cung cấp.

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

System Design Cơ Bản – Consistent Hashing

Consitent Hashing

Bài viết được sự cho phép của tác giả Edward Thiên Hoàng

Như đã nhắc đến rất nhiều lần bên trên thì Distributed Hash Table (DHT — Bảng băm phân tán) là một thành phần cơ bản trong những distributed scalable systems (hệ thống phân tán có khả năng mở rộng). Một Hash Table cần một cặp , và một hàm “hash” để map với vị trí mà  của nó được lưu trữ.

 

index = hash_function(key)

Giả sử ta có thiết kế một distributed caching system (Redis cache chẳng hạn). Chúng ta có “n” cache servers, thì hàm băm (hash function) để map key với vị trí của Cach server nó làm ở đâu sẽ là . Nó rất đơn giản và dễ sử dụng, tuy nhiên nó có hai nhược điểm chính là:

  Chuyện mấy con Consumer
  Code game rắn săn mồi trên console bằng C++
  1. Nó rất khó horizontally scalable (phân tán theo chiều ngang). Bởi vì mỗi lần một cache server mới được thêm vào LB, mọi mapping trước khia giữa key với value nó được lưu trữ ở đâu sẽ sai toét hết. Hiện tượng cache miss sẽ sẩy ra tràn lan và rất mất thời gian và khó khăn để cập nhật tất cả các mapping key-value, với một hệ thống lớn với số lượng caching data khổng lồ đây là một điểm ác mộng với những người quản lý dữ liệu.
  2. Nó có thể không đáp ứng được việc cân bằng tải (Load Balanced), bởi vì ta không thể chắc chắn rằng việc hash và mapping như vậy những data được lưu trữ ở các server khác nhau có độ truy cập có cân bằng nhau không? Rất có thể những data ít được truy cập có thể tập chung vào một vài server và vài server còn lại lại chứa những “hot key”, dẫn tới tình trang một vài server thì hoạt động hết công xuất, một vài server thì lại quá nhàn rỗi ngồi chơi không 😙.

Với những vấn đề như vậy thì Consistent Hashing là một giải pháp rất tốt để cải tiến việc chia server với các caching system.

CONSISTENT HASHING GIẢI QUYẾT VẤN ĐỀ NÀY NHƯ THẾ NÀO?

Consistent Hashing là một chiến thuật hiệu quả cho việc phân chia distributed caching systems và DHT. Nó cho phép việc thêm hay xóa các node trên một cụm server (cluster) mà ít gây ra sự xáo trộn dữ liệu, do đó nó các hệ thống caching system sẽ dễ dàng scale-up hay scale down.

Trong Consistent Hashing, khi bảng băm (hash table) thay đổi kích thước (ví dụ thêm một node và cluster), chỉ có “k/n” keys cần re-map với “k” là tổng số keys có trong hệ thống, và “n” là tổng số server. Có nghĩa là khi thay đổi kích thước của cluster thì có duy nhất keys trên một server cần phải re-map. Và khi một node bị xóa khỏi cluster, thì các data của node đó sẽ được di chuyển và chia sẻ với các node khác, và cũng tương tự khi một node được thêm vào cluster thì nó sẽ lấy tự động dữ liệu từ một vài node khác để chia sẻ tài nguyên.

CONSISTENT HASHING HOẠT ĐỘNG NHƯ THẾ NÀO?

Vậy làm thế nào để Consistent Hashing làm được những điều trên thì các Node trên cluster sẽ được lưu trữ dưới dạng vòng tròn bằng cách sử dụng hash function trong Consisten Hashing sẽ hash các key thành một một số nguyên (Integer) nằm trong một khoảng nào đó và các số nguyên đó sẽ được đặt trên một vòng tròn sao cho mỗi điểm trên vòng tròn sẽ tương ứng với một số nguyên trên dãy số nguyên đó.

Tóm lại các bước để Consistent Hashing băm dữ liệu như sau:

  1. Tiến hành hash các danh sách node trong cluster server thành một số nguyên trong một khoảng số được định nghĩa trước. Khoảng số này tùy vào người thiết kế hệ thống cân nhắc dựa trên số lượng Server tối đa mà hệ thống sẵn sàng scale up.
  2. Sau khi đã có danh sách mapping giữa các node, ta sẽ tiến hành mapping  của data tới các node bằng cách.
  • Hash giá trị của key thành một số nguyên (integer).
  • Di chuyển nó liên tục trong vòng tròn số nguyên trong khoảng đã tạo ở trên theo chiều kim đồng hồ cho tới khi giá trị integer đó bằng với giá trị hash key của một Node đầu tiên nó gặp. Tiến hành ghi dữ liệu của dữ liệu đó vào Node vừa gặp.

10-1

Mô hình vòng tròn trong Consistent Hashing

Do đó khi tiến hành thêm một Node vào Cluster Server thì dữ liệu Node gần nó nhất theo chiều kim đồng hồ sẽ được chia sẻ với Node mới thêm vào.

10-2

Mô hình Consistent Hashing với trường hợp thêm mới Node

Tương tự như việc xóa một Node trên Cluster, khi cache miss sẩy ra, dữ liệu sẽ được di chuyển, lưu và lấy từ Node kế cận nhất với Node đã xóa theo chiều kim đồng hồ

10-3

Mô hình Consistent Hashing với trường hợp xóa mới một Node

Như vậy, Consistent Hashing đã giải quyết được vấn đề xáo trộn data cache khi scale hệ thống theo chiều ngang, đảm bảo sự xáo trộn cache chỉ xảy ra với một server.

Vấn đề về phân phối đều data trên từng Node.
Bên trên chúng ta cũng đã đề cập về vấn đề Load Balancing, với dữ liệu thật thì khả năng nhiều data key đều được hash vào một dãy giá trị lưu trên một Node nào đó, khiến Node đó trở thành điểm nóng (hot spot) so với các server còn lại. Dẫn đến việc lệch cân bằng tải và rủi ro nếu node hot spot gặp sự cố, gần như toàn bộ cache sẽ bị mất, dẫn tới cache miss hàng loạt.

Để giải quyết vấn đề này, chúng ta sẽ thực hiện hash và thêm nhiều các Node ảo (virtual node) vào vòng tròn. Và thay vì việc chỉ mapping mỗi Node vào một điểm trên vòng tròn, mỗi node ảo tượng trưng cho một dãy giá trị mà một Node thật đảm nhiệm. Có nghĩa là mỗi Node thật sẽ lưu trữ dữ liệu được ánh xạ trên nhiều Virtual Node. Điều này sẽ làm cho việc phân phối key sẽ cân bằng hơn, nó giống với việc tạo ra nhiều Node con hơn cho hash function trong Consistent Hashing băm “nhuyễn” hơn 😃

Ví dụ ta có 3 Node trên Cluster, ta sẽ tạo thêm 3 virtual Node tương ứng, lúc này vòng tròn sẽ chia thành 6 điểm như trên hình vẽ. Mỗi Virtual Node sẽ ánh xạ tới các Node thật, như trong hình là Virutal Node mầu đỏ 🔴 sẽ ảnh xạ tới Real Node mầu đỏ 🔴, Virutal Node mầu xanh nước biển 🔵 sẽ ánh xạ tới Real Node mầu xanh nước biển 🔵 , tương tự với Virtual Nod mầu xanh nhạt. Do vậy với Node 🔴 nó sẽ chứa dữ liệu của khoảng 1 và 4 Node 🔵 sẽ chứa dữ liệu của 2 và 5, tương tự Node còn lại sẽ chứa dữ liệu của 0 và 6.

10-4

Virtual Node trên Consistent Hashing

Consistent Hashing được ứng dụng rất rộng rãi nổi bật nhất là DynamoDB và Cassandra đã ứng dụng nó vào việc replicate dữ liệu giữa các Server Node của nó.

Theo medium

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

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

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