THẢO LUẬN

Ý bạn là về công dụng của hàm setCurrentRefreshToken đúng k?!! Mình dùng để lưu lại refresh token vào Database sau khi đăng nhập hoặc đăng ký mục đích tăng bảo mật. Khi user tiến hành dùng refresh token thì sẽ lấy currentRefreshToken ra check bằng hàm getUserIfRefreshTokenMatched và nếu Match thì mình mới trả về Access token mới. Trong trường hợp refresh token bị lộ thì mình chỉ cần vào Database xoá token của user đó thì hacker sẽ k thể lấy refresh token mới.😁

0
Avatar
đã bình luận cho bài viết
khoảng 5 giờ trước

Bài viết rất hữu ích. Cám ơn bạn. Xin hỏi lệnh COPY . . Nghĩa là gì vậy bạn?

0

Trong bài toán này: master data là cụm chủ để đã được phân loại từ trước.Ví dụ chủ đề về Sa, Se, Tester, DevOp với các mô tả tương ứng với mỗi role. Sau đấy một bài viết mới được tạo ra sẽ so sánh với mô tả của mỗi role để chọn tag có độ tương đồng cao nhất. Khi đấy em có thể xác định được chủ đề của bài viết mới cho role gì

Còn việc xây dựng master data thì rất quan trọng để thuật toán đưa ra kết quả chính xác. Theo anh biết để xin được master data rất khó, mình phải tự build thôi. Hy vọng là giúp em được một phần

0
khoảng 15 giờ trước

Có 2 chi tiết trong comment của bạn:

  1. "khi đi qua router, nó sẽ tự mapping lại đúng địa chỉ ip lúc đầu": mình nghĩ bạn đang đề cập tới cơ chế NAT, nó nằm ngoài phạm vi bài viết của mình, mình có thể giải thích nhanh phía dưới.
  2. "với mỗi card mạng ảo, mình có thể tạo 1 line mạng khác nhau": đúng. Ví dụ thực tế máy bạn có thể cắm 2 dây mạng, hoặc vừa cắm được dây mạng vừa có kết nối wifi, thì từ phía router-wifi sẽ nhìn thấy 2 máy khác nhau, có 2 ip khác nhau nhưng lại trùng tên thiết bị vì bản chất là một máy, thành ra một máy tính nhưng lại có nhiều ip. Về mặt hệ điều hành (cái này mình chưa dám khẳng định, tuy nhiên dựa trên kiến thức của mình) thì hệ điều hành có thể hoàn toàn tạo bao nhiêu card mạng ảo tùy thích, miễn mỗi card mạng ảo có địa chỉ MAC khác nhau, sau đó khi kết nối vào router-wifi, hệ điều hành sẽ present đống MAC đó, từ phía router nó sẽ nhận diện là nhiều thiết bị đang muốn kết nối, router sẽ "phân phát" ip cho mỗi địa chỉ MAC nhưng thực chất về cùng một máy, từ đó máy bạn có thể có nhiều ip và backend có thể bind vào các địa chỉ mạng ảo đó và ... bạn làm gì với nó là việc của bạn 😃))

NAT: đây là cơ chế giải quyết vấn đề về giới hạn số lượng khoảng 2^32 ~ 4 tỉ ipv4. Nói đến NAT thì phải nói tới private (local) ip và public ip. Trong mạng local thì các máy dùng địa chỉ private ip (VD: 10.x.x.x, 192.168.x.x, 172.x.x.x (*)). Khi gói tin từ máy trong mạng local đi qua router ra public internet thì router sẽ lưu mapping địa chỉ ip private + port private <---> ip public của router + port router (đoạn này mình không chắc đúng là router sẽ làm như vậy hay không, nhưng ý tưởng thì sẽ như vậy), từ đây gói tin đi ra ngoài internet với source là ip public của router và port của router. Sau đó khi gói tin đi từ public internet về router thì router sẽ dùng bảng mapping đó để biết trả gói tin đó về cho máy nào trong mạng local. Lúc này không cần biết là card mạng ảo hay card mạng thật, miễn gói tin đi đúng máy cần nhận là được.

0

Bác nói đúng, file signature cũng có thể bị fake! Phía trên cũng chỉ là những phần cơ bản thôi, còn về mục đích thì khó nói lắm, phải thử tấn công vào hệ thống thì mới biết mình có thể làm gì được. Đương nhiên thì cũng có những lời khuyên đi trước rồi, sẵn đây thì mình khuyến khích anh em nên tách và cô lập phần file server ra, có tiền thì dùng bên thứ 3 cũng tốt.

