File size: 201,504 Bytes
208ab2a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
---
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  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  dùng để
    bắt phân tích  xác định các vấn đề  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  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  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
     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  merge capture
    files save print export capture files  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ử  các cấu hình  đặ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  dừng bắt gói tin  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   theo dõi luồng menu này sẽ hiển thị các cửa sổ thống  khác
    nhau bao gồm tóm tắt các gói đã được thu thập hiển thị thống  phân cấp giao
    thức  nhiều công dụng khác menu này chứa các mục để hiển thị các thống  mạng
    liên quan đến điện thoại menu này chứa các mục để hiển thị thống  không dây
    bluetooth  i ee e 80211 menu này chứa các công cụ khác nhau  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  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  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  đượ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  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  đánh dấu trường được
    chọn trong packet details  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  đồ 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  dữ liệu đã thu thập the statusbar i ii cách sử dụng wireshark
     bản a cách bắt các gói tin trực tiếp trong wireshark khi bạn mở wireshark 
    không bắt đầu bắt gói tin hoặc mở tệp  sẽ hiển thị màn hình chào mừng liệt 
    mọi tệp đã mở gần đây  các giao diện bắt gói tin  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
     thể chọn nhiều hơn một giao diện  bắt đồng thời nhiều hoạt động mạng bạn
     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  những cách sau bạn  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  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  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  packet bytes sau đó bạn  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  dụ về
    gói t cp được chọn được hiển thị trong hình  cũng  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  hai kiểu lọc  capture filters
     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  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  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
     nhấn enter để áp dụng bộ lọc hình dưới cho thấy một  dụ về những  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 
    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  thể
    được kết hợp với các toán tử logic như and  or  dấu ngoặc đơn thành các biểu
    thức phức tạp bạn  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  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  thể tham khảo những
     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  quá đúng đó   do
    tại sao mọi nhà tuyển dụng tìm kiếm một ứng viên  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  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  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   data structure  định dạng tổ chức quản   lưu trữ dữ
    liệu cho phép truy cập  sửa đổi hiệu quả chính xác hơn data structure  tập
    hợp các giá trị dữ liệu mối quan hệ giữa chúng  các chức năng hoặc hoạt động
     thể được áp dụng cho dữ liệu  dụ chúng ta  một số dữ liệu của một người
     name a bc  age 25  đây a bc  kiểu dữ liệu string  25  kiểu dữ liệu
    interger chúng ta  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ả tên người dùng  tuổi trong đó bây giờ chúng ta  thể thu thập
     lưu trữ các bản ghi người dùng trong một tệp hoặ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  thường được hỏi trong android cấu trúc dữ liệu được sử dụng nhiều nhất
     được hỏi nhiều nhất trong android array linked list hash table stack queue
    tree graph array mảng  cấu trúc dữ liệu được sử dụng nhiều nhất  dễ nhất được
    sử dụng để lưu trữ cùng loại dữ liệu mảng  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ề  dụ nếu bạn đang lưu trữ điểm của 10 sinh
    viên thì bạn  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  bạn  thể lưu trữ điểm trong các biến này nhưng bạn phải quản 
    10 biến khác nhau  đây đây  một nhiệm vụ rất khó khăn  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ậy chúng ta  thể sử dụng mảng cho mục đích này tất
    cả những  bạn cần làm chỉ  tạo ra một mảng  tên  marks  kích thước 10
    hoặc 1000 hoặc bất cứ thứ  khác  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  index của mảng sẽ bắt đầu từ 0  đi đến n-1 trong đó n n  kích thước
    của mảng bạn  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  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  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   cũng  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
     mỗi node  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ậy  hai phần của một node trong danh
    sách được liên kết tức  phần dữ liệu  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  hình ảnh trên  một  dụ về linked list đơn lẻ tức
      đây chúng tôi chỉ  địa chỉ của node tiếp theo  một linked list khác được
    gọi  doubly linked list trong đó địa chỉ của node trước  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
     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  node cuối cùng của linked list đang trỏ đến null tức 
    không  node nào xuất hiện sau node đó một số thao tác  bản trên linked list
    insertion tại đây bạn  thể chèn node vào linked list bạn  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  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ố 
    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 từng phần tử của linked list hash table hash table
     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ẽ  một số giá trị hoặc dữ liệu  dựa trên dữ liệu đó bạn sẽ
    tạo một khóa  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  tìm kiếm trong thời gian o 1 quá trình tạo khóa  lưu trữ dữ liệu dựa
    trên khóa đó được gọi  xóa hashing để tạo khóa từ dữ liệu chúng ta cần một hàm
    được gọi  hàm hash hash hàm hash sẽ lấy dữ liệu làm đầu vào  đưa khóa làm
    đầu ra  dụ nếu dữ liệu được lưu trữ  1 2 3 4 5 26 17  hàm băm được sử dụng
     hash function k k 10  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ậ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ử  va chạm thích hợp stack một stack 
    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 
    phần tử được chèn cuối cùng sẽ được bật ra trước  dụ nếu bạn đặt một cuốn sách
    lên trên những cuốn sách khác  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  thể nhận thấy rằng cuốn
    sách trên cùng  cuốn sách được đặt  cuối hoặc được đặt gần đây trong stack
    chúng ta  một biến top  biểu thị đỉnh của stack điều này  cần thiết bởi
     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  một  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  4 3 2  1 một số thao tá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  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  phần tử đến trước trong hàng đợi sẽ bị xóa đầu tiên khỏi
    hàng đợi  dụ trong khi đứng xếp hàng để đặt  người đến trước sẽ đặt  trước
     người mới đến đặt  phải đứng  cuối hàng đợi trong queue chúng ta  các
    front  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  một 
    dụ về hàng đợi  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  2 3 4  5 tương tự nếu bạn muốn chèn một phần tử
    trong hàng đợi  trên thì  sẽ được chèn từ rear chứ không phải từ front một
    số thao tá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  được sử dụng để biểu thị thành phần phía trước của queue rear  được
    sử dụng để biểu thị thành phần phía sau của queue tree tree  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  node  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  thể không  con hoặc một con
    hoặc nhiều hơn một con nhưng node con không thể  nhiều hơn một cha sau đây 
    một  dụ đơn giản về tree một số thuật ngữ liên quan đến tree  root root 
    node  mặt  đầu tree chỉ  thể  một gốc của một tree cụ thể parent tất cả
    các node  ít nhất một con được gọi  node cha child node bên dưới node cha
    được gọi  node con của node cha leaf node không  con được gọi  node leaf
    một số loại cây  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   cũng  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  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  graph  
    một chu kỳ trong graph nhưng không  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  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  một  dụ về đồ thị sau đây  các loại
    biểu đồ directed graph  đây các cạnh sẽ trỏ đến một số node tức  bạn sẽ 
    một mũi tên chỉ vào một node từ một node undirected graph  đây không  mũi tên
    nào  giữa các node  dụ trên  một  dụ về đồ thị  hướng một số kỹ thuật
    truyền tải đồ thị phổ biến  depth-first searchd fs breadth-first searchb fs
    kết luận trên đây  một số kiến thức về data structure hi vọng bài viết này sẽ
    giúp bạn  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  ta  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ì  tình thấy
    một framework js  mithril js tuy  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  tên  mithril js cái tên được lấy cảm
    hứng từ một loại vật liệu  cấu trong các tác phẩm của nhà văn giáo  người
    anh j r r tolkien  một framework js phía client dùng để xây dựng các ứng dụng
    s pa theo  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  các bạn  thể vào thẳng trang chủ của  để đọc  trang chủ khá chi
    tiết   ràng tuy nhiên phải nói qua cái  gây ấn tượng ngay lúc đọc phần giới
    thiệu thì hiện tại đây  một javascript framework  performance tốt nhất cũng
    như  size nhỏ nhất so với các javascript framework phổ biến hiện nay 2 các đặc
    trưng  thành phần chính mỗi framework js đều xây dựng những đặc trưng  định
    nghĩa một cấu trúc  chế hoạt động riêng react thì  virtual do m stateprops
    life-cycle thì với mithril js cũng vậy sau đây  1 số thành phần chính hay những
    giá trị cốt lõi xương sống của  21  pháp mithril js được xây dựng một  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 
    đã quá quen với cách viết của j sx thì đừng lo webpack  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  1  dụ trong đó đã dựng sẵn 1 số config  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  virtual do m thì  mithril js  vnodes vnodes  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  object  thuộc tính
    view  một hàm để return ra kết quả cuối cùng  giao diện  dụ define your component
    var example view function vnode return m div hello consume your component m example
    equivalent h tm l hello  một loạt các method trong lifecycle methods đại khái
     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  virtual d om hay
    vnode thì mithril js cũng  state state trong mithril js  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 đó  việc tích hợp sẵn  chế quản  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 
    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  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ế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á  thú vị tuy nhiên do thời gian tìm
    hiểu chưa nhiều  chưa thấu hiểu hết nên nếu trong bài viết   sai sót mong
    các bạn lượng thứ bỏ qua  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  đã config sẵn babel  webpack  bản các
    bạn  thể tham khảo code trên github của mình  đây xin chào  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  ngành nghề hay công ty nào phân
    tích nghiệp vụ  quản  sản phẩm  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
     hoàn thành các mục tiêu của mình bài đăng này sẽ  tả phân tích nghiệp vụ
     quản  sản phẩm xem xét mối quan hệ giữa chúng  nêu bật sáu cách chúng bổ
    sung cho nhau 1 phân tích nghiệp vụ   quá trình xác định các yêu cầu vấn đề
      hội kinh doanh  đưa ra giải pháp để giải quyết chúng được gọi  phân
    tích nghiệp vụ để tìm hiểu về nhu cầu của các bên liên quan  thu thập dữ liệu
    về hoạt động hệ thống  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  giải
    pháp bổ sung cho các mục tiêu của công ty 2 quản  sản phẩm   quản  sản
    phẩm  quá trình tổ chức tạo ra  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  hơn thế nữa người quản  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  đảm bảo sản phẩm được giao đúng tiến độ trong ngân sách  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  sản phẩm quản
     sản phẩm  phân tích nghiệp vụ  hai trách nhiệm riêng biệt nhưng  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ụ  quản  sản phẩm mục tiêu của phân
    tích nghiệp vụ  xác định các  hội thách thức  nhu cầu trong thế giới kinh
    doanh  sau đó đề xuất giải pháp mặt khác quản  sản phẩm tập trung vào việc
    tổ chức tạo ra  giám sát hàng hóa hoặc dịch vụ từ khi hình thành đến ra mắt
     hơn thế nữa bất chấp sự khác biệt những vai trò này  liên quan chặt chẽ với
    nhau   nhiều mục tiêu chung việc xác định nhu cầu của người tiêu dùng  một
    trong những lĩnh vực chính  phân tích nghiệp vụ  quản  sản phẩm giao nhau
    để hiểu nhu cầu  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  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  sản phẩm hiểu  hơn về thị trường môi trường cạnh tranh
     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  định vị sản phẩm của mình người quản  sản phẩm
     nhà phân tích nghiệp vụ  thể cộng tác để tạo ra các sản phẩm  khả năng
    cạnh tranh trên thị trường  đáp ứng mong đợi của người tiêu dùng 4 6 cách người
    quản  sản phẩm  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  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  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  công
    ty để thu thập yêu cầu  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  phỏng vấn các bên liên quan sử
    dụng dữ liệu này người quản  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  mục tiêu cho dự án 42 nghiên cứu thị trường để hiểu
    mong muốn  sở thích của khách hàng phát hiện xu hướng  đá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
     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  định vị sản phẩm của họ 43 lập kế hoạch lộ trình người quản  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  các nhà
    phân tích nghiệp vụ đã thu thập được lộ trình đóng vai trò  kim chỉ nam cho
    nhóm phát triển   tả các tính năng tiến độ  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  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  sản phẩm cộng tác chặt
    chẽ với nhóm phát triển  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  các bên liên quan các nhà phân tích nghiệp vụ
     quản  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  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  nhóm phát triển các nhà phân tích nghiệp
    vụ  quản  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  cập nhật lộ trình bằng cách sử
    dụng thông tin đầu vào  họ nhận được tóm lại quản  sản phẩm  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  tính cạnh tranh  hỗ trợ việc mở rộng công ty người quản
     sản phẩm  nhà phân tích nghiệp vụ  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  công ty
    bằng cách cộng tác  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   storage trong docker  một tính năng quản  data
    của docker data  đây  thể hiển  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  sẽ bị mất đi khi container bị xóa để giải quyết được vấn
    đề này docker đã đưa ra một  chế để quản  data của các container đó  docker
    storage về bản chất docker storage  một  chế cho phép lưu trữ các data của
    container  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  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  3 kiểu mount trong docker storage  volumes mount-point sẽ
    nằm varlibdockervolumes của docker host  được quản  bằng docker bind mounts
    mount-point  thể nằm  bất kỳ đâu docker host không được quản  bởi docker
    tmpfs mounts data sẽ được lưu vào memory của docker host  sẽ mất đi khi khởi
    động lại hoặc stop container - v  -mount flag ban đầu -v hoặc -mount flat được
    dùng cho standalone container  -mount flag được dùng cho swarm service tuy nhiên
    phiên bản docker 1706 bạn  thể sử dụng -mount flag cho standalone container
    nói chung điểm khác biệt duy nhất chính   pháp trong khi -v flag các option
    được làm một thì -mount flag lại phân chia chung  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  -v  -mount volumes
    về hoạt động volumes tưng tự như bind mounts những volume được quản  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  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  thể quản  volume sử dụng c li hoặc a
    pi volume hoạt động trên cả linux  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  dễ dàng  thuận tiện hơn so với bind mounts
     dụ tạo một volume  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
     thư mục của container này đã  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  chạy container với volume mount thì docker sẽ tự động tạo một volume
     dữ liệu sẽ vẫn tồn tại ngoài vòng đời của container  dụ docker run -itd --name
    webapp --mount sourcewebapp-voldestinationvar centos volume thường  sự lựa chọn
    tốt hơn  sử dụng wriable layer của container bởi  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  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   ràng  phù hợp
    với các yêu cầu của bind mount  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  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  đượ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  mount u sb với thư mục
    mnt thì những file dữ liệu  từ trước sẽ bị ẩn đi đến khi u sb được umount để
    test trường hợp này mình  một  dụ sau tạo một image từ dockerfile đảm bảo
    rằng  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  đảm bảo image tạo
    ra một container  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  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  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  bind mounts cho phép bạn chia sử dữ liệu giữa docker host 
    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  một option thứ ba  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ỏ  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  kiểm tra lại docker container restart tmp_mount
    docker exec tmp_mount bash -c ls opt kết quả trả về  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
    đó  docker storage docker storage  3 option cho bạn lựa chọn  volumes bind
    mounts tmpfs mounts nếu  vấn đề  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  đă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  rao bán dữ liệu trên chợ đen đối
    tượng bị hacker nhắm đến thường  những trang web dịch vụ lớn  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  đánh cắp dữ liệu bị hacker tấn công thì  vấn đề của
    doanh nghiệp nhưng dữ liệu bị lộ thì người dùng  đối tượng cần hoang mang nếu
    hacker  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  sở dữ liệu không may bị hacker đánh cắp  rao bán thay  đọ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  dùng
    được ông anh sao  không được m d 5 với s ha-1  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  cậu em
    nhưng  2 cái đó được khuyến nghị  không nên sử dụng  không còn đảm bảo an
    toàn nữa ông anh dựa vào đâu  nói  không đảm bảo an toàn nữa cậu em em đọc
    được  m d 5 với s ha-1 phổ biến  được sử dụng từ lâu rồi độ dài chuỗi hash
    ra cũng thấp nên  rất nhiều kết quả hash đã được tính toán  lưu trữ sẵn rồi
    em còn biết  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ụ đó  ông anh  một
    cái nữa  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ỉ
     32  tự  ra cậu em em cũng từng thấy qua về cái việc m d 5  thể xuất hiện
    trùng lặp rồi nhưng   ràng số lượng kết quả  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  trên 
    thuyết  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  một chuỗi ngẫu nhiên  nghĩa bất quy tắ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  chung  hash
    cũng  dễ xảy ra hơn đâu anh ông anh cho   trên  thuyết thì việc trùng lặp
    vẫn  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  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  tự nên việc 2 tệp tin  cùng  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ế  an tâm ông anh cũng được dùng
    thuật toán hash tốt cho ra chuỗi hash  độ dài lớn sẽ an toàn hơn nhưng  nếu
    đen bị tấn công thì vẫn  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  nhớ tìm cách bảo vệ đống salt đấy nữa nhé không  cũng công cốc
    cậu em thế  lại đẻ ra thêm 1 bài toán nữa à ông anh cũng  thể phát triển 
    chế sinh salt ngẫu nhiên  duy nhất với mỗi tài khoản đảm bảo một tài khoản chạy
     chế đó bao nhiêu lần vẫn ra cùng cái salt  được cậu em nghe cách đó  vẻ
    ok hơn anh  ông anh thực ra anh biết giờ người ta  thuật toán hash khác okla
    hơn mấy cái m d với s ha  cậu em cái nào thế anh ông anh bcrypt cậu em  
     vượt trội hơn hả anh ông anh  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ế để  tốc độ tính toán
    nhanh bcrypt thì được xây dựng dựa trên thuật toán  hoá blowfish blowfish thì
     tốc độ  hoá ok nhưng qua trình chuẩn bị khoá  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  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  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ì  ảnh hưởng tới tốc
    độ xử  của máy chủ không anh ông anh không phải flo mình tính  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  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  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ể  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  đã ổn hoá ra vẫn còn bcrypt
    okla hơn ông anh  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 
    lại hợp  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  đượ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  thể  đượ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  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  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  dụ ta  thể chọn datatrain 23 data  data
    test 13 data cách đánh giá này phù hợp khi ta bộ dữ liệu data  kích thước lớn
    2 stratified sampling được sử dụng khi các tập  dụ  kích thước nhỏ hoặc không
    cân xứng unbalanced datasets  dụ  ít hoặc không  các  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  tập kiểm thử phải
    xấp xỉ như trong tập toàn bộ các  dụ data stratified sampling  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
     tập kiểm thử sẽ  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  giá trị đầu ra của hệ thống  một giá trị số không
    phải  một nhãn lớp 3 repeated hold-out đây  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  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  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  mỗi bước lặp ta lại  một tập kiểm thử khác nhau 
    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  fold  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ể  dụ ta  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 
    tập dữ liệu data vừa  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  dụ khai thác tối đa
    tập dữ liệu ban đầu không  bước lấy mẫu ngẫu nhiên chi phí tính toán cao phù
    hợp khi ta  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  dụ lấy mẫu  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  dụ từ tập data lấy ngẫu nhiên một  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  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  dụ không được chọn vào tập
    huấn luyện  1-1n xác suất để một  dụ sau khi lấy mẫu lặp lại bootstrap sampling
    được đưa vào tập kiểm thử  1-1nn phù hợp với tập dữ liệu  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 dữ liệu trùng với tập kiểm thử  tập
    huấn luyện tối ưu giúp điều chỉnh tham số  hiệu năng cao hơn các tiêu chí để
    đánh giá 1 tính chính xác accuracy mưc đọ  đ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  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ử  nhiễu robustness kha nang  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  liẹu 5 kha nang diên giai interpretability mưc đọ
     hiêu đôi vơi nguơi  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 
    một giá trị định danh trong đó x  một  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  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  một giá trị số
    trong đó ox  giá trị đầu ra dự đoán bởi hệ thống với x dx  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  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 đó  chain of responsibility   cái  trong cuốn sách rất hay về
    design pattern design patterns elements of reusable object-oriented software 
    định nghĩa khá dài  cũng khá  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  như thế này   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  1 một request cần sử  với nhiều logic nếu sử dung ifelse
    quá nhiều thì sẽ quá phức tạp  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ử  một logic khác nhau
     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  đối tượng nhận
    request khi request đó  thể được xử  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  gửi request theo chuỗi đó cho
    đến khi request đó được xử  theo doix u ml sau handler định nghĩa 1 interface
    để xử  yêu cầu gán giá trị cho đối trượng successor concrete handler xử  yêu
    cầu  thể truy cập đối trượng successor nếu đối tượng concrete handler không
    thể xử  yêu cầu  sẽ gửi tới successor của  hiểu đơn giãn hơn nữa giã sử
    bạn  1 chuỗi các hành động khi nhận được request bạn cho a xử  nếu a không
    thể xử   sẽ gọi successor của  để xử  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  dụ mình sẽ thực hiện
    một  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  role  một số controller như
    trên tiếp theo sẽ tạo class policy đây  đối tượng chính đó  chính handler
    như trong đống  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  định nghĩa 1 instance  successor
    đối tượng này sẽ được gọi khi hanler không thể xử  request method chính thực
    hiện xử  request  check_access accept 2 params  controller  user đầu tiên
     thực hiện check  handle được request hay không bằng cách so sánh tên controller
     tên của class handler  không  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ử  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  định
    nghĩa lại method process_checking_access để xử  logic cho từng concrete handler
    giờ thì chúng ta thực hiệ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  admin sau đó định
    nghĩa 1 chuỗi handler policy  thực hiện method check_access tại concretehanlder
     logs controller policy nhưng request sẽ chỉ được xử  tại profile controller
    policy thế  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  1 đối tượng  thể xử  request phải tham chiều đến các đối tượng
    khác  chỉ cần tham chiếu đến đối tượng tiếp theo tăng tính linh hoạt  phân
    chia trách nhiệm cho tường đối tựơng  khả năng thay đổi dây chuyền không đảm
    bảo  đối tượng xử  yêu cầu khi nào thì sử dụng pattern này cái này quan trọng
    đây  hiều  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  nhiều hơn 1 đối tượng  thể xử  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ử  những không biết đối tượng
    đó  đối tượng nào tập các đối tượng xử  tập các đối tượng độc lập   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  đ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 ý  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  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   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  biết xài i if e tip nếu câu trả lời  không tôi chưa dùng bao giờ hay
    biết nhưng tôi ít khi dùng thì 910  cái ông này code j s kiểu ăn xổi answer
    j s  chẳng thích tính scope của variable theo block   tính theo từng function
     dụ if true var foo foo consolelogfoo foo oops foo lẽ ra ko nên tồn tại ngoài
    block if   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  khi  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  không nghĩ  tồn tại thì  chúa mới biết output   vậy nên
    ta  3 option ủa tưởng  2 v - đặt tên biến ko thể trùng lặp v - dùng letconst
    thay  var - bọc  vào 1 function   cần cục code phải chạy luôn  cũng
    ko muốn đặt tên cho function var foo foo đây  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  đơn giản thôi anh answer
    do  chế hoạt động của j s engine cái hoạt động khá phức tạp   lẽ cần hẳn
    1 bài viết để phân tích về  code viết sau chưa chắc đã chạy sau  dụ quen thuộc
    với j query var response ajaxlinktoresource do_somethingresponse tọi luôn  response
     undefined đợi  kết quả mới chạy code tiếp đơn giản  truyền logic vào callback
    ajaxlinktoresource do_something promise  cái chi tip hay một cách hỏi khác 
    thằng callback  những vấn đề  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  điều
    bất khả thi closure  cái  tip đây  một khái niệm khá mông lung nhiều người
    dùng j s lâu năm  hỏi chưa chắc  thể cắt  nghĩa cho người khác hiểu được
    answer  khả năng ghi nhớ của một function về scope nơi  đượ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  nhớ về thằng count
     scope  được tạo ra  vậy thế thì sao thì ta  thể dùng cái  thuật này để
    giấu state  j s thì méo  class rồi thì publicprivate như java nói chung đây
     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  null tip thường  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ì  lẽ  khá tuyệt vọng rồi answer
    undefined  chưa đc khởi tạo null  khởi tạo rồi  giá trị rồi  giá trị ấy
     null à vậy thì kết luận luôn null  một giá trị chứ ko phải  ko   nhé
    khi nào dùng call  khi nào dùng apply tip thực ra 2 cái hàm này  chỉ khác
    nhau cái a pi câu này chủ yếu để dẫn mở cho chủ đề về this answer - call  để
    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  array thay   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 ý  khi dùng giá trị falsy tip chủ yếu  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  falsy nên nếu  array thì lại phải check cả độ dài của array nữa -
    object rỗng thì lại coi  truthy nên check object thì lại nên viết thêm hàm để
    check cho tiện this   tip cái này  một trong những phần trọng tâm của buổi
    phỏng vấn answer   thì bài sau chúng ta bàn tiếp vài dòng  lẽ không đủ cho
    e  v so sánh var let  const arrow function khác  so với function tip cũng
    chỉ  một công cụ dẫn nhập sang chủ đề this không trả lời được cũng không sau
     kiểu  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  thể làm nhiên liệu để hỏi về hoisting answer do cách implement
    của  nên khi xài với một số libframework  sẽ làm mất binding của this như
     react hoặc j query   số chủ đề trên mạng về lưu ý này function declaration
     function expression khác nhau  điểm nào  như vậy thì sao tip thực chất 
    hỏi về hoising answer  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  thể khai báo biến  ko cần
    dùng var  thể đặt tên biến bằng một số reversed-word  thể lặp tên param của
    một hàm  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  giống với o op như các ngôn ngữ khác prototype
     cái khỉ  tip hẳn một topic ngang tầm với this luôn answer   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ình muốn liệt  tiếp
    nhưng  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  cái cách j s compile về event
    loop   giải cho  chế bất đồng bộ về các thể loại  thuật fake o op về cách
    mổ xẻ object  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  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ậy charles  thể bắt được các gói tin  hiển
    thị cho chúng ta tất cả dữ diệu gửi đi request  nhận response  vậy charles
     công cụ rất hữu ích cho việc debug cho developer nếu q a chỉ  screenshots
     video thì không thể nào thấy được những  đang được gửi  nhận giữa web browsers
     server nên việc lấy log charles  rất cần thiết giúp dev  thể biết được
    những  đang xảy ra   thể chuẩn đoán  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  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  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  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  bắt đầu truy cập internet
    từ trình duyệt trên charles chúng ta  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  trỏ device đến p c của bạn thiết lập i p của p c trên devices
    port  8888 mỗi device sẽ  cách thiết lập khác nhau dưới đây  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  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  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  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  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  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  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
     một vài hướng dẫn để  thể lấy được log của web trên p c  devices charlesfiddler
    còn rất hữu ích cho việc test services developing tesing hy vọng bài viết  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ề  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  một hệ thống quản 
    công việc giúp bạn  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ở  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  một dòng chảy công việc được trực quan
    hóa visualize workflow kanban  một từ tiếng nhật 看板  nghĩa  bảng thông tin
    signboard bạn  thể bắt đầu  hình kanban cực  đơ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
     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  thể bắt đầu chuyển đổi từ  hình phát triển
    hiện tại sang phương thức kanban một cách nhanh chóng  dễ dàng ngay từ những
    công việc còn đang làm dở  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ò  trách nhiệm hiện  respect the current
    roles responsibilities bạn chỉ việc áp dụng  hình kanban vào dự án thôi  không
    cần thay đổi vai trò  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  nghĩa 
    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
     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  thể  nhiều hoặc ít cột mình lấy  dụ đơn giản nhất  3 cột tương ứng
    với 3 trạng thái của task  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  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  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  d on e các thẻ kanban card đây  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ể  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
     thay đổi giúp trực quan hóa workflow  trong agile thì kanban card chính 
    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
    task cần làm như sau overview principles of kanban kanban board kanban vs scrum
    phần overview  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 để  thể đảm bảo tiến độ công việc ai
    cũng  việc để làm  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  năng lực của các member example do bài viết này chỉ  một mình mình thực
    hiện cho nên vào một thời điểm chỉ  1 task được làm  vậy mình sẽ để limit
    cho cột d oi ng  1 đồng thời sẽ kéo thẻ kanban board sang phần d on e  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
     một  dụ khác về limit w ip kanban vs scrum đã  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ư   retrospective để cải thiện chất lượng các sprint sau meeting kanban
    scrum không cần meeting cũng được  rất nhiều meeting spring planning daily meeting
    retrospective meeting role kanban scrum giữ nguyên role của  hình  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  scrum thì chúng ta  thể thấy kanban
    thường được coi  method  áp dụng cho các dự án nhỏ đơn giản còn scrum thì
     thể gọi  một framework đầy đủ  phù hợp với các dự án vừa  lớn do scrum
    bao gồm đầy đủ các yếu tố cần thiết role meeting artifacts để  thể áp dụng vào
    mọi loại dự án  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  linh động nên kanban  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
     dụ bạn  thể áp dụng kanban board để quản  công việc hàng ngày của bạn hoặc
    quản  bài tập về nhà quản  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  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  kho tài nguyên đồ
    họa khổng lồ  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  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ỹ  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ư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   không bị gián đoạn nhỉ cùng sydexa tìm hiểu cách 
    canva giải quyết vấn đề khá khoai này nha bạn cho chúng mình xin 1 upvote  comment
    để chúng mình nhận giải của viblo nha  chúng mình  động lực ra những bài viết
    thú vị hơn nữa chúng mình  tạo group cho các bạn cùng chia sẻ  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ấ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  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  đặc biệt  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ử  hàng loạt
    request đọc  ghi dữ liệu tuy nhiên  một điểm thú vị  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  sử dụng các media
     sẵn hơn  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  đồ 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  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  chuyển metadata nội dung sang một cột j so n riêng biệt metadata
     phần thông tin  tả về tệp media thường xuyên được cập nhật  thay đổi việc
    chuyển metadata sang j so n cho phép canva tự quản  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  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
     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
     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ữ  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
     cập nhật dữ liệu mặc  điều này  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
     sharding đây  kỹ thuật chia nhỏ dữ liệu thành nhiều phần  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  cải thiện hiệu
    suất cho các truy vấn theo i d vốn  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  nhược điểm  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  tất cả media thuộc sở hữu của một
    người dùng mặc  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  khả năng
    mở rộng  đá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  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  một  sở dữ liệu no sq l được quản  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  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  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  thực hiện chuyển đổi  không  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 
    cùng tỉ mỉ  thận trọng canva cần di chuyển tất cả các dữ liệu  các dữ liệu
    mới được tạo  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ử  các thông báo này để đọc trạng thái hiện tại từ  sở
    dữ liệu my sq l chính  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ẽ  sẵn trên
    dynamo db giúp giảm thiểu độ trễ  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ử  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ử  hết các thông báo ghi chúng mới chuyển sang xử
     các thông báo đọc điều này giúp cho đảm bảo  thể phục vụ các yêu cầu đọ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  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  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  gửi một thông báo qua message queue  độ ư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  dynamo db bất kỳ sự không
    nhất quán nào được phát hiện sẽ được điều tra  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  bất kỳ vấn đề nào xảy
    ra với dynamo db hệ thống vẫn  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  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  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ệ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  dynamo db vẫn hoạt động ổn định tự động mở rộng quy 
    để đá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ỹ  của canva họ nhận ra tầm quan trọng của việc hiểu  đặ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  thử nghiệm trong môi trường production cũng được
    coi  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
     dynamo db không  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  hiệu suất đã
     đắ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ượ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ẽ  linh hoạt đủ sức chứa hơn 25 tỷ file media do người dùng tải lên 
    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  một trong những nền tảng thiết kế trực tuyến hàng đầu
    thế giới  còn mở ra những  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  comment để chúng mình nhận giải
    của viblo nha lời nhắn chúng mình  tạo group cho các bạn cùng chia sẻ  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  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   agile  một triết  philosophy cho việc phát triển phần mềm nói
    cách khác đó  một cách  duy về các dự án phần mềm các triết  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  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
      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  agile được đưa ra trong một bản tuyên ngôn manifesto
    gồm 4 tiêu chí vàđược làm  hơn bởi 12 quy tắc a 4 tiêu chí của agile  nhân
     các tương tác quan trọng hơn các quy trình  công cụ tập trung làm cho phần
    mềm chạy được hơn  viết các tài liệu  tả cộng tác với khách hàng hơn  chỉ
    dựa trên hợp đồng phản ứng với các thay đổi hơn  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  liên tục chào đón việc thay đổi yêu cầu thậm chí  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  hàng tháng nhà kinh doanh  kỹ  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 
    nhân cóđộng lực cung cấp cho họ môi trường  sự hỗ trợ cần thiết  tin tưởng
    họ để hoàn thành công việc trao đổi trực tiếp mặt đối mặt  phương pháp hiệu
    quả nhất để truyền đạt thông tin phần mềm chạy được  thước đo chính của tiến
    độ phát triển bền vững  duy trì được nhịp độ phát triển liên tục liên tục quan
    tâm đến  thuật  thiết kế để cải tiến sự linh hoạt sự đơn giản  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  hình agile
    kiểm thử testing trong dự án agile yêu cầu một sự dịch chuyển  thức paradigm
    shift cho vai trò kiểm thử truyền thống  đò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  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  hình agile tiền-phân-đoạn pre-iteration
    đây  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ụ  các tiêu chí chấp nhận acceptance criteria được viết
    ra cho mỗi một story user story  q a  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  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  còn  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 
    tính khả-kiểm testability việc này sẽđảm bảo các yêu cầu luôn  ràng   thể
    kiểm thửđược yêu cầu cần đủ nhỏ để  ý 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 
    hơn về giai đoạn này chúng ta cùng tìm hiểu những phần sau user story  một tóm
    tắt đơn giản ngắn gọn về chức năng  khách hàng mong muốn  thường được viết
    theo mẫu sau với tôi muốn   dụ với vai trò  người dùng website tôi muốn
     một chức năng tìm kiếm nâng cao để  thể tìm kiếm nhanh chóng  dễ dàng những
    quyển sách tôi cần tiêu chí chấp nhận acceptance criteria  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  thể coi đó
     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  tiêu chí trả lời cho câu hỏi  dễ sử
    dụng hay không  chìa khóa đưa ra các tiêu chí đánh giá  thể xác định tính
    chức năng functionality xử  lỗi error handing liệt  ra những lỗi  thể gặp
    phải trong quá trình sử dụng chương trình  phương thức để xử   dụ người
    dùng  thể thực hiện sai thứ tự các bước  khi đó chương trình sẽ xử  như
    thế nào hiệu suất performance stress tests  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ư  nhiều người truy cập tại
    cùng 1 thời điểm  quá nhiều request được gửi đến hệ thống  dụ với story như
    trên ta  các tiêu chí chấp nhận như sau tôi  thể giới hạn tìm kiếm theo định
    dạng loại tôi  thể tìm kiếm theo phạm vi ngày tôi  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  số lượng
    xuất bản tôi  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  thể lọc filter để đạt được mục tiêu của giai đoạn này cần  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  thể kiểm thửđược của story phải
    được xem xét chi tiết để  thể kiểm thửđược story đó những yếu tố này thường
     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 chi tiết này sớm sẽ giúp câu chuyện được
    ưu tiên đúng đắn hơn trong backlog  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  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ọ  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  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  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  thể tạo ra những sự ngưng trệ không cần thiết   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  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  xu hướng được tự động hóa để họ 
    thể chạy như  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  chính xác  dụ trở lại với 
    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  thể loại sprint 2 phát
    triển chức năng tìm kiếm theo tác giả  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ô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  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ử  thường
    giúp xác định đúng các phần kiểm thử tuy nhiên điều này không  nghĩa  tất
    cả mọi người phải đều phải viết  kiểm thử 3 sử dụng tự động hóa  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  nguồn
    được tạo ra  điều quan trọng  phải xác định những  cần tự động hoá  những
     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  nhiều người đóng góp nhiều thời gian hơn mới 
    đượ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
     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ọ  thể triển khai được  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 
    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  các chuyên viên phân tích nghiệp vụđể
    làm  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
     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í  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  hơn về các yêu cầu điều bắt
    buộc  một story khi được chuyển giao  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
     vào các tiến trình kiểm thử tiếp theo một điều quan trọng khác  phải suy
    nghĩ vượt ra ngoài các yêu cầu bằng văn bản  thử nghiệm với các kiểm thử thăm
     exploratory testing để thực hiện kịch bản ngoài lề  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  chất lượng kiểm thử thăm
     không phải  thực thi tất cả các kịch bản kiểm thửđược xác định trước  
    nghệ thuật thăm  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  thấy
    quá nhiều thuật ngữ mới dành cho các bạn  thể đã làm f e một thời gian rồi nhưng
    đôi khi vẫn không biết  một thứ như vậy tồn tại trên đời  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  một file code rất to bạn chia file to đó ra thành nhiều file nhỏ thì
    gọi  code split hoặc một  dụ khác  bạn  một trang web build bằng react
    trong đó bao gồm header body  footer thì bạn  thể build thành một file bundlejs
    bao gồm cả 3 component trên hoặc cũng  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ư  bạn cắt một miếng
    bánh to thành nhiều miếng nhỏ lazy load lazy load nghĩa  một cách để delay việc
    load một resource  đó 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  user chưa thực sự cần xem đúng không
    do đó  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  thể define  mọi thứ như  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  
    thể lazy  cái  không thể lazy việc chia ra những resource nào lazy load được
    cái  không thể lazy load giúp bạn  chiến thuật quản  resource tốt hơn back
    lại cái thuật ngữ bên trên split code làm  dụ nhé câu hỏi của bạn  cắt cái
    bundle bự thành nhiều bundle nhỏ để làm  câu trả lời thường  bạn cắt  ra
    thành hai phần phần  thể lazy load được  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  lazy load
    cái resource code thì cần cắt  thành nhiều chunk nhỏ hơn để hiện thực lazy load
    về mặt  thuyết tất cả các resource liên quan tới interaction của user scroll
    click hover press đều  thể lazy load được prefetchpreload prefetch nghĩa 
    bạn nói với browser tao  một cái resource này  khi nào mày rảnh thì load trước
    giúp tao nhé preload preload nghĩa  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  user sẽ cần một số resource này trong
    tương lai mình  dụ khi user hover vào một link nào đó mình cũng không chắc 
    user sẽ thật sự click vào link này hay không nhưng khả năng cao    vậy nếu
    mình prefetch trước cái link này thì nếu user bấm thật thì  đã đượ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  quan trọng cho bước render đầu tiên  dụ dễ thấy nhất 
    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  nếu render ra trang web  font chưa  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ới góc nhìn của user thì thấy  cũng khá  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  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ư  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    vàn website
    trên internet đúng không  khi bạn search google thì  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  cách để tối ưu trang
    web giúp   thứ hạng cao hơn  các công cụ tìm kiếm như google bing tụi google
    sẽ  nhiều tiêu chí để quyết định trang web của bạn  phù hợp với user hay không
    như  content keyword hình ảnh tốc độ load trang ngôn ngữ do đó khi nói làm s
    eo nghĩa  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  theo tiêu chí của tụi google rồi google page speed   cái trang này
     page speed insights google build ra một cài tool để đo lường tốc độ website
    của bạn  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  một tiêu chí  ai cũng dùng để xem
    coi website của bạn  đuỷnh hay không mình thì thấy  cũng tương đối tuy nhiên
    mọi người lại dựa vào  quá nhiều để đánh giá một website the fold the fold hiểu
     bạn cắt cái trang web theo chiều ngang bên trên the fold  những  đập vào
    mặt user ngay lập tức khi họ mở trang web của bạn những   dưới thì người ta
    phải scroll xuống mới thấy được   định nghĩa  những  đập vào mặt user
    ngay lập tức nên khái niệm này khá  tương đối  users  thể dùng device khác
    nhau to nhỏ khác nhau  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  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  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    thứ xuất hiện
    ngay lập tức khi user mở website  dưới the fold thì  thể apply lazy load 
    user phải scroll xuống mới thấy được phải không nào c ss critical  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  optimize tối đa cho những thứ above the fold không thì cái
    này  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á  đỉ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  lên tất cả viết c ss  java
    script  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ì  sẽ gặp một vài vấn đề c ss 
    global trong khi mình muốn component của  isolated  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 
     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  một đoạn script chạy  background
      thể intercept vào request  response giữa web của bạn  server  làm
    một vài thứ hay ho khác notification cache sync data   đứng  giữa nên các
    bạn tưởng tượng  như proxy cũng đượ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á  sáng tạo  thể  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   
    chạy dưới background nên bạn  thể làm vài thứ hay ho  không khiến cho web
    của các bạn chậm đi web worker trước đây thì web chỉ  một luồng thực thi thôi
    được gọi  main thread   chỉ  một luồng thực thì nên  đẻ ra một vấn đề
    khi bạn đang thực hiện một tác vụ task  đó 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ế   dụ bạn code một trang web tính
    lương cho nhân viên khi  một task tính toán lương đang chạy  dưới  nếu 
    khá nặng thì lúc này user  click vào đâu thì trang web của các bạn cũng không
    phản hồi được  đang bận tính lương chết mọe rồi  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  cái 
    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  quan
    trọng  gặp phải  hầu hết các lib support s sr hydration  quá trình gắn các
    event listener  các node tương ứng đã được generate từ quá trình s sr httpsgithubcomthanhlmmblogblobmasterpublicmaterialslazy-hydratemp
    4rawtrue mình  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
     cái web của mình  một cuộn giấy siêu dài  mình dang nhìn  thông qua một
    cửa sổ nhỏ window nghĩa  mình đang nhìn một phần rất nhỏ trong cuộn giấy đó
     để nhìn hết thì các bạn phải scroll list virtualization   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ỏ  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  list
    cực  dài  phức tạp như  new feed của facebook twitter tới đây thấy cũng
    khá dài rồi kiều càng viết  càng  thêm á nên mình cũng không biết  còn thiếu
     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) <!-- at revision a9467ef2ef47caa6448edeabfd8e5e5ce0fa2a23 -->
