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

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

Threads
  • Tin vui đầu ngày. Github vừa công bố rộng rãi GitHub Models đến tất cả mọi người. Nếu còn nhớ cách đây hơn 2 tháng trước, Github có chương trình đăng ký dùng thử các models của LLMs, và trường hợp của mình thì phải một tháng sau mới được duyệt cho dùng. Thì giờ đây họ đã cho mọi người dùng Github có quyền truy cập vào rồi, không cần phải đăng ký gì nữa 🥳

    GitHub Models đang là phao cứu sinh cho mình trong khi xây dựng trang blog này 😆

    GitHub Models is now available in public preview | Github Blog

    » Xem thêm
  • Hôm trước mình thấy repository này dùng TauriSvelte để viết lại ứng dụng kiểu như là Task Manager trên Window hay Monitor trên Mac á. Tò mò tải về xem thử thì bất ngờ thứ nhất là dung lượng rất nhỏ, chỉ vài MB. Tiếp theo là tốc độ khởi động cũng rất nhanh mà ứng dụng cũng rất mượt nữa chứ 🫣

    Abdenasser/neohtop

    » Xem thêm
  • Tuôi" để ý là cứ đợt nào ham đọc cái là lại lười viết, tuần nay tuôi đang đọc một lúc 3 cuốn, à phải là đọc 2 và nghe 1.

    Cuốn sách ám ảnh nhất đến thời điểm hiện tại: Đại dương đen - thuật lại 12 câu chuyện của 12 người mắc bệnh trầm cảm. Thần kinh vững, nhưng mới đọc 2 câu truyện đầu thôi mà cảm giác ngộp thở, bứt rứt thật khó tả 😰

    Câu chuyện tiếp theo đó thì mang lại cảm giác dễ thở hơn vì họ kiểm soát được bản thân. Nhưng sang tiếp câu chuyện thứ 4, thứ 5 thì lại như một có một bàn tay siết họng mình lại. Không thể nhắm mắt mà nghe được á, có gì đó rất đáng sợ.

    Một câu mà mình cảm thấy ám ảnh nhất là khi ba mẹ của người mắc trầm cảm luôn miệng hỏi tại sao con lại như thế mỗi khi sắp lên cơn và gào thét. Họ chỉ đành bất lực trả lời là "Làm sao mà con biết! Cũng giống như hỏi một người bị ốm là tại sao lại ốm? Làm sao mà biết được chứ! Có ai muốn đâu!".

    » 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!

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.
Author

Xin chào, tôi tên là Hoài - một anh Dev kể chuyện bằng cách viết ✍️ và làm sản phẩm 🚀. Với nhiều năm kinh nghiệm lập trình, tôi đã đóng góp một phần công sức cho nhiều sản phẩm mang lại giá trị cho người dùng tại nơi đang làm việc, cũng như cho chính bản thân. Sở thích của tôi là đọc, viết, nghiên cứu... Tôi tạo ra trang Blog này với sứ mệnh mang đến những bài viết chất lượng cho độc giả của 2coffee.dev.Hãy theo dõi tôi qua các kênh LinkedIn, Facebook, Instagram, Telegram.

Bạn thấy bài viết này có ích?
Không

Bình luận (2)

Nội dung bình luận...
Avatar
Trịnh Cường7 tháng trước
very sure bro :))
Trả lời
Avatar
Trịnh Cường7 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ống7 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é