0

cho dù có kiểm tra cả signature thì vẫn có thể lừa đc , tuy nhiên nên đặt câu hỏi, họ fake để làm gì , nếu đập tắt đc mục đích của họ thì họ sẽ ko fake nữa

0

Jenkins is the best =))

0
khoảng 17 giờ trước

vậy có phải khi đi qua router , nó sẽ tự mapping lại đúng các địa chỉ ip mà lúc đầu mình khai báo không nhỉ, như vậy với mỗi card mạng ảo, ta có thể tạo 1 line mạng khác nhau

0
khoảng 17 giờ trước

Hôm e đi cái fossasia summit vào 1 buổi present thì có thống kê thế này :v ArgoCD vs Jenkin là được sử dụng nhiều nhất image.png

+1
khoảng 18 giờ trước

php luôn học hỏi và sao chép các tính năng của các ngôn ngữ khác , giúp ng viết ng ng khác nhảy sang php vẫn thấy ko quá nhiều khác biệt

0
khoảng 18 giờ trước

🤣

0
khoảng 19 giờ trước

Chỉ là mấy trick vặt vãnh, không xứng gọi là javascript nâng cao.

+1
khoảng 21 giờ trước

var, let, const có sự khác nhau quan trọng là scope. var luôn cho ra global scope.

var num = 10; // global scope

// begin local scope
{
  var num = 8;
}

console.log(num); // 8

let x = 4; // global scope

// begin local scope
{
  let x = 5;
}

console.log(x); // 4

let và const sinh ra để thay thế var, cho nên hãy thôi dùng var.

+3
khoảng 21 giờ trước

bài viết hay, cảm ơn anh.

+1
khoảng 22 giờ trước

Cảm ơn feedback của bạn. Rất hợp lý, mình đã bổ sung 😁

0

Anh cho em hỏi Master Data là gì và làm sao để có được Master Data vậy ạ. Em có đọc qua bài TF-IDF của anh rồi, nhưng em vẫn không biết Master Data từ đâu ra.

0

Cám ơn bạn đã theo dõi 😁

0
Thứ Sáu, 12:03 SA

Cám ơn bài viết của bạn. Nếu thêm phần giới thiệu Notion ở đầu nữa thì tuyệt.

+1

Bài viết rất hay và hữu ích nha. Mình đã thử trên cụm VKS của mình và thành công, không khác gì hướng dẫn, trừ vài thay đổi cho phù hợp với cloud provider 😄

+1
Thứ Năm, 1:35 CH

class CicularQueue: def init(self,size): self.front = self.rear = -1 self.size = size self.queue = [None] * size

def enQueue(self,data):
    if (self.front == 0 and self.rear == self.size - 1) or (self.rear == (self.front - 1) % (self.size - 1)):
        print("Queue is Full")
    elif self.front == -1 :
        self.rear = 0 
        self.front = 0 
        self.queue[self.rear] = data
    elif self.rear == self.size - 1 and self.front != 0 :
        self.rear = 0 
        self.queue[self.rear] = data
    else:
        self.rear += 1 
        if self.front <= self.rear : 
            self.queue[self.rear] = data 
            
def deQueue(self):
    if self.front == -1  : 
        print("\n Queue is empty ")
        return -1 
    
    data = self.queue[self.front]
    self.queue[self.front] = None
    if self.front == self.rear :
        self.front = - 1
        self.rear = - 1
    elif self.front == self.size - 1: 
        self.front = 0 
    else:
        self.front += 1 
        
    return data 

def displayQueue(self):
    if self.front == -1 :
        print("Queue is empty ")
        return
    print("Element in the "+"cicular queue are : ")
    if self.rear >= self.front : 
        for i in range(self.front,self.rear+1):
            print(self.queue[i],end=' ')
            print(' ')
        print('\n')
        
    else:
        for i in range(self.front,self.size):
            print(self.queue[i])
            print(" ")
            
        for i in range(0,self.rear+1):
            print(self.queue[i])
            print(" ")
        print("\n")

if name == 'main': q = CicularQueue(5) q.enQueue(10) q.enQueue(8) q.enQueue(30) q.enQueue(5) q.displayQueue() x = q.deQueue() if x != -1: print("Deleted value =", x)

x = q.deQueue()
if x != -1:
    print("Deleted value =", x)

q.displayQueue()

q.enQueue(9)
q.enQueue(20)
q.enQueue(5)

q.displayQueue()

q.enQueue(20)

Mọi người tham khảo nhé !!!

0
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí