Chatbot-Model / README.md
thuan-NM's picture
Upload folder using huggingface_hub
208ab2a verified
metadata
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 model finetuned from keepitreal/vietnamese-sbert. It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.

Model Details

Model Description

  • Model Type: Sentence Transformer
  • Base model: keepitreal/vietnamese-sbert
  • Maximum Sequence Length: 256 tokens
  • Output Dimensionality: 768 dimensions
  • Similarity Function: Cosine Similarity

Model Sources

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:

pip install -U sentence-transformers

Then you can load this model and run inference.

from sentence_transformers import SentenceTransformer

# Download from the 🤗 Hub
model = SentenceTransformer("sentence_transformers_model_id")
# Run inference
queries = [
    "thu\u1eadt ng\u1eef trong frontend - optimization",
]
documents = [
    'content creator báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm tại sao nên đọc bài này dành cho các bạn mới tiếp cận và thấy quá nhiều thuật ngữ mới dành cho các bạn có thể đã làm f e một thời gian rồi nhưng đôi khi vẫn không biết có một thứ như vậy tồn tại trên đời có vài keyword để tối ưu performance cho website các thuật ngữ phổ biến trong bài này mình sẽ nói về các thuật ngữ liên quan tới optimization nhé code split hiểu một cách đơn giản thì bạn có một file code rất to bạn chia file to đó ra thành nhiều file nhỏ thì gọi là code split hoặc một ví dụ khác là bạn có một trang web build bằng react trong đó bao gồm header body và footer thì bạn có thể build thành một file bundlejs bao gồm cả 3 component trên hoặc cũng có thể chia cái bundle đó thành 3 file mỗi file chứa một component hãy nghĩ đơn giản code split như là bạn cắt một miếng bánh to thành nhiều miếng nhỏ lazy load lazy load nghĩa là một cách để delay việc load một resource gì đó cho tới khi thật sự cần thiết như trong video ở trên sẽ khá tốn resource nếu chúng ta load hình mà user chưa thực sự cần xem đúng không do đó nó apply lazy load để khi nào ta gần scroll tới cái hình đó thì mới load hình về vừa đỡ tốn c pu cho máy user cùng vừa đỡ tốn 3 g cho người ta resource ở đây bạn có thể define là mọi thứ như là một file code một cái thẻ img một thư viện một response từ a pi khi nghĩ về lazy load thì bạn cần suy nghĩ cái gì có thể lazy và cái gì không thể lazy việc chia ra những resource nào lazy load được cái gì không thể lazy load giúp bạn có chiến thuật quản lý resource tốt hơn back lại cái thuật ngữ bên trên split code làm ví dụ nhé câu hỏi của bạn là cắt cái bundle bự thành nhiều bundle nhỏ để làm gì câu trả lời thường là bạn cắt nó ra thành hai phần phần có thể lazy load được và phần không thể lazy load được do đó bạn sẽ thấy khái niệm lazy load thường đi chung với split code vì lazy load cái resource code thì cần cắt nó thành nhiều chunk nhỏ hơn để hiện thực lazy load về mặt lý thuyết tất cả các resource liên quan tới interaction của user scroll click hover press đều có thể lazy load được prefetchpreload prefetch nghĩa là bạn nói với browser tao có một cái resource này nè khi nào mày rảnh thì load trước giúp tao nhé preload preload nghĩa là bạn nói với browser load trước đống resource này cho tao nhé rảnh hay không thì cũng load okey vậy khi nào thì nên dùng prefetch hay preload prefetch hữu dụng khi bạn tin là user sẽ cần một số resource này trong tương lai mình ví dụ khi user hover vào một link nào đó mình cũng không chắc là user sẽ thật sự click vào link này hay không nhưng khả năng cao là có vì vậy nếu mình prefetch trước cái link này thì nếu user bấm thật thì nó đã được load sẵn cmnr nên sẽ thấy trang này load nhanh vklllllllllll preload hữu dụng khi bạn cần những resource cực kì quan trọng cho bước render đầu tiên ví dụ dễ thấy nhất là font việc preload trước font giúp trang web của bạn render lần đầu tiên thì visual cũng ok luôn thay vì nếu render ra trang web mà font chưa có sau đó load font rồi phải render lại một lần nữa việc thay font như vậy dễ khiến cho layout bị flick và với góc nhìn của user thì thấy nó cũng khá là bad tree shaking bạn tưởng tượng đống codemodule của bạn như một cái cây nha bây giờ bạn cầm cái cây đó rung mạnh thật mạnh cái gì sẽ xảy ra những thành phần yếu ớt trên cái cây đó sẽ bị rơi ra như là già cành khô tổ chym tree shaking trong code cũng tương đương vậy bạn loại bỏ những thứ không cần thiết trong code dead code một cách tự động cái này giống như việc giảm mỡ cho bundle của các bạn sẽ giúp load web nhanh hơn không tốn thời gian cho những thứ không cần thiết s eo viết tắt của cụm từ search engine optimization - tối ưu hóa cho công cụ tìm kiếm hiểu đơn giản là có vô vàn website trên internet đúng không và khi bạn search google thì nó sẽ trả về cho bạn vào trăm hay vài triệu kết quả đó vậy làm sao để trang web của mình nằm ở vị trí cao hơn trong danh sách đó để nhiều user biết tới hơn vậy s eo là cách để tối ưu trang web giúp nó có thứ hạng cao hơn ở các công cụ tìm kiếm như google bing tụi google sẽ có nhiều tiêu chí để quyết định trang web của bạn có phù hợp với user hay không như là content keyword hình ảnh tốc độ load trang ngôn ngữ do đó khi nói làm s eo nghĩa là bạn làm đủ kiểu để các tiêu chí đó tốt hơn phù hợp với user hơn đường nhiên là theo tiêu chí của tụi google rồi google page speed nó là cái trang này nè page speed insights google build ra một cài tool để đo lường tốc độ website của bạn và cho ra thang điểm từ 0 tới 100 điểm càng cao thì chứng tỏ website của bạn ra dẻ load càng nhanh thường cái này là một tiêu chí mà ai cũng dùng để xem coi website của bạn có đuỷnh hay không mình thì thấy nó cũng tương đối tuy nhiên mọi người lại dựa vào nó quá nhiều để đánh giá một website the fold the fold hiểu là bạn cắt cái trang web theo chiều ngang bên trên the fold là những gì đập vào mặt user ngay lập tức khi họ mở trang web của bạn những gì ở dưới thì người ta phải scroll xuống mới thấy được và vì định nghĩa là những gì đập vào mặt user ngay lập tức nên khái niệm này khá là tương đối vì users có thể dùng device khác nhau to nhỏ khác nhau có thể đập vào mặt ở màn hình mate view 4 k 27 inch với màn hình dell full hd 24 inch nó khác nhau nên do đó the fold ở hai màn hình đó cũng khác nhau tại sao cần phải phân biệt the fold nó giúp bạn tối ưu hơn cho user kiểu như ở trên the fold thì load càng nhanh càng tốt vì nó là thứ xuất hiện ngay lập tức khi user mở website ở dưới the fold thì có thể apply lazy load vì user phải scroll xuống mới thấy được phải không nào c ss critical là một cách để trích xuất những c ss above the fold ra riêng để tối ưu tốc độc load nhớ vụ mình nói ở trên là optimize tối đa cho những thứ above the fold không thì cái này là một cách để tối ưu above the fold tuy idea về việc chỉ inject c ss above the fold ra gắn vào khá là đỉnh nhưng thực tế rất rất khó làm cái này nên mình thấy nghe cho vui thì được c ss in j s cái tên nó lên tất cả viết c ss ở java script mà tại sao lại không viết trong file css nhỉ khi dùng css đồng thời kết hợp với các library hay framework gần đầy thì nó sẽ gặp một vài vấn đề c ss là global trong khi mình muốn component của là isolated và không bị hoặc tạo những style lên các thành phần khác lỡ code j s hết rồi nên thôi code luôn j s hết vì nó viết bằng c ss nên sẽ dễ hơn khi bạn muốn làm một số thứ advance hơn với c ss như c ss extraction critical service worker là một đoạn script chạy ở background nó có thể intercept vào request và response giữa web của bạn và server và làm một vài thứ hay ho khác notification cache sync data vì nó đứng ở giữa nên các bạn tưởng tượng nó như proxy cũng được có thể thay đổi data gửi đi hay data nhận về luôn nên cách dùng của service worker cũng khá là sáng tạo có thể là mock proxy server cache lại response để biến web của các bạn trở thành offline web precache những resource cần thiết một key quan trọng khi nói tới service worker là vì nó chạy dưới background nên bạn có thể làm vài thứ hay ho mà không khiến cho web của các bạn chậm đi web worker trước đây thì web chỉ có một luồng thực thi thôi được gọi là main thread và vì chỉ có một luồng thực thì nên nó đẻ ra một vấn đề khi bạn đang thực hiện một tác vụ task gì đó thì các tương tác khác phải chờ cho task đó chạy xong mới chạy được case thử tế là ví dụ bạn code một trang web tính lương cho nhân viên khi có một task tính toán lương đang chạy ở dưới và nếu nó khá nặng thì lúc này user có click vào đâu thì trang web của các bạn cũng không phản hồi được vì đang bận tính lương chết mọe rồi mà còn bắt tao làm cái khác nữa hả do đó web worker đẻ ra để giải quyết vấn đề trên nói đơn giản là cái gì tính toán nặng thì đẩy ra một thread khác để cái thằng main thread rảnh rỗi còn handle interaction từ user hydration cái từ này hơi hiếm gặp nhưng khác là quan trọng và gặp phải ở hầu hết các lib support s sr hydration là quá trình gắn các event listener và các node tương ứng đã được generate từ quá trình s sr httpsgithubcomthanhlmmblogblobmasterpublicmaterialslazy-hydratemp 4rawtrue mình có một bài viết lan quyên tới cái này ở đây server side rendering với hydration lãng phí tài nguyên như thế nào list virtualization bạn tưởng tượng là cái web của mình là một cuộn giấy siêu dài và mình dang nhìn nò thông qua một cửa sổ nhỏ window nghĩa là mình đang nhìn một phần rất nhỏ trong cuộn giấy đó và để nhìn hết thì các bạn phải scroll list virtualization là kĩ thuật chỉ render cái d om node nằm trong cửa sổ window của bạn các thứ nằm ngoài thì bỏ nó ra khỏi d om luôn để trình duyệt không tốn resource để take care những thứ không quan trọng bạn sẽ thấy cái này rất quan trọng khi apply cho những trang web có list cực kì dài và phức tạp như là new feed của facebook twitter tới đây thấy cũng khá dài rồi kiều càng viết nó càng có thêm á nên mình cũng không biết là còn thiếu gì quan trọng không ngoài ra bạn còn muốn tìm hiểu về thuật ngữ ở mảng nào nữa layout c ss state management comment bên dưới nhé bài viết lan quyên httpsthanhleblogblogfix-loi-force-layout-reflow-anh-huong-toi-performance-frontend httpsthanhleblogblogtuong-lai-cua-frontend httpsthanhleblogblogfrontend-performance-pattern-vi frontend term software all rights reserved báo cáo thêm vào series của tôi',
    'editors choice may fest 2024 báo cáo thêm vào series của tôi canva một công cụ thiết kế trực tuyến chắc hẳn bạn đã từng nghe qua hoặc đã từng dùng để tạo ra các design một cách vô cùng nhanh chóng canva được hàng triệu người yêu thích trên toàn cầu không chỉ nổi tiếng với giao diện thân thiện và kho tài nguyên đồ họa khổng lồ mà còn nhờ khả năng cho phép người dùng tự do tải lên các design của riêng họ với hơn 100 triệu người dùng hoạt động hàng tháng và 50 triệu tệp media được tải lên mỗi ngày canva đã nhanh chóng trở thành một trong những nền tảng thiết kế trực tuyến phổ biến nhất thế giới tuy nhiên sự tăng trưởng vượt bậc này cũng đặt ra một thách thức không nhỏ cho đội ngũ kỹ sư của canva đôi khi công ty phát triển nhanh quá cũng khổ mấy ông dev phết làm thế nào để quản lý và lưu trữ khối lượng dữ liệu khổng lồ này một cách hiệu quả đảm bảo trải nghiệm người dùng luôn mượt mà và không bị gián đoạn nhỉ cùng sydexa tìm hiểu cách mà canva giải quyết vấn đề khá khoai này nha bạn cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha và chúng mình có động lực ra những bài viết thú vị hơn nữa chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom kiến trúc hiện tại của canva và vấn đề gặp phải canva được xây dựng trên một kiến trúc microservices linh hoạt nơi mỗi service đảm nhận một vai trò riêng biệt trong đó dịch vụ media đóng vai trò trung tâm quản lý toàn bộ thông tin liên quan đến tài nguyên media của người dùng từ i d chủ sở hữu trạng thái đang hoạt động đã xóa chờ xóa cho đến metadata tiêu đề tác giả từ khóa thông tin màu sắc và đặc biệt là vị trí lưu trữ của tệp tin service media hoạt động như một thủ thư cực kỳ tận tâm liên tục xử lý hàng loạt request đọc và ghi dữ liệu tuy nhiên có một điểm thú vị là lượng yêu cầu đọc vượt xa lượng yêu cầu ghi bởi người dùng thường xuyên tìm kiếm và sử dụng các media có sẵn hơn là chỉnh sửa chúng hầu hết các tệp media ít khi bị thay đổi sau khi được tạo ra ngoại trừ những media nằm trong thư viện ảnh và đồ họa của canva ban đầu canva lựa chọn my sq l trên a ws r ds làm ngôi nhà để lưu trữ kho báu media của mình tuy nhiên khi gia tài media ngày càng đồ sộ với tốc độ tăng trưởng chóng mặt my sq l bắt đầu bộc lộ những hạn chế việc thay đổi cấu trúc schema của các bảng media lớn trở nên chậm chạp có thể mất đến hàng ngày trời giới hạn về tốc độ sao chép của my sq l 56 đã cản trở tốc độ ghi vào các bản sao đọc canva cũng sắp đạt đến giới hạn về kích thước volume e bs của r ds my sq l 16 t b tại thời điểm đó hơn nữa mỗi lần nâng cấp dung lượng lưu trữ lại kéo theo sự gia tăng độ trễ io ảnh hưởng trực tiếp đến tốc độ phản hồi yêu cầu của người dùng việc khởi động lại máy chủ hay nâng cấp phiên bản my sq l cũng gây ra downtime điều tối kỵ đối với một nền tảng trực tuyến như canva các giải pháp tạm thời để khắc phục vấn đề để kéo dài tuổi thọ cho my sq l trong khi tìm kiếm một giải pháp thay thế lâu dài canva đã thực hiện một loạt các biện pháp tạm thời một trong những thay đổi quan trọng là chuyển metadata nội dung sang một cột j so n riêng biệt metadata là phần thông tin mô tả về tệp media thường xuyên được cập nhật và thay đổi việc chuyển metadata sang j so n cho phép canva tự quản lý schema của phần dữ liệu này một cách linh hoạt hơn giảm sự phụ thuộc vào việc thay đổi schema của toàn bộ bảng dữ liệu vốn rất tốn kém về thời gian và tài nguyên tiếp theo canva đã thực hiện phi chuẩn hóa một số bảng denormalized để giảm xung đột khóa lock contention và số lượng phép nối join cần thiết khi thực hiện truy vấn bên cạnh đó canva cũng thực hiện các biện pháp tối ưu hóa khác như loại bỏ các nội dung lặp lại hoặc mã hóa chúng một cách ngắn gọn hơn điều này giúp giảm dung lượng lưu trữ và tăng tốc độ truy vấn canva cũng loại bỏ các ràng buộc khóa ngoại để tăng tốc độ ghi và cập nhật dữ liệu mặc dù điều này có thể làm giảm tính toàn vẹn dữ liệu cuối cùng canva thay đổi cách thức nhập media để giảm số lần cập nhật metadata giúp giảm tải cho hệ thống một giải pháp tạm thời quan trọng khác được canva áp dụng là sharding đây là kỹ thuật chia nhỏ dữ liệu thành nhiều phần và lưu trữ trên nhiều máy chủ khác nhau sharding giúp canva vượt qua giới hạn kích thước tệp bảng 2 t b của hệ thống tệp ext 3 đồng thời tăng tốc độ sao chép và cải thiện hiệu suất cho các truy vấn theo i d vốn là loại truy vấn phổ biến nhất khi tải thiết kế trên canva tuy nhiên sharding cũng có nhược điểm là kém hiệu quả đối với các truy vấn ít phổ biến hơn chẳng hạn như liệt kê tất cả media thuộc sở hữu của một người dùng mặc dù các biện pháp trên đã giúp canva tạm thời giải quyết được những vấn đề cấp bách nhưng về lâu dài họ vẫn cần một giải pháp lưu trữ mới có khả năng mở rộng và đáp ứng tốt hơn nhu cầu ngày càng tăng của người dùng quá trình di chuyển từ my sq l sang dynamo db sau khi xem xét và thử nghiệm nhiều giải pháp khác nhau canva đã chọn dynamo db làm điểm đến cuối cùng cho kho dữ liệu media khổng lồ của mình dynamo db là một cơ sở dữ liệu no sq l được quản lý hoàn toàn bởi a ws nổi tiếng với khả năng mở rộng linh hoạt tính sẵn sàng cao và hiệu suất vượt trội đáp ứng được yêu cầu khắt khe về khả năng mở rộng và tốc độ của canva tuy nhiên quá trình di chuyển dữ liệu từ my sq l sang dynamo db không hề đơn giản canva phải đối mặt với hai yêu cầu quan trọng không được gây ảnh hưởng đến trải nghiệm người dùng và thực hiện chuyển đổi mà không có bất kỳ downtime nào để đảm bảo tính liên tục của dịch vụ canva đã triển khai một chiến lược di chuyển vô cùng tỉ mỉ và thận trọng canva cần di chuyển tất cả các dữ liệu cũ các dữ liệu mới được tạo và các dữ liệu mới được cập nhật sang dynamo d b đầu tiên canva sử dụng hàng đợi s qs của a ws để gửi các thông báo về việc một tập tin media cụ thể đã được tạo cập nhật hoặc đọc nhưng không chứa nội dung của bản cập nhật một worker instance sẽ xử lý các thông báo này để đọc trạng thái hiện tại từ cơ sở dữ liệu my sq l chính và cập nhật dynamo db các bản ghi mới được tạo cập nhật hoặc được đọc gần đây sẽ được ưu tiên sao chép sang dynamo db trước cách tiếp cận này đảm bảo rằng những dữ liệu được sử dụng thường xuyên nhất sẽ có sẵn trên dynamo db giúp giảm thiểu độ trễ và cải thiện trải nghiệm người dùng giảm tải cho cụm my sq l ghi dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db các thông báo về việc tạo mới hoặc cập nhật media được đặt vào hàng đợi ưu tiên cao trong khi các thông báo về việc đọc media được đặt vào hàng đợi ưu tiên thấp điều này đảm bảo rằng các worker instance sẽ tập trung vào việc xử lý các thông báo ghi trước để dữ liệu mới được cập nhật nhanh chóng trên tất cả các bản sao của dynamo db sau khi đã xử lý hết các thông báo ghi chúng mới chuyển sang xử lý các thông báo đọc điều này giúp cho đảm bảo có thể phục vụ các yêu cầu đọc có tính nhất quán cuối cùng eventually consistent từ dynamo db đọc dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db tiếp theo canva thực hiện một quá trình quét và sao chép dần dần để chuyển toàn bộ dữ liệu còn lại sang dynamo db quá trình này được thực hiện một cách cẩn thận và kiểm soát để không ảnh hưởng đến hoạt động của hệ thống quá trình quyét dữ liệu để di chuyển những media còn lại sang dynamo db canva sẽ quét qua tất cả các media bắt đầu từ những media được tạo gần đây và gửi một thông báo qua message queue có độ ưu tiên thấp để worker thực hiện sao chép qua dynamo db quá trình kiểm tra để đảm bảo tính toàn vẹn của dữ liệu trong quá trình di chuyển canva đã thực hiện nhiều biện pháp kiểm tra nghiêm ngặt trước khi chuyển hoàn toàn sang đọc từ dynamo db canva đã thực hiện kiểm tra so sánh kết quả từ cả hai hệ thống my sq l và dynamo db bất kỳ sự không nhất quán nào được phát hiện sẽ được điều tra và sửa chữa ngay lập tức ngoài ra canva cũng sử dụng my sq l như một phương án dự phòng fallback trong giai đoạn đầu của quá trình chuyển đổi điều này đảm bảo rằng nếu có bất kỳ vấn đề nào xảy ra với dynamo db hệ thống vẫn có thể hoạt động bình thường bằng cách đọc dữ liệu từ my sq l nhờ sự kết hợp của các biện pháp này canva đã thực hiện thành công việc di chuyển dữ liệu sang dynamo db một cách an toàn và không gây gián đoạn cho người dùng việc chuyển đổi sang dynamo db đã mang lại những kết quả vượt ngoài mong đợi cho canva độ trễ của dịch vụ media giảm đáng kể giúp cải thiện tốc độ tải và trải nghiệm người dùng khả năng mở rộng của dynamo db cũng được thể hiện rõ rệt khi số lượng người dùng hoạt động hàng tháng của canva tăng gấp ba lần kể từ khi chuyển đổi và dynamo db vẫn hoạt động ổn định tự động mở rộng quy mô để đáp ứng nhu cầu ngày càng tăng không chỉ vậy chi phí vận hành dynamo db còn thấp hơn so với cụm a ws r ds trước đây mang lại hiệu quả kinh tế đáng kể cho canva tuy nhiên quá trình chuyển đổi này cũng mang đến những bài học quý giá cho đội ngũ kỹ sư của canva họ nhận ra tầm quan trọng của việc hiểu rõ đặc điểm truy cập dữ liệu để ưu tiên di chuyển những dữ liệu được sử dụng thường xuyên nhất bên cạnh đó việc kiểm tra và thử nghiệm trong môi trường production cũng được coi là rất cần thiết để đảm bảo tính ổn định của hệ thống sau khi chuyển đổi mặc dù dynamo db không có những tính năng tiện lợi như thay đổi schema dễ dàng hay hỗ trợ truy vấn s ql ad-hoc những lợi ích về khả năng mở rộng và hiệu suất đã bù đắp cho những hạn chế này hành trình chuyển đổi từ my sq l sang dynamo db đã đánh dấu một cột mốc quan trọng trong quá trình phát triển của canva không chỉ giải quyết triệt để bài toán lưu trữ media canva còn chứng minh được khả năng thích ứng và vượt qua những thách thức về công nghệ để đáp ứng nhu cầu ngày càng tăng của người dùng với dynamo db canva đã xây dựng một hệ thống lưu trữ media mạnh mẽ và linh hoạt đủ sức chứa hơn 25 tỷ file media do người dùng tải lên và sẵn sàng đón nhận thêm 50 triệu file mới mỗi ngày thành công này không chỉ khẳng định vị thế của canva là một trong những nền tảng thiết kế trực tuyến hàng đầu thế giới mà còn mở ra những cơ hội phát triển mới trong tương lai nếu thấy bài viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha lời nhắn chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom bạn có thể tìm hiểu thêm chia sẻ từ chính canva httpswwwcanvadevblogengineeringfrom-zero-to-50-million-uploads-per-day-scaling-media-at-canva dynamo db httpsdocsawsamazoncomamazondynamodblatestdeveloperguideintroductionhtml eventual consistency httpswwwscylladbcomglossaryeventual-consistency s qs httpsawsamazoncomsqs system design dynamodb microservices canva coding all rights reserved báo cáo thêm vào series của tôi',
    'báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 10 năm 1 agile là gì agile là một triết lí philosophy cho việc phát triển phần mềm nói cách khác đó là một cách tư duy về các dự án phần mềm các triết lí của agile được cụ thể hóa bởi một số phương pháp phát triển phần mềm method chẳng hạn như extreme programming x p hay scrum gọi tắt là các phương pháp agile mỗi phương pháp agile bao gồm một tập hợp các quy tắc pratice chẳng hạn quy tắc về sử dụng công cụ quản lí mã nguồn quy tắc về các chuẩn lập trình hay quy tắc chuyển giao sản phẩm hàng tuần cho khách hàng triết lí agile được đưa ra trong một bản tuyên ngôn manifesto gồm 4 tiêu chí vàđược làm rõ hơn bởi 12 quy tắc a 4 tiêu chí của agile cá nhân và các tương tác quan trọng hơn các quy trình và công cụ tập trung làm cho phần mềm chạy được hơn là viết các tài liệu mô tả cộng tác với khách hàng hơn là chỉ dựa trên hợp đồng phản ứng với các thay đổi hơn là chỉ tuân theo một kế hoạch định sẵn b 12 quy tắc trong agile thỏa mãn yêu cầu của khách hàng thông qua việc giao hàng sớm và liên tục chào đón việc thay đổi yêu cầu thậm chí là những thay đổi yêu cầu muộn giao phần mềm chạy được cho khách hàng một cách thường xuyên giao hàng tuần hơn là hàng tháng nhà kinh doanh và kỹ sư lập trình phải làm việc cùng nhau hàng ngày trong suốt dựán các dựán được xây dựng xung quanh những cá nhân cóđộng lực cung cấp cho họ môi trường và sự hỗ trợ cần thiết và tin tưởng họ để hoàn thành công việc trao đổi trực tiếp mặt đối mặt là phương pháp hiệu quả nhất để truyền đạt thông tin phần mềm chạy được là thước đo chính của tiến độ phát triển bền vững và duy trì được nhịp độ phát triển liên tục liên tục quan tâm đến kĩ thuật và thiết kế để cải tiến sự linh hoạt sự đơn giản là cần thiết nghệ thuật tối đa hóa lượng công việc chưa hoàn thành nhóm tự tổ chức thích ứng thường xuyên với sự thay đổi 2 quy trình kiểm thử phần mềm trong mô hình agile kiểm thử testing trong dự án agile yêu cầu một sự dịch chuyển mô thức paradigm shift cho vai trò kiểm thử truyền thống nó đòi hỏi một sự thay đổi trong thái độ của kiểm thử viên tester từ một phương pháp tiếp cận theo định hướng ca kíp thành một vai trò được tham gia sâu vào quy trình phát triển từ sớm cách tiếp cận agile tập trung vào việc nhận được những điều đúng đắn ngay từ đầu làm giảm sự cần thiết phải có nhiều kiểm thử viên đảm bảo chất lượng q a tester ở cuối quy trình để đạt được kết quả vai trò kiểm thử viên q a trong agile không bị giới hạn một tập hợp các quy trình được xác định trước cũng như phương pháp luận sẽ chỉ ra vai trò dựa trên tình huống cụ thể a các giai đoạn kiểm thử phần mềm tương ứng với các giai đoạn phát triển phần mềm trong mô hình agile tiền-phân-đoạn pre-iteration đây là giai đoạn yêu cầu được phân tích chi tiết bởi b a business analyst chuyên viên phân tích nghiệp vụ và các tiêu chí chấp nhận acceptance criteria được viết ra cho mỗi một story user story và q a là những người sử dụng các yêu cầu này ngay từ đầu ta cần phải xác minh verify những yêu cầu đó từ sớm và thường xuyên xác minh story xác minh yêu cầu kiểm thử agile thiên về việc đưa ra phản hồi sớm không chỉ bằng cách kiểm tra các yêu cầu mà còn là phải làm việc đó từ sớm các q a tester cần phải xem xét các yêu cầu story từ sớm để làm sáng rõý nghĩa và tính khả-kiểm testability việc này sẽđảm bảo các yêu cầu luôn rõ ràng và có thể kiểm thửđược yêu cầu cần đủ nhỏ để có ý nghĩa trong bối cảnh xác định tiêu chí chấp nhận acceptance criteria - những story thường được sử dụng cho các tiêu chí chấp nhận không nên bị trùng lặp chồng chéo từ những story khác nhau để hiểu rõ hơn về giai đoạn này chúng ta cùng tìm hiểu những phần sau user story là một tóm tắt đơn giản ngắn gọn về chức năng mà khách hàng mong muốn nó thường được viết theo mẫu sau với tôi muốn vì ví dụ với vai trò là người dùng website tôi muốn có một chức năng tìm kiếm nâng cao để có thể tìm kiếm nhanh chóng và dễ dàng những quyển sách tôi cần tiêu chí chấp nhận acceptance criteria là những tiêu chí dùng để đánh giá sản phẩm chức năng đã thực hiện đúng yêu cầu hay chưa có thể coi đó là các tiêu chí xác nhận hoàn thành story các tiêu chí đặt ra phải đáp ứng các đặc tính sau tính khả dụng usability là tiêu chí trả lời cho câu hỏi có dễ sử dụng hay không là chìa khóa đưa ra các tiêu chí đánh giá có thể xác định tính chức năng functionality xử lý lỗi error handing liệt kê ra những lỗi có thể gặp phải trong quá trình sử dụng chương trình và phương thức để xử lý ví dụ người dùng có thể thực hiện sai thứ tự các bước và khi đó chương trình sẽ xử lý như thế nào hiệu suất performance stress tests là tiêu chí trả lời cho câu hỏi hệ thống sẽ hoạt động như thế nào dưới những áp lực như có nhiều người truy cập tại cùng 1 thời điểm có quá nhiều request được gửi đến hệ thống ví dụ với story như trên ta có các tiêu chí chấp nhận như sau tôi có thể giới hạn tìm kiếm theo định dạng loại tôi có thể tìm kiếm theo phạm vi ngày tôi có thể giới hạn tìm kiếm thông tin nhà xuất bản như tiêu đề tác giả chủ đề địa điểm nhà xuất bản và số lượng xuất bản tôi có thể giới hạn tìm kiếm bởi một tiêu chí cụ thể như danh mục bộ sưu tập tôi có thể lọc filter để đạt được mục tiêu của giai đoạn này cần có sự giao tiếp chặt chẽ giữa các bên đội phát triển nhà phân tích nghiệp vụ đảm bảo chất lượng khả kiểm testable các khía cạnh có thể kiểm thửđược của story phải được xem xét chi tiết để có thể kiểm thửđược story đó những yếu tố này thường là tìm kiếm các yêu cầu ẩn môi trường dữ liệu kiểm thử test data sự phụ thuộc vào các yêu cầu khác việc có được các chi tiết này sớm sẽ giúp câu chuyện được ưu tiên đúng đắn hơn trong backlog và cho phép việc thực hiện story đó suôn sẻ hơn trong phân đoạn iteration q a tester cũng tham gia cuộc họp lập kế hoạch cho phân đoạn để cung cấp quan điểm kiểm thửđể nhóm có thểđưa ra được ước lượng phát triển tham gia trong việc lập kế hoạch phân đoạn đóng vai trò quan trọng khi một số các yêu cầu tiềm ẩn thường được phát hiện bởi các q a tester b các hoạt động đảm bảo chất lượng trong phân đoạn môt khi q a tester đã thấy thoải mái với các tiêu chí chấp nhận của một story nào đó họ có thể giúp nhóm định nghĩa các kiểm thử chấp nhận acceptance tests cho story đó kiểm thử chấp nhận là các yêu cầu về phương diện kiểm thử cần được thực hiện để hiểu các yêu cầu phần mềm các kiểm thử chấp nhận này được sinh ra tự động và dùng để hướng dẫn quá trình phát triển các kiểm thử chấp nhận không nên bao gồm tất tần tật các tình huống case scenarios do điều này có thể tạo ra những sự ngưng trệ không cần thiết và có thể tạo ra quá nhiều bộ kiểm thử tự động automated test tương tự nhau kiểm thử chấp nhận trong các dự án agile là khác biệt so với các dự án truyền thống không giống như các dự án truyền thống nơi kiểm thử chấp nhận xảy ra ở phần cuối của vòng đời phần mềm trong dự án agile kiểm thử chấp nhận được thực hiện trước khi phần mềm được chuyển giao kiểm thử chấp nhận cũng có xu hướng được tự động hóa để họ có thể chạy như là kiểm thử hồi quy regression test kiểm thử tự động rất quan trọng đối với mọi dựán agile các bản build thường xuyên yêu cầu các chu kỳ phản hồi ngắn do đó kiểm thử hồi quy phải nhanh chóng và chính xác ví dụ trở lại với ví dụ ở phần mở đầu khi khách hàng yêu cầu thực hiện tìm kiếm sách theo nhiều tiêu chí trong trường hợp các tiêu chí tìm kiếm được chia nhỏ ra để thực hiện như sau sprint 1 phát triển chức năng tìm kiếm theo tên sách và thể loại sprint 2 phát triển chức năng tìm kiếm theo tác giả và nhà xuất bản sprint 3 phát triển chức năng tìm kiếm theo ngày phát hành tình trạng sách như vậy khi kiểm thử chấp nhận chức năng tìm kiếm ở sprint 2 chúng ta sẽ phải kết hợp việc kiểm thử lại chức năng tìm kiếm theo các tiêu chíở sprint 1 nếu không có các công cụ kiểm thử tựđộng hỗ trợ cho việc kiểm thử lại các chức năng ở sprint 1 thì người thực hiện kiểm thử sẽ mất thêm thời gian cho việc kiểm thử lại sprint 1 trong các dựán agile kiểm thử tựđộng được thực hiện bởi tất cả các cấp độ - lập trình viên kiểm thử viên bảo đảm chất lượngq a tester và các nhà phân tích nghiệp vụ b a sự tham gia của tất cả mọi người làm gia tăng tính xác đáng của các phần kiểm thử và thường giúp xác định đúng các phần kiểm thử tuy nhiên điều này không có nghĩa là tất cả mọi người phải đều phải viết mã kiểm thử 3 sử dụng tự động hóa có mục đích tự động hóa đồng nghĩa với việc cung cấp thông tin phản hồi sớm về những mã nguồn được tạo ra và điều quan trọng là phải xác định những gì cần tự động hoá và những gì thì không tất cả các kiểm thử tự động đều mất chi phí chi phí của tự động hóa nên được so sánh với chi phí khi không thực hiện việc đó một chu kỳ phản hồi dài hơn đồng nghĩa với việc phải có nhiều người đóng góp nhiều thời gian hơn mới có được phản hồi tức thì một hoạt động bảo đảm chất lượng điển hình trong phân đoạn là việc liên tục đo lường chất lượng của phần mềm q a tester tham gia vào việc bàn giao các story cho các nhà phát triển điều này giúp họ hiểu được những yêu cầu kiểm thử của story để họ có thể triển khai được kĩ thuật phát triển định-hướng-kiểm-thử test-driven development - t dd ngoài ra việc bàn giao các kiểm thử chấp nhận và giúp cho các lập trình viên hiểu các khía cạnh khả kiểm testability của story để tránh được các lỗi defect phổ biến những hoạt động này đòi hỏi một mức độ cao của giao tiếp giữa các lập trình viên và các chuyên viên phân tích nghiệp vụđể làm rõ yêu cầu vàđảm bảo sản phẩm được xây dựng đúng đắn ngay từ đầu q a tester có thể giúp giải quyết các vấn đề trước hết bằng cách tích cực tham gia vào quy trình tổng thể ta thậm chí có thể kết hợp với các nhà phát triển làm việc trên một story hoặc các kiểm thử cho story để thể hiểu rõ hơn về các yêu cầu điều bắt buộc là một story khi được chuyển giao nó phải được kiểm thử đúng cách trong một môi trường thích hợp một khi các q a tester hài lòng với những story họ sẽ đưa nó vào các tiến trình kiểm thử tiếp theo một điều quan trọng khác là phải suy nghĩ vượt ra ngoài các yêu cầu bằng văn bản và thử nghiệm với các kiểm thử thăm dò exploratory testing để thực hiện kịch bản ngoài lề và thực hiện các kiểm thử tiêu cực đểđảm bảo chắc chắn phần mềm được viết ra là chất lượng kiểm thử thăm dò không phải là thực thi tất cả các kịch bản kiểm thửđược xác định trước nó là nghệ thuật thăm dò phần mềm ngoài các trường hợp kiểm thử test case vàđồng thời giữ tập trung xung quanh các yêu cầu cụ thể nguồn tham khảo httpwwwlogigearcommagazineagilea-testers-perspective-on-agile-projects httpagilemanifestoorg httpwwwmountaingoatsoftwarecomagile agile q a all rights reserved báo cáo thêm vào series của tôi',
]
query_embeddings = model.encode_query(queries)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# [1, 768] [3, 768]

# Get the similarity scores for the embeddings
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
# tensor([[ 0.4969, -0.0312, -0.0005]])

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
    • min: 3 tokens
    • mean: 13.59 tokens
    • max: 62 tokens
    • min: 76 tokens
    • mean: 255.19 tokens
    • max: 256 tokens
    • min: 112 tokens
    • mean: 254.92 tokens
    • max: 256 tokens
  • 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 with these parameters:
    {
        "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

@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

@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}
}