- **Maximum Sequence Length:** 256 tokens
- **Output Dimensionality:** 768 dimensions
- **Similarity Function:** Cosine Similarity
<!-- - **Training Dataset:** Unknown -->
<!-- - **Language:** Unknown -->
<!-- - **License:** Unknown -->

### 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]])
```

<!--
### Direct Usage (Transformers)

<details><summary>Click to see the direct usage in Transformers</summary>

</details>
-->

<!--
### Downstream Usage (Sentence Transformers)

You can finetune this model on your own dataset.

<details><summary>Click to expand</summary>

</details>
-->

<!--
### Out-of-Scope Use

*List how the model may foreseeably be misused and address what users ought not to do with the model.*
-->

<!--
## Bias, Risks and Limitations

*What are the known or foreseeable issues stemming from this model? You could also flag here known failure cases or weaknesses of the model.*
-->

<!--
### Recommendations

*What are recommendations with respect to the foreseeable issues? For example, filtering explicit content.*
-->

## Training Details

### Training Dataset

#### Unnamed Dataset

* Size: 6,120 training samples
* Columns: <code>query</code>, <code>positive</code>, and <code>negative</code>
* Approximate statistics based on the first 1000 samples:
  |         | query                                                                             | positive                                                                             | negative                                                                              |
  |:--------|:----------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------|
  | type    | string                                                                            | string                                                                               | string                                                                                |
  | details | <ul><li>min: 3 tokens</li><li>mean: 13.59 tokens</li><li>max: 62 tokens</li></ul> | <ul><li>min: 76 tokens</li><li>mean: 255.19 tokens</li><li>max: 256 tokens</li></ul> | <ul><li>min: 112 tokens</li><li>mean: 254.92 tokens</li><li>max: 256 tokens</li></ul> |
* Samples:
  | query                                                                                  | positive                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | negative                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
  |:---------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
  | <code>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</code> | <code>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 ...</code> | <code>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...</code> |
  | <code>example</code>                                                                   | <code>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...</code> | <code>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é ...</code> |
  | <code>bài 33 - tạo multiple borders cho 1 element</code>                               | <code>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...</code> | <code>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 ...</code> |
* Loss: [<code>MultipleNegativesRankingLoss</code>](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
<details><summary>Click to expand</summary>

- `overwrite_output_dir`: False
- `do_predict`: False
- `eval_strategy`: no
- `prediction_loss_only`: True
- `per_device_train_batch_size`: 16
- `per_device_eval_batch_size`: 8
- `per_gpu_train_batch_size`: None
- `per_gpu_eval_batch_size`: None
- `gradient_accumulation_steps`: 1
- `eval_accumulation_steps`: None
- `torch_empty_cache_steps`: None
- `learning_rate`: 5e-05
- `weight_decay`: 0.0
- `adam_beta1`: 0.9
- `adam_beta2`: 0.999
- `adam_epsilon`: 1e-08
- `max_grad_norm`: 1.0
- `num_train_epochs`: 3
- `max_steps`: -1
- `lr_scheduler_type`: linear
- `lr_scheduler_kwargs`: {}
- `warmup_ratio`: 0.0
- `warmup_steps`: 100
- `log_level`: passive
- `log_level_replica`: warning
- `log_on_each_node`: True
- `logging_nan_inf_filter`: True
- `save_safetensors`: True
- `save_on_each_node`: False
- `save_only_model`: False
- `restore_callback_states_from_checkpoint`: False
- `no_cuda`: False
- `use_cpu`: False
- `use_mps_device`: False
- `seed`: 42
- `data_seed`: None
- `jit_mode_eval`: False
- `use_ipex`: False
- `bf16`: False
- `fp16`: True
- `fp16_opt_level`: O1
- `half_precision_backend`: auto
- `bf16_full_eval`: False
- `fp16_full_eval`: False
- `tf32`: None
- `local_rank`: 0
- `ddp_backend`: None
- `tpu_num_cores`: None
- `tpu_metrics_debug`: False
- `debug`: []
- `dataloader_drop_last`: False
- `dataloader_num_workers`: 0
- `dataloader_prefetch_factor`: None
- `past_index`: -1
- `disable_tqdm`: False
- `remove_unused_columns`: True
- `label_names`: None
- `load_best_model_at_end`: False
- `ignore_data_skip`: False
- `fsdp`: []
- `fsdp_min_num_params`: 0
- `fsdp_config`: {'min_num_params': 0, 'xla': False, 'xla_fsdp_v2': False, 'xla_fsdp_grad_ckpt': False}
- `fsdp_transformer_layer_cls_to_wrap`: None
- `accelerator_config`: {'split_batches': False, 'dispatch_batches': None, 'even_batches': True, 'use_seedable_sampler': True, 'non_blocking': False, 'gradient_accumulation_kwargs': None}
- `deepspeed`: None
- `label_smoothing_factor`: 0.0
- `optim`: adamw_torch
- `optim_args`: None
- `adafactor`: False
- `group_by_length`: False
- `length_column_name`: length
- `ddp_find_unused_parameters`: None
- `ddp_bucket_cap_mb`: None
- `ddp_broadcast_buffers`: False
- `dataloader_pin_memory`: True
- `dataloader_persistent_workers`: False
- `skip_memory_metrics`: True
- `use_legacy_prediction_loop`: False
- `push_to_hub`: False
- `resume_from_checkpoint`: None
- `hub_model_id`: None
- `hub_strategy`: every_save
- `hub_private_repo`: None
- `hub_always_push`: False
- `hub_revision`: None
- `gradient_checkpointing`: False
- `gradient_checkpointing_kwargs`: None
- `include_inputs_for_metrics`: False
- `include_for_metrics`: []
- `eval_do_concat_batches`: True
- `fp16_backend`: auto
- `push_to_hub_model_id`: None
- `push_to_hub_organization`: None
- `mp_parameters`: 
- `auto_find_batch_size`: False
- `full_determinism`: False
- `torchdynamo`: None
- `ray_scope`: last
- `ddp_timeout`: 1800
- `torch_compile`: False
- `torch_compile_backend`: None
- `torch_compile_mode`: None
- `include_tokens_per_second`: False
- `include_num_input_tokens_seen`: False
- `neftune_noise_alpha`: None
- `optim_target_modules`: None
- `batch_eval_metrics`: False
- `eval_on_start`: False
- `use_liger_kernel`: False
- `liger_kernel_config`: None
- `eval_use_gather_object`: False
- `average_tokens_across_devices`: False
- `prompts`: None
- `batch_sampler`: batch_sampler
- `multi_dataset_batch_sampler`: proportional
- `router_mapping`: {}
- `learning_rate_mapping`: {}

</details>

### Training Logs
| Epoch  | Step | Training Loss |
|:------:|:----:|:-------------:|
| 1.3055 | 500  | 0.9762        |
| 2.6110 | 1000 | 0.3251        |


### Framework Versions
- Python: 3.11.13
- Sentence Transformers: 5.1.0
- Transformers: 4.55.1
- PyTorch: 2.6.0+cu124
- Accelerate: 1.10.0
- Datasets: 4.0.0
- Tokenizers: 0.21.4

## Citation

### BibTeX

#### Sentence Transformers
```bibtex
@inproceedings{reimers-2019-sentence-bert,
    title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
    author = "Reimers, Nils and Gurevych, Iryna",
    booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
    month = "11",
    year = "2019",
    publisher = "Association for Computational Linguistics",
    url = "https://arxiv.org/abs/1908.10084",
}
```

#### MultipleNegativesRankingLoss
```bibtex
@misc{henderson2017efficient,
    title={Efficient Natural Language Response Suggestion for Smart Reply},
    author={Matthew Henderson and Rami Al-Rfou and Brian Strope and Yun-hsuan Sung and Laszlo Lukacs and Ruiqi Guo and Sanjiv Kumar and Balint Miklos and Ray Kurzweil},
    year={2017},
    eprint={1705.00652},
    archivePrefix={arXiv},
    primaryClass={cs.CL}
}
```

<!--
## Glossary

*Clearly define terms in order to be accessible across audiences.*
-->

<!--
## Model Card Authors

*Lists the people who create the model card, providing recognition and accountability for the detailed work that goes into its construction.*
-->

<!--
## Model Card Contact

*Provides a way for people who have updates to the Model Card, suggestions, or questions, to contact the Model Card authors.*
-->