---
tags:
- sentence-transformers
- sentence-similarity
- feature-extraction
- dense
- generated_from_trainer
- dataset_size:6120
- loss:MultipleNegativesRankingLoss
base_model: keepitreal/vietnamese-sbert
widget:
- source_sentence: giới thiệu
sentences:
- khai but dau xuan báo cáo thêm vào series của tôi bài đăng này đã không được cập
nhật trong 2 năm đối với người quan tâm đến an ninh mạng hay có kiến thức về mạng
máy tính thì chắc không còn xa lạ với phần mềm wireshark wireshark được sử dụng
để phân tích mạng network packet analyzer công dụng của ứng dụng này là dùng để
bắt phân tích và xác định các vấn đề có liên quan đến network bao gồm kết nối
chậm rớt gói tin hoặc các truy cập bất thường i cài đặt wireshark bạn có thể tải
xuống bản phát hành chính thức tại httpswwwwiresharkorgdownloadhtml ở đây bạn
hãy chọn phiên bản tương ứng với máy của mình và tải xuống i i giới thiệu về giao
diện bây giờ bạn đã cài đặt wireshark tiếp theo chúng ta sẽ khám phá về giao diện
của wireshark hình bên dưới hiển thị giao diện người dùng của wireshark như bạn
thường thấy sau khi một số gói tin được bắt hoặc tải xuống cách thực hiện sẽ được
mô tả sau giao diện người dùng của wireshark cửa sổ chính của wireshark bao gồm
các phần thường được biết đến từ nhiều chương trình g ui khác menu chính chứa
các mục sau menu chính của wireshark menu này chứa các mục open và merge capture
files save print export capture files và quit menu này chứa các mục find a packet
time reference hoặc đánh dấu một hoặc nhiều gói tin xử lý các cấu hình và đặt
tùy chọn của bạn menu này chứa các mục để chuyển đến một gói cụ thể như back forward
go to packet menu này cho phép bạn bắt đầu và dừng bắt gói tin và chỉnh sửa các
bộ lọc menu này chứa các mục để thao tác các bộ lọc bật hoặc tắt phân tích các
giao thức giải mã và theo dõi luồng menu này sẽ hiển thị các cửa sổ thống kê khác
nhau bao gồm tóm tắt các gói đã được thu thập hiển thị thống kê phân cấp giao
thức và nhiều công dụng khác menu này chứa các mục để hiển thị các thống kê mạng
liên quan đến điện thoại menu này chứa các mục để hiển thị thống kê không dây
bluetooth và i ee e 80211 menu này chứa các công cụ khác nhau có sẵn trong wireshark
chẳng hạn như tạo quy tắc a cl tường lửa menu này chứa các mục để giúp người dùng
chẳng hạn như truy cập vào một số trợ giúp cơ bản các trang hướng dẫn sử dụng
các công cụ dòng lệnh khác nhau truy cập trực tuyến vào một số trang web và hộp
thoại giới thiệu thông thường thanh công cụ chính cho phép truy cập nhanh vào
các mục thường dùng từ menu thanh công cụ bộ lọc cho phép người dùng đặt bộ lọc
hiển thị để lọc gói nào được hiển thị ngăn danh sách gói hiển thị một bản tóm
tắt của mỗi gói tin được thu thập bằng cách nhấp vào các gói trong ngăn này bạn
kiểm soát những gì được hiển thị trong hai ngăn còn lại packet list ngăn chi tiết
hiển thị chi tiết hơn về gói được chọn trong ngăn danh sách gói ngăn này hiển
thị các giao thức và trường giao thức của gói được chọn packet details ngăn byte
hiển thị dữ liệu từ gói tin được chọn trong packet list và đánh dấu trường được
chọn trong packet details và hiển thị dưới dạng hexdump packet bytes ngăn packet
diagram hiển thị gói được chọn trong packet list dưới dạng sơ đồ kiểu sách giáo
khoa thanh trạng thái hiển thị một số thông tin chi tiết về trạng thái chương
trình hiện tại và dữ liệu đã thu thập the statusbar i ii cách sử dụng wireshark
cơ bản a cách bắt các gói tin trực tiếp trong wireshark khi bạn mở wireshark mà
không bắt đầu bắt gói tin hoặc mở tệp nó sẽ hiển thị màn hình chào mừng liệt kê
mọi tệp đã mở gần đây và các giao diện bắt gói tin có sẵn hoạt động mạng cho mỗi
giao diện sẽ được hiển thị trong một đường gấp khúc bên cạnh tên giao diện bạn
có thể chọn nhiều hơn một giao diện và bắt đồng thời nhiều hoạt động mạng bạn
có thể bấm vào phần bánh răng ở phần thanh công cụ chính để cài đặt input output
của các hoạt động mạng để bắt đầu capture chúng ta có những cách sau bạn có thể
nhấp đúp vào một trong những hoạt động mạng trên màn hình chào mừng bạn có thể
chọn một trong những hoạt động mạng trên màn hình chào mừng sau đó chọn capture
start hoặc nhấp vào nút trên thanh công cụ chính b cách xem các gói tin trong
wireshark khi bạn đã bắt một số gói hoặc bạn đã mở tệp capture đã lưu trước đó
bạn có thể xem các gói được hiển thị trong packet list bằng cách chỉ cần nhấp
vào một gói trong packet list thao tác này sẽ hiển thị gói đã chọn trong packet
details và packet bytes sau đó bạn có thể mở rộng bất kỳ phần nào của packet details
để xem thông tin chi tiết về từng giao thức trong mỗi gói nhấp vào một mục trong
packet details sẽ làm nổi bật các byte tương ứng trong chế độ xem byte ví dụ về
gói t cp được chọn được hiển thị trong hình nó cũng có số acknowledgment trong
tiêu đề t cp được chọn hiển thị trong dạng xem byte dưới dạng các byte đã chọn
c cách lọc các gói tin trong wireshark wireshark có hai kiểu lọc là capture filters
và display filters capture filter được sử dụng để lọc khi bắt gói tin từ các hoạt
động mạng display filters cho phép bạn tập trung vào các gói tin mà bạn quan tâm
trong khi ẩn những gói bạn không quan tâm chúng cho phép bạn chỉ hiển thị các
gói dựa trên giao thức sự hiện diện của một trường the presence of a field giá
trị của các trường the values of fields so sánh giữa các trường a comparison between
fields và nhiều hơn nữa để chỉ hiển thị các gói tin chứa một giao thức cụ thể
hãy nhập tên giao thức đó vào thanh công cụ display filter của cửa sổ wireshark
và nhấn enter để áp dụng bộ lọc hình dưới cho thấy một ví dụ về những gì sẽ xảy
ra khi bạn nhập udp vào thanh công cụ display filter wireshark cung cấp ngôn ngữ
display filter cho phép bạn kiểm soát chính xác gói nào được hiển thị chúng có
thể được sử dụng để kiểm tra sự hiện diện của một giao thức hoặc field giá trị
của field hoặc thậm chí so sánh hai fields với nhau các phép so sánh này có thể
được kết hợp với các toán tử logic như and và or và dấu ngoặc đơn thành các biểu
thức phức tạp bạn có thể tạo display filter so sánh các giá trị bằng cách sử dụng
một số toán tử so sánh khác nhau ví dụ để chỉ hiển thị các gói đến hoặc đi từ
địa chỉ i p 1921681102 hãy sử dụng ipaddr 1921681102 bạn có thể tham khảo những
cú pháp để sử dụng display filter hiệu quả hơn tại bảng cheat sheet bên dưới cyber
security wireshark an ninh mạng mạng máy tính all rights reserved báo cáo thêm
vào series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 5 năm
giới thiệu bad programmers worry about the code good programmers worry about data
structures and their relationships linus torvalds thật là quá đúng đó là lý do
tại sao mọi nhà tuyển dụng tìm kiếm một ứng viên có hiểu biết tốt về cấu trúc
dữ liệu trong các các buổi phỏng vấn điều này cũng đúng cho các android developer
trong blog này chúng ta sẽ đề cập đến tất cả các data structure cần thiết cho
bất kỳ android developer mặc dù còn nhiều điều cần tìm hiểu chúng ta sẽ đề cập
đến những câu hỏi được sử dụng nhiều nhất và thường xuyên nhất trong phỏng vấn
android nguồn httpsblogmindorkscomandroid-developer-should-know-these-data-structures-for-next-interview
data structure là gì data structure là định dạng tổ chức quản lý và lưu trữ dữ
liệu cho phép truy cập và sửa đổi hiệu quả chính xác hơn data structure là tập
hợp các giá trị dữ liệu mối quan hệ giữa chúng và các chức năng hoặc hoạt động
có thể được áp dụng cho dữ liệu ví dụ chúng ta có một số dữ liệu của một người
có name a bc và age 25 ở đây a bc có kiểu dữ liệu string và 25 là kiểu dữ liệu
interger chúng ta có thể sắp xếp dữ liệu này dưới dạng bản ghi giống như bản ghi
user sẽ có cả tên người dùng và tuổi trong đó bây giờ chúng ta có thể thu thập
và lưu trữ các bản ghi người dùng trong một tệp hoặc cơ sở dữ liệu dưới dạng cấu
trúc dữ liệu bây giờ hãy cùng tìm hiểu về cấu trúc dữ liệu được sử dụng nhiều
nhất và thường được hỏi trong android cấu trúc dữ liệu được sử dụng nhiều nhất
và được hỏi nhiều nhất trong android array linked list hash table stack queue
tree graph array mảng là cấu trúc dữ liệu được sử dụng nhiều nhất và dễ nhất được
sử dụng để lưu trữ cùng loại dữ liệu mảng là một tập hợp các mục tương tự được
lưu trữ ở các vị trí bộ nhớ liền kề ví dụ nếu bạn đang lưu trữ điểm của 10 sinh
viên thì bạn có thể thực hiện việc này bằng cách tạo 10 biến số nguyên cho mỗi
sinh viên và bạn có thể lưu trữ điểm trong các biến này nhưng bạn phải quản lý
10 biến khác nhau ở đây đây là một nhiệm vụ rất khó khăn vì nếu trong tương lai
bạn phải lưu trữ 1000 điểm của sinh viên thì bạn phải tạo 1000 biến nếu bạn đang
theo phương pháp này vì vậy chúng ta có thể sử dụng mảng cho mục đích này tất
cả những gì bạn cần làm chỉ là tạo ra một mảng có tên là marks có kích thước 10
hoặc 1000 hoặc bất cứ thứ gì khác và sau đó lưu trữ các dấu trong mảng đó l ưu
ý trong hầu hết tất cả các ngôn ngữ lập trình chúng ta sử dụng index dựa trên
0 tức là index của mảng sẽ bắt đầu từ 0 và đi đến n-1 trong đó n n là kích thước
của mảng bạn có thể truy cập các phần tử của mảng với sự trợ giúp của các chỉ
mục của nó marks 0 to access the 1 st element ie element at index 0 marks 2 to
access the 3 rd element ie element at index 2 marks 4 to access the 5 th element
ie element at index 4 một số thao tác cơ bản trên mảng insertion chèn một phần
tử đã cho vào một chỉ mục cụ thể của mảng deletion xóa một phần tử đã cho khỏi
mảng searching tìm kiếm một phần tử cụ thể trong mảng updation cập nhật một phần
tử của một mảng tại một chỉ mục cụ thể traversing in hoặc duyệt toàn bộ mảng linked
list một linked list gần như tương tự với một mảng tức là nó cũng là một cấu trúc
dữ liệu tuyến tính để lưu trữ cùng loại dữ liệu ở đây dữ liệu không được lưu trữ
một cách liên tục dữ liệu được lưu trữ trong danh sách được liên kết ở dạng nodes
và mỗi node có thể được kết nối với node khác với sự trợ giúp của một số con trỏ
hoặc tham chiếu đến node tiếp theo vì vậy có hai phần của một node trong danh
sách được liên kết tức là phần dữ liệu và con trỏ hoặc phần tham chiếu phần dữ
liệu lưu trữ dữ liệu của node trong khi con trỏ hoặc phần tham chiếu lưu địa chỉ
của node tiếp theo nếu có hình ảnh trên là một ví dụ về linked list đơn lẻ tức
là ở đây chúng tôi chỉ có địa chỉ của node tiếp theo có một linked list khác được
gọi là doubly linked list trong đó địa chỉ của node trước và node tiếp theo được
giữ bởi bất kỳ node nào ngoài hai loại danh sách được liên kết này chúng ta còn
có một circular linked list ở đây trong hình ảnh trên head đang chỉ vào node đầu
tiên của linked list và node cuối cùng của linked list đang trỏ đến null tức là
không có node nào xuất hiện sau node đó một số thao tác cơ bản trên linked list
insertion tại đây bạn có thể chèn node vào linked list bạn có thể chèn node vào
bất kỳ nơi nào của linked list deletion trong thao tác xóa bạn có xóa node từ
bất kỳ node nào khỏi linked list searching bạn sẽ được cung cấp một yếu tố và
bạn phải tìm kiếm yếu tố đó trong linked list traversing di chuyển toàn bộ danh
sách được liên kết để có được từng phần tử của linked list hash table hash table
là một loại cấu trúc dữ liệu được sử dụng để lưu trữ dữ liệu dưới dạng cặp khóa
key-value bạn sẽ có một số giá trị hoặc dữ liệu và dựa trên dữ liệu đó bạn sẽ
tạo một khóa và với sự trợ giúp của khóa đó bạn sẽ lưu trữ giá trị trong bảng
hash nếu đầu vào được phân phối đồng đều thì bảng hash sẽ thực hiện thao tác chèn
xóa và tìm kiếm trong thời gian o 1 quá trình tạo khóa và lưu trữ dữ liệu dựa
trên khóa đó được gọi là xóa hashing để tạo khóa từ dữ liệu chúng ta cần một hàm
được gọi là hàm hash hash hàm hash sẽ lấy dữ liệu làm đầu vào và đưa khóa làm
đầu ra ví dụ nếu dữ liệu được lưu trữ là 1 2 3 4 5 26 17 và hàm băm được sử dụng
là hash function k k 10 và dữ liệu sẽ được lưu trữ trong bảng hash theo cách sau
những điểm cần suy nghĩ khi sử dụng bảng hash hàm hash phải sao cho các khóa được
tạo được phân phối đồng đều kích thước của bảng hash phụ thuộc vào hàm hash vì
vậy việc lựa chọn hàm hash nên được thực hiện hoàn hảo trong trường hợp va chạm
trong bảng hash hãy áp dụng kỹ thuật xử lý va chạm thích hợp stack một stack là
một cấu trúc dữ liệu tuyến tính sử dụng thứ tự last in first out l if o tức là
phần tử được chèn cuối cùng sẽ được bật ra trước ví dụ nếu bạn đặt một cuốn sách
lên trên những cuốn sách khác và tiếp tục quá trình này trong 50 cuốn sách thì
cuốn sách trên cùng sẽ được tìm nạp trước ở đây bạn có thể nhận thấy rằng cuốn
sách trên cùng là cuốn sách được đặt ở cuối hoặc được đặt gần đây trong stack
chúng ta có một biến top mà biểu thị đỉnh của stack điều này là cần thiết bởi
vì tất cả các hoạt động của ngăn xếp được thực hiện với sự trợ giúp của biến top
sau đây là một ví dụ về stack nếu bạn muốn xóa các phần tử khỏi stack ở trên thì
5 sẽ bị xóa trước tiếp theo là 4 3 2 và 1 một số thao tác cơ bản trên stack push
push được sử dụng để chèn một phần tử ở đầu ngăn xếp pop pop được sử dụng để xóa
một phần tử khỏi đỉnh ngăn xếp top top được sử dụng để biểu thị phần tử trên cùng
của ngăn xếp queue queue là cấu trúc dữ liệu tuyến tính sử dụng thứ tự first in
first out f if o tức là phần tử đến trước trong hàng đợi sẽ bị xóa đầu tiên khỏi
hàng đợi ví dụ trong khi đứng xếp hàng để đặt vé người đến trước sẽ đặt vé trước
và người mới đến đặt vé phải đứng ở cuối hàng đợi trong queue chúng ta có các
front và rear font được sử dụng để trỏ đến phần tử phía trước của queue trong
khi rear được sử dụng để trỏ đến phần tử phía sau của queue sau đây là một ví
dụ về hàng đợi vì vậy nếu bạn muốn xóa các thành phần khỏi hàng đợi trên thì 1
sẽ bị xóa trước tiếp theo là 2 3 4 và 5 tương tự nếu bạn muốn chèn một phần tử
trong hàng đợi ở trên thì nó sẽ được chèn từ rear chứ không phải từ front một
số thao tác cơ bản trên queue enqueue enqueue được sử dụng để chèn một phần tử
vào cuối queue dequeue dequeue được sử dụng để xóa một phần tử từ phía trước queue
front nó được sử dụng để biểu thị thành phần phía trước của queue rear nó được
sử dụng để biểu thị thành phần phía sau của queue tree tree là một cấu trúc dữ
liệu phi tuyến tính phân cấp được sử dụng để lưu trữ dữ liệu dưới dạng các node
ở đây chúng ta có node và tất cả các node được kết nối với nhau với sự trợ giúp
của các cạnh được vẽ giữa chúng một node cha có thể không có con hoặc một con
hoặc nhiều hơn một con nhưng node con không thể có nhiều hơn một cha sau đây là
một ví dụ đơn giản về tree một số thuật ngữ liên quan đến tree là root root là
node có mặt ở đầu tree chỉ có thể có một gốc của một tree cụ thể parent tất cả
các node có ít nhất một con được gọi là node cha child node bên dưới node cha
được gọi là node con của node cha leaf node không có con được gọi là node leaf
một số loại cây là general tree binary tree binary search tree a vl tree red-black
tree n-ary tree graph graph tương tự như tree tức là nó cũng là cấu trúc dữ liệu
phi tuyến tính lưu trữ dữ liệu dưới dạng các node và tất cả các node được kết
nối với nhau với sự trợ giúp của các cạnh sự khác biệt giữa tree và graph là có
một chu kỳ trong graph nhưng không có chu trình như vậy trong trường hợp của tree
graph bao gồm một tập hợp các node hữu hạn và một tập hợp các cạnh hữu hạn chịu
trách nhiệm kết nối các node sau đây là một ví dụ về đồ thị sau đây là các loại
biểu đồ directed graph ở đây các cạnh sẽ trỏ đến một số node tức là bạn sẽ có
một mũi tên chỉ vào một node từ một node undirected graph ở đây không có mũi tên
nào ở giữa các node ví dụ trên là một ví dụ về đồ thị vô hướng một số kỹ thuật
truyền tải đồ thị phổ biến là depth-first searchd fs breadth-first searchb fs
kết luận trên đây là một số kiến thức về data structure hi vọng bài viết này sẽ
giúp bạn có 1 buổi phỏng vấn thành công android interview all rights reserved
báo cáo thêm vào series của tôi
- happy new year báo cáo thêm vào series của tôi bài đăng này đã không được cập
nhật trong 4 năm dạo này ăn dầm nằm dề với nàng react nhiều quá lắm khi không
ngóc đầu lên được ông bà ta có câu chán cơm thèm phở nên lang thang trên các blog
để mong tìm được 1 chút thú vui khác react đã khá quen thuộc thì vô tình thấy
một framework js là mithril js tuy nó chưa quá nổi tiếng trên cộng đồng frontend
nhưng đọc lướt qua phần giới thiệu lại thấy khá ấn tượng 1 giới thiệu như đã đề
cập ở tiêu đề bài viết framework này có tên là mithril js cái tên được lấy cảm
hứng từ một loại vật liệu hư cấu trong các tác phẩm của nhà văn giáo sư người
anh j r r tolkien là một framework js phía client dùng để xây dựng các ứng dụng
s pa theo mô hình m vc như react hay vue về chi tiết phần giới thiệu cũng như
hướng dẫn để bắt đầu với mithril js thì mình xin phép không đề cập quá cụ thể
ở đây vì các bạn có thể vào thẳng trang chủ của nó để đọc ở trang chủ khá chi
tiết và rõ ràng tuy nhiên phải nói qua cái mà gây ấn tượng ngay lúc đọc phần giới
thiệu thì hiện tại đây là một javascript framework có performance tốt nhất cũng
như có size nhỏ nhất so với các javascript framework phổ biến hiện nay 2 các đặc
trưng và thành phần chính mỗi framework js đều xây dựng những đặc trưng và định
nghĩa một cấu trúc cơ chế hoạt động riêng react thì có virtual do m stateprops
life-cycle thì với mithril js cũng vậy sau đây là 1 số thành phần chính hay những
giá trị cốt lõi xương sống của nó 21 cú pháp mithril js được xây dựng một cú pháp
viết riêng thông qua từ khóa m tuy nhiên nếu bạn đã từng làm việc với react và
đã quá quen với cách viết của j sx thì đừng lo webpack và babel sẽ giúp các bạn
làm việc này qua vài bước config đơn giản hướng dẫn đầy đủ tại trang chủ của mithril
js hoặc ở cuối bài viết mình có 1 ví dụ trong đó đã dựng sẵn 1 số config cơ bản
function my component return view m main m h 1 hello world can be written as function
my component return view main h 1 hello world h 1 main 22 virtual node hay vnodes
cũng như react có virtual do m thì ở mithril js là vnodes vnodes là một object
đại diện cho các phần tử d om hoặc các phần của d om công cụ virtual do m của
mithril sử dụng vnodes để tạo ra một cây d om vnodes được khởi tạo thông qua từ
khóa m m selector attributes children hoặc define a component var example component
view function vnode return m div vnode attrs hello vnode children consume it m
example component style colorred world equivalent h tm l hello world cấu trúc
của một vnodes 23 component component trong mithril js là object có thuộc tính
view là một hàm để return ra kết quả cuối cùng ở giao diện ví dụ define your component
var example view function vnode return m div hello consume your component m example
equivalent h tm l hello vá một loạt các method trong lifecycle methods đại khái
là giống như các lifecycle trong react vậy var component with hooks oninit function
vnode console log initialized oncreate function vnode console log d om created
onbeforeupdate function new vnode old vnode return true onupdate function vnode
console log d om updated onbeforeremove function vnode console log exit animation
can start return new promise function resolve call after animation completes resolve
onremove function vnode console log removing d om element view function vnode
return hello 24 state cũng như các framework js khác để quản lý virtual d om hay
vnode thì mithril js cũng có state state trong mithril js có thể được khai báo
hoặc khởi tạo bằng nhiều cách khác nhau closure component state function component
with state initial vnode component state variable unique to each instance var
count 0 view function which returns a vnode return oninit function vnode console
log init a closure component view function vnode return m div m p count count
m button onclick function count 1 increment count p oj o component state var component
with initial state data initial content view function vnode return m div vnode
state data m component with initial state equivalent h tm l initial content hoặc
1 số cách khác như thông qua vnodes hoặc this 25 routing một đặc trưng không thể
không nhắc đến của mithril js đó là việc tích hợp sẵn cơ chế quản lý chuyển route
giống như trong vue js hay react-router-dom vậy bạn không cần phải cài đặt gì
thêm var routed component view function return a redraw happens asynchronously
after the route changes m m route link href m div onclick function m route set
var list component view return m div list data m route document body routed component
data list component và còn khá nhiều thành phần khác nữa chi tiết hơn các bạn
sẽ tìm hiểu dần ở docs của nó nếu thấy hứng thú nhé 3 kết luận tuy mới chỉ tìm
hiểu về mithril js nhưng mình thấy cũng khá là thú vị tuy nhiên do thời gian tìm
hiểu chưa nhiều và chưa thấu hiểu hết nên nếu trong bài viết có gì sai sót mong
các bạn lượng thứ bỏ qua và góp ý thêm cho mình nhé mình cũng đã thử dựng một
ứng dụng t od o nhỏ bằng mithril js và đã config sẵn babel và webpack cơ bản các
bạn có thể tham khảo code trên github của mình ở đây xin chào và hẹn gặp lại java
script front-end all rights reserved báo cáo thêm vào series của tôi
- source_sentence: mount trong docker
sentences:
- báo cáo thêm vào series của tôi bất kể quy mô ngành nghề hay công ty nào phân
tích nghiệp vụ và quản lý sản phẩm là hai thành phần thiết yếu chúng đóng vai
trò quan trọng trong việc giúp các doanh nghiệp mở rộng duy trì tính cạnh tranh
và hoàn thành các mục tiêu của mình bài đăng này sẽ mô tả phân tích nghiệp vụ
và quản lý sản phẩm xem xét mối quan hệ giữa chúng và nêu bật sáu cách chúng bổ
sung cho nhau 1 phân tích nghiệp vụ là gì quá trình xác định các yêu cầu vấn đề
và cơ hội kinh doanh và đưa ra giải pháp để giải quyết chúng được gọi là phân
tích nghiệp vụ để tìm hiểu về nhu cầu của các bên liên quan và thu thập dữ liệu
về hoạt động hệ thống và quy trình kinh doanh các nhà phân tích nghiệp vụ phải
cộng tác chặt chẽ với họ họ sử dụng dữ liệu này để tạo ra các kế hoạch và giải
pháp bổ sung cho các mục tiêu của công ty 2 quản lý sản phẩm là gì quản lý sản
phẩm là quá trình tổ chức tạo ra và giám sát một sản phẩm hoặc dịch vụ từ khi
hình thành đến khi ra mắt và hơn thế nữa người quản lý sản phẩm chịu trách nhiệm
xác định nhu cầu của khách hàng chỉ định các tính năng của sản phẩm phát triển
lộ trình và đảm bảo sản phẩm được giao đúng tiến độ trong ngân sách và làm hài
lòng khách hàng 3 mối quan hệ giữa phân tích nghiệp vụ vàquản lý sản phẩm quản
lý sản phẩm và phân tích nghiệp vụ là hai trách nhiệm riêng biệt nhưng có mối
liên hệ với nhau sự thành công của bất kỳ sản phẩm hoặc dịch vụ nào đều phụ thuộc
vào sự cộng tác giữa phân tích nghiệp vụ và quản lý sản phẩm mục tiêu của phân
tích nghiệp vụ là xác định các cơ hội thách thức và nhu cầu trong thế giới kinh
doanh và sau đó đề xuất giải pháp mặt khác quản lý sản phẩm tập trung vào việc
tổ chức tạo ra và giám sát hàng hóa hoặc dịch vụ từ khi hình thành đến ra mắt
và hơn thế nữa bất chấp sự khác biệt những vai trò này có liên quan chặt chẽ với
nhau và có nhiều mục tiêu chung việc xác định nhu cầu của người tiêu dùng là một
trong những lĩnh vực chính mà phân tích nghiệp vụ và quản lý sản phẩm giao nhau
để hiểu nhu cầu và sở thích của khách hàng các nhà phân tích nghiệp vụ thu thập
phản hồi từ các bên liên quan tiến hành nghiên cứu thị trường và phân tích dữ
liệu họ sử dụng dữ liệu này để phát hiện những khoảng trống thị trường cho các
tính năng hoặc hàng hóa mới cũng như đề xuất các giải pháp khắc phục khiếu nại
của khách hàng các nhà phân tích nghiệp vụ đóng một vai trò quan trọng trong việc
giúp các nhà quản lý sản phẩm hiểu rõ hơn về thị trường môi trường cạnh tranh
và nhu cầu của khách hàng họ sử dụng dữ liệu này để đưa ra những lựa chọn sáng
suốt về tính năng giá thành và định vị sản phẩm của mình người quản lý sản phẩm
và nhà phân tích nghiệp vụ có thể cộng tác để tạo ra các sản phẩm có khả năng
cạnh tranh trên thị trường và đáp ứng mong đợi của người tiêu dùng 4 6 cách người
quản lý sản phẩm và phân tích nghiệp vụ phối hợp với nhau 41 xác định yêu cầu
để xác định và ghi lại nhu cầu về các tính năng hoặc sản phẩm mới các nhà phân
tích nghiệp vụ hợp tác chặt chẽ với người quản lý sản phẩm họ làm việc cùng nhau
để đảm bảo rằng sản phẩm đáp ứng yêu cầu của các bên liên quan khách hàng và công
ty để thu thập yêu cầu và tạo ra câu chuyện của người dùng họ sử dụng nhiều phương
pháp khác nhau bao gồm hội thảo bảng câu hỏi và phỏng vấn các bên liên quan sử
dụng dữ liệu này người quản lý sản phẩm tạo ra lộ trình sản phẩm nêu chi tiết
các tính năng lịch trình và mục tiêu cho dự án 42 nghiên cứu thị trường để hiểu
mong muốn và sở thích của khách hàng phát hiện xu hướng và đánh giá môi trường
cạnh tranh các nhà phân tích nghiệp vụ thực hiện nghiên cứu thị trường người quản
lý sản phẩm sử dụng dữ liệu này để đưa ra những lựa chọn sáng suốt về tính năng
giá thành và định vị sản phẩm của họ 43 lập kế hoạch lộ trình người quản lý sản
phẩm phác thảo lộ trình phát triển sản phẩm của họ dựa trên dữ liệu mà các nhà
phân tích nghiệp vụ đã thu thập được lộ trình đóng vai trò là kim chỉ nam cho
nhóm phát triển và mô tả các tính năng tiến độ và các mốc quan trọng của dự án
44 kiểm tra sự chấp nhận của người dùng các nhà phân tích nghiệp vụ giúp phát
triển các trường hợp thử nghiệm và tiêu chuẩn chấp nhận cho các tính năng hoặc
sản phẩm mới trước khi phát hành sản phẩm người quản lý sản phẩm cộng tác chặt
chẽ với nhóm phát triển và nhà phân tích nghiệp vụ để đảm bảo sản phẩm đáp ứng
các tiêu chí chấp nhận 45 quản lý các bên liên quan các nhà phân tích nghiệp vụ
và quản lý sản phẩm cộng tác để kiểm soát kỳ vọng từ các bên liên quan đảm bảo
sản phẩm phù hợp với mục tiêu và mục tiêu của công ty đồng thời cập nhật cho các
bên liên quan về sự phát triển 46 cải tiến liên tục bằng cách thu thập ý kiến
đầu vào từ người dùng các bên liên quan và nhóm phát triển các nhà phân tích nghiệp
vụ và quản lý sản phẩm sẽ cộng tác để liên tục cải tiến sản phẩm họ ưu tiên những
thay đổi tìm ra những lĩnh vực cần cải thiện và cập nhật lộ trình bằng cách sử
dụng thông tin đầu vào mà họ nhận được tóm lại quản lý sản phẩm và phân tích nghiệp
vụ đóng vai trò quan trọng trong việc đảm bảo doanh nghiệp tạo ra hàng hóa làm
hài lòng khách hàng có tính cạnh tranh và hỗ trợ việc mở rộng công ty người quản
lý sản phẩm và nhà phân tích nghiệp vụ có thể làm việc cùng nhau để phát triển
các sản phẩm đáp ứng nhu cầu của các bên liên quan người tiêu dùng và công ty
bằng cách cộng tác và trao đổi thông tin hy vọng rằng những chia sẻ của b ac sẽ
giúp ích cho bạn đừng quên đón đọc các bài viết mới nhất được cập nhật tại b acs
blog bạn nhé nguồn tham khảo httpswwwbusinessanalysisschoolcom business analyst
kiến thức nghiệp vụ phân tích dữ liệu all rights reserved báo cáo thêm vào series
của tôi
- báo cáo thêm vào series của tôi d b migration why it matters have you ever faced
the situations when you deploy new update on production with updated database
schemas but got bugs after that and need to revert things thats when migration
comes into place database migration serves several key purposes schema evolution
as applications evolve their data models change migrations allow developers to
systematically update the database schema to reflect these changes ensuring that
the database structure matches the application code version control migrations
provide a way to version the database schema allowing teams to track changes over
time this versioning helps in understanding the evolution of the database and
aids in collaboration among developers consistency across environments migrations
ensure that the database schema is consistent across different environments development
testing production this reduces the risk of discrepancies that can lead to bugs
and integration issues rollback capability many migration tools support rolling
back changes allowing developers to revert to a previous state of the database
if a migration causes issues this enhances stability during the development and
deployment process automated deployment migrations can be automated as part of
the deployment process ensuring that the necessary schema changes are applied
to the database without manual intervention this streamlines the release process
and reduces human error applying in golang projects to create a comprehensive
production-grade setup for a golang service using g or m with my sq l to get a
quick setup that allows for easy migrations updates and rollbacks you need to
include migration tooling handle database connection pooling and ensure proper
struct definitions heres a complete example to guide you through the process project
structure golang - service -- maingo -- database -- migrationgo -- models -- usergo
-- config -- configgo -- migrations -- -- gomod 1 database configuration configconfiggo
package config import fmt log os time githubcomjohogodotenv gormiodrivermysql
gormiogorm var d b gorm d b func connect db err godotenv load if err nil log fatal
error loading env file charsetutf 8 mb 4 sets the character set to utf 8 mb 4
which supports all unicode characters including emojis parse timetrue tells the
driver to automatically parse d at e and d at et im e values into gos time time
type loclocal uses the local timezone of the server for time-related queries and
storage dsn fmt sprintf sstcpssscharsetutf 8 mb 4parse timetrueloclocal os getenv
d b_u se r os getenv d b_p as s os getenv d b_h os t os getenv d b_p or t os getenv
d b_n am e db err gorm open mysql open dsn gorm config if err nil panic failed
to connect database sql db err db d b if err nil panic failed to configure database
connection set connection pool settings sql db set max idle conns 10 sql db set
max open conns 100 sql db set conn max lifetime time hour 1sql db set max idle
conns10 sets the maximum number of idle unused but open connections in the connection
pool a value of 10 means up to 10 connections can remain idle ready to be reused
2 sql db set max open conns100 sets the maximum number of open active or idle
connections that can be created to the database a value of 100 limits the total
number of connections helping to prevent overloading the database 3 sql db set
conn max lifetimetime hour sets the maximum amount of time a connection can be
reused before its closed a value of time hour means that each connection will
be kept for up to 1 hour after which it will be discarded and a new connection
will be created if needed d b db 2 database migration databasemigrationgo package
database import golang-servicemodels golang-servicemigrations gormiogorm func
migrate db gorm d b db auto migrate models user apply additional custom migrations
if needed 3 models modelsusergo package models import gormiogorm type user struct
gorm model name string jsonname 4 environment configuration env d b_u se r root
d b_p as s yourpassword d b_h os t 1270 01 d b_p or t 3306 d b_n am e yourdb 5
main entry point maingo package main import golang-serviceconfig golang-servicedatabase
golang-servicemodels githubcomgin-gonicgin gormiogorm func main config connect
db database migrate config d b r gin default r p os t users create user r g et
usersid get user r run 8080 func create user c gin context var user models user
if err c should bind js on user err nil c j so n 400 gin h error err error return
if err config d b create user error err nil c j so n 500 gin h error err error
return c j so n 201 user func get user c gin context id c param id var user models
user if err config d b first user id error err nil c j so n 404 gin h error user
not found return c j so n 200 user 6 explanation database config manages connection
pooling for production-grade performance migration files in migrations folder
helps in versioning the database schema g or m models maps database tables to
go structs database migrations in database folder custom logic for altering tables
over time allowing for easy rollbacks testing you can create integration tests
for this setup using httptest and testify 7 create first migration for production
environments we could use a migration library like golang-migrate to apply rollback
or redo migrations install golang-migrate go install -tags mysql githubcomgolang-migratemigratev
4cmdmigratelatest generate migrate files for users table migrate create -ext sql
-dir migrations -seq create_users_table after running the command well get a pair
of upsql to update schema and downsql for potential rollback later the number
000001 is the auto generated index of migration golang - service -- migrations
-- 000001_create_users_tabledownsql -- 000001_create_users_tableupsql add relevant
sql command to up file and down file 000001_create_users_tableupsql c re at e
t ab le users id b ig in t a ut o_i nc re me nt p ri ma ry k ey name v ar ch ar
255 n ot n ul l created_at d at et im e updated_at d at et im e deleted_at d at
et im e 000001_create_users_tabledownsql d ro p t ab le i f e xi st s users run
the up migration and apply changes to the database with the following command
-verbose flag to see more log details migrate - path migrations - database mysqluserpasswordtcplocalhost3306dbname
- verbose up in case we got issue with migration we can use the following command
to see the current migration version and its status migrate -path migrations -database
mysqluserpasswordtcplocalhost3306dbname version if we have a broken migration
for some reasons we can consider to use the force use carefully command with the
version number of the dirty migration if the version is 1 could check it in migrations
or schema_migrations table we would run migrate -path migrations -database mysqluserpasswordtcplocalhost3306dbname
force 1 8 changing schemes at some point in time we might like to add new features
and some of those might require chaning data schemes for instance wed like to
add email field to users table wed do it as following make a new migration for
adding email column to users table migrate create -ext sql -dir migrations -seq
add_email_to_users now we have a new pair of upsql and downsql golang - service
-- migrations -- 000001_create_users_tabledownsql -- 000001_create_users_tableupsql
-- 000002_add_email_to_usersdownsql -- 000002_add_email_to_usersupsql adding following
content to _add_email_to_userssql files 000002_add_email_to_usersupsql a lt er
t ab le users a dd c ol um n email v ar ch ar 255 u ni qu e 000002_add_email_to_usersdownsql
a lt er t ab le users d ro p c ol um n email run the up migration command again
to make update to the data schemas migrate - path migrations - database mysqluserpasswordtcplocalhost3306dbname
- verbose up well also need to update the golang users struct adding email field
to keep it in sync with the new schemas type user struct gorm model name string
jsonname email string json email gorm unique index 9 rolling back migrations in
case for some reasons we got bugs with new updated schemas and we need to rollback
this case well use the down command migrate -path migrations -database mysqluserpasswordtcplocalhost3306dbname
down 1 number 1 indicates that we want to rollback 1 migration here we also need
manually to update golang users struct remove the email field to reflect the data
schema changes type user struct gorm model name string jsonname 10 use with makefile
to simplify the process of migration and rolling back we can add a makefile golang
- service -- -- makefile the content of makefile as following include env create_migration
migrate create - ext sql - dir migrations - seq create_new_migration migrate_up
migrate - path migrations - database mysqld b_u se rd b_p as stcpd b_h os td b_p
or td b_n am e - verbose up 1 migrate_down migrate - path migrations - database
mysqld b_u se rd b_p as stcpd b_h os td b_p or td b_n am e - verbose down 1 p
ho ny create_migration migrate_up migrate_down now we can simply run make migrate_up
or make migrate_down on c li to do the migration and the rollback 11 considerations
data loss during rollback rolling back migrations that delete columns or tables
may result in data loss so always backup data before running a rollback c ic d
integration integrate the migration process into your c ic d pipeline to automate
schema changes during deployment d b backups schedule regular database backups
to prevent data loss in case of migration errors about d b backups before rolling
back a migration or making changes that could potentially affect your database
here are some key points to consider schema changes if the migration involved
altering the schema eg adding or removing columns changing data types rolling
back to a previous migration can result in the loss of any data stored in those
altered columns or tables data removal if the migration includes commands that
delete data like dropping tables or truncating tables rolling back will execute
the corresponding down migration which could permanently remove that data transaction
handling if your migration tool supports transactions the rollback might be safer
since changes are applied in a transaction however if you manually run s ql commands
outside of transactions there is a risk of losing data data integrity if you have
modified data in a way that depends on the current schema rolling back could leave
your database in an inconsistent state so its crucial to back up your data heres
a brief guide database dump use database-specific tools to create a full backup
of your database for my sq l you can use mysqldump -u root -p dbname backup_before_rollbacksql
this creates a file backup_before_rollbacksql that contains all the data and schema
of the dbname database export specific tables if you only need to back up certain
tables specify them in the mysqldump command mysqldump -u root -p golang_1 users
users_table_backupsql verify the backup ensure that the backup file has been created
and check its size or open it to ensure it contains the necessary data store backups
securely keep a copy of the backup in a secure location such as cloud storage
or a separate server to prevent data loss during the rollback process backups
on cloud to back up your my sq l data when using golang and deploying on a ws
e ks you can follow these steps use mysqldump for database backup create a mysqldump
of your my sq l database using a kubernetes cron job mysqldump -h mysql-host -u
user -p password database_name backupsql store this in a persistent volume or
an s 3 bucket automate with kubernetes cron job use a kubernetes cron job to automate
the mysqldump process example y am l configurationyaml api version batchv 1 kind
cron job metadata name mysql - backup spec schedule 0 2 runs every day at 2 a
m job template spec template spec containers - name mysql - backup image mysql
57 args - binsh - - c - mysqldump -h -u -p aws s 3 cp - s 3 backup-date fsql env
- name a ws_a cc es s_k ey_i d value - name a ws_s ec re t_a cc es s_k ey value
restart policy on failure using a ws r ds automated backups if using r ds if your
my sq l database is on a ws r ds you can leverage r ds automated backups and snapshots
set a backup retention period and take snapshots manually or automate snapshots
using lambda functions back up persistent volumes p v with velero use velero a
backup tool for kubernetes to back up the persistent volume that holds my sq l
data install velero on your e ks cluster and configure it to back up to s 3 by
using these methods you can ensure your my sq l data is regularly backed up and
securely stored if you found this helpful let me know by leaving a or a comment
or if you think this post could help someone feel free to share it thank you very
much backup d b migrate go my sql database all rights reserved báo cáo thêm vào
series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 4 năm
storage trong docker là gì storage trong docker là một tính năng quản lý data
của docker data ở đây có thể hiển là các file trong quá trình chạy ứng dụng như
file log file data khi chạy một container data trong quá trình vận hành được chưa
ở writeable layer và sẽ bị mất đi khi container bị xóa để giải quyết được vấn
đề này docker đã đưa ra một cơ chế để quản lý data của các container đó là docker
storage về bản chất docker storage là một cơ chế cho phép lưu trữ các data của
container và docker host bằng cách mount mot folder từ docker container vào docker
host bằng việc mount này data trong container giờ đây sẽ được an toàn hơn dễ dàng
chia sẻ giữa các container với nhau hơn một số chứa setting hay log có thể được
đọc dễ dàng hơn trong quá trình troubleshoot các container các kiểu mount của
docker storage có 3 kiểu mount trong docker storage là volumes mount-point sẽ
nằm varlibdockervolumes của docker host và được quản lý bằng docker bind mounts
mount-point có thể nằm ở bất kỳ đâu docker host không được quản lý bởi docker
tmpfs mounts data sẽ được lưu vào memory của docker host và sẽ mất đi khi khởi
động lại hoặc stop container - v và -mount flag ban đầu -v hoặc -mount flat được
dùng cho standalone container và -mount flag được dùng cho swarm service tuy nhiên
phiên bản docker 1706 bạn có thể sử dụng -mount flag cho standalone container
nói chung điểm khác biệt duy nhất chính là cú pháp trong khi -v flag các option
được làm một thì -mount flag lại phân chia chung rõ ràng hơn với từng option các
nhau bởi dấu phẩy trong bài viết này minh sử dụng option là -v và -mount volumes
về hoạt động volumes tưng tự như bind mounts những volume được quản lý bời docker
trong khi bind mounts file hoặc thư muc cần mount phải tồn tại trên docker host
volume khi tạo ra sẽ nằm ở thư mục varlibdockervolumesvolume khi tạo sẽ nằm ở
thư mục volume cũng support cơ chế của volume drivers cho phép lưu trữ dữ liệu
tới một server remote hoặc cloud bạn có thể quản lý volume sử dụng c li hoặc a
pi volume hoạt động trên cả linux và windows container sử dụng volume khi nào
khi chia sẻ dữ liệu giữa nhiều container đang chạy lưu dữ liệu tới một server
remote hoặc cloud khi cần backup restore hoặc migrate dữ liệu từ docker host này
sang docker host khác cần quản lý dễ dàng và thuận tiện hơn so với bind mounts
ví dụ tạo một volume và chạy container mount với volume đó tạo volume docker volume
create my-volume tạo một volume docker volume ls list danh sách volume docker
volume inspect my-volume hiển thị thông tin của volume ll varlibdockervolumes
kiểm tra volume được tạo ra chạy container với volume docker run -itd -v my-volumeoptmount_point
centos hoặc docker run -itd --mount typevolumesrcmy-volumedstoptmount_point centos
hoặc docker run -itd --mount typevolumesourcemy-volumetargetoptmount_point centos
kiểm tra lại docker exec my-container bash -c echo this is test file optmount_pointtesttxt
docker exec my-container bash -c cat optmount_pointtesttxt cat varlibdockervolumesmy-volume_datatesttxt
một số chú ý với volume nếu bạn mount một volume vào trong một thư mục của container
mà thư mục của container này đã có dữ liệu thì dữ liệu từ container sẽ được copy
vào volume mount-point của docker host thông thường nếu bạn không tạo volume từ
trước mà chạy container với volume mount thì docker sẽ tự động tạo một volume
và dữ liệu sẽ vẫn tồn tại ngoài vòng đời của container ví dụ docker run -itd --name
webapp --mount sourcewebapp-voldestinationvar centos volume thường là sự lựa chọn
tốt hơn là sử dụng wriable layer của container bởi vì sử dụng volume không làm
tăng dung lượng của container sử dụng bind mounts bind mounts trong docker xuất
hiện trước volume bind mounts bị giới hạn một số các tính năng hơn so với volume
binds mount có hiệu năng tốt nhưng bị phụ thuộc vào cấu trúc filesystem của docker
host khi sử dụng bind mount thì một file hoặc một folder trong docker host được
mount vào trong container file hoặc folder này yêu cầu đường dẫn tuyệt đối vậy
nên trong trường hợp file hoặc folder này không tồn tại trên docker host thì quá
trình mount sẽ bị lỗi sử dụng bind mounts khi nào khi chia sẻ file cấu hình từ
docker host với container chia sẻ thư mục source code hoặc môi trường từ docker
host với container khi cấu trúc filesystem của docker host là rõ ràng và phù hợp
với các yêu cầu của bind mount ví dụ chạy một container với bind mounts theo hai
cách sử dụng flag -v khi sử dụng flag -v nếu source folder trên docker host chưa
tồn tại docker sẽ tự động tạo mới folder docker run -itd --name my_contanier -v
optdocker_host_folderopt centos docker exec my_contanier bash -c touch optduckhang
ll optdocker_host_folder sử dụng flag mount khi sử dụng flag mount thì đảm bảo
folder trên docker host đã được tồn tại nếu không sẽ bị lỗi mkdir -p optdocker_host_folder
docker run -itd --name my_contanier --mount typebindsrcoptdocker_host_folderdstopt
centos docker exec my_contanier bash -c touch optduckhang ll optdocker_host_folder
một số chú ý với binds mount khi sử dụng bind mounts và flag mount thì phải đảm
bảo file hoặc folder từ docker host đã được tồn tại không giống như volume nếu
folder trong container không trống và được mount với folder của docker host thì
tất cả các file trong folder của container sẽ bị ẩn đi điều này giống với khi
bạn save dữ liệu của mình trong mnt sau đó cắm u sb và mount u sb với thư mục
mnt thì những file dữ liệu có từ trước sẽ bị ẩn đi đến khi u sb được umount để
test trường hợp này mình có một ví dụ sau tạo một image từ dockerfile đảm bảo
rằng có một folder không trống khi chạy container cd mkdir create_image cd create_image
cat dockerfile f ro m centoscentos 7 l ab el image-typeduckhang-test m ai nt ai
ne r duckhang r un mkdir opttest_folder touch opttest_foldertest_filetxt e of
docker build -t image-test docker images chạy một container và đảm bảo image tạo
ra một container có một folder không trống docker run -itd --name test_container
image-test docker exec test_ container bash -c ls opttest_folder chạy contaier
sử dụng chính image đó với bind mounts và kiểm tra thư mục mount mkdir optdocker_host_folder
docker run -itd --privileged --name another_container --mount typebindsrcoptdocker_host_folderdstopttest_folder
image-test docker exec another_container bash -c ls opttest_folder unmount thư
mục trong container và kiểm tra lại docker exec another_container bash -c umount
opttest_folder docker exec another_container bash -c ls opttest_folder test_filetxt
tmpfs volumes và bind mounts cho phép bạn chia sử dữ liệu giữa docker host và
container kể cả khi container bị stop hoặc xóa đi nếu bạn sử dụng docker trên
linux thì bạn có một option thứ ba là tmpfs mounts sử dụng tmpfs mounts khi nào
khi bạn không muốn giữ data trên docker host hoặc trong container khi muốn bảo
mật hoặc muốn đảm bảo hiệu suất container khi ứng dụng cần ghi một số lượng lớn
dữ liệu không liên tục tmpfs mount sẽ lưu dữ liệu tạm thời trên memory khi container
stop tmpfs mount sẽ bị xóa bỏ ví dụ docker run -itd --name tmp_mount --mount typetmpfsdstopt
centos docker exec tmp_mount bash -c touch opttesttxt docker exec tmp_mount bash
-c ls opt testtxt restart container và kiểm tra lại docker container restart tmp_mount
docker exec tmp_mount bash -c ls opt kết quả trả về là trắng tinh tổng kết như
vậy trong bài viết này mình đã giới thiệu một thành phần quan trọng trong docker
đó là docker storage docker storage có 3 option cho bạn lựa chọn là volumes bind
mounts tmpfs mounts nếu có vấn đề gì thì comment ở dưới để cùng trao đổi nhé tài
liệu tham khảo httpsdocsdockercomstorage docker all rights reserved báo cáo thêm
vào series của tôi
- source_sentence: buổi trò chuyện
sentences:
- may fest 2024 content creator báo cáo thêm vào series của tôi thỉnh thoảng các
trang tin tức báo mạng facebook có đăng những thông tin về một dịch vụ mội doanh
nghiệp nào đó bị hacker tấn công đánh cắp và rao bán dữ liệu trên chợ đen đối
tượng bị hacker nhắm đến thường là những trang web dịch vụ lớn có nhiều người
dùng ngay cả một công ty bình thường tại v n cũng bị tấn công hacker trong vụ
này còn nghênh ngang khiêu khích trực tiếp bằng cách đăng tải một video cho thấy
cách hắn ta truy cập được vào hệ thống mạng nội bộ của công ty này từ đó tiến
hành tấn công sâu hơn và đánh cắp dữ liệu bị hacker tấn công thì là vấn đề của
doanh nghiệp nhưng dữ liệu bị lộ thì người dùng là đối tượng cần hoang mang nếu
hacker có thể dựa vào những dữ liệu này để tìm được mật khẩu của người dùng thì
rất nguy hiểm vậy làm thế nào để bảo vệ thật tốt mật khẩu của người dùng kể cả
khi cơ sở dữ liệu không may bị hacker đánh cắp và rao bán thay vì đọc một bài
viết mang tính kỹ thuật đơn thuần hôm nay chúng ta đổi phong cách một chút hãy
theo dõi buổi trò chuyện dưới đây để biết thêm về cách bảo vệ mật khẩu an toàn
nhé buổi trò chuyện tiếp nối phần 1 ông anh thế mấy dự án trước bên chú dùng thuật
toán hash nào mấy cái nổi như m d 5 với s ha-1 à cậu em không anh làm sao mà dùng
được ông anh sao mà không được m d 5 với s ha-1 có tốc độ tính toán nhanh dữ liệu
hash ra thì không lớn tiết kiệm rất nhiều tài nguyên của máy chủ còn gì cậu em
nhưng mà 2 cái đó được khuyến nghị là không nên sử dụng vì không còn đảm bảo an
toàn nữa ông anh dựa vào đâu mà nói là không đảm bảo an toàn nữa cậu em em đọc
được là m d 5 với s ha-1 phổ biến và được sử dụng từ lâu rồi độ dài chuỗi hash
ra cũng thấp nên có rất nhiều kết quả hash đã được tính toán và lưu trữ sẵn rồi
em còn biết có nhiều công cụ crack hash trên mạng cho sử dụng miễn phí rất nhiều
chuỗi hash đều tìm ra được bản gốc khi sử dụng các công cụ đó cơ ông anh ừ một
cái nữa là khả năng chống trùng lặp của m d 5 thấp cũng do độ dài chuỗi hash chỉ
có 32 ký tự mà ra cậu em em cũng từng thấy qua về cái việc m d 5 có thể xuất hiện
trùng lặp rồi nhưng mà rõ ràng số lượng kết quả có thể xảy ra của m d 5 không
thấp thế thì cũng rất khó để trùng lặp mới đúng chứ nhỉ ông anh đúng là trên lý
thuyết có tối đa 1632 kết quả hash khác nhau nhưng đa số người dùng sẽ không đặt
mật khẩu là một chuỗi ngẫu nhiên vô nghĩa bất quy tắc có đầy người đặt trùng mật
khẩu với nhau đấy thôi cậu em thế thì việc mật khẩu khác nhau có chung mã hash
cũng có dễ xảy ra hơn đâu anh ông anh cho dù ở trên lý thuyết thì việc trùng lặp
vẫn có khả năng xảy ra cao hơn so với các thuật toán hash khác nên người ta mới
khuyến nghị không nên dùng nữa đấy thôi còn việc trùng lặp kết quả hash thì anh
thấy dễ xảy ra với trường hợp đầu vào lớn cơ như kiểu em tính m d 5 hash cho 2
tệp tin nặng mấy trăm mb vài gb ấy lúc này thì do kích thước dữ liệu từ rất lớn
giảm xuống chỉ còn 32 ký tự nên việc 2 tệp tin có cùng mã hash dễ xảy ra hơn cậu
em bọn em dùng s ha-3 để hash mật khẩu luôn thế là an tâm ông anh cũng được dùng
thuật toán hash tốt cho ra chuỗi hash có độ dài lớn sẽ an toàn hơn nhưng mà nếu
đen bị tấn công thì vẫn có thể thất thủ cậu em nếu bọn em triển khai thêm việc
sử dụng salt trong quá trình hash mật khẩu thì ổn áp luôn chưa anh ông anh sẽ
ok hơn nhưng mà nhớ tìm cách bảo vệ đống salt đấy nữa nhé không là cũng công cốc
cậu em thế là lại đẻ ra thêm 1 bài toán nữa à ông anh cũng có thể phát triển cơ
chế sinh salt ngẫu nhiên và duy nhất với mỗi tài khoản đảm bảo một tài khoản chạy
cơ chế đó bao nhiêu lần vẫn ra cùng cái salt là được cậu em nghe cách đó có vẻ
ok hơn anh ạ ông anh thực ra anh biết giờ người ta có thuật toán hash khác okla
hơn mấy cái m d với s ha cơ cậu em cái nào thế anh ông anh bcrypt cậu em nó có
gì vượt trội hơn hả anh ông anh nó gây lãng phí thời gian cậu em ông anh đúng
thế thật mấy thuật toán hash m d với s ha được thiết kế để có tốc độ tính toán
nhanh bcrypt thì được xây dựng dựa trên thuật toán mã hoá blowfish blowfish thì
có tốc độ mã hoá ok nhưng qua trình chuẩn bị khoá mã hoá của thuật toán này lại
tốn thời gian bcrypt cũng thừa hưởng đặc điểm này nhờ vậy có thể bảo vệ mật khẩu
tốt hơn trước những cuộc tấn công brute force hacker muốn lợi dụng việc thử thật
nhiều lần để tìm ra bản rõ tương ứng với 1 chuỗi hash nhưng thử càng nhiều lần
thì thời gian hao tổn do thay đổi tham số càng cao việc lãng phí thời gian này
giúp giảm khả năng bẻ khoá của hacker cậu em nếu thế thì có ảnh hưởng tới tốc
độ xử lý của máy chủ không anh ông anh không phải flo mình tính mã hash của mật
khẩu thì mỗi tài khoản chỉ cần chạy 1 lần thì chẳng ảnh hưởng gì mấy cả phía hacker
phải chạy hàng nghìn lần chỉ để tìm ra 1 mật khẩu thì mới tốn thời gian cậu em
cao kiến cao kiến ông anh mà sử dụng bcrypt thì còn bắt buộc phải sử dụng salt
nữa đảm bảo lập trình viên code phần này không thể sơ suất quên sử dụng salt được
cậu em hay thật đấy cứ nghĩ mình biết dùng s ha-3 là đã ổn hoá ra vẫn còn bcrypt
okla hơn ông anh có cả bài viết nói kỹ hơn về bcrypt đây nhé về đọc thêm rồi xem
xét áp dụng vào dự án httpsauth 0combloghashing-in-action-understanding-bcrypt
cậu em cảm ơn anh nhiều nhé lát nữa anh em mình ra quán bia em mời ông anh nó
lại hợp lý encryption password all rights reserved báo cáo thêm vào series của
tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 6 năm
tập dữ liệu dùng để học máy tập huấn luyện được dùng để huấn luyện hệ thống tập
tối ưu tùy chọn và được dùng để tối ưu các tham số của hệ thống tập kiểm thử được
dùng để đánh gúa hệ thống đã được huấn luyện tập huấn luyện càng lớn thì hiệu
năng của hệ thống học càng tốt tập kiểm thử càng lớn thì việc đánh giá càng chính
xác rất khó ít khi có thể có được các tập dữ liệu rất lớn hiệu năng của hệ thống
không chỉ phụ thuộc vào giải thuật học máy mà còn phụ thuộc class distribution
phân bố lớp cost of misclassification size of the training set kích thước của
tập huấn luyện size of the testing set kích thước tập kiểm thử các phương pháp
đánh giá hiệu năng học máy hold-out stratified sampling repeated hold-out cross
validation k-fold leave-one-out bootstrap sampling 1 hold-out toàn bộ tập dữ liệu
data sẽ được chia thành 2 tập con datatrain và datatest không giao nhau datatrain
datatest tập huấn luyện datatrain để huấn luyện hệ thống tập kiểm thử datatest
để đánh giá hiệu năng của hệ thống sau khi đã được huấn luyện yêu cầu dữ liệu
thuộc tập kiểm thử datatest không được sử dụng trong quá trình huấn luyện hệ thống
dữ liệu thuộc tập huấn luyện datatrain không được sử dụng trong quá trình đánh
giá hệ thống sau khi huấn luyện ví dụ ta có thể chọn datatrain 23 data và data
test 13 data cách đánh giá này phù hợp khi ta bộ dữ liệu data có kích thước lớn
2 stratified sampling được sử dụng khi các tập ví dụ có kích thước nhỏ hoặc không
cân xứng unbalanced datasets ví dụ có ít hoặc không có các ví dụ với một số lớp
mục tiêu phân bố lớp class distribution trong tập huấn luyện và tập kiểm thử phải
xấp xỉ như trong tập toàn bộ các ví dụ data stratified sampling là một phương
pháp để cân xứng về phân bố lớp đảm bảo tỉ lệ phân bố lớp trong tập huấn luyện
và tập kiểm thử sẽ là xấp xỉ nhau phương pháp này không áp dụng được cho bài toán
học máy dự đoánhồi quy vì giá trị đầu ra của hệ thống là một giá trị số không
phải là một nhãn lớp 3 repeated hold-out đây là phương pháp sẽ áp dụng phương
pháp đánh giá hold-out nhiều lần để sinh ra các tập huấn luyện và thử nghiệm khác
nhau trong mỗi lần lặp một tỉ lệ nhất định của tập dữ liệu data được chọn ngẫu
nhiên nhằm tạo nên tập huấn luyện có thể kết hợp với phương pháp stratified sampling
đối với các giá trị lỗi hoặc giá trị với các tiêu chí đánh giá khác ghi nhận trong
các bước lặp này được lấy trung bình công để xác định lỗi tổng thể tuy nhiên phương
pháp này chưa được tốt vì mỗi bước lặp ta lại có một tập kiểm thử khác nhau có
một số dữ liệu sẽ được dùng nhiều lần trùng lặp trong các tập kiểm thử 4 cross
validation 41 k-fold tập dữ liệu data được chia thành k tập con không giao nhau
gọi là fold có kích thước xấp xỉ nhau mỗi lần lặp một tập con trong k tập sẽ được
dùng để làm tập kiểm thử k-1 tập còn lại sẽ được sử dụng làm tập huấn luyện k
giá trị lỗi mỗi giá trị tương ứng với mỗi fold sẽ được tính trung bình cộng để
thu được giá trị lỗi tổng thể ví dụ ta có thể chia data thành 10 hoặc 5 folds
k 10 hoặc k 5 thông thường mỗi tập con fold được lấy mẫu phân tầng xấp xỉ phân
bố lớp trước khi áp dụng quá trình đánh giá cross validation phù hợp khi ta có
tập dữ liệu data vừa và nhỏ 42 leave-one-out số lượng các nhóm folds bằng kích
thước của tập dữ liệu k data mỗi nhóm fold chỉ bao gồm 1 ví dụ khai thác tối đa
tập dữ liệu ban đầu không có bước lấy mẫu ngẫu nhiên chi phí tính toán cao phù
hợp khi ta có tập dữ liệu data rất nhỏ 5 bootstrap sampling phương pháp này sử
dụng việc lấy mẫu lặp lại để tạo nên tập huấn luyện giả sử toàn bộ tập data bao
gồm n ví dụ lấy mẫu có lặp lại n lần đối với tập data để tạo nên tập huấn luyện
datatrain gồm n ví dụ từ tập data lấy ngẫu nhiên một ví dụ x nhưng không loại
bỏ x khỏi data đưa dữ liệu x vào trong tập huấn luyện lặp lại các bước trên n
lần ta có n dữ liệu trong tập datatrain sử dụng dữ liệu tập datatrain để huấn
luyện hệ thống sử dụng tất cả các dữ liệu thuộc data nhưng không thuộc tập huấn
luyện datatrain để tạo nên tập test xác suất để 1 ví dụ không được chọn vào tập
huấn luyện là 1-1n xác suất để một ví dụ sau khi lấy mẫu lặp lại bootstrap sampling
được đưa vào tập kiểm thử là 1-1nn phù hợp với tập dữ liệu có kích thước rất nhỏ
tập tối ưu validation set quá trình học máy huấn luyện sẽ được thực hiện gồm 2
giai đoạn giai đoạn 1 huấn luyện hệ thống giai đoạn 2 tối ưu giá trị các tham
số của hệ thống tập tối ưu sẽ không có các dữ liệu trùng với tập kiểm thử và tập
huấn luyện tối ưu giúp điều chỉnh tham số và hiệu năng cao hơn các tiêu chí để
đánh giá 1 tính chính xác accuracy mưc đọ dư đoan phan lơp chinh xac cua hẹ thông
đa đuơc huân luyẹn đôi vơi cac vi du kiêm chưng test instances 2 tính hiệu quả
efficiency chi phi vê thơi gian va tai nguyen bọ nhơ cân thiêt cho viẹc huân luyẹn
va kiêm thư hẹ thông 3 khả năng xử lý nhiễu robustness kha nang xư ly chiu đuơc
cua hẹ thông đôi vơi cac vi du nhiêu lôi hoạc thiêu gia tri 4 khả năng mở rộng
scalability hiẹu nang cua hẹ thông vd tôc đọ hocphan loai thay đôi nhu thê nao
đôi vơi kich thuơc cua tạp dư liẹu 5 kha nang diên giai interpretability mưc đọ
dê hiêu đôi vơi nguơi sư dung cua cac kêt qua va hoat đọng cua hẹ thông 6 mưc
đọ phưc tap complexity mưc đọ phưc tap cua mo hinh hẹ thông ham muc tieu hoc đuơc
cách tính chính xác 1 đối với bài toán phân loại giá trị đầu ra của bài toán là
một giá trị định danh trong đó x là một ví dụ trong tập kiểm thử datatest ox giá
trị đầu ra phân lớp của hệ thống với dữ liệu x cy phân lớp đúng với ví dụ x 2
đối với bài toán hồi quy dự đoán giá trị đầu ra của hệ thống là một giá trị số
trong đó ox là giá trị đầu ra dự đoán bởi hệ thống với x dx là giá trị đúng của
dữ liệu x machine learning đánh giá hiệu năng học máy all rights reserved báo
cáo thêm vào series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 3 năm
tiếp nối loạt bài viết về design pattern trước bridfe pattern và facade pattern
bài này mình sẽ giới thiệu về một design pattern nằm trong nhóm behavioral design
patterns đó là chain of responsibility nó là cái gì trong cuốn sách rất hay về
design pattern design patterns elements of reusable object-oriented software có
định nghĩa khá dài và cũng khá là khó hiểu nên theo tìm hiểu của mình thì mình
sẽ nói đơn giản hơn là như thế này nó là việc cho tách nhỏ riêng biệt một request
của người gửi từ người nhận request đó bằng việc tạo ra nhiều object để handle
request đó giả sử bạn có 1 một request cần sử lý với nhiều logic nếu sử dung ifelse
quá nhiều thì sẽ quá phức tạp và khó refactor sau này vậy nên chain of responsibility
design pattern tạo ra 1 chuổi các handle mỗi handle xử lý một logic khác nhau
và với một điệu kiện cụ thể nào đó nói cụ thể hơn thì chain of responsibility
dùng để tránh sự liên kết trực tiếp giữa đối tượng gửi request và đối tượng nhận
request khi request đó có thể được xử lý bởi hơn 1 đối tượng thực hiện móc nối
các đối tượng nhận request đó thành một chuỗi và gửi request theo chuỗi đó cho
đến khi request đó được xử lý theo doix u ml sau handler định nghĩa 1 interface
để xử lý yêu cầu gán giá trị cho đối trượng successor concrete handler xử lý yêu
cầu có thể truy cập đối trượng successor nếu đối tượng concrete handler không
thể xử lý yêu cầu nó sẽ gửi tới successor của nó hiểu đơn giãn hơn nữa giã sử
bạn có 1 chuỗi các hành động khi nhận được request bạn cho a xử lý nếu a không
thể xử lý nó sẽ gọi successor của nó để xử lý cứ như thế cho đến khi không còn
concrete handle nào xử lỹ nữa trăm lời nói không bằng 1 ví dụ mình sẽ thực hiện
một ví dụ để thể hiện đống chữ phía trên đầu tiên chúng ta định nghĩa 1 class
user class user possible roles guest internal_user admin attr_reader role def
initializerole role role end end class registration controller end class profile
controller end class logs controller end user có role và một số controller như
trên tiếp theo sẽ tạo class policy đây là đối tượng chính đó là chính handler
như trong đống lý thuyết trên class policy attr_reader successor def initializesuccessornil
successor successor end def check_accesscontroller user if policy_matches_controllercontroller
return process_checking_accesscontroller user elsif successor successorcheck_accesscontroller
user else raise_no_policycontroller end end def raise_no_policycontroller raise
no policy found for controller end def process_checking_accesscontroller user
raise not implemented end protected def policy_matches_controllercontroller controllerto_s
selfclassto_sgsubpolicy end end class policy có định nghĩa 1 instance là successor
đối tượng này sẽ được gọi khi hanler không thể xử lý request method chính thực
hiện xử lý request là check_access accept 2 params là controller và user đầu tiên
nó thực hiện check có handle được request hay không bằng cách so sánh tên controller
và tên của class handler mà không có word policy nếu không request sẽ được passed
qua successor nếu successor tồn tại nếu không thì sẽ raise lên exepction ngược
lại nếu xử lý thành công thì sẽ gọi method process_checking_access cần được định
nghĩa bên trong từng concrete handle class giờ thì chúng ta sẽ định nghĩa một
vài concrete handle của policy class registration controller policy policy def
process_checking_accesscontroller user userrole guest end end class profile controller
policy policy def process_checking_accesscontroller user internal_user adminincludeuserrole
end end class logs controller policy policy def process_checking_accesscontroller
user userrole admin end end chúng ta sẽ xây dựng dựa trên policy class và định
nghĩa lại method process_checking_access để xử lý logic cho từng concrete handler
giờ thì chúng ta thực hiện nó user usernewadmin policy logs controller policynew
profile controller policynew registration controller policynew puts policycheck_accessprofile
controller user đầu tiên chúng ta định nghĩa 1 user với role là admin sau đó định
nghĩa 1 chuỗi handler policy và thực hiện method check_access tại concretehanlder
là logs controller policy nhưng request sẽ chỉ được xử lý tại profile controller
policy thế là xong cũng không quá phức tạp phải không mọi người yeah ưu điểm giảm
kết nối thay vì 1 đối tượng có thể xử lý request phải tham chiều đến các đối tượng
khác nó chỉ cần tham chiếu đến đối tượng tiếp theo tăng tính linh hoạt và phân
chia trách nhiệm cho tường đối tựơng có khả năng thay đổi dây chuyền không đảm
bảo có đối tượng xử lý yêu cầu khi nào thì sử dụng pattern này cái này quan trọng
đây vì hiều mà không biết khi nào apply thì chắc chỉ để đọc cho vui chúng ta sẽ
sử dụng trong những trường hợp sau có nhiều hơn 1 đối tượng có thể xử lý request
đó nhưng đối tượng cụ thể nào thực hiện request đó lại phụ thuộc vào ngữ cảnh
muốn gửi request đến một trong số các đối tượng xử lý những không biết đối tượng
đó là đối tượng nào tập các đối tượng xử là tập các đối tượng độc lập và có khả
năng biến đổi hết rồi mọi người cảm ơn mọi người đã đọc bài viết mình cũng mới
tìm hiểu và đang apply vào một vài project d em o khi nào xong thì sẽ public sharing
với mọi người đừng ngại góp ý và chia sẽ nhé thank you so much design pattern
ruby all rights reserved báo cáo thêm vào series của tôi
- source_sentence: những câu hỏi phỏng vấn javascript rất đỗi thông dụng
sentences:
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 4 năm
phỏng vấn thì muôn hình vạn trạng nhưng kiểu gì thì khả năng cao vẫn sẽ hỏi mấy
câu này chắc vậy v tuỳ sở thích từng người mà có thể hỏi kiểu khó trước - dễ sau
hay từ dễ đến khó còn bài viết này thì sắp xếp tuỳ hứng chả theo thứ tự nào cả
bạn có biết xài i if e tip nếu câu trả lời là không tôi chưa dùng bao giờ hay
biết nhưng tôi ít khi dùng thì 910 là cái ông này code j s kiểu ăn xổi answer
j s nó chẳng thích tính scope của variable theo block mà nó tính theo từng function
ví dụ if true var foo foo consolelogfoo foo oops foo lẽ ra ko nên tồn tại ngoài
block if vì lí do vậy ta rất dễ làm bẩn scope bên ngoài do ko giới hạn đc scope
của variable và khi nó tòi ra ngoài một vùng code khác cũng gọisửa cái biến foo
trời đánh kia mà không nghĩ nó tồn tại thì có chúa mới biết output là gì vậy nên
ta có 3 option ủa tưởng là 2 v - đặt tên biến ko thể trùng lặp v - dùng letconst
thay vì var - bọc nó vào 1 function cơ mà cần cục code phải chạy luôn và cũng
ko muốn đặt tên cho function var foo foo đây là cái i if e consolelogfoo undefined
tuyệt bạn biết xài callback chứ tip câu trả lời nên là đơn giản thôi anh answer
do cơ chế hoạt động của j s engine cái hoạt động khá phức tạp mà có lẽ cần hẳn
1 bài viết để phân tích về nó code viết sau chưa chắc đã chạy sau dí dụ quen thuộc
với j query var response ajaxlinktoresource do_somethingresponse tọi luôn vì response
là undefined đợi có kết quả mới chạy code tiếp đơn giản là truyền logic vào callback
ajaxlinktoresource do_something promise là cái chi tip hay một cách hỏi khác là
thằng callback có những vấn đề gì answer bạn hãy - than vãn về callback hell khiến
code khó maintain - cằn nhằn về việc catch error chuẩn xác với callback là điều
bất khả thi closure là cái gì tip đây là một khái niệm khá mông lung nhiều người
dùng j s lâu năm mà hỏi chưa chắc có thể cắt rõ nghĩa cho người khác hiểu được
answer là khả năng ghi nhớ của một function về scope nơi nó được tạo ra thí dụ
function counter var count 0 return get count function return count increase function
count my counter counter my counterincrease my counterget count 1 đến đây bạn
vẫn chưa hiểu ý đồ lắm đúng ko vậy thì mình sẽ thêm vài dòng code sau your counter
counter your counterget count 0 ồ get count increase bọn nó nhớ về thằng count
ở scope nó được tạo ra ờ vậy thế thì sao thì ta có thể dùng cái kĩ thuật này để
giấu state vì j s thì méo có class rồi thì publicprivate như java nói chung đây
là chìa khoá để thực hiện encapsulation một trong những khái niệm trụ cột của
o op undefined khác vẹo gì null tip thường là câu hỏi để làm nóng buổi phỏng vấn
còn nếu người ta hỏi câu này ở cuối buổi thì có lẽ là khá tuyệt vọng rồi answer
undefined là chưa đc khởi tạo null là khởi tạo rồi có giá trị rồi và giá trị ấy
là null à vậy thì kết luận luôn null là một giá trị chứ ko phải là ko là gì nhé
khi nào dùng call và khi nào dùng apply tip thực ra 2 cái hàm này nó chỉ khác
nhau cái a pi câu này chủ yếu để dẫn mở cho chủ đề về this answer - call là để
hard binding cái this vào 1 context cụ thể - apply cũng vậy nhưng đống parameters
được truyền vào là array thay vì là các optional parameter như call giả dụ như
sau my functioncallmy context param 1 param 2 my functionapplymy context param
1 param 2 cần lưu ý gì khi dùng giá trị falsy tip chủ yếu là mang tính hỏi mẹo
nhưng cũng đủ để đoán ra được thời gian bạn làm việc với j s answer - array cũng
đc coi là falsy nên nếu có array thì lại phải check cả độ dài của array nữa -
object rỗng thì lại coi là truthy nên check object thì lại nên viết thêm hàm để
check cho tiện this là gì tip cái này là một trong những phần trọng tâm của buổi
phỏng vấn answer là gì thì bài sau chúng ta bàn tiếp vài dòng có lẽ không đủ cho
e nó v so sánh var let và const arrow function khác gì so với function tip cũng
chỉ là một công cụ dẫn nhập sang chủ đề this không trả lời được cũng không sau
vì kiểu gì thì người ta vẫn sẽ đề cập đến this bằng cách này hay cách khác ngoài
ra thì đây cũng có thể làm nhiên liệu để hỏi về hoisting answer do cách implement
của nó nên khi xài với một số libframework nó sẽ làm mất binding của this như
là react hoặc j query có cơ số chủ đề trên mạng về lưu ý này function declaration
và function expression khác nhau ở điểm nào và như vậy thì sao tip thực chất là
hỏi về hoising answer có 2 hiểu syntax như nầy foo style chạy ngon bar style tọi
luôn function foo style var bar style function thằng bar style thì chỉ đc hoist
mỗi cái biến bar style còn foo style đc hoist cả tên lẫn block khi nào thì cần
use strict tip basic answer j s khá linh hoạt bạn có thể khai báo biến mà ko cần
dùng var có thể đặt tên biến bằng một số reversed-word có thể lặp tên param của
một hàm có thể hoisting etc nói chung những tính năng này khiến code khá đau đầu
use strict để disable hết mấy cái tính năng sida này đi vi phạm thì raise lỗi
kế thừa trong javascript liệu có giống với o op như các ngôn ngữ khác prototype
là cái khỉ gì tip hẳn một topic ngang tầm với this luôn answer ồ và chúng ta cần
hẳn 1 bài viết nữa để phân tích luôn v kết các chủ đề mà mình muốn liệt kê tiếp
nhưng có vẻ sẽ tốn khả nhiều giấy mực nên xin tổng kết bằng mấy gạch đầu dòng
sau cảm ơn các bạn đã theo dõi về lexical scope và cái cách j s compile về event
loop và lí giải cho cơ chế bất đồng bộ về các thể loại kĩ thuật fake o op về cách
mổ xẻ object và nền móng cho functional programming interview java script all
rights reserved báo cáo thêm vào series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 3 năm
1 about charlesfiddler charlesfiddler là một web proxy h tt p proxy h tt p monitor
được chạy trên p c cho phép các web browsers của bạn được thiết lập để truy cập
internet thông qua charles vì vậy charles có thể bắt được các gói tin và hiển
thị cho chúng ta tất cả dữ diệu gửi đi request và nhận response vì vậy charles
là công cụ rất hữu ích cho việc debug cho developer nếu q a chỉ có screenshots
và video thì không thể nào thấy được những gì đang được gửi và nhận giữa web browsers
và server nên việc lấy log charles là rất cần thiết giúp dev có thể biết được
những gì đang xảy ra và có thể chuẩn đoán và sửa chữa vấn đề dễ dàng hơn một số
chức năng chính của charles s sl proxying xem s sl requests and responses bandwidth
throttling dùng để test với những đường truyền khác nhau a ja x debugging xem
x ml and j so n requests and responses theo dạng cây thư mục hoặc dạng text repeat
requests to test back-end changes edit requests để test nhiều inputs breakpoints
để chỉnh sửa requests và responses một số chức năng chính của fiddler web debugging
performance testing h tt ph tt ps traffic recording web session manipulation security
testing customizing fiddler trong bài viết này mình sẽ chỉ đề cập đến những chức
năng q a hay dùng và hướng dẫn cách lấy log với charles phần fiddler thì cách
dùng cũng tưởng tự charles nên mình chỉ đề cập đến charles 2 lấy log web a config
browsers để charles có thể bắt được các gói tin từ trình duyệt thì đầu tiên mình
phải config proxy của trình duyệt như sau mở charles và bắt đầu truy cập internet
từ trình duyệt trên charles chúng ta có thể thấy được thông tin của các gói tin
b config devices để thiết lập device truy cập internet thông qua charles bạn phải
mở charles trên p c và trỏ device đến p c của bạn thiết lập i p của p c trên devices
port là 8888 mỗi device sẽ có cách thiết lập khác nhau dưới đây là thiết lập trên
i os devices sau khi thiết lập thành công trên charles sẽ thông báo có thiết bị
truy cập bạn chọn allow để đồng ý cho phép truy cập bây giờ devices của bạn sẽ
truy cập internet thông qua charles c get log việc của bạn sau khi làm lại tất
cả steps thì get log và gửi cho dev chọn file save sesion as chọn lưu file dưới
format chls 3 bandwidth throttling để đảm bảo ứng dụng có thể chạy hoặc download
app trong các điều kiện mạng nhất định thì bạn cần kiểm tra trong nhiều tốc độ
mạng khác nhau và charles với chức năng bandwidth throttling cho phép bạn thiết
lập băng thông thích hợp để test chọn proxy throttling settings bạn chọn enable
throttling và lựa chọn gói mạng phù hợp để kiểm tra 4 black list settings như
các proxy khác charles có thể chặn một số truy cập với chức năng back list khi
truy cập vào những trang nằm trong danh sách đen sẽ bị charles từ chối trên đây
là một vài hướng dẫn để có thể lấy được log của web trên p c và devices charlesfiddler
còn rất hữu ích cho việc test services developing tesing hy vọng bài viết có thể
giúp ích cho mọi người q a charles fiddler web dubugging all rights reserved báo
cáo thêm vào series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 5 năm
tổng quan overview khi tìm hiểu về mô hình phát triển phần mềm agile chúng ta
không thể không nhắc tới kanban một methodology nổi tiếng của agile cùng với các
methodology khác như scrum x p tóm gọn lại thì kanban là một hệ thống quản lý
công việc giúp bạn có thể trực quan hóa visualize công việc của mình giới hạn
số việc đang làm dở và tối đa hóa năng suất công việc hệ thống này hoạt động theo
dòng chảy flow nói cách khác kanban là một dòng chảy công việc được trực quan
hóa visualize workflow kanban là một từ tiếng nhật 看板 có nghĩa là bảng thông tin
signboard bạn có thể bắt đầu mô hình kanban cực kì đơn giản trong 3 nốt nhạc bước
1 vẽ một bảng kanban kanban board bước 2 dán lên đó các thẻ kanban kanban card
bước 3 đặt ra giới hạn số công việc đang làm limit w ip - work in progress vậy
là xong các quy tắc của kanban principles of kanban bắt đầu bằng những việc đang
làm start with what you do now bạn có thể bắt đầu chuyển đổi từ mô hình phát triển
hiện tại sang phương thức kanban một cách nhanh chóng và dễ dàng ngay từ những
công việc còn đang làm dở mà không gây ảnh hướng tới các phần công việc đã hoàn
thành trước đó tôn trọng các vai trò và trách nhiệm hiện có respect the current
roles responsibilities bạn chỉ việc áp dụng mô hình kanban vào dự án thôi mà không
cần thay đổi vai trò và trách nhiệm của các thành viên khuyến khích phát triển
từ mọi cấp độ encourage acts of leadership at all levels điều này có nghĩa là
mọi thành viên trong dự án đều cần cải thiện bản thân liên tục tinh thần kaizen
để tăng performance của teamcủa bộ phận của cả công ty để dễ hình dung hơn chúng
ta hãy cùng bắt tay vào thực hành luôn vẽ kanban board kanban board kanban board
là một bảng bao gồm các cột thể hiện trạng thái tùy vào độ phức tạp của dự án
bạn có thể có nhiều hoặc ít cột mình lấy ví dụ đơn giản nhất là 3 cột tương ứng
với 3 trạng thái của task là những việc phải làm t o d o những việc đang làm d
oi ng những việc đã làm xong d on e kanban board có thể được vẽ bằng bút dạ trên
bảng trắng truyền thống hoặc sử dụng các tool điện tử như j ir a hoặc t re ll
o example sử dụng kanban board để quản lí bài viết này chúng ta sẽ kẻ 1 bảng gồm
3 cột t o d o d oi ng và d on e các thẻ kanban card đây là một thành phần quan
trọng của kanban giúp trực quan hóa các task mỗi thẻ kanban chứa một công việc
cụ thể có thể đo lường được càng nhỏ càng cụ thể càng tốt giống như 1 tờ sticky
note vậy kanban card sẽ được di chuyển từ cột này sang cột khác khi status của
nó thay đổi giúp trực quan hóa workflow ở trong agile thì kanban card chính là
từng featureproduct backlog được chia nhỏ thành các user-story example viết tên
các task lên kanban card rồi sắp xếp vào các cột tương ứng chúng ta sẽ có các
task cần làm như sau overview principles of kanban kanban board kanban vs scrum
phần overview và principles of kanban đã hoàn thành nên sẽ để ở cột d on e phần
kanban board đang làm dở nên sẽ để ở cột d oi ng phần kanban vs scrum vẫn chưa
làm nên sẽ để ở cột t o d o limit w ip để có thể đảm bảo tiến độ công việc ai
cũng có việc để làm và tránh hiện tượng nghẽn cổ chai chúng ta cần giới hạn số
w ip tối đa trong một cột con số w ip này tùy thuộc vào số lượng member trong
team và năng lực của các member example do bài viết này chỉ có một mình mình thực
hiện cho nên vào một thời điểm chỉ có 1 task được làm vì vậy mình sẽ để limit
cho cột d oi ng là 1 đồng thời sẽ kéo thẻ kanban board sang phần d on e vì mình
sẽ kết thúc phần này tại đây đồng thời kéo tiếp thẻ kanban vs scrum để thực hiện
nó một ví dụ khác về limit w ip kanban vs scrum đã có rất nhiều bài so sánh chi
tiết về sự khác nhau giữa hai methodology này của scrum tuy nhiên trong bài viết
này thì mình sẽ nêu vắn tắt như sau tổng quan kanban scrum làm việc theo danh
sách hàng đợi hoạt động theo sprint plan kéo task từ cột t o d o sang d oi ng
để làm hết task này thì tự động kéo task khác chỉ làm các task của sprint đó thôi
làm cho đến khi thỏa mãn tiêu chí d on e phải pass sprint review của p o lặp lại
y như cũ có retrospective để cải thiện chất lượng các sprint sau meeting kanban
scrum không cần meeting cũng được có rất nhiều meeting spring planning daily meeting
retrospective meeting role kanban scrum giữ nguyên role của mô hình cũ yêu cầu
đủ các role stakeholder product owner scrum master team các công cụ kanban scrum
kanban board backlog burndown chart potiential shipable product p sp như vậy qua
bảng phân tích sự khác nhau giữa kanban và scrum thì chúng ta có thể thấy kanban
thường được coi là method và áp dụng cho các dự án nhỏ đơn giản còn scrum thì
có thể gọi là một framework đầy đủ và phù hợp với các dự án vừa và lớn do scrum
bao gồm đầy đủ các yếu tố cần thiết role meeting artifacts để có thể áp dụng vào
mọi loại dự án mà không cần phải thêm bất cứ một framework nào khác tuy nhiên
do tính chất đơn giản và linh động nên kanban có thể được áp dụng rộng rãi trong
rất nhiều domain của cuộc sống chứ ko chỉ riêng lĩnh vực software development
ví dụ bạn có thể áp dụng kanban board để quản lý công việc hàng ngày của bạn hoặc
quản lý bài tập về nhà quản lý nhà hàng quán ăn ps trước khi kết thúc bài viết
thì mình xin update nốt phần cuối vào cột done để kết thúc bảng kanban board của
mình cảm ơn các bạn đã dành thời gian đọc bài viết này source httpswwwatlassiancomagilekanban
httpskanbanizecomkanban-resourcesgetting-startedwhat-is-kanban kanban agile kanban
board scrum kanban card all rights reserved báo cáo thêm vào series của tôi
- source_sentence: thuật ngữ trong frontend - optimization
sentences:
- editors choice may fest 2024 báo cáo thêm vào series của tôi canva một công cụ
thiết kế trực tuyến chắc hẳn bạn đã từng nghe qua hoặc đã từng dùng để tạo ra
các design một cách vô cùng nhanh chóng canva được hàng triệu người yêu thích
trên toàn cầu không chỉ nổi tiếng với giao diện thân thiện và kho tài nguyên đồ
họa khổng lồ mà còn nhờ khả năng cho phép người dùng tự do tải lên các design
của riêng họ với hơn 100 triệu người dùng hoạt động hàng tháng và 50 triệu tệp
media được tải lên mỗi ngày canva đã nhanh chóng trở thành một trong những nền
tảng thiết kế trực tuyến phổ biến nhất thế giới tuy nhiên sự tăng trưởng vượt
bậc này cũng đặt ra một thách thức không nhỏ cho đội ngũ kỹ sư của canva đôi khi
công ty phát triển nhanh quá cũng khổ mấy ông dev phết làm thế nào để quản lý
và lưu trữ khối lượng dữ liệu khổng lồ này một cách hiệu quả đảm bảo trải nghiệm
người dùng luôn mượt mà và không bị gián đoạn nhỉ cùng sydexa tìm hiểu cách mà
canva giải quyết vấn đề khá khoai này nha bạn cho chúng mình xin 1 upvote và comment
để chúng mình nhận giải của viblo nha và chúng mình có động lực ra những bài viết
thú vị hơn nữa chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về
thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt
nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa
kênh tik tok httpswwwtiktokcomsydexacom kiến trúc hiện tại của canva và vấn đề
gặp phải canva được xây dựng trên một kiến trúc microservices linh hoạt nơi mỗi
service đảm nhận một vai trò riêng biệt trong đó dịch vụ media đóng vai trò trung
tâm quản lý toàn bộ thông tin liên quan đến tài nguyên media của người dùng từ
i d chủ sở hữu trạng thái đang hoạt động đã xóa chờ xóa cho đến metadata tiêu
đề tác giả từ khóa thông tin màu sắc và đặc biệt là vị trí lưu trữ của tệp tin
service media hoạt động như một thủ thư cực kỳ tận tâm liên tục xử lý hàng loạt
request đọc và ghi dữ liệu tuy nhiên có một điểm thú vị là lượng yêu cầu đọc vượt
xa lượng yêu cầu ghi bởi người dùng thường xuyên tìm kiếm và sử dụng các media
có sẵn hơn là chỉnh sửa chúng hầu hết các tệp media ít khi bị thay đổi sau khi
được tạo ra ngoại trừ những media nằm trong thư viện ảnh và đồ họa của canva ban
đầu canva lựa chọn my sq l trên a ws r ds làm ngôi nhà để lưu trữ kho báu media
của mình tuy nhiên khi gia tài media ngày càng đồ sộ với tốc độ tăng trưởng chóng
mặt my sq l bắt đầu bộc lộ những hạn chế việc thay đổi cấu trúc schema của các
bảng media lớn trở nên chậm chạp có thể mất đến hàng ngày trời giới hạn về tốc
độ sao chép của my sq l 56 đã cản trở tốc độ ghi vào các bản sao đọc canva cũng
sắp đạt đến giới hạn về kích thước volume e bs của r ds my sq l 16 t b tại thời
điểm đó hơn nữa mỗi lần nâng cấp dung lượng lưu trữ lại kéo theo sự gia tăng độ
trễ io ảnh hưởng trực tiếp đến tốc độ phản hồi yêu cầu của người dùng việc khởi
động lại máy chủ hay nâng cấp phiên bản my sq l cũng gây ra downtime điều tối
kỵ đối với một nền tảng trực tuyến như canva các giải pháp tạm thời để khắc phục
vấn đề để kéo dài tuổi thọ cho my sq l trong khi tìm kiếm một giải pháp thay thế
lâu dài canva đã thực hiện một loạt các biện pháp tạm thời một trong những thay
đổi quan trọng là chuyển metadata nội dung sang một cột j so n riêng biệt metadata
là phần thông tin mô tả về tệp media thường xuyên được cập nhật và thay đổi việc
chuyển metadata sang j so n cho phép canva tự quản lý schema của phần dữ liệu
này một cách linh hoạt hơn giảm sự phụ thuộc vào việc thay đổi schema của toàn
bộ bảng dữ liệu vốn rất tốn kém về thời gian và tài nguyên tiếp theo canva đã
thực hiện phi chuẩn hóa một số bảng denormalized để giảm xung đột khóa lock contention
và số lượng phép nối join cần thiết khi thực hiện truy vấn bên cạnh đó canva cũng
thực hiện các biện pháp tối ưu hóa khác như loại bỏ các nội dung lặp lại hoặc
mã hóa chúng một cách ngắn gọn hơn điều này giúp giảm dung lượng lưu trữ và tăng
tốc độ truy vấn canva cũng loại bỏ các ràng buộc khóa ngoại để tăng tốc độ ghi
và cập nhật dữ liệu mặc dù điều này có thể làm giảm tính toàn vẹn dữ liệu cuối
cùng canva thay đổi cách thức nhập media để giảm số lần cập nhật metadata giúp
giảm tải cho hệ thống một giải pháp tạm thời quan trọng khác được canva áp dụng
là sharding đây là kỹ thuật chia nhỏ dữ liệu thành nhiều phần và lưu trữ trên
nhiều máy chủ khác nhau sharding giúp canva vượt qua giới hạn kích thước tệp bảng
2 t b của hệ thống tệp ext 3 đồng thời tăng tốc độ sao chép và cải thiện hiệu
suất cho các truy vấn theo i d vốn là loại truy vấn phổ biến nhất khi tải thiết
kế trên canva tuy nhiên sharding cũng có nhược điểm là kém hiệu quả đối với các
truy vấn ít phổ biến hơn chẳng hạn như liệt kê tất cả media thuộc sở hữu của một
người dùng mặc dù các biện pháp trên đã giúp canva tạm thời giải quyết được những
vấn đề cấp bách nhưng về lâu dài họ vẫn cần một giải pháp lưu trữ mới có khả năng
mở rộng và đáp ứng tốt hơn nhu cầu ngày càng tăng của người dùng quá trình di
chuyển từ my sq l sang dynamo db sau khi xem xét và thử nghiệm nhiều giải pháp
khác nhau canva đã chọn dynamo db làm điểm đến cuối cùng cho kho dữ liệu media
khổng lồ của mình dynamo db là một cơ sở dữ liệu no sq l được quản lý hoàn toàn
bởi a ws nổi tiếng với khả năng mở rộng linh hoạt tính sẵn sàng cao và hiệu suất
vượt trội đáp ứng được yêu cầu khắt khe về khả năng mở rộng và tốc độ của canva
tuy nhiên quá trình di chuyển dữ liệu từ my sq l sang dynamo db không hề đơn giản
canva phải đối mặt với hai yêu cầu quan trọng không được gây ảnh hưởng đến trải
nghiệm người dùng và thực hiện chuyển đổi mà không có bất kỳ downtime nào để đảm
bảo tính liên tục của dịch vụ canva đã triển khai một chiến lược di chuyển vô
cùng tỉ mỉ và thận trọng canva cần di chuyển tất cả các dữ liệu cũ các dữ liệu
mới được tạo và các dữ liệu mới được cập nhật sang dynamo d b đầu tiên canva sử
dụng hàng đợi s qs của a ws để gửi các thông báo về việc một tập tin media cụ
thể đã được tạo cập nhật hoặc đọc nhưng không chứa nội dung của bản cập nhật một
worker instance sẽ xử lý các thông báo này để đọc trạng thái hiện tại từ cơ sở
dữ liệu my sq l chính và cập nhật dynamo db các bản ghi mới được tạo cập nhật
hoặc được đọc gần đây sẽ được ưu tiên sao chép sang dynamo db trước cách tiếp
cận này đảm bảo rằng những dữ liệu được sử dụng thường xuyên nhất sẽ có sẵn trên
dynamo db giúp giảm thiểu độ trễ và cải thiện trải nghiệm người dùng giảm tải
cho cụm my sq l ghi dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db
các thông báo về việc tạo mới hoặc cập nhật media được đặt vào hàng đợi ưu tiên
cao trong khi các thông báo về việc đọc media được đặt vào hàng đợi ưu tiên thấp
điều này đảm bảo rằng các worker instance sẽ tập trung vào việc xử lý các thông
báo ghi trước để dữ liệu mới được cập nhật nhanh chóng trên tất cả các bản sao
của dynamo db sau khi đã xử lý hết các thông báo ghi chúng mới chuyển sang xử
lý các thông báo đọc điều này giúp cho đảm bảo có thể phục vụ các yêu cầu đọc
có tính nhất quán cuối cùng eventually consistent từ dynamo db đọc dữ liệu trong
quá trình di chuyển từ my sq l sang dynamo db tiếp theo canva thực hiện một quá
trình quét và sao chép dần dần để chuyển toàn bộ dữ liệu còn lại sang dynamo db
quá trình này được thực hiện một cách cẩn thận và kiểm soát để không ảnh hưởng
đến hoạt động của hệ thống quá trình quyét dữ liệu để di chuyển những media còn
lại sang dynamo db canva sẽ quét qua tất cả các media bắt đầu từ những media được
tạo gần đây và gửi một thông báo qua message queue có độ ưu tiên thấp để worker
thực hiện sao chép qua dynamo db quá trình kiểm tra để đảm bảo tính toàn vẹn của
dữ liệu trong quá trình di chuyển canva đã thực hiện nhiều biện pháp kiểm tra
nghiêm ngặt trước khi chuyển hoàn toàn sang đọc từ dynamo db canva đã thực hiện
kiểm tra so sánh kết quả từ cả hai hệ thống my sq l và dynamo db bất kỳ sự không
nhất quán nào được phát hiện sẽ được điều tra và sửa chữa ngay lập tức ngoài ra
canva cũng sử dụng my sq l như một phương án dự phòng fallback trong giai đoạn
đầu của quá trình chuyển đổi điều này đảm bảo rằng nếu có bất kỳ vấn đề nào xảy
ra với dynamo db hệ thống vẫn có thể hoạt động bình thường bằng cách đọc dữ liệu
từ my sq l nhờ sự kết hợp của các biện pháp này canva đã thực hiện thành công
việc di chuyển dữ liệu sang dynamo db một cách an toàn và không gây gián đoạn
cho người dùng việc chuyển đổi sang dynamo db đã mang lại những kết quả vượt ngoài
mong đợi cho canva độ trễ của dịch vụ media giảm đáng kể giúp cải thiện tốc độ
tải và trải nghiệm người dùng khả năng mở rộng của dynamo db cũng được thể hiện
rõ rệt khi số lượng người dùng hoạt động hàng tháng của canva tăng gấp ba lần
kể từ khi chuyển đổi và dynamo db vẫn hoạt động ổn định tự động mở rộng quy mô
để đáp ứng nhu cầu ngày càng tăng không chỉ vậy chi phí vận hành dynamo db còn
thấp hơn so với cụm a ws r ds trước đây mang lại hiệu quả kinh tế đáng kể cho
canva tuy nhiên quá trình chuyển đổi này cũng mang đến những bài học quý giá cho
đội ngũ kỹ sư của canva họ nhận ra tầm quan trọng của việc hiểu rõ đặc điểm truy
cập dữ liệu để ưu tiên di chuyển những dữ liệu được sử dụng thường xuyên nhất
bên cạnh đó việc kiểm tra và thử nghiệm trong môi trường production cũng được
coi là rất cần thiết để đảm bảo tính ổn định của hệ thống sau khi chuyển đổi mặc
dù dynamo db không có những tính năng tiện lợi như thay đổi schema dễ dàng hay
hỗ trợ truy vấn s ql ad-hoc những lợi ích về khả năng mở rộng và hiệu suất đã
bù đắp cho những hạn chế này hành trình chuyển đổi từ my sq l sang dynamo db đã
đánh dấu một cột mốc quan trọng trong quá trình phát triển của canva không chỉ
giải quyết triệt để bài toán lưu trữ media canva còn chứng minh được khả năng
thích ứng và vượt qua những thách thức về công nghệ để đáp ứng nhu cầu ngày càng
tăng của người dùng với dynamo db canva đã xây dựng một hệ thống lưu trữ media
mạnh mẽ và linh hoạt đủ sức chứa hơn 25 tỷ file media do người dùng tải lên và
sẵn sàng đón nhận thêm 50 triệu file mới mỗi ngày thành công này không chỉ khẳng
định vị thế của canva là một trong những nền tảng thiết kế trực tuyến hàng đầu
thế giới mà còn mở ra những cơ hội phát triển mới trong tương lai nếu thấy bài
viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải
của viblo nha lời nhắn chúng mình có tạo group cho các bạn cùng chia sẻ và học
hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design
việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa
kênh tik tok httpswwwtiktokcomsydexacom bạn có thể tìm hiểu thêm chia sẻ từ chính
canva httpswwwcanvadevblogengineeringfrom-zero-to-50-million-uploads-per-day-scaling-media-at-canva
dynamo db httpsdocsawsamazoncomamazondynamodblatestdeveloperguideintroductionhtml
eventual consistency httpswwwscylladbcomglossaryeventual-consistency s qs httpsawsamazoncomsqs
system design dynamodb microservices canva coding all rights reserved báo cáo
thêm vào series của tôi
- báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 10 năm
1 agile là gì agile là một triết lí philosophy cho việc phát triển phần mềm nói
cách khác đó là một cách tư duy về các dự án phần mềm các triết lí của agile được
cụ thể hóa bởi một số phương pháp phát triển phần mềm method chẳng hạn như extreme
programming x p hay scrum gọi tắt là các phương pháp agile mỗi phương pháp agile
bao gồm một tập hợp các quy tắc pratice chẳng hạn quy tắc về sử dụng công cụ quản
lí mã nguồn quy tắc về các chuẩn lập trình hay quy tắc chuyển giao sản phẩm hàng
tuần cho khách hàng triết lí agile được đưa ra trong một bản tuyên ngôn manifesto
gồm 4 tiêu chí vàđược làm rõ hơn bởi 12 quy tắc a 4 tiêu chí của agile cá nhân
và các tương tác quan trọng hơn các quy trình và công cụ tập trung làm cho phần
mềm chạy được hơn là viết các tài liệu mô tả cộng tác với khách hàng hơn là chỉ
dựa trên hợp đồng phản ứng với các thay đổi hơn là chỉ tuân theo một kế hoạch
định sẵn b 12 quy tắc trong agile thỏa mãn yêu cầu của khách hàng thông qua việc
giao hàng sớm và liên tục chào đón việc thay đổi yêu cầu thậm chí là những thay
đổi yêu cầu muộn giao phần mềm chạy được cho khách hàng một cách thường xuyên
giao hàng tuần hơn là hàng tháng nhà kinh doanh và kỹ sư lập trình phải làm việc
cùng nhau hàng ngày trong suốt dựán các dựán được xây dựng xung quanh những cá
nhân cóđộng lực cung cấp cho họ môi trường và sự hỗ trợ cần thiết và tin tưởng
họ để hoàn thành công việc trao đổi trực tiếp mặt đối mặt là phương pháp hiệu
quả nhất để truyền đạt thông tin phần mềm chạy được là thước đo chính của tiến
độ phát triển bền vững và duy trì được nhịp độ phát triển liên tục liên tục quan
tâm đến kĩ thuật và thiết kế để cải tiến sự linh hoạt sự đơn giản là cần thiết
nghệ thuật tối đa hóa lượng công việc chưa hoàn thành nhóm tự tổ chức thích ứng
thường xuyên với sự thay đổi 2 quy trình kiểm thử phần mềm trong mô hình agile
kiểm thử testing trong dự án agile yêu cầu một sự dịch chuyển mô thức paradigm
shift cho vai trò kiểm thử truyền thống nó đòi hỏi một sự thay đổi trong thái
độ của kiểm thử viên tester từ một phương pháp tiếp cận theo định hướng ca kíp
thành một vai trò được tham gia sâu vào quy trình phát triển từ sớm cách tiếp
cận agile tập trung vào việc nhận được những điều đúng đắn ngay từ đầu làm giảm
sự cần thiết phải có nhiều kiểm thử viên đảm bảo chất lượng q a tester ở cuối
quy trình để đạt được kết quả vai trò kiểm thử viên q a trong agile không bị giới
hạn một tập hợp các quy trình được xác định trước cũng như phương pháp luận sẽ
chỉ ra vai trò dựa trên tình huống cụ thể a các giai đoạn kiểm thử phần mềm tương
ứng với các giai đoạn phát triển phần mềm trong mô hình agile tiền-phân-đoạn pre-iteration
đây là giai đoạn yêu cầu được phân tích chi tiết bởi b a business analyst chuyên
viên phân tích nghiệp vụ và các tiêu chí chấp nhận acceptance criteria được viết
ra cho mỗi một story user story và q a là những người sử dụng các yêu cầu này
ngay từ đầu ta cần phải xác minh verify những yêu cầu đó từ sớm và thường xuyên
xác minh story xác minh yêu cầu kiểm thử agile thiên về việc đưa ra phản hồi sớm
không chỉ bằng cách kiểm tra các yêu cầu mà còn là phải làm việc đó từ sớm các
q a tester cần phải xem xét các yêu cầu story từ sớm để làm sáng rõý nghĩa và
tính khả-kiểm testability việc này sẽđảm bảo các yêu cầu luôn rõ ràng và có thể
kiểm thửđược yêu cầu cần đủ nhỏ để có ý nghĩa trong bối cảnh xác định tiêu chí
chấp nhận acceptance criteria - những story thường được sử dụng cho các tiêu chí
chấp nhận không nên bị trùng lặp chồng chéo từ những story khác nhau để hiểu rõ
hơn về giai đoạn này chúng ta cùng tìm hiểu những phần sau user story là một tóm
tắt đơn giản ngắn gọn về chức năng mà khách hàng mong muốn nó thường được viết
theo mẫu sau với tôi muốn vì ví dụ với vai trò là người dùng website tôi muốn
có một chức năng tìm kiếm nâng cao để có thể tìm kiếm nhanh chóng và dễ dàng những
quyển sách tôi cần tiêu chí chấp nhận acceptance criteria là những tiêu chí dùng
để đánh giá sản phẩm chức năng đã thực hiện đúng yêu cầu hay chưa có thể coi đó
là các tiêu chí xác nhận hoàn thành story các tiêu chí đặt ra phải đáp ứng các
đặc tính sau tính khả dụng usability là tiêu chí trả lời cho câu hỏi có dễ sử
dụng hay không là chìa khóa đưa ra các tiêu chí đánh giá có thể xác định tính
chức năng functionality xử lý lỗi error handing liệt kê ra những lỗi có thể gặp
phải trong quá trình sử dụng chương trình và phương thức để xử lý ví dụ người
dùng có thể thực hiện sai thứ tự các bước và khi đó chương trình sẽ xử lý như
thế nào hiệu suất performance stress tests là tiêu chí trả lời cho câu hỏi hệ
thống sẽ hoạt động như thế nào dưới những áp lực như có nhiều người truy cập tại
cùng 1 thời điểm có quá nhiều request được gửi đến hệ thống ví dụ với story như
trên ta có các tiêu chí chấp nhận như sau tôi có thể giới hạn tìm kiếm theo định
dạng loại tôi có thể tìm kiếm theo phạm vi ngày tôi có thể giới hạn tìm kiếm thông
tin nhà xuất bản như tiêu đề tác giả chủ đề địa điểm nhà xuất bản và số lượng
xuất bản tôi có thể giới hạn tìm kiếm bởi một tiêu chí cụ thể như danh mục bộ
sưu tập tôi có thể lọc filter để đạt được mục tiêu của giai đoạn này cần có sự
giao tiếp chặt chẽ giữa các bên đội phát triển nhà phân tích nghiệp vụ đảm bảo
chất lượng khả kiểm testable các khía cạnh có thể kiểm thửđược của story phải
được xem xét chi tiết để có thể kiểm thửđược story đó những yếu tố này thường
là tìm kiếm các yêu cầu ẩn môi trường dữ liệu kiểm thử test data sự phụ thuộc
vào các yêu cầu khác việc có được các chi tiết này sớm sẽ giúp câu chuyện được
ưu tiên đúng đắn hơn trong backlog và cho phép việc thực hiện story đó suôn sẻ
hơn trong phân đoạn iteration q a tester cũng tham gia cuộc họp lập kế hoạch cho
phân đoạn để cung cấp quan điểm kiểm thửđể nhóm có thểđưa ra được ước lượng phát
triển tham gia trong việc lập kế hoạch phân đoạn đóng vai trò quan trọng khi một
số các yêu cầu tiềm ẩn thường được phát hiện bởi các q a tester b các hoạt động
đảm bảo chất lượng trong phân đoạn môt khi q a tester đã thấy thoải mái với các
tiêu chí chấp nhận của một story nào đó họ có thể giúp nhóm định nghĩa các kiểm
thử chấp nhận acceptance tests cho story đó kiểm thử chấp nhận là các yêu cầu
về phương diện kiểm thử cần được thực hiện để hiểu các yêu cầu phần mềm các kiểm
thử chấp nhận này được sinh ra tự động và dùng để hướng dẫn quá trình phát triển
các kiểm thử chấp nhận không nên bao gồm tất tần tật các tình huống case scenarios
do điều này có thể tạo ra những sự ngưng trệ không cần thiết và có thể tạo ra
quá nhiều bộ kiểm thử tự động automated test tương tự nhau kiểm thử chấp nhận
trong các dự án agile là khác biệt so với các dự án truyền thống không giống như
các dự án truyền thống nơi kiểm thử chấp nhận xảy ra ở phần cuối của vòng đời
phần mềm trong dự án agile kiểm thử chấp nhận được thực hiện trước khi phần mềm
được chuyển giao kiểm thử chấp nhận cũng có xu hướng được tự động hóa để họ có
thể chạy như là kiểm thử hồi quy regression test kiểm thử tự động rất quan trọng
đối với mọi dựán agile các bản build thường xuyên yêu cầu các chu kỳ phản hồi
ngắn do đó kiểm thử hồi quy phải nhanh chóng và chính xác ví dụ trở lại với ví
dụ ở phần mở đầu khi khách hàng yêu cầu thực hiện tìm kiếm sách theo nhiều tiêu
chí trong trường hợp các tiêu chí tìm kiếm được chia nhỏ ra để thực hiện như sau
sprint 1 phát triển chức năng tìm kiếm theo tên sách và thể loại sprint 2 phát
triển chức năng tìm kiếm theo tác giả và nhà xuất bản sprint 3 phát triển chức
năng tìm kiếm theo ngày phát hành tình trạng sách như vậy khi kiểm thử chấp nhận
chức năng tìm kiếm ở sprint 2 chúng ta sẽ phải kết hợp việc kiểm thử lại chức
năng tìm kiếm theo các tiêu chíở sprint 1 nếu không có các công cụ kiểm thử tựđộng
hỗ trợ cho việc kiểm thử lại các chức năng ở sprint 1 thì người thực hiện kiểm
thử sẽ mất thêm thời gian cho việc kiểm thử lại sprint 1 trong các dựán agile
kiểm thử tựđộng được thực hiện bởi tất cả các cấp độ - lập trình viên kiểm thử
viên bảo đảm chất lượngq a tester và các nhà phân tích nghiệp vụ b a sự tham gia
của tất cả mọi người làm gia tăng tính xác đáng của các phần kiểm thử và thường
giúp xác định đúng các phần kiểm thử tuy nhiên điều này không có nghĩa là tất
cả mọi người phải đều phải viết mã kiểm thử 3 sử dụng tự động hóa có mục đích
tự động hóa đồng nghĩa với việc cung cấp thông tin phản hồi sớm về những mã nguồn
được tạo ra và điều quan trọng là phải xác định những gì cần tự động hoá và những
gì thì không tất cả các kiểm thử tự động đều mất chi phí chi phí của tự động hóa
nên được so sánh với chi phí khi không thực hiện việc đó một chu kỳ phản hồi dài
hơn đồng nghĩa với việc phải có nhiều người đóng góp nhiều thời gian hơn mới có
được phản hồi tức thì một hoạt động bảo đảm chất lượng điển hình trong phân đoạn
là việc liên tục đo lường chất lượng của phần mềm q a tester tham gia vào việc
bàn giao các story cho các nhà phát triển điều này giúp họ hiểu được những yêu
cầu kiểm thử của story để họ có thể triển khai được kĩ thuật phát triển định-hướng-kiểm-thử
test-driven development - t dd ngoài ra việc bàn giao các kiểm thử chấp nhận và
giúp cho các lập trình viên hiểu các khía cạnh khả kiểm testability của story
để tránh được các lỗi defect phổ biến những hoạt động này đòi hỏi một mức độ cao
của giao tiếp giữa các lập trình viên và các chuyên viên phân tích nghiệp vụđể
làm rõ yêu cầu vàđảm bảo sản phẩm được xây dựng đúng đắn ngay từ đầu q a tester
có thể giúp giải quyết các vấn đề trước hết bằng cách tích cực tham gia vào quy
trình tổng thể ta thậm chí có thể kết hợp với các nhà phát triển làm việc trên
một story hoặc các kiểm thử cho story để thể hiểu rõ hơn về các yêu cầu điều bắt
buộc là một story khi được chuyển giao nó phải được kiểm thử đúng cách trong một
môi trường thích hợp một khi các q a tester hài lòng với những story họ sẽ đưa
nó vào các tiến trình kiểm thử tiếp theo một điều quan trọng khác là phải suy
nghĩ vượt ra ngoài các yêu cầu bằng văn bản và thử nghiệm với các kiểm thử thăm
dò exploratory testing để thực hiện kịch bản ngoài lề và thực hiện các kiểm thử
tiêu cực đểđảm bảo chắc chắn phần mềm được viết ra là chất lượng kiểm thử thăm
dò không phải là thực thi tất cả các kịch bản kiểm thửđược xác định trước nó là
nghệ thuật thăm dò phần mềm ngoài các trường hợp kiểm thử test case vàđồng thời
giữ tập trung xung quanh các yêu cầu cụ thể nguồn tham khảo httpwwwlogigearcommagazineagilea-testers-perspective-on-agile-projects
httpagilemanifestoorg httpwwwmountaingoatsoftwarecomagile agile q a all rights
reserved báo cáo thêm vào series của tôi
- content creator báo cáo thêm vào series của tôi bài đăng này đã không được cập
nhật trong 2 năm tại sao nên đọc bài này dành cho các bạn mới tiếp cận và thấy
quá nhiều thuật ngữ mới dành cho các bạn có thể đã làm f e một thời gian rồi nhưng
đôi khi vẫn không biết có một thứ như vậy tồn tại trên đời có vài keyword để tối
ưu performance cho website các thuật ngữ phổ biến trong bài này mình sẽ nói về
các thuật ngữ liên quan tới optimization nhé code split hiểu một cách đơn giản
thì bạn có một file code rất to bạn chia file to đó ra thành nhiều file nhỏ thì
gọi là code split hoặc một ví dụ khác là bạn có một trang web build bằng react
trong đó bao gồm header body và footer thì bạn có thể build thành một file bundlejs
bao gồm cả 3 component trên hoặc cũng có thể chia cái bundle đó thành 3 file mỗi
file chứa một component hãy nghĩ đơn giản code split như là bạn cắt một miếng
bánh to thành nhiều miếng nhỏ lazy load lazy load nghĩa là một cách để delay việc
load một resource gì đó cho tới khi thật sự cần thiết như trong video ở trên sẽ
khá tốn resource nếu chúng ta load hình mà user chưa thực sự cần xem đúng không
do đó nó apply lazy load để khi nào ta gần scroll tới cái hình đó thì mới load
hình về vừa đỡ tốn c pu cho máy user cùng vừa đỡ tốn 3 g cho người ta resource
ở đây bạn có thể define là mọi thứ như là một file code một cái thẻ img một thư
viện một response từ a pi khi nghĩ về lazy load thì bạn cần suy nghĩ cái gì có
thể lazy và cái gì không thể lazy việc chia ra những resource nào lazy load được
cái gì không thể lazy load giúp bạn có chiến thuật quản lý resource tốt hơn back
lại cái thuật ngữ bên trên split code làm ví dụ nhé câu hỏi của bạn là cắt cái
bundle bự thành nhiều bundle nhỏ để làm gì câu trả lời thường là bạn cắt nó ra
thành hai phần phần có thể lazy load được và phần không thể lazy load được do
đó bạn sẽ thấy khái niệm lazy load thường đi chung với split code vì lazy load
cái resource code thì cần cắt nó thành nhiều chunk nhỏ hơn để hiện thực lazy load
về mặt lý thuyết tất cả các resource liên quan tới interaction của user scroll
click hover press đều có thể lazy load được prefetchpreload prefetch nghĩa là
bạn nói với browser tao có một cái resource này nè khi nào mày rảnh thì load trước
giúp tao nhé preload preload nghĩa là bạn nói với browser load trước đống resource
này cho tao nhé rảnh hay không thì cũng load okey vậy khi nào thì nên dùng prefetch
hay preload prefetch hữu dụng khi bạn tin là user sẽ cần một số resource này trong
tương lai mình ví dụ khi user hover vào một link nào đó mình cũng không chắc là
user sẽ thật sự click vào link này hay không nhưng khả năng cao là có vì vậy nếu
mình prefetch trước cái link này thì nếu user bấm thật thì nó đã được load sẵn
cmnr nên sẽ thấy trang này load nhanh vklllllllllll preload hữu dụng khi bạn cần
những resource cực kì quan trọng cho bước render đầu tiên ví dụ dễ thấy nhất là
font việc preload trước font giúp trang web của bạn render lần đầu tiên thì visual
cũng ok luôn thay vì nếu render ra trang web mà font chưa có sau đó load font
rồi phải render lại một lần nữa việc thay font như vậy dễ khiến cho layout bị
flick và với góc nhìn của user thì thấy nó cũng khá là bad tree shaking bạn tưởng
tượng đống codemodule của bạn như một cái cây nha bây giờ bạn cầm cái cây đó rung
mạnh thật mạnh cái gì sẽ xảy ra những thành phần yếu ớt trên cái cây đó sẽ bị
rơi ra như là già cành khô tổ chym tree shaking trong code cũng tương đương vậy
bạn loại bỏ những thứ không cần thiết trong code dead code một cách tự động cái
này giống như việc giảm mỡ cho bundle của các bạn sẽ giúp load web nhanh hơn không
tốn thời gian cho những thứ không cần thiết s eo viết tắt của cụm từ search engine
optimization - tối ưu hóa cho công cụ tìm kiếm hiểu đơn giản là có vô vàn website
trên internet đúng không và khi bạn search google thì nó sẽ trả về cho bạn vào
trăm hay vài triệu kết quả đó vậy làm sao để trang web của mình nằm ở vị trí cao
hơn trong danh sách đó để nhiều user biết tới hơn vậy s eo là cách để tối ưu trang
web giúp nó có thứ hạng cao hơn ở các công cụ tìm kiếm như google bing tụi google
sẽ có nhiều tiêu chí để quyết định trang web của bạn có phù hợp với user hay không
như là content keyword hình ảnh tốc độ load trang ngôn ngữ do đó khi nói làm s
eo nghĩa là bạn làm đủ kiểu để các tiêu chí đó tốt hơn phù hợp với user hơn đường
nhiên là theo tiêu chí của tụi google rồi google page speed nó là cái trang này
nè page speed insights google build ra một cài tool để đo lường tốc độ website
của bạn và cho ra thang điểm từ 0 tới 100 điểm càng cao thì chứng tỏ website của
bạn ra dẻ load càng nhanh thường cái này là một tiêu chí mà ai cũng dùng để xem
coi website của bạn có đuỷnh hay không mình thì thấy nó cũng tương đối tuy nhiên
mọi người lại dựa vào nó quá nhiều để đánh giá một website the fold the fold hiểu
là bạn cắt cái trang web theo chiều ngang bên trên the fold là những gì đập vào
mặt user ngay lập tức khi họ mở trang web của bạn những gì ở dưới thì người ta
phải scroll xuống mới thấy được và vì định nghĩa là những gì đập vào mặt user
ngay lập tức nên khái niệm này khá là tương đối vì users có thể dùng device khác
nhau to nhỏ khác nhau có thể đập vào mặt ở màn hình mate view 4 k 27 inch với
màn hình dell full hd 24 inch nó khác nhau nên do đó the fold ở hai màn hình đó
cũng khác nhau tại sao cần phải phân biệt the fold nó giúp bạn tối ưu hơn cho
user kiểu như ở trên the fold thì load càng nhanh càng tốt vì nó là thứ xuất hiện
ngay lập tức khi user mở website ở dưới the fold thì có thể apply lazy load vì
user phải scroll xuống mới thấy được phải không nào c ss critical là một cách
để trích xuất những c ss above the fold ra riêng để tối ưu tốc độc load nhớ vụ
mình nói ở trên là optimize tối đa cho những thứ above the fold không thì cái
này là một cách để tối ưu above the fold tuy idea về việc chỉ inject c ss above
the fold ra gắn vào khá là đỉnh nhưng thực tế rất rất khó làm cái này nên mình
thấy nghe cho vui thì được c ss in j s cái tên nó lên tất cả viết c ss ở java
script mà tại sao lại không viết trong file css nhỉ khi dùng css đồng thời kết
hợp với các library hay framework gần đầy thì nó sẽ gặp một vài vấn đề c ss là
global trong khi mình muốn component của là isolated và không bị hoặc tạo những
style lên các thành phần khác lỡ code j s hết rồi nên thôi code luôn j s hết vì
nó viết bằng c ss nên sẽ dễ hơn khi bạn muốn làm một số thứ advance hơn với c
ss như c ss extraction critical service worker là một đoạn script chạy ở background
nó có thể intercept vào request và response giữa web của bạn và server và làm
một vài thứ hay ho khác notification cache sync data vì nó đứng ở giữa nên các
bạn tưởng tượng nó như proxy cũng được có thể thay đổi data gửi đi hay data nhận
về luôn nên cách dùng của service worker cũng khá là sáng tạo có thể là mock proxy
server cache lại response để biến web của các bạn trở thành offline web precache
những resource cần thiết một key quan trọng khi nói tới service worker là vì nó
chạy dưới background nên bạn có thể làm vài thứ hay ho mà không khiến cho web
của các bạn chậm đi web worker trước đây thì web chỉ có một luồng thực thi thôi
được gọi là main thread và vì chỉ có một luồng thực thì nên nó đẻ ra một vấn đề
khi bạn đang thực hiện một tác vụ task gì đó thì các tương tác khác phải chờ cho
task đó chạy xong mới chạy được case thử tế là ví dụ bạn code một trang web tính
lương cho nhân viên khi có một task tính toán lương đang chạy ở dưới và nếu nó
khá nặng thì lúc này user có click vào đâu thì trang web của các bạn cũng không
phản hồi được vì đang bận tính lương chết mọe rồi mà còn bắt tao làm cái khác
nữa hả do đó web worker đẻ ra để giải quyết vấn đề trên nói đơn giản là cái gì
tính toán nặng thì đẩy ra một thread khác để cái thằng main thread rảnh rỗi còn
handle interaction từ user hydration cái từ này hơi hiếm gặp nhưng khác là quan
trọng và gặp phải ở hầu hết các lib support s sr hydration là quá trình gắn các
event listener và các node tương ứng đã được generate từ quá trình s sr httpsgithubcomthanhlmmblogblobmasterpublicmaterialslazy-hydratemp
4rawtrue mình có một bài viết lan quyên tới cái này ở đây server side rendering
với hydration lãng phí tài nguyên như thế nào list virtualization bạn tưởng tượng
là cái web của mình là một cuộn giấy siêu dài và mình dang nhìn nò thông qua một
cửa sổ nhỏ window nghĩa là mình đang nhìn một phần rất nhỏ trong cuộn giấy đó
và để nhìn hết thì các bạn phải scroll list virtualization là kĩ thuật chỉ render
cái d om node nằm trong cửa sổ window của bạn các thứ nằm ngoài thì bỏ nó ra khỏi
d om luôn để trình duyệt không tốn resource để take care những thứ không quan
trọng bạn sẽ thấy cái này rất quan trọng khi apply cho những trang web có list
cực kì dài và phức tạp như là new feed của facebook twitter tới đây thấy cũng
khá dài rồi kiều càng viết nó càng có thêm á nên mình cũng không biết là còn thiếu
gì quan trọng không ngoài ra bạn còn muốn tìm hiểu về thuật ngữ ở mảng nào nữa
layout c ss state management comment bên dưới nhé bài viết lan quyên httpsthanhleblogblogfix-loi-force-layout-reflow-anh-huong-toi-performance-frontend
httpsthanhleblogblogtuong-lai-cua-frontend httpsthanhleblogblogfrontend-performance-pattern-vi
frontend term software all rights reserved báo cáo thêm vào series của tôi
pipeline_tag: sentence-similarity
library_name: sentence-transformers
---
# SentenceTransformer based on keepitreal/vietnamese-sbert
This is a [sentence-transformers](https://www.SBERT.net) model finetuned from [keepitreal/vietnamese-sbert](https://huggingface.co/keepitreal/vietnamese-sbert). It maps sentences & paragraphs to a 768-dimensional dense vector space and can be used for semantic textual similarity, semantic search, paraphrase mining, text classification, clustering, and more.
## Model Details
### Model Description
- **Model Type:** Sentence Transformer
- **Base model:** [keepitreal/vietnamese-sbert](https://huggingface.co/keepitreal/vietnamese-sbert)
- **Maximum Sequence Length:** 256 tokens
- **Output Dimensionality:** 768 dimensions
- **Similarity Function:** Cosine Similarity
### Model Sources
- **Documentation:** [Sentence Transformers Documentation](https://sbert.net)
- **Repository:** [Sentence Transformers on GitHub](https://github.com/UKPLab/sentence-transformers)
- **Hugging Face:** [Sentence Transformers on Hugging Face](https://huggingface.co/models?library=sentence-transformers)
### Full Model Architecture
```
SentenceTransformer(
(0): Transformer({'max_seq_length': 256, 'do_lower_case': False, 'architecture': 'RobertaModel'})
(1): Pooling({'word_embedding_dimension': 768, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
)
```
## Usage
### Direct Usage (Sentence Transformers)
First install the Sentence Transformers library:
```bash
pip install -U sentence-transformers
```
Then you can load this model and run inference.
```python
from sentence_transformers import SentenceTransformer
# Download from the 🤗 Hub
model = SentenceTransformer("sentence_transformers_model_id")
# Run inference
queries = [
"thu\u1eadt ng\u1eef trong frontend - optimization",
]
documents = [
'content creator báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm tại sao nên đọc bài này dành cho các bạn mới tiếp cận và thấy quá nhiều thuật ngữ mới dành cho các bạn có thể đã làm f e một thời gian rồi nhưng đôi khi vẫn không biết có một thứ như vậy tồn tại trên đời có vài keyword để tối ưu performance cho website các thuật ngữ phổ biến trong bài này mình sẽ nói về các thuật ngữ liên quan tới optimization nhé code split hiểu một cách đơn giản thì bạn có một file code rất to bạn chia file to đó ra thành nhiều file nhỏ thì gọi là code split hoặc một ví dụ khác là bạn có một trang web build bằng react trong đó bao gồm header body và footer thì bạn có thể build thành một file bundlejs bao gồm cả 3 component trên hoặc cũng có thể chia cái bundle đó thành 3 file mỗi file chứa một component hãy nghĩ đơn giản code split như là bạn cắt một miếng bánh to thành nhiều miếng nhỏ lazy load lazy load nghĩa là một cách để delay việc load một resource gì đó cho tới khi thật sự cần thiết như trong video ở trên sẽ khá tốn resource nếu chúng ta load hình mà user chưa thực sự cần xem đúng không do đó nó apply lazy load để khi nào ta gần scroll tới cái hình đó thì mới load hình về vừa đỡ tốn c pu cho máy user cùng vừa đỡ tốn 3 g cho người ta resource ở đây bạn có thể define là mọi thứ như là một file code một cái thẻ img một thư viện một response từ a pi khi nghĩ về lazy load thì bạn cần suy nghĩ cái gì có thể lazy và cái gì không thể lazy việc chia ra những resource nào lazy load được cái gì không thể lazy load giúp bạn có chiến thuật quản lý resource tốt hơn back lại cái thuật ngữ bên trên split code làm ví dụ nhé câu hỏi của bạn là cắt cái bundle bự thành nhiều bundle nhỏ để làm gì câu trả lời thường là bạn cắt nó ra thành hai phần phần có thể lazy load được và phần không thể lazy load được do đó bạn sẽ thấy khái niệm lazy load thường đi chung với split code vì lazy load cái resource code thì cần cắt nó thành nhiều chunk nhỏ hơn để hiện thực lazy load về mặt lý thuyết tất cả các resource liên quan tới interaction của user scroll click hover press đều có thể lazy load được prefetchpreload prefetch nghĩa là bạn nói với browser tao có một cái resource này nè khi nào mày rảnh thì load trước giúp tao nhé preload preload nghĩa là bạn nói với browser load trước đống resource này cho tao nhé rảnh hay không thì cũng load okey vậy khi nào thì nên dùng prefetch hay preload prefetch hữu dụng khi bạn tin là user sẽ cần một số resource này trong tương lai mình ví dụ khi user hover vào một link nào đó mình cũng không chắc là user sẽ thật sự click vào link này hay không nhưng khả năng cao là có vì vậy nếu mình prefetch trước cái link này thì nếu user bấm thật thì nó đã được load sẵn cmnr nên sẽ thấy trang này load nhanh vklllllllllll preload hữu dụng khi bạn cần những resource cực kì quan trọng cho bước render đầu tiên ví dụ dễ thấy nhất là font việc preload trước font giúp trang web của bạn render lần đầu tiên thì visual cũng ok luôn thay vì nếu render ra trang web mà font chưa có sau đó load font rồi phải render lại một lần nữa việc thay font như vậy dễ khiến cho layout bị flick và với góc nhìn của user thì thấy nó cũng khá là bad tree shaking bạn tưởng tượng đống codemodule của bạn như một cái cây nha bây giờ bạn cầm cái cây đó rung mạnh thật mạnh cái gì sẽ xảy ra những thành phần yếu ớt trên cái cây đó sẽ bị rơi ra như là già cành khô tổ chym tree shaking trong code cũng tương đương vậy bạn loại bỏ những thứ không cần thiết trong code dead code một cách tự động cái này giống như việc giảm mỡ cho bundle của các bạn sẽ giúp load web nhanh hơn không tốn thời gian cho những thứ không cần thiết s eo viết tắt của cụm từ search engine optimization - tối ưu hóa cho công cụ tìm kiếm hiểu đơn giản là có vô vàn website trên internet đúng không và khi bạn search google thì nó sẽ trả về cho bạn vào trăm hay vài triệu kết quả đó vậy làm sao để trang web của mình nằm ở vị trí cao hơn trong danh sách đó để nhiều user biết tới hơn vậy s eo là cách để tối ưu trang web giúp nó có thứ hạng cao hơn ở các công cụ tìm kiếm như google bing tụi google sẽ có nhiều tiêu chí để quyết định trang web của bạn có phù hợp với user hay không như là content keyword hình ảnh tốc độ load trang ngôn ngữ do đó khi nói làm s eo nghĩa là bạn làm đủ kiểu để các tiêu chí đó tốt hơn phù hợp với user hơn đường nhiên là theo tiêu chí của tụi google rồi google page speed nó là cái trang này nè page speed insights google build ra một cài tool để đo lường tốc độ website của bạn và cho ra thang điểm từ 0 tới 100 điểm càng cao thì chứng tỏ website của bạn ra dẻ load càng nhanh thường cái này là một tiêu chí mà ai cũng dùng để xem coi website của bạn có đuỷnh hay không mình thì thấy nó cũng tương đối tuy nhiên mọi người lại dựa vào nó quá nhiều để đánh giá một website the fold the fold hiểu là bạn cắt cái trang web theo chiều ngang bên trên the fold là những gì đập vào mặt user ngay lập tức khi họ mở trang web của bạn những gì ở dưới thì người ta phải scroll xuống mới thấy được và vì định nghĩa là những gì đập vào mặt user ngay lập tức nên khái niệm này khá là tương đối vì users có thể dùng device khác nhau to nhỏ khác nhau có thể đập vào mặt ở màn hình mate view 4 k 27 inch với màn hình dell full hd 24 inch nó khác nhau nên do đó the fold ở hai màn hình đó cũng khác nhau tại sao cần phải phân biệt the fold nó giúp bạn tối ưu hơn cho user kiểu như ở trên the fold thì load càng nhanh càng tốt vì nó là thứ xuất hiện ngay lập tức khi user mở website ở dưới the fold thì có thể apply lazy load vì user phải scroll xuống mới thấy được phải không nào c ss critical là một cách để trích xuất những c ss above the fold ra riêng để tối ưu tốc độc load nhớ vụ mình nói ở trên là optimize tối đa cho những thứ above the fold không thì cái này là một cách để tối ưu above the fold tuy idea về việc chỉ inject c ss above the fold ra gắn vào khá là đỉnh nhưng thực tế rất rất khó làm cái này nên mình thấy nghe cho vui thì được c ss in j s cái tên nó lên tất cả viết c ss ở java script mà tại sao lại không viết trong file css nhỉ khi dùng css đồng thời kết hợp với các library hay framework gần đầy thì nó sẽ gặp một vài vấn đề c ss là global trong khi mình muốn component của là isolated và không bị hoặc tạo những style lên các thành phần khác lỡ code j s hết rồi nên thôi code luôn j s hết vì nó viết bằng c ss nên sẽ dễ hơn khi bạn muốn làm một số thứ advance hơn với c ss như c ss extraction critical service worker là một đoạn script chạy ở background nó có thể intercept vào request và response giữa web của bạn và server và làm một vài thứ hay ho khác notification cache sync data vì nó đứng ở giữa nên các bạn tưởng tượng nó như proxy cũng được có thể thay đổi data gửi đi hay data nhận về luôn nên cách dùng của service worker cũng khá là sáng tạo có thể là mock proxy server cache lại response để biến web của các bạn trở thành offline web precache những resource cần thiết một key quan trọng khi nói tới service worker là vì nó chạy dưới background nên bạn có thể làm vài thứ hay ho mà không khiến cho web của các bạn chậm đi web worker trước đây thì web chỉ có một luồng thực thi thôi được gọi là main thread và vì chỉ có một luồng thực thì nên nó đẻ ra một vấn đề khi bạn đang thực hiện một tác vụ task gì đó thì các tương tác khác phải chờ cho task đó chạy xong mới chạy được case thử tế là ví dụ bạn code một trang web tính lương cho nhân viên khi có một task tính toán lương đang chạy ở dưới và nếu nó khá nặng thì lúc này user có click vào đâu thì trang web của các bạn cũng không phản hồi được vì đang bận tính lương chết mọe rồi mà còn bắt tao làm cái khác nữa hả do đó web worker đẻ ra để giải quyết vấn đề trên nói đơn giản là cái gì tính toán nặng thì đẩy ra một thread khác để cái thằng main thread rảnh rỗi còn handle interaction từ user hydration cái từ này hơi hiếm gặp nhưng khác là quan trọng và gặp phải ở hầu hết các lib support s sr hydration là quá trình gắn các event listener và các node tương ứng đã được generate từ quá trình s sr httpsgithubcomthanhlmmblogblobmasterpublicmaterialslazy-hydratemp 4rawtrue mình có một bài viết lan quyên tới cái này ở đây server side rendering với hydration lãng phí tài nguyên như thế nào list virtualization bạn tưởng tượng là cái web của mình là một cuộn giấy siêu dài và mình dang nhìn nò thông qua một cửa sổ nhỏ window nghĩa là mình đang nhìn một phần rất nhỏ trong cuộn giấy đó và để nhìn hết thì các bạn phải scroll list virtualization là kĩ thuật chỉ render cái d om node nằm trong cửa sổ window của bạn các thứ nằm ngoài thì bỏ nó ra khỏi d om luôn để trình duyệt không tốn resource để take care những thứ không quan trọng bạn sẽ thấy cái này rất quan trọng khi apply cho những trang web có list cực kì dài và phức tạp như là new feed của facebook twitter tới đây thấy cũng khá dài rồi kiều càng viết nó càng có thêm á nên mình cũng không biết là còn thiếu gì quan trọng không ngoài ra bạn còn muốn tìm hiểu về thuật ngữ ở mảng nào nữa layout c ss state management comment bên dưới nhé bài viết lan quyên httpsthanhleblogblogfix-loi-force-layout-reflow-anh-huong-toi-performance-frontend httpsthanhleblogblogtuong-lai-cua-frontend httpsthanhleblogblogfrontend-performance-pattern-vi frontend term software all rights reserved báo cáo thêm vào series của tôi',
'editors choice may fest 2024 báo cáo thêm vào series của tôi canva một công cụ thiết kế trực tuyến chắc hẳn bạn đã từng nghe qua hoặc đã từng dùng để tạo ra các design một cách vô cùng nhanh chóng canva được hàng triệu người yêu thích trên toàn cầu không chỉ nổi tiếng với giao diện thân thiện và kho tài nguyên đồ họa khổng lồ mà còn nhờ khả năng cho phép người dùng tự do tải lên các design của riêng họ với hơn 100 triệu người dùng hoạt động hàng tháng và 50 triệu tệp media được tải lên mỗi ngày canva đã nhanh chóng trở thành một trong những nền tảng thiết kế trực tuyến phổ biến nhất thế giới tuy nhiên sự tăng trưởng vượt bậc này cũng đặt ra một thách thức không nhỏ cho đội ngũ kỹ sư của canva đôi khi công ty phát triển nhanh quá cũng khổ mấy ông dev phết làm thế nào để quản lý và lưu trữ khối lượng dữ liệu khổng lồ này một cách hiệu quả đảm bảo trải nghiệm người dùng luôn mượt mà và không bị gián đoạn nhỉ cùng sydexa tìm hiểu cách mà canva giải quyết vấn đề khá khoai này nha bạn cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha và chúng mình có động lực ra những bài viết thú vị hơn nữa chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom kiến trúc hiện tại của canva và vấn đề gặp phải canva được xây dựng trên một kiến trúc microservices linh hoạt nơi mỗi service đảm nhận một vai trò riêng biệt trong đó dịch vụ media đóng vai trò trung tâm quản lý toàn bộ thông tin liên quan đến tài nguyên media của người dùng từ i d chủ sở hữu trạng thái đang hoạt động đã xóa chờ xóa cho đến metadata tiêu đề tác giả từ khóa thông tin màu sắc và đặc biệt là vị trí lưu trữ của tệp tin service media hoạt động như một thủ thư cực kỳ tận tâm liên tục xử lý hàng loạt request đọc và ghi dữ liệu tuy nhiên có một điểm thú vị là lượng yêu cầu đọc vượt xa lượng yêu cầu ghi bởi người dùng thường xuyên tìm kiếm và sử dụng các media có sẵn hơn là chỉnh sửa chúng hầu hết các tệp media ít khi bị thay đổi sau khi được tạo ra ngoại trừ những media nằm trong thư viện ảnh và đồ họa của canva ban đầu canva lựa chọn my sq l trên a ws r ds làm ngôi nhà để lưu trữ kho báu media của mình tuy nhiên khi gia tài media ngày càng đồ sộ với tốc độ tăng trưởng chóng mặt my sq l bắt đầu bộc lộ những hạn chế việc thay đổi cấu trúc schema của các bảng media lớn trở nên chậm chạp có thể mất đến hàng ngày trời giới hạn về tốc độ sao chép của my sq l 56 đã cản trở tốc độ ghi vào các bản sao đọc canva cũng sắp đạt đến giới hạn về kích thước volume e bs của r ds my sq l 16 t b tại thời điểm đó hơn nữa mỗi lần nâng cấp dung lượng lưu trữ lại kéo theo sự gia tăng độ trễ io ảnh hưởng trực tiếp đến tốc độ phản hồi yêu cầu của người dùng việc khởi động lại máy chủ hay nâng cấp phiên bản my sq l cũng gây ra downtime điều tối kỵ đối với một nền tảng trực tuyến như canva các giải pháp tạm thời để khắc phục vấn đề để kéo dài tuổi thọ cho my sq l trong khi tìm kiếm một giải pháp thay thế lâu dài canva đã thực hiện một loạt các biện pháp tạm thời một trong những thay đổi quan trọng là chuyển metadata nội dung sang một cột j so n riêng biệt metadata là phần thông tin mô tả về tệp media thường xuyên được cập nhật và thay đổi việc chuyển metadata sang j so n cho phép canva tự quản lý schema của phần dữ liệu này một cách linh hoạt hơn giảm sự phụ thuộc vào việc thay đổi schema của toàn bộ bảng dữ liệu vốn rất tốn kém về thời gian và tài nguyên tiếp theo canva đã thực hiện phi chuẩn hóa một số bảng denormalized để giảm xung đột khóa lock contention và số lượng phép nối join cần thiết khi thực hiện truy vấn bên cạnh đó canva cũng thực hiện các biện pháp tối ưu hóa khác như loại bỏ các nội dung lặp lại hoặc mã hóa chúng một cách ngắn gọn hơn điều này giúp giảm dung lượng lưu trữ và tăng tốc độ truy vấn canva cũng loại bỏ các ràng buộc khóa ngoại để tăng tốc độ ghi và cập nhật dữ liệu mặc dù điều này có thể làm giảm tính toàn vẹn dữ liệu cuối cùng canva thay đổi cách thức nhập media để giảm số lần cập nhật metadata giúp giảm tải cho hệ thống một giải pháp tạm thời quan trọng khác được canva áp dụng là sharding đây là kỹ thuật chia nhỏ dữ liệu thành nhiều phần và lưu trữ trên nhiều máy chủ khác nhau sharding giúp canva vượt qua giới hạn kích thước tệp bảng 2 t b của hệ thống tệp ext 3 đồng thời tăng tốc độ sao chép và cải thiện hiệu suất cho các truy vấn theo i d vốn là loại truy vấn phổ biến nhất khi tải thiết kế trên canva tuy nhiên sharding cũng có nhược điểm là kém hiệu quả đối với các truy vấn ít phổ biến hơn chẳng hạn như liệt kê tất cả media thuộc sở hữu của một người dùng mặc dù các biện pháp trên đã giúp canva tạm thời giải quyết được những vấn đề cấp bách nhưng về lâu dài họ vẫn cần một giải pháp lưu trữ mới có khả năng mở rộng và đáp ứng tốt hơn nhu cầu ngày càng tăng của người dùng quá trình di chuyển từ my sq l sang dynamo db sau khi xem xét và thử nghiệm nhiều giải pháp khác nhau canva đã chọn dynamo db làm điểm đến cuối cùng cho kho dữ liệu media khổng lồ của mình dynamo db là một cơ sở dữ liệu no sq l được quản lý hoàn toàn bởi a ws nổi tiếng với khả năng mở rộng linh hoạt tính sẵn sàng cao và hiệu suất vượt trội đáp ứng được yêu cầu khắt khe về khả năng mở rộng và tốc độ của canva tuy nhiên quá trình di chuyển dữ liệu từ my sq l sang dynamo db không hề đơn giản canva phải đối mặt với hai yêu cầu quan trọng không được gây ảnh hưởng đến trải nghiệm người dùng và thực hiện chuyển đổi mà không có bất kỳ downtime nào để đảm bảo tính liên tục của dịch vụ canva đã triển khai một chiến lược di chuyển vô cùng tỉ mỉ và thận trọng canva cần di chuyển tất cả các dữ liệu cũ các dữ liệu mới được tạo và các dữ liệu mới được cập nhật sang dynamo d b đầu tiên canva sử dụng hàng đợi s qs của a ws để gửi các thông báo về việc một tập tin media cụ thể đã được tạo cập nhật hoặc đọc nhưng không chứa nội dung của bản cập nhật một worker instance sẽ xử lý các thông báo này để đọc trạng thái hiện tại từ cơ sở dữ liệu my sq l chính và cập nhật dynamo db các bản ghi mới được tạo cập nhật hoặc được đọc gần đây sẽ được ưu tiên sao chép sang dynamo db trước cách tiếp cận này đảm bảo rằng những dữ liệu được sử dụng thường xuyên nhất sẽ có sẵn trên dynamo db giúp giảm thiểu độ trễ và cải thiện trải nghiệm người dùng giảm tải cho cụm my sq l ghi dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db các thông báo về việc tạo mới hoặc cập nhật media được đặt vào hàng đợi ưu tiên cao trong khi các thông báo về việc đọc media được đặt vào hàng đợi ưu tiên thấp điều này đảm bảo rằng các worker instance sẽ tập trung vào việc xử lý các thông báo ghi trước để dữ liệu mới được cập nhật nhanh chóng trên tất cả các bản sao của dynamo db sau khi đã xử lý hết các thông báo ghi chúng mới chuyển sang xử lý các thông báo đọc điều này giúp cho đảm bảo có thể phục vụ các yêu cầu đọc có tính nhất quán cuối cùng eventually consistent từ dynamo db đọc dữ liệu trong quá trình di chuyển từ my sq l sang dynamo db tiếp theo canva thực hiện một quá trình quét và sao chép dần dần để chuyển toàn bộ dữ liệu còn lại sang dynamo db quá trình này được thực hiện một cách cẩn thận và kiểm soát để không ảnh hưởng đến hoạt động của hệ thống quá trình quyét dữ liệu để di chuyển những media còn lại sang dynamo db canva sẽ quét qua tất cả các media bắt đầu từ những media được tạo gần đây và gửi một thông báo qua message queue có độ ưu tiên thấp để worker thực hiện sao chép qua dynamo db quá trình kiểm tra để đảm bảo tính toàn vẹn của dữ liệu trong quá trình di chuyển canva đã thực hiện nhiều biện pháp kiểm tra nghiêm ngặt trước khi chuyển hoàn toàn sang đọc từ dynamo db canva đã thực hiện kiểm tra so sánh kết quả từ cả hai hệ thống my sq l và dynamo db bất kỳ sự không nhất quán nào được phát hiện sẽ được điều tra và sửa chữa ngay lập tức ngoài ra canva cũng sử dụng my sq l như một phương án dự phòng fallback trong giai đoạn đầu của quá trình chuyển đổi điều này đảm bảo rằng nếu có bất kỳ vấn đề nào xảy ra với dynamo db hệ thống vẫn có thể hoạt động bình thường bằng cách đọc dữ liệu từ my sq l nhờ sự kết hợp của các biện pháp này canva đã thực hiện thành công việc di chuyển dữ liệu sang dynamo db một cách an toàn và không gây gián đoạn cho người dùng việc chuyển đổi sang dynamo db đã mang lại những kết quả vượt ngoài mong đợi cho canva độ trễ của dịch vụ media giảm đáng kể giúp cải thiện tốc độ tải và trải nghiệm người dùng khả năng mở rộng của dynamo db cũng được thể hiện rõ rệt khi số lượng người dùng hoạt động hàng tháng của canva tăng gấp ba lần kể từ khi chuyển đổi và dynamo db vẫn hoạt động ổn định tự động mở rộng quy mô để đáp ứng nhu cầu ngày càng tăng không chỉ vậy chi phí vận hành dynamo db còn thấp hơn so với cụm a ws r ds trước đây mang lại hiệu quả kinh tế đáng kể cho canva tuy nhiên quá trình chuyển đổi này cũng mang đến những bài học quý giá cho đội ngũ kỹ sư của canva họ nhận ra tầm quan trọng của việc hiểu rõ đặc điểm truy cập dữ liệu để ưu tiên di chuyển những dữ liệu được sử dụng thường xuyên nhất bên cạnh đó việc kiểm tra và thử nghiệm trong môi trường production cũng được coi là rất cần thiết để đảm bảo tính ổn định của hệ thống sau khi chuyển đổi mặc dù dynamo db không có những tính năng tiện lợi như thay đổi schema dễ dàng hay hỗ trợ truy vấn s ql ad-hoc những lợi ích về khả năng mở rộng và hiệu suất đã bù đắp cho những hạn chế này hành trình chuyển đổi từ my sq l sang dynamo db đã đánh dấu một cột mốc quan trọng trong quá trình phát triển của canva không chỉ giải quyết triệt để bài toán lưu trữ media canva còn chứng minh được khả năng thích ứng và vượt qua những thách thức về công nghệ để đáp ứng nhu cầu ngày càng tăng của người dùng với dynamo db canva đã xây dựng một hệ thống lưu trữ media mạnh mẽ và linh hoạt đủ sức chứa hơn 25 tỷ file media do người dùng tải lên và sẵn sàng đón nhận thêm 50 triệu file mới mỗi ngày thành công này không chỉ khẳng định vị thế của canva là một trong những nền tảng thiết kế trực tuyến hàng đầu thế giới mà còn mở ra những cơ hội phát triển mới trong tương lai nếu thấy bài viết này hay thì cho chúng mình xin 1 upvote và comment để chúng mình nhận giải của viblo nha lời nhắn chúng mình có tạo group cho các bạn cùng chia sẻ và học hỏi về thiết kế hệ thống nha các bạn tham gia để gây dựng cộng đồng system design việt nam thật lớn mạnh nhé cộng đồng system design việt nam httpswwwfacebookcomgroupssydexa kênh tik tok httpswwwtiktokcomsydexacom bạn có thể tìm hiểu thêm chia sẻ từ chính canva httpswwwcanvadevblogengineeringfrom-zero-to-50-million-uploads-per-day-scaling-media-at-canva dynamo db httpsdocsawsamazoncomamazondynamodblatestdeveloperguideintroductionhtml eventual consistency httpswwwscylladbcomglossaryeventual-consistency s qs httpsawsamazoncomsqs system design dynamodb microservices canva coding all rights reserved báo cáo thêm vào series của tôi',
'báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 10 năm 1 agile là gì agile là một triết lí philosophy cho việc phát triển phần mềm nói cách khác đó là một cách tư duy về các dự án phần mềm các triết lí của agile được cụ thể hóa bởi một số phương pháp phát triển phần mềm method chẳng hạn như extreme programming x p hay scrum gọi tắt là các phương pháp agile mỗi phương pháp agile bao gồm một tập hợp các quy tắc pratice chẳng hạn quy tắc về sử dụng công cụ quản lí mã nguồn quy tắc về các chuẩn lập trình hay quy tắc chuyển giao sản phẩm hàng tuần cho khách hàng triết lí agile được đưa ra trong một bản tuyên ngôn manifesto gồm 4 tiêu chí vàđược làm rõ hơn bởi 12 quy tắc a 4 tiêu chí của agile cá nhân và các tương tác quan trọng hơn các quy trình và công cụ tập trung làm cho phần mềm chạy được hơn là viết các tài liệu mô tả cộng tác với khách hàng hơn là chỉ dựa trên hợp đồng phản ứng với các thay đổi hơn là chỉ tuân theo một kế hoạch định sẵn b 12 quy tắc trong agile thỏa mãn yêu cầu của khách hàng thông qua việc giao hàng sớm và liên tục chào đón việc thay đổi yêu cầu thậm chí là những thay đổi yêu cầu muộn giao phần mềm chạy được cho khách hàng một cách thường xuyên giao hàng tuần hơn là hàng tháng nhà kinh doanh và kỹ sư lập trình phải làm việc cùng nhau hàng ngày trong suốt dựán các dựán được xây dựng xung quanh những cá nhân cóđộng lực cung cấp cho họ môi trường và sự hỗ trợ cần thiết và tin tưởng họ để hoàn thành công việc trao đổi trực tiếp mặt đối mặt là phương pháp hiệu quả nhất để truyền đạt thông tin phần mềm chạy được là thước đo chính của tiến độ phát triển bền vững và duy trì được nhịp độ phát triển liên tục liên tục quan tâm đến kĩ thuật và thiết kế để cải tiến sự linh hoạt sự đơn giản là cần thiết nghệ thuật tối đa hóa lượng công việc chưa hoàn thành nhóm tự tổ chức thích ứng thường xuyên với sự thay đổi 2 quy trình kiểm thử phần mềm trong mô hình agile kiểm thử testing trong dự án agile yêu cầu một sự dịch chuyển mô thức paradigm shift cho vai trò kiểm thử truyền thống nó đòi hỏi một sự thay đổi trong thái độ của kiểm thử viên tester từ một phương pháp tiếp cận theo định hướng ca kíp thành một vai trò được tham gia sâu vào quy trình phát triển từ sớm cách tiếp cận agile tập trung vào việc nhận được những điều đúng đắn ngay từ đầu làm giảm sự cần thiết phải có nhiều kiểm thử viên đảm bảo chất lượng q a tester ở cuối quy trình để đạt được kết quả vai trò kiểm thử viên q a trong agile không bị giới hạn một tập hợp các quy trình được xác định trước cũng như phương pháp luận sẽ chỉ ra vai trò dựa trên tình huống cụ thể a các giai đoạn kiểm thử phần mềm tương ứng với các giai đoạn phát triển phần mềm trong mô hình agile tiền-phân-đoạn pre-iteration đây là giai đoạn yêu cầu được phân tích chi tiết bởi b a business analyst chuyên viên phân tích nghiệp vụ và các tiêu chí chấp nhận acceptance criteria được viết ra cho mỗi một story user story và q a là những người sử dụng các yêu cầu này ngay từ đầu ta cần phải xác minh verify những yêu cầu đó từ sớm và thường xuyên xác minh story xác minh yêu cầu kiểm thử agile thiên về việc đưa ra phản hồi sớm không chỉ bằng cách kiểm tra các yêu cầu mà còn là phải làm việc đó từ sớm các q a tester cần phải xem xét các yêu cầu story từ sớm để làm sáng rõý nghĩa và tính khả-kiểm testability việc này sẽđảm bảo các yêu cầu luôn rõ ràng và có thể kiểm thửđược yêu cầu cần đủ nhỏ để có ý nghĩa trong bối cảnh xác định tiêu chí chấp nhận acceptance criteria - những story thường được sử dụng cho các tiêu chí chấp nhận không nên bị trùng lặp chồng chéo từ những story khác nhau để hiểu rõ hơn về giai đoạn này chúng ta cùng tìm hiểu những phần sau user story là một tóm tắt đơn giản ngắn gọn về chức năng mà khách hàng mong muốn nó thường được viết theo mẫu sau với tôi muốn vì ví dụ với vai trò là người dùng website tôi muốn có một chức năng tìm kiếm nâng cao để có thể tìm kiếm nhanh chóng và dễ dàng những quyển sách tôi cần tiêu chí chấp nhận acceptance criteria là những tiêu chí dùng để đánh giá sản phẩm chức năng đã thực hiện đúng yêu cầu hay chưa có thể coi đó là các tiêu chí xác nhận hoàn thành story các tiêu chí đặt ra phải đáp ứng các đặc tính sau tính khả dụng usability là tiêu chí trả lời cho câu hỏi có dễ sử dụng hay không là chìa khóa đưa ra các tiêu chí đánh giá có thể xác định tính chức năng functionality xử lý lỗi error handing liệt kê ra những lỗi có thể gặp phải trong quá trình sử dụng chương trình và phương thức để xử lý ví dụ người dùng có thể thực hiện sai thứ tự các bước và khi đó chương trình sẽ xử lý như thế nào hiệu suất performance stress tests là tiêu chí trả lời cho câu hỏi hệ thống sẽ hoạt động như thế nào dưới những áp lực như có nhiều người truy cập tại cùng 1 thời điểm có quá nhiều request được gửi đến hệ thống ví dụ với story như trên ta có các tiêu chí chấp nhận như sau tôi có thể giới hạn tìm kiếm theo định dạng loại tôi có thể tìm kiếm theo phạm vi ngày tôi có thể giới hạn tìm kiếm thông tin nhà xuất bản như tiêu đề tác giả chủ đề địa điểm nhà xuất bản và số lượng xuất bản tôi có thể giới hạn tìm kiếm bởi một tiêu chí cụ thể như danh mục bộ sưu tập tôi có thể lọc filter để đạt được mục tiêu của giai đoạn này cần có sự giao tiếp chặt chẽ giữa các bên đội phát triển nhà phân tích nghiệp vụ đảm bảo chất lượng khả kiểm testable các khía cạnh có thể kiểm thửđược của story phải được xem xét chi tiết để có thể kiểm thửđược story đó những yếu tố này thường là tìm kiếm các yêu cầu ẩn môi trường dữ liệu kiểm thử test data sự phụ thuộc vào các yêu cầu khác việc có được các chi tiết này sớm sẽ giúp câu chuyện được ưu tiên đúng đắn hơn trong backlog và cho phép việc thực hiện story đó suôn sẻ hơn trong phân đoạn iteration q a tester cũng tham gia cuộc họp lập kế hoạch cho phân đoạn để cung cấp quan điểm kiểm thửđể nhóm có thểđưa ra được ước lượng phát triển tham gia trong việc lập kế hoạch phân đoạn đóng vai trò quan trọng khi một số các yêu cầu tiềm ẩn thường được phát hiện bởi các q a tester b các hoạt động đảm bảo chất lượng trong phân đoạn môt khi q a tester đã thấy thoải mái với các tiêu chí chấp nhận của một story nào đó họ có thể giúp nhóm định nghĩa các kiểm thử chấp nhận acceptance tests cho story đó kiểm thử chấp nhận là các yêu cầu về phương diện kiểm thử cần được thực hiện để hiểu các yêu cầu phần mềm các kiểm thử chấp nhận này được sinh ra tự động và dùng để hướng dẫn quá trình phát triển các kiểm thử chấp nhận không nên bao gồm tất tần tật các tình huống case scenarios do điều này có thể tạo ra những sự ngưng trệ không cần thiết và có thể tạo ra quá nhiều bộ kiểm thử tự động automated test tương tự nhau kiểm thử chấp nhận trong các dự án agile là khác biệt so với các dự án truyền thống không giống như các dự án truyền thống nơi kiểm thử chấp nhận xảy ra ở phần cuối của vòng đời phần mềm trong dự án agile kiểm thử chấp nhận được thực hiện trước khi phần mềm được chuyển giao kiểm thử chấp nhận cũng có xu hướng được tự động hóa để họ có thể chạy như là kiểm thử hồi quy regression test kiểm thử tự động rất quan trọng đối với mọi dựán agile các bản build thường xuyên yêu cầu các chu kỳ phản hồi ngắn do đó kiểm thử hồi quy phải nhanh chóng và chính xác ví dụ trở lại với ví dụ ở phần mở đầu khi khách hàng yêu cầu thực hiện tìm kiếm sách theo nhiều tiêu chí trong trường hợp các tiêu chí tìm kiếm được chia nhỏ ra để thực hiện như sau sprint 1 phát triển chức năng tìm kiếm theo tên sách và thể loại sprint 2 phát triển chức năng tìm kiếm theo tác giả và nhà xuất bản sprint 3 phát triển chức năng tìm kiếm theo ngày phát hành tình trạng sách như vậy khi kiểm thử chấp nhận chức năng tìm kiếm ở sprint 2 chúng ta sẽ phải kết hợp việc kiểm thử lại chức năng tìm kiếm theo các tiêu chíở sprint 1 nếu không có các công cụ kiểm thử tựđộng hỗ trợ cho việc kiểm thử lại các chức năng ở sprint 1 thì người thực hiện kiểm thử sẽ mất thêm thời gian cho việc kiểm thử lại sprint 1 trong các dựán agile kiểm thử tựđộng được thực hiện bởi tất cả các cấp độ - lập trình viên kiểm thử viên bảo đảm chất lượngq a tester và các nhà phân tích nghiệp vụ b a sự tham gia của tất cả mọi người làm gia tăng tính xác đáng của các phần kiểm thử và thường giúp xác định đúng các phần kiểm thử tuy nhiên điều này không có nghĩa là tất cả mọi người phải đều phải viết mã kiểm thử 3 sử dụng tự động hóa có mục đích tự động hóa đồng nghĩa với việc cung cấp thông tin phản hồi sớm về những mã nguồn được tạo ra và điều quan trọng là phải xác định những gì cần tự động hoá và những gì thì không tất cả các kiểm thử tự động đều mất chi phí chi phí của tự động hóa nên được so sánh với chi phí khi không thực hiện việc đó một chu kỳ phản hồi dài hơn đồng nghĩa với việc phải có nhiều người đóng góp nhiều thời gian hơn mới có được phản hồi tức thì một hoạt động bảo đảm chất lượng điển hình trong phân đoạn là việc liên tục đo lường chất lượng của phần mềm q a tester tham gia vào việc bàn giao các story cho các nhà phát triển điều này giúp họ hiểu được những yêu cầu kiểm thử của story để họ có thể triển khai được kĩ thuật phát triển định-hướng-kiểm-thử test-driven development - t dd ngoài ra việc bàn giao các kiểm thử chấp nhận và giúp cho các lập trình viên hiểu các khía cạnh khả kiểm testability của story để tránh được các lỗi defect phổ biến những hoạt động này đòi hỏi một mức độ cao của giao tiếp giữa các lập trình viên và các chuyên viên phân tích nghiệp vụđể làm rõ yêu cầu vàđảm bảo sản phẩm được xây dựng đúng đắn ngay từ đầu q a tester có thể giúp giải quyết các vấn đề trước hết bằng cách tích cực tham gia vào quy trình tổng thể ta thậm chí có thể kết hợp với các nhà phát triển làm việc trên một story hoặc các kiểm thử cho story để thể hiểu rõ hơn về các yêu cầu điều bắt buộc là một story khi được chuyển giao nó phải được kiểm thử đúng cách trong một môi trường thích hợp một khi các q a tester hài lòng với những story họ sẽ đưa nó vào các tiến trình kiểm thử tiếp theo một điều quan trọng khác là phải suy nghĩ vượt ra ngoài các yêu cầu bằng văn bản và thử nghiệm với các kiểm thử thăm dò exploratory testing để thực hiện kịch bản ngoài lề và thực hiện các kiểm thử tiêu cực đểđảm bảo chắc chắn phần mềm được viết ra là chất lượng kiểm thử thăm dò không phải là thực thi tất cả các kịch bản kiểm thửđược xác định trước nó là nghệ thuật thăm dò phần mềm ngoài các trường hợp kiểm thử test case vàđồng thời giữ tập trung xung quanh các yêu cầu cụ thể nguồn tham khảo httpwwwlogigearcommagazineagilea-testers-perspective-on-agile-projects httpagilemanifestoorg httpwwwmountaingoatsoftwarecomagile agile q a all rights reserved báo cáo thêm vào series của tôi',
]
query_embeddings = model.encode_query(queries)
document_embeddings = model.encode_document(documents)
print(query_embeddings.shape, document_embeddings.shape)
# [1, 768] [3, 768]
# Get the similarity scores for the embeddings
similarities = model.similarity(query_embeddings, document_embeddings)
print(similarities)
# tensor([[ 0.4969, -0.0312, -0.0005]])
```
## Training Details
### Training Dataset
#### Unnamed Dataset
* Size: 6,120 training samples
* Columns: query, positive, and negative
* Approximate statistics based on the first 1000 samples:
| | query | positive | negative |
|:--------|:----------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------|
| type | string | string | string |
| details |
d b m ig ra ti on f or g ol an g s er vi ce s w hy i t m at te rs - viblo | báo cáo thêm vào series của tôi d b migration why it matters have you ever faced the situations when you deploy new update on production with updated database schemas but got bugs after that and need to revert things thats when migration comes into place database migration serves several key purposes schema evolution as applications evolve their data models change migrations allow developers to systematically update the database schema to reflect these changes ensuring that the database structure matches the application code version control migrations provide a way to version the database schema allowing teams to track changes over time this versioning helps in understanding the evolution of the database and aids in collaboration among developers consistency across environments migrations ensure that the database schema is consistent across different environments development testing production this reduces the risk of discrepancies that can lead to bugs and integration issues rollback ... | báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 2 năm 37 doubly linked lists ưu điểm của doubly linked list - danh sách liên kết kép còn được gọi là danh sách liên kết hai chiều là với một nút trong danh sách chúng ta có thể điều hướng theo cả hai hướng không thể xóa một nút trong singly linked list trừ khi chúng ta có con trỏ tới nút phía trước của nó nhưng trong danh sách được liên kết kép chúng ta có thể xóa một nút ngay cả khi chúng ta không có địa chỉ của nút trước đó vì mỗi nút có một con trỏ bên trái trỏ đến nút trước đó và có thể di chuyển ngược lại những nhược điểm chính của danh sách được liên kết kép là mỗi nút yêu cầu thêm một con trỏ đòi hỏi nhiều không gian bộ nhớ hơn việc chèn hoặc xóa một nút mất nhiều thời gian hơn nhiều thao tác tới con trỏ hơn tương tự như một danh sách được liên kết đơn chúng ta triển khai các hoạt động của một danh sách được liên kết kép nếu bạn hiểu các thao tác danh sách liên kết đơn thì các thao tác danh sách liên kết k... |
| example | báo cáo thêm vào series của tôi as a beginner programmer you may have heard of the term sorting algorithms but have no idea what they are or how they work well fear not in this article well be diving into one of the most basic sorting algorithms out there bubble sort but before we get into the nitty-gritty of how bubble sort works lets first define what it is simply put bubble sort is an algorithm that compares adjacent elements in an array and swaps their positions if they are not in the correct order it continues to do this until the array is fully sorted now that we have a basic understanding of bubble sort lets take a look at how it works with an example lets say we have an array of numbers that we want to sort from least to greatest 5 2 1 4 3 using bubble sort we would first compare the first two elements 5 and 2 since 5 is greater than 2 we would swap their positions the array would now look like this 2 5 1 4 3 next we would compare the second and third elements 5 and 1 since 5 i... | happy new year báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 4 năm rất chào các bạn như các bạn đã biết trong kỉ nguyên công nghệ song song với sự sinh ra dày đặc của các trang web mới cũng là sự biến mất của những trang web lạc hậu hay hoạt động kém hiệu quả một trang web hấp dẫn người dùng luôn có cách cung cấp nội dung hiệu quả sáng tạo dễ dàng nắm bắt và các bức ảnh chất lượng thú vị là cách tốt nhất để thực hiện điều đó nhưng rồi một ngày đẹp trời bạn bạn nhận ra trang web tuyệt đẹp của mình lại gây thất vọng với người dùng bởi tốc độ tải trang chậm hơn cả cụ rùa khiến họ ngán ngẩm thoát ra vì thế hôm nay tôi sẽ chỉ cho các bạn 8 kỹ thuật tối ưu hóa không chỉ giúp bạn giảm băng thông tải mà còn giảm cả việc hao tốn c pu để hiển thị bất kì bức ảnh nào trên ứng dụng web của mình chúng ta vào việc ngay thôi trước hết tôi sẽ đặt ngay ở đây một đoạn code tổng hợp hầu hết các kỹ thuật tôi sắp nói giúp hiển thị một bức ảnh chuẩn không cần chỉnh oke con dê nhé ... |
| bài 33 - tạo multiple borders cho 1 element | báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 6 năm chào các bạn đã bao giờ các bạn phải tạo 1 box mà có nhiều border chưa thực ra vấn đề này không khó bạn có thể dùng phương pháp truyền thống đó là tạo nhiều element con bên trong rồi thêm border cho các element đó như vậy có nghĩa là 1 box có bao nhiều border thì cần tạo bấy nhiều element con phương pháp này không sai tuy nhiên nó hơi lạm dụng việc tạo element con tốn dung lượng tốn bộ nhớ và có khi làm ảnh hưởng tới performance có 1 cách cực kỳ đơn giản mà bạn chỉ cần 1 sử dụng duy nhất 1 element nhưng vẫn có thể tạo ra nhiều border cho element đó tạo như thế nào thì hiện tại cùng mình đi vào chi tiết nhé 1 sử dụng pseudo elements ở đây không biết có bạn nào còn chưa hiểu về khái niệm pseudo element hoặc pseudo class không nếu chưa hiểu thì hãy comment bên dưới để bài sau mình viết bài về 2 khái niệm này nhé trước tiên tạm bỏ qua khái niệm và cùng đi vào cách sử dụng nó coi sao các bạn có thể sử dụng pseud... | báo cáo thêm vào series của tôi bài đăng này đã không được cập nhật trong 6 năm h tt p là một điều kì diệu của internet một giao thức đã tồn tại hơn 20 năm qua và vẫn đang tiếp tục phát triển ở bài viết trước chúng ta đã biết trình duyệt tương tác với các ứng dụng web qua giao thức h tt p trong bài viết lần này chúng ta sẽ đi tìm hiểu về giao thức này trong thực tế nếu người dùng nhập một thông tin nhạy cảm như thông tin thẻ tín dụng khi sử dụng một trang web và kẻ tấn công có thể chặn bắt được dữ liệu này trước khi nó tới server thì tất nhiên là ứng dụng chúng ta nát bét rồi hiểu cách h tt p hoạt động các đặc điểm của giao thức này và các biện pháp giúp bảo mật kết nối giữa client và server sẽ giúp chúng ta cài đặt một ứng dụng web bảo mật và an toàn hơn một điều lưu ý là những khái niệm ý tưởng cơ bản đằng sau giao thức h tt p không thay đổi nhiều nhưng cách thiết kế để client và server có thể giao tiếp với nhau lại liên tục được cải tiến từ năm này qua năm khác nếu bạn nhìn vào một ... |
* Loss: [MultipleNegativesRankingLoss](https://sbert.net/docs/package_reference/sentence_transformer/losses.html#multiplenegativesrankingloss) with these parameters:
```json
{
"scale": 20.0,
"similarity_fct": "cos_sim",
"gather_across_devices": false
}
```
### Training Hyperparameters
#### Non-Default Hyperparameters
- `per_device_train_batch_size`: 16
- `warmup_steps`: 100
- `fp16`: True
#### All Hyperparameters