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

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

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » 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

Bí mật ngăn xếp của Blog

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào ngay!

Là một lập trình viên, bạn có tò mò về bí mật công nghệ hay những khoản nợ kỹ thuật về trang blog này? Tất cả bí mật sẽ được bật mí ngay bài viết dưới đây. Còn chờ đợi gì nữa, hãy bấm vào 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ường1 năm trước

very sure bro :))

Trả lời
Avatar
Trịnh Cường1 năm 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ống1 năm 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é