Nhật ký làm Notas - Kỳ II

Nhật ký làm Notas - Kỳ II

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Hẳn là nhiều người ở đây đã nghe đến kiểu tấn công bảo mật Clickjacking rồi nhỉ. Kẻ tấn công thường nhúng một website (thường là mục tiêu) vào trong một iframe trên website của chúng, sau đó làm mờ hoặc ẩn nó đi rồi đặt vào vị trí các nút bấm trên web, ví dụ "Bấm vào để nhận quà". Đâu ai ngờ rằng phía trên nút bấm đó là một nút bấm khác trong iframe. Khá nguy hiểm!

    Nhưng trình duyệt đã có cách ngăn chặn kiểu tấn công này bằng các quy tắc như tiêu đề X-Frame-Options, frame-ancestors của CSP và SameSite: Lax/Strict của Cookies...

    Mới đây, đã xuất hiện thêm kiểu tấn công mới - "DoubleClickjacking" 😨. Đại ý là "hắn" lợi dụng hành động double click để lừa người dùng bấm vào một nút mà hắn muốn. Chi tiết hơn trong bài viết này: DoubleClickjacking: A New Era of UI Redressing.

    » Xem thêm
  • Mọi người đã nghe nói đến Jujutsu - jj - một dạng quản lý phiên bản cho mã nguồn (version control system) chưa? Có vẻ như nó đang nhận được nhiều sự quan tâm.

    Chờ xíu! Chẳng phải git đã quá tốt rồi sao? Thế thì chế ra thằng jj để làm gì nữa? Cũng hơi khó trả lời nhỉ? Mỗi công cụ sinh ra chắc chắn phải cải thiện hoặc khắc phục được nhược điểm của cái trước. Cho nên jj ắt hẳn phải làm được điều gì đó mà git chưa làm được nên mới nổi lên như vậy.

    Thật ra mình đã nghe nói đến jj từ vài tháng trước rồi, nhưng vào đọc thì toàn kiến thức cao siêu. Hoặc là đang mang nặng cái lối suy nghĩ của git vào trong đầu rồi nên chưa lĩnh hội ra được điều gì cả.

    Mình hay có kiểu cái gì đọc lần 1 mà không hiểu thì đọc tiếp lần 2, lần 2 không hiểu thì đọc tiếp lần 3... đến lần thứ n mà vẫn không hiểu thì bỏ. Cơ mà không phải là từ bỏ mà một thời gian sau đó quay lại đọc tiếp. Đến một lúc nào đó khả năng mình sẽ hiểu ra một ít vấn đề, thế mới tài 😆.

    Thì cái jj này có vẻ như nó đang mở ra được tính linh hoạt trong việc "cam kết" mã. Tưởng tượng bạn đang làm việc trên một dự án, đang ở nhánh này, muốn sang nhánh khác để sửa, nhưng mà lại đang viết dở ở nhánh này, thế là phải stash, rồi checkout, rồi commit, rồi merge hoặc rebase lại vào nhánh cũ... nhìn chung quá trình làm việc với git nghiêm ngặt đến mức cứng nhắc, cần nhiều thao tác để giải quyết một vấn đề, chưa kể cái cây commit (commit-tree) nữa thì ôi thôi, khỏi xem cho đỡ nhức mắt. Thế nên ông jj này đang làm cách nào đó để bạn khỏi cần phải quan tâm đến các nhánh luôn, sửa trực tiếp vào commit. Nghe ảo nhỉ 😂.

    Đấy mới lĩnh hội được đến đấy, hy vọng sau n lần đọc lại nữa mình sẽ viết được một bài chi tiết hơn về công cụ này.

    » Xem thêm
  • Gòi gòi tới công chiện gòi 🤤🤤🤤

    » Xem thêm

Vấn đề

Hôm nay Hà Nội trở gió, trời mát và có mưa phùn nhẹ, tôi đã tái chạy lại sau gần 3 tuần nghỉ ngơi cũng như tập trung làm Notas. Chỉ mới sáng nay, ý tưởng viết bài cho kỳ tiếp theo vẫn chưa có trong dự kiến bởi vì có quá nhiều vấn đề lớn mà tôi chưa xử lý được. Nhưng thật may, vừa mới đây thôi, trong lúc gột rửa tâm hồn trong những hạt nước phun ra từ đài sen, thì tôi đã tìm ra mảnh ghép cho phiền muộn dai dẵng bấy lâu nay.

Như thường lệ, tuần này tôi sẽ tổng hợp lại vấn đề, khó khăn đang gặp phải, làm được gì và cả kế hoạch cho tuần tới.

Khó khăn

Có nhiều khó khăn cực lớn đang phải đối mặt.

Trong bài viết trước, tôi có bật mí với bạn đọc về cấu trúc của Adapter đóng vai trò như cơ sở dữ liệu. Ban đầu, tôi đã triển khai được Adapter có tên LocalStorage để lấy dữ liệu từ Local Storage trong trình duyệt, từ đó nếu viết thêm một Adapter mới, lấy dữ liệu từ máy chủ nào đó, đồng thời xử lý luôn vấn đề đồng bộ thì... người dùng cần phải kết nối mạng mới sử dụng được Adapter đó.

Điều đó có nghĩa một ứng dụng ghi chú nhưng lại cần phải trực tuyến mới có thể sử dụng. Hmm... nghe có vẻ vô lý, đâu phải ai lúc nào cũng có mạng Internet. Nếu đi ra ngoài, họ ngoại tuyến, cần việc phải ghi chú thì cái ứng dụng coi như bỏ đi vì không sử dụng được hay sao?

