Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
Paper • 1908.10084 • Published • 14
How to use thuan-NM/Chatbot-Model with sentence-transformers:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("thuan-NM/Chatbot-Model")
sentences = [
"giới thiệu",
"khai but dau xuan báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm đối với người quan tâm đến an ninh mạng hay có kiến thức về mạng máy tính thì chắc không còn xa lạ với phần mềm wireshark wireshark được sử dụng để phân tích mạng network packet analyzer công dụng của ứng dụng này là dùng để bắt phân tích và xác định các vấn đề có liên quan đến network bao gồm kết nối chậm rớt gói tin hoặc các truy cập bất thường i cài đặt wireshark bạn có thể tải xuống bản phát hành chính thức tại httpswwwwiresharkorgdownloadhtml ở đây bạn hãy chọn phiên bản tương ứng với máy của mình và tải xuống i i giới thiệu về giao diện bây giờ bạn đã cài đặt wireshark tiếp theo chúng ta sẽ khám phá về giao diện của wireshark hình bên dưới hiển thị giao diện người dùng của wireshark như bạn thường thấy sau khi một số gói tin được bắt hoặc tải xuống cách thực hiện sẽ được mô tả sau giao diện người dùng của wireshark cửa sổ chính của wireshark bao gồm các phần thường được biết đến từ nhiều chương trình g ui khác menu chính chứa các mục sau menu chính của wireshark menu này chứa các mục open và merge capture files save print export capture files và quit menu này chứa các mục find a packet time reference hoặc đánh dấu một hoặc nhiều gói tin xử lý các cấu hình và đặt tùy chọn của bạn menu này chứa các mục để chuyển đến một gói cụ thể như back forward go to packet menu này cho phép bạn bắt đầu và dừng bắt gói tin và chỉnh sửa các bộ lọc menu này chứa các mục để thao tác các bộ lọc bật hoặc tắt phân tích các giao thức giải mã và theo dõi luồng menu này sẽ hiển thị các cửa sổ thống kê khác nhau bao gồm tóm tắt các gói đã được thu thập hiển thị thống kê phân cấp giao thức và nhiều công dụng khác menu này chứa các mục để hiển thị các thống kê mạng liên quan đến điện thoại menu này chứa các mục để hiển thị thống kê không dây bluetooth và i ee e 80211 menu này chứa các công cụ khác nhau có sẵn trong wireshark chẳng hạn như tạo quy tắc a cl tường lửa menu này chứa các mục để giúp người dùng chẳng hạn như truy cập vào một số trợ giúp cơ bản các trang hướng dẫn sử dụng các công cụ dòng lệnh khác nhau truy cập trực tuyến vào một số trang web và hộp thoại giới thiệu thông thường thanh công cụ chính cho phép truy cập nhanh vào các mục thường dùng từ menu thanh công cụ bộ lọc cho phép người dùng đặt bộ lọc hiển thị để lọc gói nào được hiển thị ngăn danh sách gói hiển thị một bản tóm tắt của mỗi gói tin được thu thập bằng cách nhấp vào các gói trong ngăn này bạn kiểm soát những gì được hiển thị trong hai ngăn còn lại packet list ngăn chi tiết hiển thị chi tiết hơn về gói được chọn trong ngăn danh sách gói ngăn này hiển thị các giao thức và trường giao thức của gói được chọn packet details ngăn byte hiển thị dữ liệu từ gói tin được chọn trong packet list và đánh dấu trường được chọn trong packet details và hiển thị dưới dạng hexdump packet bytes ngăn packet diagram hiển thị gói được chọn trong packet list dưới dạng sơ đồ kiểu sách giáo khoa thanh trạng thái hiển thị một số thông tin chi tiết về trạng thái chương trình hiện tại và dữ liệu đã thu thập the statusbar i ii cách sử dụng wireshark cơ bản a cách bắt các gói tin trực tiếp trong wireshark khi bạn mở wireshark mà không bắt đầu bắt gói tin hoặc mở tệp nó sẽ hiển thị màn hình chào mừng liệt kê mọi tệp đã mở gần đây và các giao diện bắt gói tin có sẵn hoạt động mạng cho mỗi giao diện sẽ được hiển thị trong một đường gấp khúc bên cạnh tên giao diện bạn có thể chọn nhiều hơn một giao diện và bắt đồng thời nhiều hoạt động mạng bạn có thể bấm vào phần bánh răng ở phần thanh công cụ chính để cài đặt input output của các hoạt động mạng để bắt đầu capture chúng ta có những cách sau bạn có thể nhấp đúp vào một trong những hoạt động mạng trên màn hình chào mừng bạn có thể chọn một trong những hoạt động mạng trên màn hình chào mừng sau đó chọn capture start hoặc nhấp vào nút trên thanh công cụ chính b cách xem các gói tin trong wireshark khi bạn đã bắt một số gói hoặc bạn đã mở tệp capture đã lưu trước đó bạn có thể xem các gói được hiển thị trong packet list bằng cách chỉ cần nhấp vào một gói trong packet list thao tác này sẽ hiển thị gói đã chọn trong packet details và packet bytes sau đó bạn có thể mở rộng bất kỳ phần nào của packet details để xem thông tin chi tiết về từng giao thức trong mỗi gói nhấp vào một mục trong packet details sẽ làm nổi bật các byte tương ứng trong chế độ xem byte ví dụ về gói t cp được chọn được hiển thị trong hình nó cũng có số acknowledgment trong tiêu đề t cp được chọn hiển thị trong dạng xem byte dưới dạng các byte đã chọn c cách lọc các gói tin trong wireshark wireshark có hai kiểu lọc là capture filters và display filters capture filter được sử dụng để lọc khi bắt gói tin từ các hoạt động mạng display filters cho phép bạn tập trung vào các gói tin mà bạn quan tâm trong khi ẩn những gói bạn không quan tâm chúng cho phép bạn chỉ hiển thị các gói dựa trên giao thức sự hiện diện của một trường the presence of a field giá trị của các trường the values of fields so sánh giữa các trường a comparison between fields và nhiều hơn nữa để chỉ hiển thị các gói tin chứa một giao thức cụ thể hãy nhập tên giao thức đó vào thanh công cụ display filter của cửa sổ wireshark và nhấn enter để áp dụng bộ lọc hình dưới cho thấy một ví dụ về những gì sẽ xảy ra khi bạn nhập udp vào thanh công cụ display filter wireshark cung cấp ngôn ngữ display filter cho phép bạn kiểm soát chính xác gói nào được hiển thị chúng có thể được sử dụng để kiểm tra sự hiện diện của một giao thức hoặc field giá trị của field hoặc thậm chí so sánh hai fields với nhau các phép so sánh này có thể được kết hợp với các toán tử logic như and và or và dấu ngoặc đơn thành các biểu thức phức tạp bạn có thể tạo display filter so sánh các giá trị bằng cách sử dụng một số toán tử so sánh khác nhau ví dụ để chỉ hiển thị các gói đến hoặc đi từ địa chỉ i p 1921681102 hãy sử dụng ipaddr 1921681102 bạn có thể tham khảo những cú pháp để sử dụng display filter hiệu quả hơn tại bảng cheat sheet bên dưới cyber security wireshark an ninh mạng mạng máy tính all rights reserved báo cáo thêm vào series của tôi",
"báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 5 năm giới thiệu bad programmers worry about the code good programmers worry about data structures and their relationships linus torvalds thật là quá đúng đó là lý do tại sao mọi nhà tuyển dụng tìm kiếm một ứng viên có hiểu biết tốt về cấu trúc dữ liệu trong các các buổi phỏng vấn điều này cũng đúng cho các android developer trong blog này chúng ta sẽ đề cập đến tất cả các data structure cần thiết cho bất kỳ android developer mặc dù còn nhiều điều cần tìm hiểu chúng ta sẽ đề cập đến những câu hỏi được sử dụng nhiều nhất và thường xuyên nhất trong phỏng vấn android nguồn httpsblogmindorkscomandroid-developer-should-know-these-data-structures-for-next-interview data structure là gì data structure là định dạng tổ chức quản lý và lưu trữ dữ liệu cho phép truy cập và sửa đổi hiệu quả chính xác hơn data structure là tập hợp các giá trị dữ liệu mối quan hệ giữa chúng và các chức năng hoặc hoạt động có thể được áp dụng cho dữ liệu ví dụ chúng ta có một số dữ liệu của một người có name a bc và age 25 ở đây a bc có kiểu dữ liệu string và 25 là kiểu dữ liệu interger chúng ta có thể sắp xếp dữ liệu này dưới dạng bản ghi giống như bản ghi user sẽ có cả tên người dùng và tuổi trong đó bây giờ chúng ta có thể thu thập và lưu trữ các bản ghi người dùng trong một tệp hoặc cơ sở dữ liệu dưới dạng cấu trúc dữ liệu bây giờ hãy cùng tìm hiểu về cấu trúc dữ liệu được sử dụng nhiều nhất và thường được hỏi trong android cấu trúc dữ liệu được sử dụng nhiều nhất và được hỏi nhiều nhất trong android array linked list hash table stack queue tree graph array mảng là cấu trúc dữ liệu được sử dụng nhiều nhất và dễ nhất được sử dụng để lưu trữ cùng loại dữ liệu mảng là một tập hợp các mục tương tự được lưu trữ ở các vị trí bộ nhớ liền kề ví dụ nếu bạn đang lưu trữ điểm của 10 sinh viên thì bạn có thể thực hiện việc này bằng cách tạo 10 biến số nguyên cho mỗi sinh viên và bạn có thể lưu trữ điểm trong các biến này nhưng bạn phải quản lý 10 biến khác nhau ở đây đây là một nhiệm vụ rất khó khăn vì nếu trong tương lai bạn phải lưu trữ 1000 điểm của sinh viên thì bạn phải tạo 1000 biến nếu bạn đang theo phương pháp này vì vậy chúng ta có thể sử dụng mảng cho mục đích này tất cả những gì bạn cần làm chỉ là tạo ra một mảng có tên là marks có kích thước 10 hoặc 1000 hoặc bất cứ thứ gì khác và sau đó lưu trữ các dấu trong mảng đó l ưu ý trong hầu hết tất cả các ngôn ngữ lập trình chúng ta sử dụng index dựa trên 0 tức là index của mảng sẽ bắt đầu từ 0 và đi đến n-1 trong đó n n là kích thước của mảng bạn có thể truy cập các phần tử của mảng với sự trợ giúp của các chỉ mục của nó marks 0 to access the 1 st element ie element at index 0 marks 2 to access the 3 rd element ie element at index 2 marks 4 to access the 5 th element ie element at index 4 một số thao tác cơ bản trên mảng insertion chèn một phần tử đã cho vào một chỉ mục cụ thể của mảng deletion xóa một phần tử đã cho khỏi mảng searching tìm kiếm một phần tử cụ thể trong mảng updation cập nhật một phần tử của một mảng tại một chỉ mục cụ thể traversing in hoặc duyệt toàn bộ mảng linked list một linked list gần như tương tự với một mảng tức là nó cũng là một cấu trúc dữ liệu tuyến tính để lưu trữ cùng loại dữ liệu ở đây dữ liệu không được lưu trữ một cách liên tục dữ liệu được lưu trữ trong danh sách được liên kết ở dạng nodes và mỗi node có thể được kết nối với node khác với sự trợ giúp của một số con trỏ hoặc tham chiếu đến node tiếp theo vì vậy có hai phần của một node trong danh sách được liên kết tức là phần dữ liệu và con trỏ hoặc phần tham chiếu phần dữ liệu lưu trữ dữ liệu của node trong khi con trỏ hoặc phần tham chiếu lưu địa chỉ của node tiếp theo nếu có hình ảnh trên là một ví dụ về linked list đơn lẻ tức là ở đây chúng tôi chỉ có địa chỉ của node tiếp theo có một linked list khác được gọi là doubly linked list trong đó địa chỉ của node trước và node tiếp theo được giữ bởi bất kỳ node nào ngoài hai loại danh sách được liên kết này chúng ta còn có một circular linked list ở đây trong hình ảnh trên head đang chỉ vào node đầu tiên của linked list và node cuối cùng của linked list đang trỏ đến null tức là không có node nào xuất hiện sau node đó một số thao tác cơ bản trên linked list insertion tại đây bạn có thể chèn node vào linked list bạn có thể chèn node vào bất kỳ nơi nào của linked list deletion trong thao tác xóa bạn có xóa node từ bất kỳ node nào khỏi linked list searching bạn sẽ được cung cấp một yếu tố và bạn phải tìm kiếm yếu tố đó trong linked list traversing di chuyển toàn bộ danh sách được liên kết để có được từng phần tử của linked list hash table hash table là một loại cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu dưới dạng cặp khóa key-value bạn sẽ có một số giá trị hoặc dữ liệu và dựa trên dữ liệu đó bạn sẽ tạo một khóa và với sự trợ giúp của khóa đó bạn sẽ lưu trữ giá trị trong bảng hash nếu đầu vào được phân phối đồng đều thì bảng hash sẽ thực hiện thao tác chèn xóa và tìm kiếm trong thời gian o 1 quá trình tạo khóa và lưu trữ dữ liệu dựa trên khóa đó được gọi là xóa hashing để tạo khóa từ dữ liệu chúng ta cần một hàm được gọi là hàm hash hash hàm hash sẽ lấy dữ liệu làm đầu vào và đưa khóa làm đầu ra ví dụ nếu dữ liệu được lưu trữ là 1 2 3 4 5 26 17 và hàm băm được sử dụng là hash function k k 10 và dữ liệu sẽ được lưu trữ trong bảng hash theo cách sau những điểm cần suy nghĩ khi sử dụng bảng hash hàm hash phải sao cho các khóa được tạo được phân phối đồng đều kích thước của bảng hash phụ thuộc vào hàm hash vì vậy việc lựa chọn hàm hash nên được thực hiện hoàn hảo trong trường hợp va chạm trong bảng hash hãy áp dụng kỹ thuật xử lý va chạm thích hợp stack một stack là một cấu trúc dữ liệu tuyến tính sử dụng thứ tự last in first out l if o tức là phần tử được chèn cuối cùng sẽ được bật ra trước ví dụ nếu bạn đặt một cuốn sách lên trên những cuốn sách khác và tiếp tục quá trình này trong 50 cuốn sách thì cuốn sách trên cùng sẽ được tìm nạp trước ở đây bạn có thể nhận thấy rằng cuốn sách trên cùng là cuốn sách được đặt ở cuối hoặc được đặt gần đây trong stack chúng ta có một biến top mà biểu thị đỉnh của stack điều này là cần thiết bởi vì tất cả các hoạt động của ngăn xếp được thực hiện với sự trợ giúp của biến top sau đây là một ví dụ về stack nếu bạn muốn xóa các phần tử khỏi stack ở trên thì 5 sẽ bị xóa trước tiếp theo là 4 3 2 và 1 một số thao tác cơ bản trên stack push push được sử dụng để chèn một phần tử ở đầu ngăn xếp pop pop được sử dụng để xóa một phần tử khỏi đỉnh ngăn xếp top top được sử dụng để biểu thị phần tử trên cùng của ngăn xếp queue queue là cấu trúc dữ liệu tuyến tính sử dụng thứ tự first in first out f if o tức là phần tử đến trước trong hàng đợi sẽ bị xóa đầu tiên khỏi hàng đợi ví dụ trong khi đứng xếp hàng để đặt vé người đến trước sẽ đặt vé trước và người mới đến đặt vé phải đứng ở cuối hàng đợi trong queue chúng ta có các front và rear font được sử dụng để trỏ đến phần tử phía trước của queue trong khi rear được sử dụng để trỏ đến phần tử phía sau của queue sau đây là một ví dụ về hàng đợi vì vậy nếu bạn muốn xóa các thành phần khỏi hàng đợi trên thì 1 sẽ bị xóa trước tiếp theo là 2 3 4 và 5 tương tự nếu bạn muốn chèn một phần tử trong hàng đợi ở trên thì nó sẽ được chèn từ rear chứ không phải từ front một số thao tác cơ bản trên queue enqueue enqueue được sử dụng để chèn một phần tử vào cuối queue dequeue dequeue được sử dụng để xóa một phần tử từ phía trước queue front nó được sử dụng để biểu thị thành phần phía trước của queue rear nó được sử dụng để biểu thị thành phần phía sau của queue tree tree là một cấu trúc dữ liệu phi tuyến tính phân cấp được sử dụng để lưu trữ dữ liệu dưới dạng các node ở đây chúng ta có node và tất cả các node được kết nối với nhau với sự trợ giúp của các cạnh được vẽ giữa chúng một node cha có thể không có con hoặc một con hoặc nhiều hơn một con nhưng node con không thể có nhiều hơn một cha sau đây là một ví dụ đơn giản về tree một số thuật ngữ liên quan đến tree là root root là node có mặt ở đầu tree chỉ có thể có một gốc của một tree cụ thể parent tất cả các node có ít nhất một con được gọi là node cha child node bên dưới node cha được gọi là node con của node cha leaf node không có con được gọi là node leaf một số loại cây là general tree binary tree binary search tree a vl tree red-black tree n-ary tree graph graph tương tự như tree tức là nó cũng là cấu trúc dữ liệu phi tuyến tính lưu trữ dữ liệu dưới dạng các node và tất cả các node được kết nối với nhau với sự trợ giúp của các cạnh sự khác biệt giữa tree và graph là có một chu kỳ trong graph nhưng không có chu trình như vậy trong trường hợp của tree graph bao gồm một tập hợp các node hữu hạn và một tập hợp các cạnh hữu hạn chịu trách nhiệm kết nối các node sau đây là một ví dụ về đồ thị sau đây là các loại biểu đồ directed graph ở đây các cạnh sẽ trỏ đến một số node tức là bạn sẽ có một mũi tên chỉ vào một node từ một node undirected graph ở đây không có mũi tên nào ở giữa các node ví dụ trên là một ví dụ về đồ thị vô hướng một số kỹ thuật truyền tải đồ thị phổ biến là depth-first searchd fs breadth-first searchb fs kết luận trên đây là một số kiến thức về data structure hi vọng bài viết này sẽ giúp bạn có 1 buổi phỏng vấn thành công android interview all rights reserved báo cáo thêm vào series của tôi",
"happy new year báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 4 năm dạo này ăn dầm nằm dề với nàng react nhiều quá lắm khi không ngóc đầu lên được ông bà ta có câu chán cơm thèm phở nên lang thang trên các blog để mong tìm được 1 chút thú vui khác react đã khá quen thuộc thì vô tình thấy một framework js là mithril js tuy nó chưa quá nổi tiếng trên cộng đồng frontend nhưng đọc lướt qua phần giới thiệu lại thấy khá ấn tượng 1 giới thiệu như đã đề cập ở tiêu đề bài viết framework này có tên là mithril js cái tên được lấy cảm hứng từ một loại vật liệu hư cấu trong các tác phẩm của nhà văn giáo sư người anh j r r tolkien là một framework js phía client dùng để xây dựng các ứng dụng s pa theo mô hình m vc như react hay vue về chi tiết phần giới thiệu cũng như hướng dẫn để bắt đầu với mithril js thì mình xin phép không đề cập quá cụ thể ở đây vì các bạn có thể vào thẳng trang chủ của nó để đọc ở trang chủ khá chi tiết và rõ ràng tuy nhiên phải nói qua cái mà gây ấn tượng ngay lúc đọc phần giới thiệu thì hiện tại đây là một javascript framework có performance tốt nhất cũng như có size nhỏ nhất so với các javascript framework phổ biến hiện nay 2 các đặc trưng và thành phần chính mỗi framework js đều xây dựng những đặc trưng và định nghĩa một cấu trúc cơ chế hoạt động riêng react thì có virtual do m stateprops life-cycle thì với mithril js cũng vậy sau đây là 1 số thành phần chính hay những giá trị cốt lõi xương sống của nó 21 cú pháp mithril js được xây dựng một cú pháp viết riêng thông qua từ khóa m tuy nhiên nếu bạn đã từng làm việc với react và đã quá quen với cách viết của j sx thì đừng lo webpack và babel sẽ giúp các bạn làm việc này qua vài bước config đơn giản hướng dẫn đầy đủ tại trang chủ của mithril js hoặc ở cuối bài viết mình có 1 ví dụ trong đó đã dựng sẵn 1 số config cơ bản function my component return view m main m h 1 hello world can be written as function my component return view main h 1 hello world h 1 main 22 virtual node hay vnodes cũng như react có virtual do m thì ở mithril js là vnodes vnodes là một object đại diện cho các phần tử d om hoặc các phần của d om công cụ virtual do m của mithril sử dụng vnodes để tạo ra một cây d om vnodes được khởi tạo thông qua từ khóa m m selector attributes children hoặc define a component var example component view function vnode return m div vnode attrs hello vnode children consume it m example component style colorred world equivalent h tm l hello world cấu trúc của một vnodes 23 component component trong mithril js là object có thuộc tính view là một hàm để return ra kết quả cuối cùng ở giao diện ví dụ define your component var example view function vnode return m div hello consume your component m example equivalent h tm l hello vá một loạt các method trong lifecycle methods đại khái là giống như các lifecycle trong react vậy var component with hooks oninit function vnode console log initialized oncreate function vnode console log d om created onbeforeupdate function new vnode old vnode return true onupdate function vnode console log d om updated onbeforeremove function vnode console log exit animation can start return new promise function resolve call after animation completes resolve onremove function vnode console log removing d om element view function vnode return hello 24 state cũng như các framework js khác để quản lý virtual d om hay vnode thì mithril js cũng có state state trong mithril js có thể được khai báo hoặc khởi tạo bằng nhiều cách khác nhau closure component state function component with state initial vnode component state variable unique to each instance var count 0 view function which returns a vnode return oninit function vnode console log init a closure component view function vnode return m div m p count count m button onclick function count 1 increment count p oj o component state var component with initial state data initial content view function vnode return m div vnode state data m component with initial state equivalent h tm l initial content hoặc 1 số cách khác như thông qua vnodes hoặc this 25 routing một đặc trưng không thể không nhắc đến của mithril js đó là việc tích hợp sẵn cơ chế quản lý chuyển route giống như trong vue js hay react-router-dom vậy bạn không cần phải cài đặt gì thêm var routed component view function return a redraw happens asynchronously after the route changes m m route link href m div onclick function m route set var list component view return m div list data m route document body routed component data list component và còn khá nhiều thành phần khác nữa chi tiết hơn các bạn sẽ tìm hiểu dần ở docs của nó nếu thấy hứng thú nhé 3 kết luận tuy mới chỉ tìm hiểu về mithril js nhưng mình thấy cũng khá là thú vị tuy nhiên do thời gian tìm hiểu chưa nhiều và chưa thấu hiểu hết nên nếu trong bài viết có gì sai sót mong các bạn lượng thứ bỏ qua và góp ý thêm cho mình nhé mình cũng đã thử dựng một ứng dụng t od o nhỏ bằng mithril js và đã config sẵn babel và webpack cơ bản các bạn có thể tham khảo code trên github của mình ở đây xin chào và hẹn gặp lại java script front-end all rights reserved báo cáo thêm vào series của tôi"
]
embeddings = model.encode(sentences)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
# [4, 4]This is a sentence-transformers model finetuned from keepitreal/vietnamese-sbert. It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.
SentenceTransformer(
(0): Transformer({'max_seq_length': 256, 'do_lower_case': False, 'architecture': 'RobertaModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
)
First install the Sentence Transformers library:
pip install -U sentence-transformers
Then you can load this model and run inference.
from sentence_transformers import SentenceTransformer
# Download from the 🤗 Hub
model = SentenceTransformer("sentence_transformers_model_id")
# Run inference
queries = [
"thu\u1eadt ng\u1eef trong frontend - optimization",
]
documents = [
'content creator báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm tại sao nên đọc bài này dành cho các bạn mới tiếp cận và thấy quá nhiều thuật ngữ mới dành cho các bạn có thể đã làm f e một thời gian rồi nhưng đôi khi vẫn không biết có một thứ như vậy tồn tại trên đời có vài keyword để tối ưu performance cho website các thuật ngữ phổ biến trong bài này mình sẽ nói về các thuật ngữ liên quan tới optimization nhé code split hiểu một cách đơn giản thì bạn có một file code rất to bạn chia file to đó ra thành nhiều file nhỏ thì gọi là code split hoặc một ví dụ khác là bạn có một trang web build bằng react trong đó bao gồm header body và footer thì bạn có thể build thành một file bundlejs bao gồm cả 3 component trên hoặc cũng có thể chia cái bundle đó thành 3 file mỗi file chứa một component hãy nghĩ đơn giản code split như là bạn cắt một miếng bánh to thành nhiều miếng nhỏ lazy load lazy load nghĩa là một cách để delay việc load một resource gì đó cho tới khi thật sự cần thiết như trong video ở trên sẽ khá tốn resource nếu chúng ta load hình mà user chưa thực sự cần xem đúng không do đó nó apply lazy load để khi nào ta gần scroll tới cái hình đó thì mới load hình về vừa đỡ tốn c pu cho máy user cùng vừa đỡ tốn 3 g cho người ta resource ở đây bạn có thể define là mọi thứ như là một file code một cái thẻ img một thư viện một response từ a pi khi nghĩ về lazy load thì bạn cần suy nghĩ cái gì có thể lazy và cái gì không thể lazy việc chia ra những resource nào lazy load được cái gì không thể lazy load giúp bạn có chiến thuật quản lý resource tốt hơn back lại cái thuật ngữ bên trên split code làm ví dụ nhé câu hỏi của bạn là cắt cái bundle bự thành nhiều bundle nhỏ để làm gì câu trả lời thường là bạn cắt nó ra thành hai phần phần có thể lazy load được và phần không thể lazy load được do đó bạn sẽ thấy khái niệm lazy load thường đi chung với split code vì lazy load cái resource code thì cần cắt nó thành nhiều chunk nhỏ hơn để hiện thực lazy load về mặt lý thuyết tất cả các resource liên quan tới interaction của user scroll click hover press đều có thể lazy load được prefetchpreload prefetch nghĩa là bạn nói với browser tao có một cái resource này nè khi nào mày rảnh thì load trước giúp tao nhé preload preload nghĩa là bạn nói với browser load trước đống resource này cho tao nhé rảnh hay không thì cũng load okey vậy khi nào thì nên dùng prefetch hay preload prefetch hữu dụng khi bạn tin là user sẽ cần một số resource này trong tương lai mình ví dụ khi user hover vào một link nào đó mình cũng không chắc là user sẽ thật sự click vào link này hay không nhưng khả năng cao là có vì vậy nếu mình prefetch trước cái link này thì nếu user bấm thật thì nó đã được load sẵn cmnr nên sẽ thấy trang này load nhanh vklllllllllll preload hữu dụng khi bạn cần những resource cực kì quan trọng cho bước render đầu tiên ví dụ dễ thấy nhất là font việc preload trước font giúp trang web của bạn render lần đầu tiên thì visual cũng ok luôn thay vì nếu render ra trang web mà font chưa có sau đó load font rồi phải render lại một lần nữa việc thay font như vậy dễ khiến cho layout bị flick và với góc nhìn của user thì thấy nó cũng khá là bad tree shaking bạn tưởng tượng đống codemodule của bạn như một cái cây nha bây giờ bạn cầm cái cây đó rung mạnh thật mạnh cái gì sẽ xảy ra những thành phần yếu ớt trên cái cây đó sẽ bị rơi ra như là già cành khô tổ chym tree shaking trong code cũng tương đương vậy bạn loại bỏ những thứ không cần thiết trong code dead code một cách tự động cái này giống như việc giảm mỡ cho bundle của các bạn sẽ giúp load web nhanh hơn không tốn thời gian cho những thứ không cần thiết s eo viết tắt của cụm từ search engine optimization - tối ưu hóa cho công cụ tìm kiếm hiểu đơn giản là có vô vàn website trên internet đúng không và khi bạn search google thì nó sẽ trả về cho bạn vào trăm hay vài triệu kết quả đó vậy làm sao để trang web của mình nằm ở vị trí cao hơn trong danh sách đó để nhiều user biết tới hơn vậy s eo là cách để tối ưu trang web giúp nó có thứ hạng cao hơn ở các công cụ tìm kiếm như google bing tụi google sẽ có nhiều tiêu chí để quyết định trang web của bạn có phù hợp với user hay không như là content keyword hình ảnh tốc độ load trang ngôn ngữ do đó khi nói làm s eo nghĩa là bạn làm đủ kiểu để các tiêu chí đó tốt hơn phù hợp với user hơn đường nhiên là theo tiêu chí của tụi google rồi google page speed nó là cái trang này nè page speed insights google build ra một cài tool để đo lường tốc độ website của bạn và cho ra thang điểm từ 0 tới 100 điểm càng cao thì chứng tỏ website của bạn ra dẻ load càng nhanh thường cái này là một tiêu chí mà ai cũng dùng để xem coi website của bạn có đuỷnh hay không mình thì thấy nó cũng tương đối tuy nhiên mọi người lại dựa vào nó quá nhiều để đánh giá một website the fold the fold hiểu là bạn cắt cái trang web theo chiều ngang bên trên the fold là những gì đập vào mặt user ngay lập tức khi họ mở trang web của bạn những gì ở dưới thì người ta phải scroll xuống mới thấy được và vì định nghĩa là những gì đập vào mặt user ngay lập tức nên khái niệm này khá là tương đối vì users có thể dùng device khác nhau to nhỏ khác nhau có thể đập vào mặt ở màn hình mate view 4 k 27 inch với màn hình dell full hd 24 inch nó khác nhau nên do đó the fold ở hai màn hình đó cũng khác nhau tại sao cần phải phân biệt the fold nó giúp bạn tối ưu hơn cho user kiểu như ở trên the fold thì load càng nhanh càng tốt vì nó là thứ xuất hiện ngay lập tức khi user mở website ở dưới the fold thì có thể apply lazy load vì user phải scroll xuống mới thấy được phải không nào c ss critical là một cách để trích xuất những c ss above the fold ra riêng để tối ưu tốc độc load nhớ vụ mình nói ở trên là optimize tối đa cho những thứ above the fold không thì cái này là một cách để tối ưu above the fold tuy idea về việc chỉ inject c ss above the fold ra gắn vào khá là đỉnh nhưng thực tế rất rất khó làm cái này nên mình thấy nghe cho vui thì được c ss in j s cái tên nó lên tất cả viết c ss ở java script mà tại sao lại không viết trong file css nhỉ khi dùng css đồng thời kết hợp với các library hay framework gần đầy thì nó sẽ gặp một vài vấn đề c ss là global trong khi mình muốn component của là isolated và không bị hoặc tạo những style lên các thành phần khác lỡ code j s hết rồi nên thôi code luôn j s hết vì nó viết bằng c ss nên sẽ dễ hơn khi bạn muốn làm một số thứ advance hơn với c ss như c ss extraction critical service worker là một đoạn script chạy ở background nó có thể intercept vào request và response giữa web của bạn và server và làm một vài thứ hay ho khác notification cache sync data vì nó đứng ở giữa nên các bạn tưởng tượng nó như proxy cũng được có thể thay đổi data gửi đi hay data nhận về luôn nên cách dùng của service worker cũng khá là sáng tạo có thể là mock proxy server cache lại response để biến web của các bạn trở thành offline web precache những resource cần thiết một key quan trọng khi nói tới service worker là vì nó chạy dưới background nên bạn có thể làm vài thứ hay ho mà không khiến cho web của các bạn chậm đi web worker trước đây thì web chỉ có một luồng thực thi thôi được gọi là main thread và vì chỉ có một luồng thực thì nên nó đẻ ra một vấn đề khi bạn đang thực hiện một tác vụ task gì đó thì các tương tác khác phải chờ cho task đó chạy xong mới chạy được case thử tế là ví dụ bạn code một trang web tính lương cho nhân viên khi có một task tính toán lương đang chạy ở dưới và nếu nó khá nặng thì lúc này user có click vào đâu thì trang web của các bạn cũng không phản hồi được vì đang bận tính lương chết mọe rồi mà còn bắt tao làm cái khác nữa hả do đó web worker đẻ ra để giải quyết vấn đề trên nói đơn giản là cái gì tính toán nặng thì đẩy ra một thread khác để cái thằng main thread rảnh rỗi còn handle interaction từ user hydration cái từ này hơi hiếm gặp nhưng khác là quan trọng và gặp phải ở hầu hết các lib support s sr hydration là quá trình gắn các event listener và các node tương ứng đã được generate từ quá trình s sr httpsgithubcomthanhlmmblogblobmasterpublicmaterialslazy-hydratemp 4rawtrue mình có một bài viết lan quyên tới cái này ở đây server side rendering với hydration lãng phí tài nguyên như thế nào list virtualization bạn tưởng tượng là cái web của mình là một cuộn giấy siêu dài và mình dang nhìn nò thông qua một cửa sổ nhỏ window nghĩa là mình đang nhìn một phần rất nhỏ trong cuộn giấy đó và để nhìn hết thì các bạn phải scroll list virtualization là kĩ thuật chỉ render cái d om node nằm trong cửa sổ window của bạn các thứ nằm ngoài thì bỏ nó ra khỏi d om luôn để trình duyệt không tốn resource để take care những thứ không quan trọng bạn sẽ thấy cái này rất quan trọng khi apply cho những trang web có list cực kì dài và phức tạp như là new feed của facebook twitter tới đây thấy cũng khá dài rồi kiều càng viết nó càng có thêm á nên mình cũng không biết là còn thiếu gì quan trọng không ngoài ra bạn còn muốn tìm hiểu về thuật ngữ ở mảng nào nữa layout c ss state management comment bên dưới nhé bài viết lan quyên httpsthanhleblogblogfix-loi-force-layout-reflow-anh-huong-toi-performance-frontend httpsthanhleblogblogtuong-lai-cua-frontend httpsthanhleblogblogfrontend-performance-pattern-vi frontend term software all rights reserved báo cáo thêm vào series của tôi',
'editors choice may fest 2024 báo cáo thêm vào series của tôi canva một công cụ thiết kế trực tuyến chắc hẳn bạn đã từng nghe qua hoặc đã từng dùng để tạo ra các design một cách vô cùng nhanh chóng canva được hàng triệu người yêu thích trên toàn cầu không chỉ nổi tiếng với giao diện thân thiện và kho tài nguyên đồ họa khổng lồ mà còn nhờ khả năng cho phép người dùng tự do tải lên các design của riêng họ với hơn 100 triệu người dùng hoạt động hàng tháng và 50 triệu tệp media được tải lên mỗi ngày canva đã nhanh chóng trở thành một trong những nền tảng thiết kế trực tuyến phổ biến nhất thế giới tuy nhiên sự tăng trưởng vượt bậc này cũng đặt ra một thách thức không nhỏ cho đội ngũ kỹ sư của canva đôi khi công ty phát triển nhanh quá cũng khổ mấy ông dev phết làm thế nào để quản lý và lưu trữ khối lượng dữ liệu khổng lồ này một cách hiệu quả đảm bảo trải nghiệm người dùng luôn mượt mà và không bị gián đoạn nhỉ cùng sydexa tìm hiểu cách mà canva giải quyết vấn đề khá khoai này nha bạn cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha và chúng mình có động lực ra những bài viết thú vị hơn nữa chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom kiến trúc hiện tại của canva và vấn đề gặp phải canva được xây dựng trên một kiến trúc microservices linh hoạt nơi mỗi service đảm nhận một vai trò riêng biệt trong đó dịch vụ media đóng vai trò trung tâm quản lý toàn bộ thông tin liên quan đến tài nguyên media của người dùng từ i d chủ sở hữu trạng thái đang hoạt động đã xóa chờ xóa cho đến metadata tiêu đề tác giả từ khóa thông tin màu sắc và đặc biệt là vị trí lưu trữ của tệp tin service media hoạt động như một thủ thư cực kỳ tận tâm liên tục xử lý hàng loạt request đọc và ghi dữ liệu tuy nhiên có một điểm thú vị là lượng yêu cầu đọc vượt xa lượng yêu cầu ghi bởi người dùng thường xuyên tìm kiếm và sử dụng các media có sẵn hơn là chỉnh sửa chúng hầu hết các tệp media ít khi bị thay đổi sau khi được tạo ra ngoại trừ những media nằm trong thư viện ảnh và đồ họa của canva ban đầu canva lựa chọn my sq l trên a ws r ds làm ngôi nhà để lưu trữ kho báu media của mình tuy nhiên khi gia tài media ngày càng đồ sộ với tốc độ tăng trưởng chóng mặt my sq l bắt đầu bộc lộ những hạn chế việc thay đổi cấu trúc schema của các bảng media lớn trở nên chậm chạp có thể mất đến hàng ngày trời giới hạn về tốc độ sao chép của my sq l 56 đã cản trở tốc độ ghi vào các bản sao đọc canva cũng sắp đạt đến giới hạn về kích thước volume e bs của r ds my sq l 16 t b tại thời điểm đó hơn nữa mỗi lần nâng cấp dung lượng lưu trữ lại kéo theo sự gia tăng độ trễ io ảnh hưởng trực tiếp đến tốc độ phản hồi yêu cầu của người dùng việc khởi động lại máy chủ hay nâng cấp phiên bản my sq l cũng gây ra downtime điều tối kỵ đối với một nền tảng trực tuyến như canva các giải pháp tạm thời để khắc phục vấn đề để kéo dài tuổi thọ cho my sq l trong khi tìm kiếm một giải pháp thay thế lâu dài canva đã thực hiện một loạt các biện pháp tạm thời một trong những thay đổi quan trọng là chuyển metadata nội dung sang một cột j so n riêng biệt metadata là phần thông tin mô tả về tệp media thường xuyên được cập nhật và thay đổi việc chuyển metadata sang j so n cho phép canva tự quản lý schema của phần dữ liệu này một cách linh hoạt hơn giảm sự phụ thuộc vào việc thay đổi schema của toàn bộ bảng dữ liệu vốn rất tốn kém về thời gian và tài nguyên tiếp theo canva đã thực hiện phi chuẩn hóa một số bảng denormalized để giảm xung đột khóa lock contention và số lượng phép nối join cần thiết khi thực hiện truy vấn bên cạnh đó canva cũng thực hiện các biện pháp tối ưu hóa khác như loại bỏ các nội dung lặp lại hoặc mã hóa chúng một cách ngắn gọn hơn điều này giúp giảm dung lượng lưu trữ và tăng tốc độ truy vấn canva cũng loại bỏ các ràng buộc khóa ngoại để tăng tốc độ ghi và cập nhật dữ liệu mặc dù điều này có thể làm giảm tính toàn vẹn dữ liệu cuối cùng canva thay đổi cách thức nhập media để giảm số lần cập nhật metadata giúp giảm tải cho hệ thống một giải pháp tạm thời quan trọng khác được canva áp dụng là sharding đây là kỹ thuật chia nhỏ dữ liệu thành nhiều phần và lưu trữ trên nhiều máy chủ khác nhau sharding giúp canva vượt qua giới hạn kích thước tệp bảng 2 t b của hệ thống tệp ext 3 đồng thời tăng tốc độ sao chép và cải thiện hiệu suất cho các truy vấn theo i d vốn là loại truy vấn phổ biến nhất khi tải thiết kế trên canva tuy nhiên sharding cũng có nhược điểm là kém hiệu quả đối với các truy vấn ít phổ biến hơn chẳng hạn như liệt kê tất cả media thuộc sở hữu của một người dùng mặc dù các biện pháp trên đã giúp canva tạm thời giải quyết được những vấn đề cấp bách nhưng về lâu dài họ vẫn cần một giải pháp lưu trữ mới có khả năng mở rộng và đáp ứng tốt hơn nhu cầu ngày càng tăng của người dùng quá trình di chuyển từ my sq l sang dynamo db sau khi xem xét và thử nghiệm nhiều giải pháp khác nhau canva đã chọn dynamo db làm điểm đến cuối cùng cho kho dữ liệu media khổng lồ của mình dynamo db là một cơ sở dữ liệu no sq l được quản lý hoàn toàn bởi a ws nổi tiếng với khả năng mở rộng linh hoạt tính sẵn sàng cao và hiệu suất vượt trội đáp ứng được yêu cầu khắt khe về khả năng mở rộng và tốc độ của canva tuy nhiên quá trình di chuyển dữ liệu từ my sq l sang dynamo db không hề đơn giản canva phải đối mặt với hai yêu cầu quan trọng không được gây ảnh hưởng đến trải nghiệm người dùng và thực hiện chuyển đổi mà không có bất kỳ downtime nào để đảm bảo tính liên tục của dịch vụ canva đã triển khai một chiến lược di chuyển vô cùng tỉ mỉ và thận trọng canva cần di chuyển tất cả các dữ liệu cũ các dữ liệu mới được tạo và các dữ liệu mới được cập nhật sang dynamo d b đầu tiên canva sử dụng hàng đợi s qs của a ws để gửi các thông báo về việc một tập tin media cụ thể đã được tạo cập nhật hoặc đọc nhưng không chứa nội dung của bản cập nhật một worker instance sẽ xử lý các thông báo này để đọc trạng thái hiện tại từ cơ sở dữ liệu my sq l chính và cập nhật dynamo db các bản ghi mới được tạo cập nhật hoặc được đọc gần đây sẽ được ưu tiên sao chép sang dynamo db trước cách tiếp cận này đảm bảo rằng những dữ liệu được sử dụng thường xuyên nhất sẽ có sẵn trên dynamo db giúp giảm thiểu độ trễ và cải thiện trải nghiệm người dùng giảm tải cho cụm my sq l ghi dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db các thông báo về việc tạo mới hoặc cập nhật media được đặt vào hàng đợi ưu tiên cao trong khi các thông báo về việc đọc media được đặt vào hàng đợi ưu tiên thấp điều này đảm bảo rằng các worker instance sẽ tập trung vào việc xử lý các thông báo ghi trước để dữ liệu mới được cập nhật nhanh chóng trên tất cả các bản sao của dynamo db sau khi đã xử lý hết các thông báo ghi chúng mới chuyển sang xử lý các thông báo đọc điều này giúp cho đảm bảo có thể phục vụ các yêu cầu đọc có tính nhất quán cuối cùng eventually consistent từ dynamo db đọc dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db tiếp theo canva thực hiện một quá trình quét và sao chép dần dần để chuyển toàn bộ dữ liệu còn lại sang dynamo db quá trình này được thực hiện một cách cẩn thận và kiểm soát để không ảnh hưởng đến hoạt động của hệ thống quá trình quyét dữ liệu để di chuyển những media còn lại sang dynamo db canva sẽ quét qua tất cả các media bắt đầu từ những media được tạo gần đây và gửi một thông báo qua message queue có độ ưu tiên thấp để worker thực hiện sao chép qua dynamo db quá trình kiểm tra để đảm bảo tính toàn vẹn của dữ liệu trong quá trình di chuyển canva đã thực hiện nhiều biện pháp kiểm tra nghiêm ngặt trước khi chuyển hoàn toàn sang đọc từ dynamo db canva đã thực hiện kiểm tra so sánh kết quả từ cả hai hệ thống my sq l và dynamo db bất kỳ sự không nhất quán nào được phát hiện sẽ được điều tra và sửa chữa ngay lập tức ngoài ra canva cũng sử dụng my sq l như một phương án dự phòng fallback trong giai đoạn đầu của quá trình chuyển đổi điều này đảm bảo rằng nếu có bất kỳ vấn đề nào xảy ra với dynamo db hệ thống vẫn có thể hoạt động bình thường bằng cách đọc dữ liệu từ my sq l nhờ sự kết hợp của các biện pháp này canva đã thực hiện thành công việc di chuyển dữ liệu sang dynamo db một cách an toàn và không gây gián đoạn cho người dùng việc chuyển đổi sang dynamo db đã mang lại những kết quả vượt ngoài mong đợi cho canva độ trễ của dịch vụ media giảm đáng kể giúp cải thiện tốc độ tải và trải nghiệm người dùng khả năng mở rộng của dynamo db cũng được thể hiện rõ rệt khi số lượng người dùng hoạt động hàng tháng của canva tăng gấp ba lần kể từ khi chuyển đổi và dynamo db vẫn hoạt động ổn định tự động mở rộng quy mô để đáp ứng nhu cầu ngày càng tăng không chỉ vậy chi phí vận hành dynamo db còn thấp hơn so với cụm a ws r ds trước đây mang lại hiệu quả kinh tế đáng kể cho canva tuy nhiên quá trình chuyển đổi này cũng mang đến những bài học quý giá cho đội ngũ kỹ sư của canva họ nhận ra tầm quan trọng của việc hiểu rõ đặc điểm truy cập dữ liệu để ưu tiên di chuyển những dữ liệu được sử dụng thường xuyên nhất bên cạnh đó việc kiểm tra và thử nghiệm trong môi trường production cũng được coi là rất cần thiết để đảm bảo tính ổn định của hệ thống sau khi chuyển đổi mặc dù dynamo db không có những tính năng tiện lợi như thay đổi schema dễ dàng hay hỗ trợ truy vấn s ql ad-hoc những lợi ích về khả năng mở rộng và hiệu suất đã bù đắp cho những hạn chế này hành trình chuyển đổi từ my sq l sang dynamo db đã đánh dấu một cột mốc quan trọng trong quá trình phát triển của canva không chỉ giải quyết triệt để bài toán lưu trữ media canva còn chứng minh được khả năng thích ứng và vượt qua những thách thức về công nghệ để đáp ứng nhu cầu ngày càng tăng của người dùng với dynamo db canva đã xây dựng một hệ thống lưu trữ media mạnh mẽ và linh hoạt đủ sức chứa hơn 25 tỷ file media do người dùng tải lên và sẵn sàng đón nhận thêm 50 triệu file mới mỗi ngày thành công này không chỉ khẳng định vị thế của canva là một trong những nền tảng thiết kế trực tuyến hàng đầu thế giới mà còn mở ra những cơ hội phát triển mới trong tương lai nếu thấy bài viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha lời nhắn chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom bạn có thể tìm hiểu thêm chia sẻ từ chính canva httpswwwcanvadevblogengineeringfrom-zero-to-50-million-uploads-per-day-scaling-media-at-canva dynamo db httpsdocsawsamazoncomamazondynamodblatestdeveloperguideintroductionhtml eventual consistency httpswwwscylladbcomglossaryeventual-consistency s qs httpsawsamazoncomsqs system design dynamodb microservices canva coding all rights reserved báo cáo thêm vào series của tôi',
'báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 10 năm 1 agile là gì agile là một triết lí philosophy cho việc phát triển phần mềm nói cách khác đó là một cách tư duy về các dự án phần mềm các triết lí của agile được cụ thể hóa bởi một số phương pháp phát triển phần mềm method chẳng hạn như extreme programming x p hay scrum gọi tắt là các phương pháp agile mỗi phương pháp agile bao gồm một tập hợp các quy tắc pratice chẳng hạn quy tắc về sử dụng công cụ quản lí mã nguồn quy tắc về các chuẩn lập trình hay quy tắc chuyển giao sản phẩm hàng tuần cho khách hàng triết lí agile được đưa ra trong một bản tuyên ngôn manifesto gồm 4 tiêu chí vàđược làm rõ hơn bởi 12 quy tắc a 4 tiêu chí của agile cá nhân và các tương tác quan trọng hơn các quy trình và công cụ tập trung làm cho phần mềm chạy được hơn là viết các tài liệu mô tả cộng tác với khách hàng hơn là chỉ dựa trên hợp đồng phản ứng với các thay đổi hơn là chỉ tuân theo một kế hoạch định sẵn b 12 quy tắc trong agile thỏa mãn yêu cầu của khách hàng thông qua việc giao hàng sớm và liên tục chào đón việc thay đổi yêu cầu thậm chí là những thay đổi yêu cầu muộn giao phần mềm chạy được cho khách hàng một cách thường xuyên giao hàng tuần hơn là hàng tháng nhà kinh doanh và kỹ sư lập trình phải làm việc cùng nhau hàng ngày trong suốt dựán các dựán được xây dựng xung quanh những cá nhân cóđộng lực cung cấp cho họ môi trường và sự hỗ trợ cần thiết và tin tưởng họ để hoàn thành công việc trao đổi trực tiếp mặt đối mặt là phương pháp hiệu quả nhất để truyền đạt thông tin phần mềm chạy được là thước đo chính của tiến độ phát triển bền vững và duy trì được nhịp độ phát triển liên tục liên tục quan tâm đến kĩ thuật và thiết kế để cải tiến sự linh hoạt sự đơn giản là cần thiết nghệ thuật tối đa hóa lượng công việc chưa hoàn thành nhóm tự tổ chức thích ứng thường xuyên với sự thay đổi 2 quy trình kiểm thử phần mềm trong mô hình agile kiểm thử testing trong dự án agile yêu cầu một sự dịch chuyển mô thức paradigm shift cho vai trò kiểm thử truyền thống nó đòi hỏi một sự thay đổi trong thái độ của kiểm thử viên tester từ một phương pháp tiếp cận theo định hướng ca kíp thành một vai trò được tham gia sâu vào quy trình phát triển từ sớm cách tiếp cận agile tập trung vào việc nhận được những điều đúng đắn ngay từ đầu làm giảm sự cần thiết phải có nhiều kiểm thử viên đảm bảo chất lượng q a tester ở cuối quy trình để đạt được kết quả vai trò kiểm thử viên q a trong agile không bị giới hạn một tập hợp các quy trình được xác định trước cũng như phương pháp luận sẽ chỉ ra vai trò dựa trên tình huống cụ thể a các giai đoạn kiểm thử phần mềm tương ứng với các giai đoạn phát triển phần mềm trong mô hình agile tiền-phân-đoạn pre-iteration đây là giai đoạn yêu cầu được phân tích chi tiết bởi b a business analyst chuyên viên phân tích nghiệp vụ và các tiêu chí chấp nhận acceptance criteria được viết ra cho mỗi một story user story và q a là những người sử dụng các yêu cầu này ngay từ đầu ta cần phải xác minh verify những yêu cầu đó từ sớm và thường xuyên xác minh story xác minh yêu cầu kiểm thử agile thiên về việc đưa ra phản hồi sớm không chỉ bằng cách kiểm tra các yêu cầu mà còn là phải làm việc đó từ sớm các q a tester cần phải xem xét các yêu cầu story từ sớm để làm sáng rõý nghĩa và tính khả-kiểm testability việc này sẽđảm bảo các yêu cầu luôn rõ ràng và có thể kiểm thửđược yêu cầu cần đủ nhỏ để có ý nghĩa trong bối cảnh xác định tiêu chí chấp nhận acceptance criteria - những story thường được sử dụng cho các tiêu chí chấp nhận không nên bị trùng lặp chồng chéo từ những story khác nhau để hiểu rõ hơn về giai đoạn này chúng ta cùng tìm hiểu những phần sau user story là một tóm tắt đơn giản ngắn gọn về chức năng mà khách hàng mong muốn nó thường được viết theo mẫu sau với tôi muốn vì ví dụ với vai trò là người dùng website tôi muốn có một chức năng tìm kiếm nâng cao để có thể tìm kiếm nhanh chóng và dễ dàng những quyển sách tôi cần tiêu chí chấp nhận acceptance criteria là những tiêu chí dùng để đánh giá sản phẩm chức năng đã thực hiện đúng yêu cầu hay chưa có thể coi đó là các tiêu chí xác nhận hoàn thành story các tiêu chí đặt ra phải đáp ứng các đặc tính sau tính khả dụng usability là tiêu chí trả lời cho câu hỏi có dễ sử dụng hay không là chìa khóa đưa ra các tiêu chí đánh giá có thể xác định tính chức năng functionality xử lý lỗi error handing liệt kê ra những lỗi có thể gặp phải trong quá trình sử dụng chương trình và phương thức để xử lý ví dụ người dùng có thể thực hiện sai thứ tự các bước và khi đó chương trình sẽ xử lý như thế nào hiệu suất performance stress tests là tiêu chí trả lời cho câu hỏi hệ thống sẽ hoạt động như thế nào dưới những áp lực như có nhiều người truy cập tại cùng 1 thời điểm có quá nhiều request được gửi đến hệ thống ví dụ với story như trên ta có các tiêu chí chấp nhận như sau tôi có thể giới hạn tìm kiếm theo định dạng loại tôi có thể tìm kiếm theo phạm vi ngày tôi có thể giới hạn tìm kiếm thông tin nhà xuất bản như tiêu đề tác giả chủ đề địa điểm nhà xuất bản và số lượng xuất bản tôi có thể giới hạn tìm kiếm bởi một tiêu chí cụ thể như danh mục bộ sưu tập tôi có thể lọc filter để đạt được mục tiêu của giai đoạn này cần có sự giao tiếp chặt chẽ giữa các bên đội phát triển nhà phân tích nghiệp vụ đảm bảo chất lượng khả kiểm testable các khía cạnh có thể kiểm thửđược của story phải được xem xét chi tiết để có thể kiểm thửđược story đó những yếu tố này thường là tìm kiếm các yêu cầu ẩn môi trường dữ liệu kiểm thử test data sự phụ thuộc vào các yêu cầu khác việc có được các chi tiết này sớm sẽ giúp câu chuyện được ưu tiên đúng đắn hơn trong backlog và cho phép việc thực hiện story đó suôn sẻ hơn trong phân đoạn iteration q a tester cũng tham gia cuộc họp lập kế hoạch cho phân đoạn để cung cấp quan điểm kiểm thửđể nhóm có thểđưa ra được ước lượng phát triển tham gia trong việc lập kế hoạch phân đoạn đóng vai trò quan trọng khi một số các yêu cầu tiềm ẩn thường được phát hiện bởi các q a tester b các hoạt động đảm bảo chất lượng trong phân đoạn môt khi q a tester đã thấy thoải mái với các tiêu chí chấp nhận của một story nào đó họ có thể giúp nhóm định nghĩa các kiểm thử chấp nhận acceptance tests cho story đó kiểm thử chấp nhận là các yêu cầu về phương diện kiểm thử cần được thực hiện để hiểu các yêu cầu phần mềm các kiểm thử chấp nhận này được sinh ra tự động và dùng để hướng dẫn quá trình phát triển các kiểm thử chấp nhận không nên bao gồm tất tần tật các tình huống case scenarios do điều này có thể tạo ra những sự ngưng trệ không cần thiết và có thể tạo ra quá nhiều bộ kiểm thử tự động automated test tương tự nhau kiểm thử chấp nhận trong các dự án agile là khác biệt so với các dự án truyền thống không giống như các dự án truyền thống nơi kiểm thử chấp nhận xảy ra ở phần cuối của vòng đời phần mềm trong dự án agile kiểm thử chấp nhận được thực hiện trước khi phần mềm được chuyển giao kiểm thử chấp nhận cũng có xu hướng được tự động hóa để họ có thể chạy như là kiểm thử hồi quy regression test kiểm thử tự động rất quan trọng đối với mọi dựán agile các bản build thường xuyên yêu cầu các chu kỳ phản hồi ngắn do đó kiểm thử hồi quy phải nhanh chóng và chính xác ví dụ trở lại với ví dụ ở phần mở đầu khi khách hàng yêu cầu thực hiện tìm kiếm sách theo nhiều tiêu chí trong trường hợp các tiêu chí tìm kiếm được chia nhỏ ra để thực hiện như sau sprint 1 phát triển chức năng tìm kiếm theo tên sách và thể loại sprint 2 phát triển chức năng tìm kiếm theo tác giả và nhà xuất bản sprint 3 phát triển chức năng tìm kiếm theo ngày phát hành tình trạng sách như vậy khi kiểm thử chấp nhận chức năng tìm kiếm ở sprint 2 chúng ta sẽ phải kết hợp việc kiểm thử lại chức năng tìm kiếm theo các tiêu chíở sprint 1 nếu không có các công cụ kiểm thử tựđộng hỗ trợ cho việc kiểm thử lại các chức năng ở sprint 1 thì người thực hiện kiểm thử sẽ mất thêm thời gian cho việc kiểm thử lại sprint 1 trong các dựán agile kiểm thử tựđộng được thực hiện bởi tất cả các cấp độ - lập trình viên kiểm thử viên bảo đảm chất lượngq a tester và các nhà phân tích nghiệp vụ b a sự tham gia của tất cả mọi người làm gia tăng tính xác đáng của các phần kiểm thử và thường giúp xác định đúng các phần kiểm thử tuy nhiên điều này không có nghĩa là tất cả mọi người phải đều phải viết mã kiểm thử 3 sử dụng tự động hóa có mục đích tự động hóa đồng nghĩa với việc cung cấp thông tin phản hồi sớm về những mã nguồn được tạo ra và điều quan trọng là phải xác định những gì cần tự động hoá và những gì thì không tất cả các kiểm thử tự động đều mất chi phí chi phí của tự động hóa nên được so sánh với chi phí khi không thực hiện việc đó một chu kỳ phản hồi dài hơn đồng nghĩa với việc phải có nhiều người đóng góp nhiều thời gian hơn mới có được phản hồi tức thì một hoạt động bảo đảm chất lượng điển hình trong phân đoạn là việc liên tục đo lường chất lượng của phần mềm q a tester tham gia vào việc bàn giao các story cho các nhà phát triển điều này giúp họ hiểu được những yêu cầu kiểm thử của story để họ có thể triển khai được kĩ thuật phát triển định-hướng-kiểm-thử test-driven development - t dd ngoài ra việc bàn giao các kiểm thử chấp nhận và giúp cho các lập trình viên hiểu các khía cạnh khả kiểm testability của story để tránh được các lỗi defect phổ biến những hoạt động này đòi hỏi một mức độ cao của giao tiếp giữa các lập trình viên và các chuyên viên phân tích nghiệp vụđể làm rõ yêu cầu vàđảm bảo sản phẩm được xây dựng đúng đắn ngay từ đầu q a tester có thể giúp giải quyết các vấn đề trước hết bằng cách tích cực tham gia vào quy trình tổng thể ta thậm chí có thể kết hợp với các nhà phát triển làm việc trên một story hoặc các kiểm thử cho story để thể hiểu rõ hơn về các yêu cầu điều bắt buộc là một story khi được chuyển giao nó phải được kiểm thử đúng cách trong một môi trường thích hợp một khi các q a tester hài lòng với những story họ sẽ đưa nó vào các tiến trình kiểm thử tiếp theo một điều quan trọng khác là phải suy nghĩ vượt ra ngoài các yêu cầu bằng văn bản và thử nghiệm với các kiểm thử thăm dò exploratory testing để thực hiện kịch bản ngoài lề và thực hiện các kiểm thử tiêu cực đểđảm bảo chắc chắn phần mềm được viết ra là chất lượng kiểm thử thăm dò không phải là thực thi tất cả các kịch bản kiểm thửđược xác định trước nó là nghệ thuật thăm dò phần mềm ngoài các trường hợp kiểm thử test case vàđồng thời giữ tập trung xung quanh các yêu cầu cụ thể nguồn tham khảo httpwwwlogigearcommagazineagilea-testers-perspective-on-agile-projects httpagilemanifestoorg httpwwwmountaingoatsoftwarecomagile agile q a all rights reserved báo cáo thêm vào series của tôi',
]
query_embeddings = model.encode_query(queries)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# [1, 768] [3, 768]
# Get the similarity scores for the embeddings
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
# tensor([[ 0.4969, -0.0312, -0.0005]])
query, positive, and negative| query | positive | negative | |
|---|---|---|---|
| type | string | string | string |
| details |
|
|
|
| query | positive | negative |
|---|---|---|
d b m ig ra ti on f or g ol an g s er vi ce s w hy i t m at te rs - viblo |
báo cáo thêm vào series của tôi d b migration why it matters have you ever faced the situations when you deploy new update on production with updated database schemas but got bugs after that and need to revert things thats when migration comes into place database migration serves several key purposes schema evolution as applications evolve their data models change migrations allow developers to systematically update the database schema to reflect these changes ensuring that the database structure matches the application code version control migrations provide a way to version the database schema allowing teams to track changes over time this versioning helps in understanding the evolution of the database and aids in collaboration among developers consistency across environments migrations ensure that the database schema is consistent across different environments development testing production this reduces the risk of discrepancies that can lead to bugs and integration issues rollback ... |
báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm 37 doubly linked lists ưu điểm của doubly linked list - danh sách liên kết kép còn được gọi là danh sách liên kết hai chiều là với một nút trong danh sách chúng ta có thể điều hướng theo cả hai hướng không thể xóa một nút trong singly linked list trừ khi chúng ta có con trỏ tới nút phía trước của nó nhưng trong danh sách được liên kết kép chúng ta có thể xóa một nút ngay cả khi chúng ta không có địa chỉ của nút trước đó vì mỗi nút có một con trỏ bên trái trỏ đến nút trước đó và có thể di chuyển ngược lại những nhược điểm chính của danh sách được liên kết kép là mỗi nút yêu cầu thêm một con trỏ đòi hỏi nhiều không gian bộ nhớ hơn việc chèn hoặc xóa một nút mất nhiều thời gian hơn nhiều thao tác tới con trỏ hơn tương tự như một danh sách được liên kết đơn chúng ta triển khai các hoạt động của một danh sách được liên kết kép nếu bạn hiểu các thao tác danh sách liên kết đơn thì các thao tác danh sách liên kết k... |
example |
báo cáo thêm vào series của tôi as a beginner programmer you may have heard of the term sorting algorithms but have no idea what they are or how they work well fear not in this article well be diving into one of the most basic sorting algorithms out there bubble sort but before we get into the nitty-gritty of how bubble sort works lets first define what it is simply put bubble sort is an algorithm that compares adjacent elements in an array and swaps their positions if they are not in the correct order it continues to do this until the array is fully sorted now that we have a basic understanding of bubble sort lets take a look at how it works with an example lets say we have an array of numbers that we want to sort from least to greatest 5 2 1 4 3 using bubble sort we would first compare the first two elements 5 and 2 since 5 is greater than 2 we would swap their positions the array would now look like this 2 5 1 4 3 next we would compare the second and third elements 5 and 1 since 5 i... |
happy new year báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 4 năm rất chào các bạn như các bạn đã biết trong kỉ nguyên công nghệ song song với sự sinh ra dày đặc của các trang web mới cũng là sự biến mất của những trang web lạc hậu hay hoạt động kém hiệu quả một trang web hấp dẫn người dùng luôn có cách cung cấp nội dung hiệu quả sáng tạo dễ dàng nắm bắt và các bức ảnh chất lượng thú vị là cách tốt nhất để thực hiện điều đó nhưng rồi một ngày đẹp trời bạn bạn nhận ra trang web tuyệt đẹp của mình lại gây thất vọng với người dùng bởi tốc độ tải trang chậm hơn cả cụ rùa khiến họ ngán ngẩm thoát ra vì thế hôm nay tôi sẽ chỉ cho các bạn 8 kỹ thuật tối ưu hóa không chỉ giúp bạn giảm băng thông tải mà còn giảm cả việc hao tốn c pu để hiển thị bất kì bức ảnh nào trên ứng dụng web của mình chúng ta vào việc ngay thôi trước hết tôi sẽ đặt ngay ở đây một đoạn code tổng hợp hầu hết các kỹ thuật tôi sắp nói giúp hiển thị một bức ảnh chuẩn không cần chỉnh oke con dê nhé ... |
bài 33 - tạo multiple borders cho 1 element |
báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 6 năm chào các bạn đã bao giờ các bạn phải tạo 1 box mà có nhiều border chưa thực ra vấn đề này không khó bạn có thể dùng phương pháp truyền thống đó là tạo nhiều element con bên trong rồi thêm border cho các element đó như vậy có nghĩa là 1 box có bao nhiều border thì cần tạo bấy nhiều element con phương pháp này không sai tuy nhiên nó hơi lạm dụng việc tạo element con tốn dung lượng tốn bộ nhớ và có khi làm ảnh hưởng tới performance có 1 cách cực kỳ đơn giản mà bạn chỉ cần 1 sử dụng duy nhất 1 element nhưng vẫn có thể tạo ra nhiều border cho element đó tạo như thế nào thì hiện tại cùng mình đi vào chi tiết nhé 1 sử dụng pseudo elements ở đây không biết có bạn nào còn chưa hiểu về khái niệm pseudo element hoặc pseudo class không nếu chưa hiểu thì hãy comment bên dưới để bài sau mình viết bài về 2 khái niệm này nhé trước tiên tạm bỏ qua khái niệm và cùng đi vào cách sử dụng nó coi sao các bạn có thể sử dụng pseud... |
báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 6 năm h tt p là một điều kì diệu của internet một giao thức đã tồn tại hơn 20 năm qua và vẫn đang tiếp tục phát triển ở bài viết trước chúng ta đã biết trình duyệt tương tác với các ứng dụng web qua giao thức h tt p trong bài viết lần này chúng ta sẽ đi tìm hiểu về giao thức này trong thực tế nếu người dùng nhập một thông tin nhạy cảm như thông tin thẻ tín dụng khi sử dụng một trang web và kẻ tấn công có thể chặn bắt được dữ liệu này trước khi nó tới server thì tất nhiên là ứng dụng chúng ta nát bét rồi hiểu cách h tt p hoạt động các đặc điểm của giao thức này và các biện pháp giúp bảo mật kết nối giữa client và server sẽ giúp chúng ta cài đặt một ứng dụng web bảo mật và an toàn hơn một điều lưu ý là những khái niệm ý tưởng cơ bản đằng sau giao thức h tt p không thay đổi nhiều nhưng cách thiết kế để client và server có thể giao tiếp với nhau lại liên tục được cải tiến từ năm này qua năm khác nếu bạn nhìn vào một ... |
MultipleNegativesRankingLoss with these parameters:{
"scale": 20.0,
"similarity_fct": "cos_sim",
"gather_across_devices": false
}
per_device_train_batch_size: 16warmup_steps: 100fp16: Trueoverwrite_output_dir: Falsedo_predict: Falseeval_strategy: noprediction_loss_only: Trueper_device_train_batch_size: 16per_device_eval_batch_size: 8per_gpu_train_batch_size: Noneper_gpu_eval_batch_size: Nonegradient_accumulation_steps: 1eval_accumulation_steps: Nonetorch_empty_cache_steps: Nonelearning_rate: 5e-05weight_decay: 0.0adam_beta1: 0.9adam_beta2: 0.999adam_epsilon: 1e-08max_grad_norm: 1.0num_train_epochs: 3max_steps: -1lr_scheduler_type: linearlr_scheduler_kwargs: {}warmup_ratio: 0.0warmup_steps: 100log_level: passivelog_level_replica: warninglog_on_each_node: Truelogging_nan_inf_filter: Truesave_safetensors: Truesave_on_each_node: Falsesave_only_model: Falserestore_callback_states_from_checkpoint: Falseno_cuda: Falseuse_cpu: Falseuse_mps_device: Falseseed: 42data_seed: Nonejit_mode_eval: Falseuse_ipex: Falsebf16: Falsefp16: Truefp16_opt_level: O1half_precision_backend: autobf16_full_eval: Falsefp16_full_eval: Falsetf32: Nonelocal_rank: 0ddp_backend: Nonetpu_num_cores: Nonetpu_metrics_debug: Falsedebug: []dataloader_drop_last: Falsedataloader_num_workers: 0dataloader_prefetch_factor: Nonepast_index: -1disable_tqdm: Falseremove_unused_columns: Truelabel_names: Noneload_best_model_at_end: Falseignore_data_skip: Falsefsdp: []fsdp_min_num_params: 0fsdp_config: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}fsdp_transformer_layer_cls_to_wrap: Noneaccelerator_config: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}deepspeed: Nonelabel_smoothing_factor: 0.0optim: adamw_torchoptim_args: Noneadafactor: Falsegroup_by_length: Falselength_column_name: lengthddp_find_unused_parameters: Noneddp_bucket_cap_mb: Noneddp_broadcast_buffers: Falsedataloader_pin_memory: Truedataloader_persistent_workers: Falseskip_memory_metrics: Trueuse_legacy_prediction_loop: Falsepush_to_hub: Falseresume_from_checkpoint: Nonehub_model_id: Nonehub_strategy: every_savehub_private_repo: Nonehub_always_push: Falsehub_revision: Nonegradient_checkpointing: Falsegradient_checkpointing_kwargs: Noneinclude_inputs_for_metrics: Falseinclude_for_metrics: []eval_do_concat_batches: Truefp16_backend: autopush_to_hub_model_id: Nonepush_to_hub_organization: Nonemp_parameters: auto_find_batch_size: Falsefull_determinism: Falsetorchdynamo: Noneray_scope: lastddp_timeout: 1800torch_compile: Falsetorch_compile_backend: Nonetorch_compile_mode: Noneinclude_tokens_per_second: Falseinclude_num_input_tokens_seen: Falseneftune_noise_alpha: Noneoptim_target_modules: Nonebatch_eval_metrics: Falseeval_on_start: Falseuse_liger_kernel: Falseliger_kernel_config: Noneeval_use_gather_object: Falseaverage_tokens_across_devices: Falseprompts: Nonebatch_sampler: batch_samplermulti_dataset_batch_sampler: proportionalrouter_mapping: {}learning_rate_mapping: {}| Epoch | Step | Training Loss |
|---|---|---|
| 1.3055 | 500 | 0.9762 |
| 2.6110 | 1000 | 0.3251 |
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084",
}
@misc{henderson2017efficient,
title={Efficient Natural Language Response Suggestion for Smart Reply},
author={Matthew Henderson and Rami Al-Rfou and Brian Strope and Yun-hsuan Sung and Laszlo Lukacs and Ruiqi Guo and Sanjiv Kumar and Balint Miklos and Ray Kurzweil},
year={2017},
eprint={1705.00652},
archivePrefix={arXiv},
primaryClass={cs.CL}
}
Base model
keepitreal/vietnamese-sbert