--- tags: - sentence-transformers - sentence-similarity - feature-extraction - dense - generated_from_trainer - dataset_size:6120 - loss:MultipleNegativesRankingLoss base_model: keepitreal/vietnamese-sbert widget: - source_sentence: giới thiệu sentences: - 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 - source_sentence: mount trong docker sentences: - báo cáo thêm vào series của tôi bất kể quy mô ngành nghề hay công ty nào phân tích nghiệp vụ và quản lý sản phẩm là hai thành phần thiết yếu chúng đóng vai trò quan trọng trong việc giúp các doanh nghiệp mở rộng duy trì tính cạnh tranh và hoàn thành các mục tiêu của mình bài đăng này sẽ mô tả phân tích nghiệp vụ và quản lý sản phẩm xem xét mối quan hệ giữa chúng và nêu bật sáu cách chúng bổ sung cho nhau 1 phân tích nghiệp vụ là gì quá trình xác định các yêu cầu vấn đề và cơ hội kinh doanh và đưa ra giải pháp để giải quyết chúng được gọi là phân tích nghiệp vụ để tìm hiểu về nhu cầu của các bên liên quan và thu thập dữ liệu về hoạt động hệ thống và quy trình kinh doanh các nhà phân tích nghiệp vụ phải cộng tác chặt chẽ với họ họ sử dụng dữ liệu này để tạo ra các kế hoạch và giải pháp bổ sung cho các mục tiêu của công ty 2 quản lý sản phẩm là gì quản lý sản phẩm là quá trình tổ chức tạo ra và giám sát một sản phẩm hoặc dịch vụ từ khi hình thành đến khi ra mắt và hơn thế nữa người quản lý sản phẩm chịu trách nhiệm xác định nhu cầu của khách hàng chỉ định các tính năng của sản phẩm phát triển lộ trình và đảm bảo sản phẩm được giao đúng tiến độ trong ngân sách và làm hài lòng khách hàng 3 mối quan hệ giữa phân tích nghiệp vụ vàquản lý sản phẩm quản lý sản phẩm và phân tích nghiệp vụ là hai trách nhiệm riêng biệt nhưng có mối liên hệ với nhau sự thành công của bất kỳ sản phẩm hoặc dịch vụ nào đều phụ thuộc vào sự cộng tác giữa phân tích nghiệp vụ và quản lý sản phẩm mục tiêu của phân tích nghiệp vụ là xác định các cơ hội thách thức và nhu cầu trong thế giới kinh doanh và sau đó đề xuất giải pháp mặt khác quản lý sản phẩm tập trung vào việc tổ chức tạo ra và giám sát hàng hóa hoặc dịch vụ từ khi hình thành đến ra mắt và hơn thế nữa bất chấp sự khác biệt những vai trò này có liên quan chặt chẽ với nhau và có nhiều mục tiêu chung việc xác định nhu cầu của người tiêu dùng là một trong những lĩnh vực chính mà phân tích nghiệp vụ và quản lý sản phẩm giao nhau để hiểu nhu cầu và sở thích của khách hàng các nhà phân tích nghiệp vụ thu thập phản hồi từ các bên liên quan tiến hành nghiên cứu thị trường và phân tích dữ liệu họ sử dụng dữ liệu này để phát hiện những khoảng trống thị trường cho các tính năng hoặc hàng hóa mới cũng như đề xuất các giải pháp khắc phục khiếu nại của khách hàng các nhà phân tích nghiệp vụ đóng một vai trò quan trọng trong việc giúp các nhà quản lý sản phẩm hiểu rõ hơn về thị trường môi trường cạnh tranh và nhu cầu của khách hàng họ sử dụng dữ liệu này để đưa ra những lựa chọn sáng suốt về tính năng giá thành và định vị sản phẩm của mình người quản lý sản phẩm và nhà phân tích nghiệp vụ có thể cộng tác để tạo ra các sản phẩm có khả năng cạnh tranh trên thị trường và đáp ứng mong đợi của người tiêu dùng 4 6 cách người quản lý sản phẩm và phân tích nghiệp vụ phối hợp với nhau 41 xác định yêu cầu để xác định và ghi lại nhu cầu về các tính năng hoặc sản phẩm mới các nhà phân tích nghiệp vụ hợp tác chặt chẽ với người quản lý sản phẩm họ làm việc cùng nhau để đảm bảo rằng sản phẩm đáp ứng yêu cầu của các bên liên quan khách hàng và công ty để thu thập yêu cầu và tạo ra câu chuyện của người dùng họ sử dụng nhiều phương pháp khác nhau bao gồm hội thảo bảng câu hỏi và phỏng vấn các bên liên quan sử dụng dữ liệu này người quản lý sản phẩm tạo ra lộ trình sản phẩm nêu chi tiết các tính năng lịch trình và mục tiêu cho dự án 42 nghiên cứu thị trường để hiểu mong muốn và sở thích của khách hàng phát hiện xu hướng và đánh giá môi trường cạnh tranh các nhà phân tích nghiệp vụ thực hiện nghiên cứu thị trường người quản lý sản phẩm sử dụng dữ liệu này để đưa ra những lựa chọn sáng suốt về tính năng giá thành và định vị sản phẩm của họ 43 lập kế hoạch lộ trình người quản lý sản phẩm phác thảo lộ trình phát triển sản phẩm của họ dựa trên dữ liệu mà các nhà phân tích nghiệp vụ đã thu thập được lộ trình đóng vai trò là kim chỉ nam cho nhóm phát triển và mô tả các tính năng tiến độ và các mốc quan trọng của dự án 44 kiểm tra sự chấp nhận của người dùng các nhà phân tích nghiệp vụ giúp phát triển các trường hợp thử nghiệm và tiêu chuẩn chấp nhận cho các tính năng hoặc sản phẩm mới trước khi phát hành sản phẩm người quản lý sản phẩm cộng tác chặt chẽ với nhóm phát triển và nhà phân tích nghiệp vụ để đảm bảo sản phẩm đáp ứng các tiêu chí chấp nhận 45 quản lý các bên liên quan các nhà phân tích nghiệp vụ và quản lý sản phẩm cộng tác để kiểm soát kỳ vọng từ các bên liên quan đảm bảo sản phẩm phù hợp với mục tiêu và mục tiêu của công ty đồng thời cập nhật cho các bên liên quan về sự phát triển 46 cải tiến liên tục bằng cách thu thập ý kiến đầu vào từ người dùng các bên liên quan và nhóm phát triển các nhà phân tích nghiệp vụ và quản lý sản phẩm sẽ cộng tác để liên tục cải tiến sản phẩm họ ưu tiên những thay đổi tìm ra những lĩnh vực cần cải thiện và cập nhật lộ trình bằng cách sử dụng thông tin đầu vào mà họ nhận được tóm lại quản lý sản phẩm và phân tích nghiệp vụ đóng vai trò quan trọng trong việc đảm bảo doanh nghiệp tạo ra hàng hóa làm hài lòng khách hàng có tính cạnh tranh và hỗ trợ việc mở rộng công ty người quản lý sản phẩm và nhà phân tích nghiệp vụ có thể làm việc cùng nhau để phát triển các sản phẩm đáp ứng nhu cầu của các bên liên quan người tiêu dùng và công ty bằng cách cộng tác và trao đổi thông tin hy vọng rằng những chia sẻ của b ac sẽ giúp ích cho bạn đừng quên đón đọc các bài viết mới nhất được cập nhật tại b acs blog bạn nhé nguồn tham khảo httpswwwbusinessanalysisschoolcom business analyst kiến thức nghiệp vụ phân tích dữ liệu 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 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 capability many migration tools support rolling back changes allowing developers to revert to a previous state of the database if a migration causes issues this enhances stability during the development and deployment process automated deployment migrations can be automated as part of the deployment process ensuring that the necessary schema changes are applied to the database without manual intervention this streamlines the release process and reduces human error applying in golang projects to create a comprehensive production-grade setup for a golang service using g or m with my sq l to get a quick setup that allows for easy migrations updates and rollbacks you need to include migration tooling handle database connection pooling and ensure proper struct definitions heres a complete example to guide you through the process project structure golang - service -- maingo -- database -- migrationgo -- models -- usergo -- config -- configgo -- migrations -- -- gomod 1 database configuration configconfiggo package config import fmt log os time githubcomjohogodotenv gormiodrivermysql gormiogorm var d b gorm d b func connect db err godotenv load if err nil log fatal error loading env file charsetutf 8 mb 4 sets the character set to utf 8 mb 4 which supports all unicode characters including emojis parse timetrue tells the driver to automatically parse d at e and d at et im e values into gos time time type loclocal uses the local timezone of the server for time-related queries and storage dsn fmt sprintf sstcpssscharsetutf 8 mb 4parse timetrueloclocal os getenv d b_u se r os getenv d b_p as s os getenv d b_h os t os getenv d b_p or t os getenv d b_n am e db err gorm open mysql open dsn gorm config if err nil panic failed to connect database sql db err db d b if err nil panic failed to configure database connection set connection pool settings sql db set max idle conns 10 sql db set max open conns 100 sql db set conn max lifetime time hour 1sql db set max idle conns10 sets the maximum number of idle unused but open connections in the connection pool a value of 10 means up to 10 connections can remain idle ready to be reused 2 sql db set max open conns100 sets the maximum number of open active or idle connections that can be created to the database a value of 100 limits the total number of connections helping to prevent overloading the database 3 sql db set conn max lifetimetime hour sets the maximum amount of time a connection can be reused before its closed a value of time hour means that each connection will be kept for up to 1 hour after which it will be discarded and a new connection will be created if needed d b db 2 database migration databasemigrationgo package database import golang-servicemodels golang-servicemigrations gormiogorm func migrate db gorm d b db auto migrate models user apply additional custom migrations if needed 3 models modelsusergo package models import gormiogorm type user struct gorm model name string jsonname 4 environment configuration env d b_u se r root d b_p as s yourpassword d b_h os t 1270 01 d b_p or t 3306 d b_n am e yourdb 5 main entry point maingo package main import golang-serviceconfig golang-servicedatabase golang-servicemodels githubcomgin-gonicgin gormiogorm func main config connect db database migrate config d b r gin default r p os t users create user r g et usersid get user r run 8080 func create user c gin context var user models user if err c should bind js on user err nil c j so n 400 gin h error err error return if err config d b create user error err nil c j so n 500 gin h error err error return c j so n 201 user func get user c gin context id c param id var user models user if err config d b first user id error err nil c j so n 404 gin h error user not found return c j so n 200 user 6 explanation database config manages connection pooling for production-grade performance migration files in migrations folder helps in versioning the database schema g or m models maps database tables to go structs database migrations in database folder custom logic for altering tables over time allowing for easy rollbacks testing you can create integration tests for this setup using httptest and testify 7 create first migration for production environments we could use a migration library like golang-migrate to apply rollback or redo migrations install golang-migrate go install -tags mysql githubcomgolang-migratemigratev 4cmdmigratelatest generate migrate files for users table migrate create -ext sql -dir migrations -seq create_users_table after running the command well get a pair of upsql to update schema and downsql for potential rollback later the number 000001 is the auto generated index of migration golang - service -- migrations -- 000001_create_users_tabledownsql -- 000001_create_users_tableupsql add relevant sql command to up file and down file 000001_create_users_tableupsql c re at e t ab le users id b ig in t a ut o_i nc re me nt p ri ma ry k ey name v ar ch ar 255 n ot n ul l created_at d at et im e updated_at d at et im e deleted_at d at et im e 000001_create_users_tabledownsql d ro p t ab le i f e xi st s users run the up migration and apply changes to the database with the following command -verbose flag to see more log details migrate - path migrations - database mysqluserpasswordtcplocalhost3306dbname - verbose up in case we got issue with migration we can use the following command to see the current migration version and its status migrate -path migrations -database mysqluserpasswordtcplocalhost3306dbname version if we have a broken migration for some reasons we can consider to use the force use carefully command with the version number of the dirty migration if the version is 1 could check it in migrations or schema_migrations table we would run migrate -path migrations -database mysqluserpasswordtcplocalhost3306dbname force 1 8 changing schemes at some point in time we might like to add new features and some of those might require chaning data schemes for instance wed like to add email field to users table wed do it as following make a new migration for adding email column to users table migrate create -ext sql -dir migrations -seq add_email_to_users now we have a new pair of upsql and downsql golang - service -- migrations -- 000001_create_users_tabledownsql -- 000001_create_users_tableupsql -- 000002_add_email_to_usersdownsql -- 000002_add_email_to_usersupsql adding following content to _add_email_to_userssql files 000002_add_email_to_usersupsql a lt er t ab le users a dd c ol um n email v ar ch ar 255 u ni qu e 000002_add_email_to_usersdownsql a lt er t ab le users d ro p c ol um n email run the up migration command again to make update to the data schemas migrate - path migrations - database mysqluserpasswordtcplocalhost3306dbname - verbose up well also need to update the golang users struct adding email field to keep it in sync with the new schemas type user struct gorm model name string jsonname email string json email gorm unique index 9 rolling back migrations in case for some reasons we got bugs with new updated schemas and we need to rollback this case well use the down command migrate -path migrations -database mysqluserpasswordtcplocalhost3306dbname down 1 number 1 indicates that we want to rollback 1 migration here we also need manually to update golang users struct remove the email field to reflect the data schema changes type user struct gorm model name string jsonname 10 use with makefile to simplify the process of migration and rolling back we can add a makefile golang - service -- -- makefile the content of makefile as following include env create_migration migrate create - ext sql - dir migrations - seq create_new_migration migrate_up migrate - path migrations - database mysqld b_u se rd b_p as stcpd b_h os td b_p or td b_n am e - verbose up 1 migrate_down migrate - path migrations - database mysqld b_u se rd b_p as stcpd b_h os td b_p or td b_n am e - verbose down 1 p ho ny create_migration migrate_up migrate_down now we can simply run make migrate_up or make migrate_down on c li to do the migration and the rollback 11 considerations data loss during rollback rolling back migrations that delete columns or tables may result in data loss so always backup data before running a rollback c ic d integration integrate the migration process into your c ic d pipeline to automate schema changes during deployment d b backups schedule regular database backups to prevent data loss in case of migration errors about d b backups before rolling back a migration or making changes that could potentially affect your database here are some key points to consider schema changes if the migration involved altering the schema eg adding or removing columns changing data types rolling back to a previous migration can result in the loss of any data stored in those altered columns or tables data removal if the migration includes commands that delete data like dropping tables or truncating tables rolling back will execute the corresponding down migration which could permanently remove that data transaction handling if your migration tool supports transactions the rollback might be safer since changes are applied in a transaction however if you manually run s ql commands outside of transactions there is a risk of losing data data integrity if you have modified data in a way that depends on the current schema rolling back could leave your database in an inconsistent state so its crucial to back up your data heres a brief guide database dump use database-specific tools to create a full backup of your database for my sq l you can use mysqldump -u root -p dbname backup_before_rollbacksql this creates a file backup_before_rollbacksql that contains all the data and schema of the dbname database export specific tables if you only need to back up certain tables specify them in the mysqldump command mysqldump -u root -p golang_1 users users_table_backupsql verify the backup ensure that the backup file has been created and check its size or open it to ensure it contains the necessary data store backups securely keep a copy of the backup in a secure location such as cloud storage or a separate server to prevent data loss during the rollback process backups on cloud to back up your my sq l data when using golang and deploying on a ws e ks you can follow these steps use mysqldump for database backup create a mysqldump of your my sq l database using a kubernetes cron job mysqldump -h mysql-host -u user -p password database_name backupsql store this in a persistent volume or an s 3 bucket automate with kubernetes cron job use a kubernetes cron job to automate the mysqldump process example y am l configurationyaml api version batchv 1 kind cron job metadata name mysql - backup spec schedule 0 2 runs every day at 2 a m job template spec template spec containers - name mysql - backup image mysql 57 args - binsh - - c - mysqldump -h -u -p aws s 3 cp - s 3 backup-date fsql env - name a ws_a cc es s_k ey_i d value - name a ws_s ec re t_a cc es s_k ey value restart policy on failure using a ws r ds automated backups if using r ds if your my sq l database is on a ws r ds you can leverage r ds automated backups and snapshots set a backup retention period and take snapshots manually or automate snapshots using lambda functions back up persistent volumes p v with velero use velero a backup tool for kubernetes to back up the persistent volume that holds my sq l data install velero on your e ks cluster and configure it to back up to s 3 by using these methods you can ensure your my sq l data is regularly backed up and securely stored if you found this helpful let me know by leaving a or a comment or if you think this post could help someone feel free to share it thank you very much backup d b migrate go my sql database 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 4 năm storage trong docker là gì storage trong docker là một tính năng quản lý data của docker data ở đây có thể hiển là các file trong quá trình chạy ứng dụng như file log file data khi chạy một container data trong quá trình vận hành được chưa ở writeable layer và sẽ bị mất đi khi container bị xóa để giải quyết được vấn đề này docker đã đưa ra một cơ chế để quản lý data của các container đó là docker storage về bản chất docker storage là một cơ chế cho phép lưu trữ các data của container và docker host bằng cách mount mot folder từ docker container vào docker host bằng việc mount này data trong container giờ đây sẽ được an toàn hơn dễ dàng chia sẻ giữa các container với nhau hơn một số chứa setting hay log có thể được đọc dễ dàng hơn trong quá trình troubleshoot các container các kiểu mount của docker storage có 3 kiểu mount trong docker storage là volumes mount-point sẽ nằm varlibdockervolumes của docker host và được quản lý bằng docker bind mounts mount-point có thể nằm ở bất kỳ đâu docker host không được quản lý bởi docker tmpfs mounts data sẽ được lưu vào memory của docker host và sẽ mất đi khi khởi động lại hoặc stop container - v và -mount flag ban đầu -v hoặc -mount flat được dùng cho standalone container và -mount flag được dùng cho swarm service tuy nhiên phiên bản docker 1706 bạn có thể sử dụng -mount flag cho standalone container nói chung điểm khác biệt duy nhất chính là cú pháp trong khi -v flag các option được làm một thì -mount flag lại phân chia chung rõ ràng hơn với từng option các nhau bởi dấu phẩy trong bài viết này minh sử dụng option là -v và -mount volumes về hoạt động volumes tưng tự như bind mounts những volume được quản lý bời docker trong khi bind mounts file hoặc thư muc cần mount phải tồn tại trên docker host volume khi tạo ra sẽ nằm ở thư mục varlibdockervolumesvolume khi tạo sẽ nằm ở thư mục volume cũng support cơ chế của volume drivers cho phép lưu trữ dữ liệu tới một server remote hoặc cloud bạn có thể quản lý volume sử dụng c li hoặc a pi volume hoạt động trên cả linux và windows container sử dụng volume khi nào khi chia sẻ dữ liệu giữa nhiều container đang chạy lưu dữ liệu tới một server remote hoặc cloud khi cần backup restore hoặc migrate dữ liệu từ docker host này sang docker host khác cần quản lý dễ dàng và thuận tiện hơn so với bind mounts ví dụ tạo một volume và chạy container mount với volume đó tạo volume docker volume create my-volume tạo một volume docker volume ls list danh sách volume docker volume inspect my-volume hiển thị thông tin của volume ll varlibdockervolumes kiểm tra volume được tạo ra chạy container với volume docker run -itd -v my-volumeoptmount_point centos hoặc docker run -itd --mount typevolumesrcmy-volumedstoptmount_point centos hoặc docker run -itd --mount typevolumesourcemy-volumetargetoptmount_point centos kiểm tra lại docker exec my-container bash -c echo this is test file optmount_pointtesttxt docker exec my-container bash -c cat optmount_pointtesttxt cat varlibdockervolumesmy-volume_datatesttxt một số chú ý với volume nếu bạn mount một volume vào trong một thư mục của container mà thư mục của container này đã có dữ liệu thì dữ liệu từ container sẽ được copy vào volume mount-point của docker host thông thường nếu bạn không tạo volume từ trước mà chạy container với volume mount thì docker sẽ tự động tạo một volume và dữ liệu sẽ vẫn tồn tại ngoài vòng đời của container ví dụ docker run -itd --name webapp --mount sourcewebapp-voldestinationvar centos volume thường là sự lựa chọn tốt hơn là sử dụng wriable layer của container bởi vì sử dụng volume không làm tăng dung lượng của container sử dụng bind mounts bind mounts trong docker xuất hiện trước volume bind mounts bị giới hạn một số các tính năng hơn so với volume binds mount có hiệu năng tốt nhưng bị phụ thuộc vào cấu trúc filesystem của docker host khi sử dụng bind mount thì một file hoặc một folder trong docker host được mount vào trong container file hoặc folder này yêu cầu đường dẫn tuyệt đối vậy nên trong trường hợp file hoặc folder này không tồn tại trên docker host thì quá trình mount sẽ bị lỗi sử dụng bind mounts khi nào khi chia sẻ file cấu hình từ docker host với container chia sẻ thư mục source code hoặc môi trường từ docker host với container khi cấu trúc filesystem của docker host là rõ ràng và phù hợp với các yêu cầu của bind mount ví dụ chạy một container với bind mounts theo hai cách sử dụng flag -v khi sử dụng flag -v nếu source folder trên docker host chưa tồn tại docker sẽ tự động tạo mới folder docker run -itd --name my_contanier -v optdocker_host_folderopt centos docker exec my_contanier bash -c touch optduckhang ll optdocker_host_folder sử dụng flag mount khi sử dụng flag mount thì đảm bảo folder trên docker host đã được tồn tại nếu không sẽ bị lỗi mkdir -p optdocker_host_folder docker run -itd --name my_contanier --mount typebindsrcoptdocker_host_folderdstopt centos docker exec my_contanier bash -c touch optduckhang ll optdocker_host_folder một số chú ý với binds mount khi sử dụng bind mounts và flag mount thì phải đảm bảo file hoặc folder từ docker host đã được tồn tại không giống như volume nếu folder trong container không trống và được mount với folder của docker host thì tất cả các file trong folder của container sẽ bị ẩn đi điều này giống với khi bạn save dữ liệu của mình trong mnt sau đó cắm u sb và mount u sb với thư mục mnt thì những file dữ liệu có từ trước sẽ bị ẩn đi đến khi u sb được umount để test trường hợp này mình có một ví dụ sau tạo một image từ dockerfile đảm bảo rằng có một folder không trống khi chạy container cd mkdir create_image cd create_image cat dockerfile f ro m centoscentos 7 l ab el image-typeduckhang-test m ai nt ai ne r duckhang r un mkdir opttest_folder touch opttest_foldertest_filetxt e of docker build -t image-test docker images chạy một container và đảm bảo image tạo ra một container có một folder không trống docker run -itd --name test_container image-test docker exec test_ container bash -c ls opttest_folder chạy contaier sử dụng chính image đó với bind mounts và kiểm tra thư mục mount mkdir optdocker_host_folder docker run -itd --privileged --name another_container --mount typebindsrcoptdocker_host_folderdstopttest_folder image-test docker exec another_container bash -c ls opttest_folder unmount thư mục trong container và kiểm tra lại docker exec another_container bash -c umount opttest_folder docker exec another_container bash -c ls opttest_folder test_filetxt tmpfs volumes và bind mounts cho phép bạn chia sử dữ liệu giữa docker host và container kể cả khi container bị stop hoặc xóa đi nếu bạn sử dụng docker trên linux thì bạn có một option thứ ba là tmpfs mounts sử dụng tmpfs mounts khi nào khi bạn không muốn giữ data trên docker host hoặc trong container khi muốn bảo mật hoặc muốn đảm bảo hiệu suất container khi ứng dụng cần ghi một số lượng lớn dữ liệu không liên tục tmpfs mount sẽ lưu dữ liệu tạm thời trên memory khi container stop tmpfs mount sẽ bị xóa bỏ ví dụ docker run -itd --name tmp_mount --mount typetmpfsdstopt centos docker exec tmp_mount bash -c touch opttesttxt docker exec tmp_mount bash -c ls opt testtxt restart container và kiểm tra lại docker container restart tmp_mount docker exec tmp_mount bash -c ls opt kết quả trả về là trắng tinh tổng kết như vậy trong bài viết này mình đã giới thiệu một thành phần quan trọng trong docker đó là docker storage docker storage có 3 option cho bạn lựa chọn là volumes bind mounts tmpfs mounts nếu có vấn đề gì thì comment ở dưới để cùng trao đổi nhé tài liệu tham khảo httpsdocsdockercomstorage docker all rights reserved báo cáo thêm vào series của tôi - source_sentence: buổi trò chuyện sentences: - may fest 2024 content creator báo cáo thêm vào series của tôi thỉnh thoảng các trang tin tức báo mạng facebook có đăng những thông tin về một dịch vụ mội doanh nghiệp nào đó bị hacker tấn công đánh cắp và rao bán dữ liệu trên chợ đen đối tượng bị hacker nhắm đến thường là những trang web dịch vụ lớn có nhiều người dùng ngay cả một công ty bình thường tại v n cũng bị tấn công hacker trong vụ này còn nghênh ngang khiêu khích trực tiếp bằng cách đăng tải một video cho thấy cách hắn ta truy cập được vào hệ thống mạng nội bộ của công ty này từ đó tiến hành tấn công sâu hơn và đánh cắp dữ liệu bị hacker tấn công thì là vấn đề của doanh nghiệp nhưng dữ liệu bị lộ thì người dùng là đối tượng cần hoang mang nếu hacker có thể dựa vào những dữ liệu này để tìm được mật khẩu của người dùng thì rất nguy hiểm vậy làm thế nào để bảo vệ thật tốt mật khẩu của người dùng kể cả khi cơ sở dữ liệu không may bị hacker đánh cắp và rao bán thay vì đọc một bài viết mang tính kỹ thuật đơn thuần hôm nay chúng ta đổi phong cách một chút hãy theo dõi buổi trò chuyện dưới đây để biết thêm về cách bảo vệ mật khẩu an toàn nhé buổi trò chuyện tiếp nối phần 1 ông anh thế mấy dự án trước bên chú dùng thuật toán hash nào mấy cái nổi như m d 5 với s ha-1 à cậu em không anh làm sao mà dùng được ông anh sao mà không được m d 5 với s ha-1 có tốc độ tính toán nhanh dữ liệu hash ra thì không lớn tiết kiệm rất nhiều tài nguyên của máy chủ còn gì cậu em nhưng mà 2 cái đó được khuyến nghị là không nên sử dụng vì không còn đảm bảo an toàn nữa ông anh dựa vào đâu mà nói là không đảm bảo an toàn nữa cậu em em đọc được là m d 5 với s ha-1 phổ biến và được sử dụng từ lâu rồi độ dài chuỗi hash ra cũng thấp nên có rất nhiều kết quả hash đã được tính toán và lưu trữ sẵn rồi em còn biết có nhiều công cụ crack hash trên mạng cho sử dụng miễn phí rất nhiều chuỗi hash đều tìm ra được bản gốc khi sử dụng các công cụ đó cơ ông anh ừ một cái nữa là khả năng chống trùng lặp của m d 5 thấp cũng do độ dài chuỗi hash chỉ có 32 ký tự mà ra cậu em em cũng từng thấy qua về cái việc m d 5 có thể xuất hiện trùng lặp rồi nhưng mà rõ ràng số lượng kết quả có thể xảy ra của m d 5 không thấp thế thì cũng rất khó để trùng lặp mới đúng chứ nhỉ ông anh đúng là trên lý thuyết có tối đa 1632 kết quả hash khác nhau nhưng đa số người dùng sẽ không đặt mật khẩu là một chuỗi ngẫu nhiên vô nghĩa bất quy tắc có đầy người đặt trùng mật khẩu với nhau đấy thôi cậu em thế thì việc mật khẩu khác nhau có chung mã hash cũng có dễ xảy ra hơn đâu anh ông anh cho dù ở trên lý thuyết thì việc trùng lặp vẫn có khả năng xảy ra cao hơn so với các thuật toán hash khác nên người ta mới khuyến nghị không nên dùng nữa đấy thôi còn việc trùng lặp kết quả hash thì anh thấy dễ xảy ra với trường hợp đầu vào lớn cơ như kiểu em tính m d 5 hash cho 2 tệp tin nặng mấy trăm mb vài gb ấy lúc này thì do kích thước dữ liệu từ rất lớn giảm xuống chỉ còn 32 ký tự nên việc 2 tệp tin có cùng mã hash dễ xảy ra hơn cậu em bọn em dùng s ha-3 để hash mật khẩu luôn thế là an tâm ông anh cũng được dùng thuật toán hash tốt cho ra chuỗi hash có độ dài lớn sẽ an toàn hơn nhưng mà nếu đen bị tấn công thì vẫn có thể thất thủ cậu em nếu bọn em triển khai thêm việc sử dụng salt trong quá trình hash mật khẩu thì ổn áp luôn chưa anh ông anh sẽ ok hơn nhưng mà nhớ tìm cách bảo vệ đống salt đấy nữa nhé không là cũng công cốc cậu em thế là lại đẻ ra thêm 1 bài toán nữa à ông anh cũng có thể phát triển cơ chế sinh salt ngẫu nhiên và duy nhất với mỗi tài khoản đảm bảo một tài khoản chạy cơ chế đó bao nhiêu lần vẫn ra cùng cái salt là được cậu em nghe cách đó có vẻ ok hơn anh ạ ông anh thực ra anh biết giờ người ta có thuật toán hash khác okla hơn mấy cái m d với s ha cơ cậu em cái nào thế anh ông anh bcrypt cậu em nó có gì vượt trội hơn hả anh ông anh nó gây lãng phí thời gian cậu em ông anh đúng thế thật mấy thuật toán hash m d với s ha được thiết kế để có tốc độ tính toán nhanh bcrypt thì được xây dựng dựa trên thuật toán mã hoá blowfish blowfish thì có tốc độ mã hoá ok nhưng qua trình chuẩn bị khoá mã hoá của thuật toán này lại tốn thời gian bcrypt cũng thừa hưởng đặc điểm này nhờ vậy có thể bảo vệ mật khẩu tốt hơn trước những cuộc tấn công brute force hacker muốn lợi dụng việc thử thật nhiều lần để tìm ra bản rõ tương ứng với 1 chuỗi hash nhưng thử càng nhiều lần thì thời gian hao tổn do thay đổi tham số càng cao việc lãng phí thời gian này giúp giảm khả năng bẻ khoá của hacker cậu em nếu thế thì có ảnh hưởng tới tốc độ xử lý của máy chủ không anh ông anh không phải flo mình tính mã hash của mật khẩu thì mỗi tài khoản chỉ cần chạy 1 lần thì chẳng ảnh hưởng gì mấy cả phía hacker phải chạy hàng nghìn lần chỉ để tìm ra 1 mật khẩu thì mới tốn thời gian cậu em cao kiến cao kiến ông anh mà sử dụng bcrypt thì còn bắt buộc phải sử dụng salt nữa đảm bảo lập trình viên code phần này không thể sơ suất quên sử dụng salt được cậu em hay thật đấy cứ nghĩ mình biết dùng s ha-3 là đã ổn hoá ra vẫn còn bcrypt okla hơn ông anh có cả bài viết nói kỹ hơn về bcrypt đây nhé về đọc thêm rồi xem xét áp dụng vào dự án httpsauth 0combloghashing-in-action-understanding-bcrypt cậu em cảm ơn anh nhiều nhé lát nữa anh em mình ra quán bia em mời ông anh nó lại hợp lý encryption password 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 6 năm tập dữ liệu dùng để học máy tập huấn luyện được dùng để huấn luyện hệ thống tập tối ưu tùy chọn và được dùng để tối ưu các tham số của hệ thống tập kiểm thử được dùng để đánh gúa hệ thống đã được huấn luyện tập huấn luyện càng lớn thì hiệu năng của hệ thống học càng tốt tập kiểm thử càng lớn thì việc đánh giá càng chính xác rất khó ít khi có thể có được các tập dữ liệu rất lớn hiệu năng của hệ thống không chỉ phụ thuộc vào giải thuật học máy mà còn phụ thuộc class distribution phân bố lớp cost of misclassification size of the training set kích thước của tập huấn luyện size of the testing set kích thước tập kiểm thử các phương pháp đánh giá hiệu năng học máy hold-out stratified sampling repeated hold-out cross validation k-fold leave-one-out bootstrap sampling 1 hold-out toàn bộ tập dữ liệu data sẽ được chia thành 2 tập con datatrain và datatest không giao nhau datatrain datatest tập huấn luyện datatrain để huấn luyện hệ thống tập kiểm thử datatest để đánh giá hiệu năng của hệ thống sau khi đã được huấn luyện yêu cầu dữ liệu thuộc tập kiểm thử datatest không được sử dụng trong quá trình huấn luyện hệ thống dữ liệu thuộc tập huấn luyện datatrain không được sử dụng trong quá trình đánh giá hệ thống sau khi huấn luyện ví dụ ta có thể chọn datatrain 23 data và data test 13 data cách đánh giá này phù hợp khi ta bộ dữ liệu data có kích thước lớn 2 stratified sampling được sử dụng khi các tập ví dụ có kích thước nhỏ hoặc không cân xứng unbalanced datasets ví dụ có ít hoặc không có các ví dụ với một số lớp mục tiêu phân bố lớp class distribution trong tập huấn luyện và tập kiểm thử phải xấp xỉ như trong tập toàn bộ các ví dụ data stratified sampling là một phương pháp để cân xứng về phân bố lớp đảm bảo tỉ lệ phân bố lớp trong tập huấn luyện và tập kiểm thử sẽ là xấp xỉ nhau phương pháp này không áp dụng được cho bài toán học máy dự đoánhồi quy vì giá trị đầu ra của hệ thống là một giá trị số không phải là một nhãn lớp 3 repeated hold-out đây là phương pháp sẽ áp dụng phương pháp đánh giá hold-out nhiều lần để sinh ra các tập huấn luyện và thử nghiệm khác nhau trong mỗi lần lặp một tỉ lệ nhất định của tập dữ liệu data được chọn ngẫu nhiên nhằm tạo nên tập huấn luyện có thể kết hợp với phương pháp stratified sampling đối với các giá trị lỗi hoặc giá trị với các tiêu chí đánh giá khác ghi nhận trong các bước lặp này được lấy trung bình công để xác định lỗi tổng thể tuy nhiên phương pháp này chưa được tốt vì mỗi bước lặp ta lại có một tập kiểm thử khác nhau có một số dữ liệu sẽ được dùng nhiều lần trùng lặp trong các tập kiểm thử 4 cross validation 41 k-fold tập dữ liệu data được chia thành k tập con không giao nhau gọi là fold có kích thước xấp xỉ nhau mỗi lần lặp một tập con trong k tập sẽ được dùng để làm tập kiểm thử k-1 tập còn lại sẽ được sử dụng làm tập huấn luyện k giá trị lỗi mỗi giá trị tương ứng với mỗi fold sẽ được tính trung bình cộng để thu được giá trị lỗi tổng thể ví dụ ta có thể chia data thành 10 hoặc 5 folds k 10 hoặc k 5 thông thường mỗi tập con fold được lấy mẫu phân tầng xấp xỉ phân bố lớp trước khi áp dụng quá trình đánh giá cross validation phù hợp khi ta có tập dữ liệu data vừa và nhỏ 42 leave-one-out số lượng các nhóm folds bằng kích thước của tập dữ liệu k data mỗi nhóm fold chỉ bao gồm 1 ví dụ khai thác tối đa tập dữ liệu ban đầu không có bước lấy mẫu ngẫu nhiên chi phí tính toán cao phù hợp khi ta có tập dữ liệu data rất nhỏ 5 bootstrap sampling phương pháp này sử dụng việc lấy mẫu lặp lại để tạo nên tập huấn luyện giả sử toàn bộ tập data bao gồm n ví dụ lấy mẫu có lặp lại n lần đối với tập data để tạo nên tập huấn luyện datatrain gồm n ví dụ từ tập data lấy ngẫu nhiên một ví dụ x nhưng không loại bỏ x khỏi data đưa dữ liệu x vào trong tập huấn luyện lặp lại các bước trên n lần ta có n dữ liệu trong tập datatrain sử dụng dữ liệu tập datatrain để huấn luyện hệ thống sử dụng tất cả các dữ liệu thuộc data nhưng không thuộc tập huấn luyện datatrain để tạo nên tập test xác suất để 1 ví dụ không được chọn vào tập huấn luyện là 1-1n xác suất để một ví dụ sau khi lấy mẫu lặp lại bootstrap sampling được đưa vào tập kiểm thử là 1-1nn phù hợp với tập dữ liệu có kích thước rất nhỏ tập tối ưu validation set quá trình học máy huấn luyện sẽ được thực hiện gồm 2 giai đoạn giai đoạn 1 huấn luyện hệ thống giai đoạn 2 tối ưu giá trị các tham số của hệ thống tập tối ưu sẽ không có các dữ liệu trùng với tập kiểm thử và tập huấn luyện tối ưu giúp điều chỉnh tham số và hiệu năng cao hơn các tiêu chí để đánh giá 1 tính chính xác accuracy mưc đọ dư đoan phan lơp chinh xac cua hẹ thông đa đuơc huân luyẹn đôi vơi cac vi du kiêm chưng test instances 2 tính hiệu quả efficiency chi phi vê thơi gian va tai nguyen bọ nhơ cân thiêt cho viẹc huân luyẹn va kiêm thư hẹ thông 3 khả năng xử lý nhiễu robustness kha nang xư ly chiu đuơc cua hẹ thông đôi vơi cac vi du nhiêu lôi hoạc thiêu gia tri 4 khả năng mở rộng scalability hiẹu nang cua hẹ thông vd tôc đọ hocphan loai thay đôi nhu thê nao đôi vơi kich thuơc cua tạp dư liẹu 5 kha nang diên giai interpretability mưc đọ dê hiêu đôi vơi nguơi sư dung cua cac kêt qua va hoat đọng cua hẹ thông 6 mưc đọ phưc tap complexity mưc đọ phưc tap cua mo hinh hẹ thông ham muc tieu hoc đuơc cách tính chính xác 1 đối với bài toán phân loại giá trị đầu ra của bài toán là một giá trị định danh trong đó x là một ví dụ trong tập kiểm thử datatest ox giá trị đầu ra phân lớp của hệ thống với dữ liệu x cy phân lớp đúng với ví dụ x 2 đối với bài toán hồi quy dự đoán giá trị đầu ra của hệ thống là một giá trị số trong đó ox là giá trị đầu ra dự đoán bởi hệ thống với x dx là giá trị đúng của dữ liệu x machine learning đánh giá hiệu năng học máy 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 3 năm tiếp nối loạt bài viết về design pattern trước bridfe pattern và facade pattern bài này mình sẽ giới thiệu về một design pattern nằm trong nhóm behavioral design patterns đó là chain of responsibility nó là cái gì trong cuốn sách rất hay về design pattern design patterns elements of reusable object-oriented software có định nghĩa khá dài và cũng khá là khó hiểu nên theo tìm hiểu của mình thì mình sẽ nói đơn giản hơn là như thế này nó là việc cho tách nhỏ riêng biệt một request của người gửi từ người nhận request đó bằng việc tạo ra nhiều object để handle request đó giả sử bạn có 1 một request cần sử lý với nhiều logic nếu sử dung ifelse quá nhiều thì sẽ quá phức tạp và khó refactor sau này vậy nên chain of responsibility design pattern tạo ra 1 chuổi các handle mỗi handle xử lý một logic khác nhau và với một điệu kiện cụ thể nào đó nói cụ thể hơn thì chain of responsibility dùng để tránh sự liên kết trực tiếp giữa đối tượng gửi request và đối tượng nhận request khi request đó có thể được xử lý bởi hơn 1 đối tượng thực hiện móc nối các đối tượng nhận request đó thành một chuỗi và gửi request theo chuỗi đó cho đến khi request đó được xử lý theo doix u ml sau handler định nghĩa 1 interface để xử lý yêu cầu gán giá trị cho đối trượng successor concrete handler xử lý yêu cầu có thể truy cập đối trượng successor nếu đối tượng concrete handler không thể xử lý yêu cầu nó sẽ gửi tới successor của nó hiểu đơn giãn hơn nữa giã sử bạn có 1 chuỗi các hành động khi nhận được request bạn cho a xử lý nếu a không thể xử lý nó sẽ gọi successor của nó để xử lý cứ như thế cho đến khi không còn concrete handle nào xử lỹ nữa trăm lời nói không bằng 1 ví dụ mình sẽ thực hiện một ví dụ để thể hiện đống chữ phía trên đầu tiên chúng ta định nghĩa 1 class user class user possible roles guest internal_user admin attr_reader role def initializerole role role end end class registration controller end class profile controller end class logs controller end user có role và một số controller như trên tiếp theo sẽ tạo class policy đây là đối tượng chính đó là chính handler như trong đống lý thuyết trên class policy attr_reader successor def initializesuccessornil successor successor end def check_accesscontroller user if policy_matches_controllercontroller return process_checking_accesscontroller user elsif successor successorcheck_accesscontroller user else raise_no_policycontroller end end def raise_no_policycontroller raise no policy found for controller end def process_checking_accesscontroller user raise not implemented end protected def policy_matches_controllercontroller controllerto_s selfclassto_sgsubpolicy end end class policy có định nghĩa 1 instance là successor đối tượng này sẽ được gọi khi hanler không thể xử lý request method chính thực hiện xử lý request là check_access accept 2 params là controller và user đầu tiên nó thực hiện check có handle được request hay không bằng cách so sánh tên controller và tên của class handler mà không có word policy nếu không request sẽ được passed qua successor nếu successor tồn tại nếu không thì sẽ raise lên exepction ngược lại nếu xử lý thành công thì sẽ gọi method process_checking_access cần được định nghĩa bên trong từng concrete handle class giờ thì chúng ta sẽ định nghĩa một vài concrete handle của policy class registration controller policy policy def process_checking_accesscontroller user userrole guest end end class profile controller policy policy def process_checking_accesscontroller user internal_user adminincludeuserrole end end class logs controller policy policy def process_checking_accesscontroller user userrole admin end end chúng ta sẽ xây dựng dựa trên policy class và định nghĩa lại method process_checking_access để xử lý logic cho từng concrete handler giờ thì chúng ta thực hiện nó user usernewadmin policy logs controller policynew profile controller policynew registration controller policynew puts policycheck_accessprofile controller user đầu tiên chúng ta định nghĩa 1 user với role là admin sau đó định nghĩa 1 chuỗi handler policy và thực hiện method check_access tại concretehanlder là logs controller policy nhưng request sẽ chỉ được xử lý tại profile controller policy thế là xong cũng không quá phức tạp phải không mọi người yeah ưu điểm giảm kết nối thay vì 1 đối tượng có thể xử lý request phải tham chiều đến các đối tượng khác nó chỉ cần tham chiếu đến đối tượng tiếp theo tăng tính linh hoạt và phân chia trách nhiệm cho tường đối tựơng có khả năng thay đổi dây chuyền không đảm bảo có đối tượng xử lý yêu cầu khi nào thì sử dụng pattern này cái này quan trọng đây vì hiều mà không biết khi nào apply thì chắc chỉ để đọc cho vui chúng ta sẽ sử dụng trong những trường hợp sau có nhiều hơn 1 đối tượng có thể xử lý request đó nhưng đối tượng cụ thể nào thực hiện request đó lại phụ thuộc vào ngữ cảnh muốn gửi request đến một trong số các đối tượng xử lý những không biết đối tượng đó là đối tượng nào tập các đối tượng xử là tập các đối tượng độc lập và có khả năng biến đổi hết rồi mọi người cảm ơn mọi người đã đọc bài viết mình cũng mới tìm hiểu và đang apply vào một vài project d em o khi nào xong thì sẽ public sharing với mọi người đừng ngại góp ý và chia sẽ nhé thank you so much design pattern ruby all rights reserved báo cáo thêm vào series của tôi - source_sentence: những câu hỏi phỏng vấn javascript rất đỗi thông dụng sentences: - 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 phỏng vấn thì muôn hình vạn trạng nhưng kiểu gì thì khả năng cao vẫn sẽ hỏi mấy câu này chắc vậy v tuỳ sở thích từng người mà có thể hỏi kiểu khó trước - dễ sau hay từ dễ đến khó còn bài viết này thì sắp xếp tuỳ hứng chả theo thứ tự nào cả bạn có biết xài i if e tip nếu câu trả lời là không tôi chưa dùng bao giờ hay biết nhưng tôi ít khi dùng thì 910 là cái ông này code j s kiểu ăn xổi answer j s nó chẳng thích tính scope của variable theo block mà nó tính theo từng function ví dụ if true var foo foo consolelogfoo foo oops foo lẽ ra ko nên tồn tại ngoài block if vì lí do vậy ta rất dễ làm bẩn scope bên ngoài do ko giới hạn đc scope của variable và khi nó tòi ra ngoài một vùng code khác cũng gọisửa cái biến foo trời đánh kia mà không nghĩ nó tồn tại thì có chúa mới biết output là gì vậy nên ta có 3 option ủa tưởng là 2 v - đặt tên biến ko thể trùng lặp v - dùng letconst thay vì var - bọc nó vào 1 function cơ mà cần cục code phải chạy luôn và cũng ko muốn đặt tên cho function var foo foo đây là cái i if e consolelogfoo undefined tuyệt bạn biết xài callback chứ tip câu trả lời nên là đơn giản thôi anh answer do cơ chế hoạt động của j s engine cái hoạt động khá phức tạp mà có lẽ cần hẳn 1 bài viết để phân tích về nó code viết sau chưa chắc đã chạy sau dí dụ quen thuộc với j query var response ajaxlinktoresource do_somethingresponse tọi luôn vì response là undefined đợi có kết quả mới chạy code tiếp đơn giản là truyền logic vào callback ajaxlinktoresource do_something promise là cái chi tip hay một cách hỏi khác là thằng callback có những vấn đề gì answer bạn hãy - than vãn về callback hell khiến code khó maintain - cằn nhằn về việc catch error chuẩn xác với callback là điều bất khả thi closure là cái gì tip đây là một khái niệm khá mông lung nhiều người dùng j s lâu năm mà hỏi chưa chắc có thể cắt rõ nghĩa cho người khác hiểu được answer là khả năng ghi nhớ của một function về scope nơi nó được tạo ra thí dụ function counter var count 0 return get count function return count increase function count my counter counter my counterincrease my counterget count 1 đến đây bạn vẫn chưa hiểu ý đồ lắm đúng ko vậy thì mình sẽ thêm vài dòng code sau your counter counter your counterget count 0 ồ get count increase bọn nó nhớ về thằng count ở scope nó được tạo ra ờ vậy thế thì sao thì ta có thể dùng cái kĩ thuật này để giấu state vì j s thì méo có class rồi thì publicprivate như java nói chung đây là chìa khoá để thực hiện encapsulation một trong những khái niệm trụ cột của o op undefined khác vẹo gì null tip thường là câu hỏi để làm nóng buổi phỏng vấn còn nếu người ta hỏi câu này ở cuối buổi thì có lẽ là khá tuyệt vọng rồi answer undefined là chưa đc khởi tạo null là khởi tạo rồi có giá trị rồi và giá trị ấy là null à vậy thì kết luận luôn null là một giá trị chứ ko phải là ko là gì nhé khi nào dùng call và khi nào dùng apply tip thực ra 2 cái hàm này nó chỉ khác nhau cái a pi câu này chủ yếu để dẫn mở cho chủ đề về this answer - call là để hard binding cái this vào 1 context cụ thể - apply cũng vậy nhưng đống parameters được truyền vào là array thay vì là các optional parameter như call giả dụ như sau my functioncallmy context param 1 param 2 my functionapplymy context param 1 param 2 cần lưu ý gì khi dùng giá trị falsy tip chủ yếu là mang tính hỏi mẹo nhưng cũng đủ để đoán ra được thời gian bạn làm việc với j s answer - array cũng đc coi là falsy nên nếu có array thì lại phải check cả độ dài của array nữa - object rỗng thì lại coi là truthy nên check object thì lại nên viết thêm hàm để check cho tiện this là gì tip cái này là một trong những phần trọng tâm của buổi phỏng vấn answer là gì thì bài sau chúng ta bàn tiếp vài dòng có lẽ không đủ cho e nó v so sánh var let và const arrow function khác gì so với function tip cũng chỉ là một công cụ dẫn nhập sang chủ đề this không trả lời được cũng không sau vì kiểu gì thì người ta vẫn sẽ đề cập đến this bằng cách này hay cách khác ngoài ra thì đây cũng có thể làm nhiên liệu để hỏi về hoisting answer do cách implement của nó nên khi xài với một số libframework nó sẽ làm mất binding của this như là react hoặc j query có cơ số chủ đề trên mạng về lưu ý này function declaration và function expression khác nhau ở điểm nào và như vậy thì sao tip thực chất là hỏi về hoising answer có 2 hiểu syntax như nầy foo style chạy ngon bar style tọi luôn function foo style var bar style function thằng bar style thì chỉ đc hoist mỗi cái biến bar style còn foo style đc hoist cả tên lẫn block khi nào thì cần use strict tip basic answer j s khá linh hoạt bạn có thể khai báo biến mà ko cần dùng var có thể đặt tên biến bằng một số reversed-word có thể lặp tên param của một hàm có thể hoisting etc nói chung những tính năng này khiến code khá đau đầu use strict để disable hết mấy cái tính năng sida này đi vi phạm thì raise lỗi kế thừa trong javascript liệu có giống với o op như các ngôn ngữ khác prototype là cái khỉ gì tip hẳn một topic ngang tầm với this luôn answer ồ và chúng ta cần hẳn 1 bài viết nữa để phân tích luôn v kết các chủ đề mà mình muốn liệt kê tiếp nhưng có vẻ sẽ tốn khả nhiều giấy mực nên xin tổng kết bằng mấy gạch đầu dòng sau cảm ơn các bạn đã theo dõi về lexical scope và cái cách j s compile về event loop và lí giải cho cơ chế bất đồng bộ về các thể loại kĩ thuật fake o op về cách mổ xẻ object và nền móng cho functional programming interview java script 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 3 năm 1 about charlesfiddler charlesfiddler là một web proxy h tt p proxy h tt p monitor được chạy trên p c cho phép các web browsers của bạn được thiết lập để truy cập internet thông qua charles vì vậy charles có thể bắt được các gói tin và hiển thị cho chúng ta tất cả dữ diệu gửi đi request và nhận response vì vậy charles là công cụ rất hữu ích cho việc debug cho developer nếu q a chỉ có screenshots và video thì không thể nào thấy được những gì đang được gửi và nhận giữa web browsers và server nên việc lấy log charles là rất cần thiết giúp dev có thể biết được những gì đang xảy ra và có thể chuẩn đoán và sửa chữa vấn đề dễ dàng hơn một số chức năng chính của charles s sl proxying xem s sl requests and responses bandwidth throttling dùng để test với những đường truyền khác nhau a ja x debugging xem x ml and j so n requests and responses theo dạng cây thư mục hoặc dạng text repeat requests to test back-end changes edit requests để test nhiều inputs breakpoints để chỉnh sửa requests và responses một số chức năng chính của fiddler web debugging performance testing h tt ph tt ps traffic recording web session manipulation security testing customizing fiddler trong bài viết này mình sẽ chỉ đề cập đến những chức năng q a hay dùng và hướng dẫn cách lấy log với charles phần fiddler thì cách dùng cũng tưởng tự charles nên mình chỉ đề cập đến charles 2 lấy log web a config browsers để charles có thể bắt được các gói tin từ trình duyệt thì đầu tiên mình phải config proxy của trình duyệt như sau mở charles và bắt đầu truy cập internet từ trình duyệt trên charles chúng ta có thể thấy được thông tin của các gói tin b config devices để thiết lập device truy cập internet thông qua charles bạn phải mở charles trên p c và trỏ device đến p c của bạn thiết lập i p của p c trên devices port là 8888 mỗi device sẽ có cách thiết lập khác nhau dưới đây là thiết lập trên i os devices sau khi thiết lập thành công trên charles sẽ thông báo có thiết bị truy cập bạn chọn allow để đồng ý cho phép truy cập bây giờ devices của bạn sẽ truy cập internet thông qua charles c get log việc của bạn sau khi làm lại tất cả steps thì get log và gửi cho dev chọn file save sesion as chọn lưu file dưới format chls 3 bandwidth throttling để đảm bảo ứng dụng có thể chạy hoặc download app trong các điều kiện mạng nhất định thì bạn cần kiểm tra trong nhiều tốc độ mạng khác nhau và charles với chức năng bandwidth throttling cho phép bạn thiết lập băng thông thích hợp để test chọn proxy throttling settings bạn chọn enable throttling và lựa chọn gói mạng phù hợp để kiểm tra 4 black list settings như các proxy khác charles có thể chặn một số truy cập với chức năng back list khi truy cập vào những trang nằm trong danh sách đen sẽ bị charles từ chối trên đây là một vài hướng dẫn để có thể lấy được log của web trên p c và devices charlesfiddler còn rất hữu ích cho việc test services developing tesing hy vọng bài viết có thể giúp ích cho mọi người q a charles fiddler web dubugging 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 tổng quan overview khi tìm hiểu về mô hình phát triển phần mềm agile chúng ta không thể không nhắc tới kanban một methodology nổi tiếng của agile cùng với các methodology khác như scrum x p tóm gọn lại thì kanban là một hệ thống quản lý công việc giúp bạn có thể trực quan hóa visualize công việc của mình giới hạn số việc đang làm dở và tối đa hóa năng suất công việc hệ thống này hoạt động theo dòng chảy flow nói cách khác kanban là một dòng chảy công việc được trực quan hóa visualize workflow kanban là một từ tiếng nhật 看板 có nghĩa là bảng thông tin signboard bạn có thể bắt đầu mô hình kanban cực kì đơn giản trong 3 nốt nhạc bước 1 vẽ một bảng kanban kanban board bước 2 dán lên đó các thẻ kanban kanban card bước 3 đặt ra giới hạn số công việc đang làm limit w ip - work in progress vậy là xong các quy tắc của kanban principles of kanban bắt đầu bằng những việc đang làm start with what you do now bạn có thể bắt đầu chuyển đổi từ mô hình phát triển hiện tại sang phương thức kanban một cách nhanh chóng và dễ dàng ngay từ những công việc còn đang làm dở mà không gây ảnh hướng tới các phần công việc đã hoàn thành trước đó tôn trọng các vai trò và trách nhiệm hiện có respect the current roles responsibilities bạn chỉ việc áp dụng mô hình kanban vào dự án thôi mà không cần thay đổi vai trò và trách nhiệm của các thành viên khuyến khích phát triển từ mọi cấp độ encourage acts of leadership at all levels điều này có nghĩa là mọi thành viên trong dự án đều cần cải thiện bản thân liên tục tinh thần kaizen để tăng performance của teamcủa bộ phận của cả công ty để dễ hình dung hơn chúng ta hãy cùng bắt tay vào thực hành luôn vẽ kanban board kanban board kanban board là một bảng bao gồm các cột thể hiện trạng thái tùy vào độ phức tạp của dự án bạn có thể có nhiều hoặc ít cột mình lấy ví dụ đơn giản nhất là 3 cột tương ứng với 3 trạng thái của task là những việc phải làm t o d o những việc đang làm d oi ng những việc đã làm xong d on e kanban board có thể được vẽ bằng bút dạ trên bảng trắng truyền thống hoặc sử dụng các tool điện tử như j ir a hoặc t re ll o example sử dụng kanban board để quản lí bài viết này chúng ta sẽ kẻ 1 bảng gồm 3 cột t o d o d oi ng và d on e các thẻ kanban card đây là một thành phần quan trọng của kanban giúp trực quan hóa các task mỗi thẻ kanban chứa một công việc cụ thể có thể đo lường được càng nhỏ càng cụ thể càng tốt giống như 1 tờ sticky note vậy kanban card sẽ được di chuyển từ cột này sang cột khác khi status của nó thay đổi giúp trực quan hóa workflow ở trong agile thì kanban card chính là từng featureproduct backlog được chia nhỏ thành các user-story example viết tên các task lên kanban card rồi sắp xếp vào các cột tương ứng chúng ta sẽ có các task cần làm như sau overview principles of kanban kanban board kanban vs scrum phần overview và principles of kanban đã hoàn thành nên sẽ để ở cột d on e phần kanban board đang làm dở nên sẽ để ở cột d oi ng phần kanban vs scrum vẫn chưa làm nên sẽ để ở cột t o d o limit w ip để có thể đảm bảo tiến độ công việc ai cũng có việc để làm và tránh hiện tượng nghẽn cổ chai chúng ta cần giới hạn số w ip tối đa trong một cột con số w ip này tùy thuộc vào số lượng member trong team và năng lực của các member example do bài viết này chỉ có một mình mình thực hiện cho nên vào một thời điểm chỉ có 1 task được làm vì vậy mình sẽ để limit cho cột d oi ng là 1 đồng thời sẽ kéo thẻ kanban board sang phần d on e vì mình sẽ kết thúc phần này tại đây đồng thời kéo tiếp thẻ kanban vs scrum để thực hiện nó một ví dụ khác về limit w ip kanban vs scrum đã có rất nhiều bài so sánh chi tiết về sự khác nhau giữa hai methodology này của scrum tuy nhiên trong bài viết này thì mình sẽ nêu vắn tắt như sau tổng quan kanban scrum làm việc theo danh sách hàng đợi hoạt động theo sprint plan kéo task từ cột t o d o sang d oi ng để làm hết task này thì tự động kéo task khác chỉ làm các task của sprint đó thôi làm cho đến khi thỏa mãn tiêu chí d on e phải pass sprint review của p o lặp lại y như cũ có retrospective để cải thiện chất lượng các sprint sau meeting kanban scrum không cần meeting cũng được có rất nhiều meeting spring planning daily meeting retrospective meeting role kanban scrum giữ nguyên role của mô hình cũ yêu cầu đủ các role stakeholder product owner scrum master team các công cụ kanban scrum kanban board backlog burndown chart potiential shipable product p sp như vậy qua bảng phân tích sự khác nhau giữa kanban và scrum thì chúng ta có thể thấy kanban thường được coi là method và áp dụng cho các dự án nhỏ đơn giản còn scrum thì có thể gọi là một framework đầy đủ và phù hợp với các dự án vừa và lớn do scrum bao gồm đầy đủ các yếu tố cần thiết role meeting artifacts để có thể áp dụng vào mọi loại dự án mà không cần phải thêm bất cứ một framework nào khác tuy nhiên do tính chất đơn giản và linh động nên kanban có thể được áp dụng rộng rãi trong rất nhiều domain của cuộc sống chứ ko chỉ riêng lĩnh vực software development ví dụ bạn có thể áp dụng kanban board để quản lý công việc hàng ngày của bạn hoặc quản lý bài tập về nhà quản lý nhà hàng quán ăn ps trước khi kết thúc bài viết thì mình xin update nốt phần cuối vào cột done để kết thúc bảng kanban board của mình cảm ơn các bạn đã dành thời gian đọc bài viết này source httpswwwatlassiancomagilekanban httpskanbanizecomkanban-resourcesgetting-startedwhat-is-kanban kanban agile kanban board scrum kanban card all rights reserved báo cáo thêm vào series của tôi - source_sentence: thuật ngữ trong frontend - optimization sentences: - 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 - 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 pipeline_tag: sentence-similarity library_name: sentence-transformers --- # SentenceTransformer based on keepitreal/vietnamese-sbert This is a [sentence-transformers](https://www.SBERT.net) model finetuned from [keepitreal/vietnamese-sbert](https://huggingface.co/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. ## Model Details ### Model Description - **Model Type:** Sentence Transformer - **Base model:** [keepitreal/vietnamese-sbert](https://huggingface.co/keepitreal/vietnamese-sbert) - **Maximum Sequence Length:** 256 tokens - **Output Dimensionality:** 768 dimensions - **Similarity Function:** Cosine Similarity ### Model Sources - **Documentation:** [Sentence Transformers Documentation](https://sbert.net) - **Repository:** [Sentence Transformers on GitHub](https://github.com/UKPLab/sentence-transformers) - **Hugging Face:** [Sentence Transformers on Hugging Face](https://huggingface.co/models?library=sentence-transformers) ### Full Model Architecture ``` 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}) ) ``` ## Usage ### Direct Usage (Sentence Transformers) First install the Sentence Transformers library: ```bash pip install -U sentence-transformers ``` Then you can load this model and run inference. ```python 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]]) ``` ## Training Details ### Training Dataset #### Unnamed Dataset * Size: 6,120 training samples * Columns: query, positive, and negative * Approximate statistics based on the first 1000 samples: | | query | positive | negative | |:--------|:----------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------| | type | string | string | string | | details | | | | * Samples: | 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 ... | * Loss: [MultipleNegativesRankingLoss](https://sbert.net/docs/package_reference/sentence_transformer/losses.html#multiplenegativesrankingloss) with these parameters: ```json { "scale": 20.0, "similarity_fct": "cos_sim", "gather_across_devices": false } ``` ### Training Hyperparameters #### Non-Default Hyperparameters - `per_device_train_batch_size`: 16 - `warmup_steps`: 100 - `fp16`: True #### All Hyperparameters
Click to expand - `overwrite_output_dir`: False - `do_predict`: False - `eval_strategy`: no - `prediction_loss_only`: True - `per_device_train_batch_size`: 16 - `per_device_eval_batch_size`: 8 - `per_gpu_train_batch_size`: None - `per_gpu_eval_batch_size`: None - `gradient_accumulation_steps`: 1 - `eval_accumulation_steps`: None - `torch_empty_cache_steps`: None - `learning_rate`: 5e-05 - `weight_decay`: 0.0 - `adam_beta1`: 0.9 - `adam_beta2`: 0.999 - `adam_epsilon`: 1e-08 - `max_grad_norm`: 1.0 - `num_train_epochs`: 3 - `max_steps`: -1 - `lr_scheduler_type`: linear - `lr_scheduler_kwargs`: {} - `warmup_ratio`: 0.0 - `warmup_steps`: 100 - `log_level`: passive - `log_level_replica`: warning - `log_on_each_node`: True - `logging_nan_inf_filter`: True - `save_safetensors`: True - `save_on_each_node`: False - `save_only_model`: False - `restore_callback_states_from_checkpoint`: False - `no_cuda`: False - `use_cpu`: False - `use_mps_device`: False - `seed`: 42 - `data_seed`: None - `jit_mode_eval`: False - `use_ipex`: False - `bf16`: False - `fp16`: True - `fp16_opt_level`: O1 - `half_precision_backend`: auto - `bf16_full_eval`: False - `fp16_full_eval`: False - `tf32`: None - `local_rank`: 0 - `ddp_backend`: None - `tpu_num_cores`: None - `tpu_metrics_debug`: False - `debug`: [] - `dataloader_drop_last`: False - `dataloader_num_workers`: 0 - `dataloader_prefetch_factor`: None - `past_index`: -1 - `disable_tqdm`: False - `remove_unused_columns`: True - `label_names`: None - `load_best_model_at_end`: False - `ignore_data_skip`: False - `fsdp`: [] - `fsdp_min_num_params`: 0 - `fsdp_config`: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False} - `fsdp_transformer_layer_cls_to_wrap`: None - `accelerator_config`: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None} - `deepspeed`: None - `label_smoothing_factor`: 0.0 - `optim`: adamw_torch - `optim_args`: None - `adafactor`: False - `group_by_length`: False - `length_column_name`: length - `ddp_find_unused_parameters`: None - `ddp_bucket_cap_mb`: None - `ddp_broadcast_buffers`: False - `dataloader_pin_memory`: True - `dataloader_persistent_workers`: False - `skip_memory_metrics`: True - `use_legacy_prediction_loop`: False - `push_to_hub`: False - `resume_from_checkpoint`: None - `hub_model_id`: None - `hub_strategy`: every_save - `hub_private_repo`: None - `hub_always_push`: False - `hub_revision`: None - `gradient_checkpointing`: False - `gradient_checkpointing_kwargs`: None - `include_inputs_for_metrics`: False - `include_for_metrics`: [] - `eval_do_concat_batches`: True - `fp16_backend`: auto - `push_to_hub_model_id`: None - `push_to_hub_organization`: None - `mp_parameters`: - `auto_find_batch_size`: False - `full_determinism`: False - `torchdynamo`: None - `ray_scope`: last - `ddp_timeout`: 1800 - `torch_compile`: False - `torch_compile_backend`: None - `torch_compile_mode`: None - `include_tokens_per_second`: False - `include_num_input_tokens_seen`: False - `neftune_noise_alpha`: None - `optim_target_modules`: None - `batch_eval_metrics`: False - `eval_on_start`: False - `use_liger_kernel`: False - `liger_kernel_config`: None - `eval_use_gather_object`: False - `average_tokens_across_devices`: False - `prompts`: None - `batch_sampler`: batch_sampler - `multi_dataset_batch_sampler`: proportional - `router_mapping`: {} - `learning_rate_mapping`: {}
### Training Logs | Epoch | Step | Training Loss | |:------:|:----:|:-------------:| | 1.3055 | 500 | 0.9762 | | 2.6110 | 1000 | 0.3251 | ### Framework Versions - Python: 3.11.13 - Sentence Transformers: 5.1.0 - Transformers: 4.55.1 - PyTorch: 2.6.0+cu124 - Accelerate: 1.10.0 - Datasets: 4.0.0 - Tokenizers: 0.21.4 ## Citation ### BibTeX #### Sentence Transformers ```bibtex @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", } ``` #### MultipleNegativesRankingLoss ```bibtex @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} } ```