Vì vậy buộc phải tìm một giải pháp khác, cho phép người dùng trực tuyến lẫn ngoại tuyến phải dùng được.

Như kiến trúc 3 lớp trước kia: UI, Logic và Adapter thì có vẻ vẫn chưa đủ để làm cho ứng dụng hoạt động khi ngoại tuyến. Muốn ứng dụng vẫn hoạt động được khi ngoại tuyến, chúng ta cần nghĩ ra cách lưu được dữ liệu của người dùng khi họ không có kết nối Internet.

Như vậy, cần phải thêm một lớp lưu trữ - mà tôi gọi là Storage nằm giữa Logic và Adapter. Storage đóng vai trò lưu trữ dữ liệu cục bộ, tức là dữ liệu mà người dùng tương tác ngay cả khi ngoại tuyến. Lúc này, Logic sẽ tương tác trực tiếp với Storage - đóng vai trò như một cơ sở dữ liệu cục bộ, đồng thời cần thêm cơ chế đồng bộ dữ liệu từ Adapter xuống Storage.

Nghe thì có vẻ đơn giản nhưng khi bắt tay vào làm thì mọi chuyện không hề dễ.

Đầu tiên là tôi phải sửa lại khá nhiều mã, tạo thêm một lớp Storage lưu trữ dữ liệu trong Local Storage để làm cơ sở dữ liệu ngoại tuyến cho người dùng.

Thứ hai là cơ chế đồng bộ giữa Storage và Adapter. Việc giữ cho hai cơ sở dữ liệu được thống nhất không được thuận lợi cho lắm, đặc biệt khi thêm một máy khách thứ 2 cũng tham gia vào máy chủ đồng bộ. Như vậy, khi một máy nào đó chỉnh sửa dữ liệu trong cùng một máy chủ đồng bộ, thì ngay lập tức dữ liệu cũng phải được đồng bộ đến các máy còn lại. Chưa kể khi các máy cùng tham gia chỉnh sửa trên một ghi chú thì sẽ rất phức tạp.

Thứ ba đó là dù cho một máy khách đã bật đồng bộ dữ liệu, nhưng vì một lý do nào đó mà máy này không được kết nối mạng, nhưng vẫn thực hiện các thao tác thêm/sửa/xóa ngoại tuyến thì khi có mạng, vẫn phải đảm bảo dữ liệu được đồng bộ hóa lên máy chủ theo một quy tắc nhất định.

Thật đau đầu, lúc mới bắt tay vào làm quả thực tôi chưa hề nghĩ vấn đề này lại phức tạp đến như vậy. Thú thật trong 1 tuần qua, mỗi buổi sáng thức giấc, điều tôi nghĩ đến đầu tiên là làm sao để giải quyết vấn đề đồng bộ này.

Rốt cục, tôi đã sửa đi sửa lại mã của mình rất nhiều lần để tìm ra được một quy tắc chung cho việc đồng bộ, và có lẽ ánh sáng đang rọi qua những chiếc lá ngày một rõ nét.

Giải pháp

Hãy nghĩ về git cùng với cơ chế pull/push dữ liệu của nó. Một máy chủ lưu trữ repository từ xa (remote), một repository được "clone" về lưu trữ cục bộ trên máy tính. Nhiệm vụ của git là cung cấp cơ chế để đồng bộ hóa giữa remote và local, nghĩa là phải làm sao đó đảm bảo dữ liệu trong local luôn giống với remote nhất.

Nếu áp dụng theo cách đó, Adapter sẽ giống như là remote còn Storage sẽ giống như là local. Notas sẽ yêu cầu Adapter triển khai các hàm pull/push tương ứng với hành vi lấy và đẩy dữ liệu mới lên máy chủ đồng bộ.

Cái khó còn lại là xác định được khi nào cần pull và push dữ liệu.

Kết quả đạt được và mục tiêu cho tuần tới

Viết ghi chú trên Notas

Có thể bạn không tin nhưng bài viết tổng kết kết quả kỳ II này đang được viết trong chính ứng dụng Notas.

Có thể nói Notas đã có thể hoạt động với tính năng đồng bộ ở mức độ Alpha. Khi sử dụng nó viết cũng là cách để kiểm tra nó hoạt động có chính xác hay không. Dĩ nhiên là các lỗi vẫn xuất hiện trong khi viết, nhiều lỗi liên quan đến hành vi pull/push dữ liệu không đồng bộ, gây ra tình trạng mất dữ liệu tại một số thời điểm. Hy vọng những lỗi này sẽ được "fix" trong tuần tiếp theo.

Cuối cùng cảm ơn bạn đọc đã theo dõi, nếu bạn có thắc mắc vấn đề gì hoặc còn điều gì chưa được làm sáng tỏ thì hãy để lại bình luận xuống phía dưới bài viết nhé. Rất sẵn lòng để giải đáp!

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (2)

Nội dung bình luận...
Avatar
Trịnh Cường9 tháng trước
very sure bro :))
Trả lời
Avatar
Trịnh Cường9 tháng trước
cố lên bạn, mình tin là bạn sẽ làm đc ;)
Trả lời
Avatar
Xuân Hoài Tống9 tháng trước
Cảm ơn bạn Cường đã động viên tinh thần. Nhớ dùng sp của mình sắp tới nhé
Bấm hoặc cuộn mạnh để sang bài mới