Mindblown: a blog about philosophy.

  • Gitlab CI/CD cho người mới bắt đầu – Phần 2: Configure Runner

    Gitlab CI/CD cho người mới bắt đầu – Phần 2: Configure Runner

    (Ngoài ra các bạn có thế xem thêm các cài đặt nâng cao khi đăng kí runner tại đây) Khi đăng kí runner như trên, bạn sẽ cần chú ý vào tag-list, tại đây thì runner sẽ nhận diện những job nào được gắn tag đó để khởi chạy! Đó, và như vậy là chúng […]

  • Null safety trong Flutter

    Null safety trong Flutter 1. Null safety là gì a. Tổng quan về null safety Trong các ngôn ngữ lập trình hướng đối tượng có một lỗi mà chúng ta rất hay gặp đó là NullPointerException, lỗi này có thể dẫn đến việc ứng dụng bị crash, ảnh hưởng đến trải nghiệm người dùng. Để […]

  • Mô hình phát triển ứng dụng

    Mô hình phát triển ứng dụng

    Mục đích của blog này là cung cấp phân tích chi tiết về phân tích mô hình phát triển di động và các lựa chọn công nghệ, khuôn khổ khác nhau. Điều này sẽ giúp xác định con đường để chọn dựa trên các thông lệ kinh doanh và kỹ thuật. CÁC MÔ HÌNH PHÁT TRIỂN […]

  • Differentiate between ephemeral state and app state.

    Theo nghĩa rộng nhất có thể, trạng thái của ứng dụng là mọi thứ tồn tại trong bộ nhớ khi ứng dụng đang chạy. Điều này bao gồm nội dung của ứng dụng, tất cả các biến mà khung Flutter lưu giữ về giao diện người dùng, trạng thái hoạt ảnh, kết cấu, phông chữ, […]

  • Stateful Builder có thể bước thay thế vị trí của Stateful Widget không?

    Để hiểu điều này trước tiên chúng ta hãy hiểu Stateful Builder là gì? StatefulBuilder là một widget có trạng thái có thể thay đổi (trạng thái có thể thay đổi), điều làm cho nó trở nên đặc biệt là chỉ xây dựng lại widget cụ thể được bao bọc trong Stateful Builder. Rất may là […]

  • Swift: weak and unowned

    Swift: weak and unowned

    Automatic Reference Counting aka ARC, là 1 tính năng của Swift dùng để đếm số lượng strong reference, và cho phép quản lý việc giải phóng memory khi 1 instance không còn được reference(tham chiếu) đến. Theo như doc của Apple: Ví dụ :  Trong ví dụ này, class FirstViewController của mình đang strong reference đến instance secondClass Như mình đã đề cập bên trên, ARC sẽ giúp chúng ta quản lý, phân bổ memory từ những instance không còn được tham chiếu đến. Tuy nhiên, câu hỏi đặt ra là điều gì sẽ xảy ra khi có 2 object/instance strong reference đến nhau? Từ strong việt hóa ra là mạnh, bền, … nghe thôi cũng cảm giác khó phá hỏng, phá hủy nó rồi đúng không? :))) Thì strong reference cũng thế, strong reference trỏ đến 1 instance/object và sở hữu nó, quyết định đến sự tồn tại của instance/object đó.  ARC không thể có cách nào giải phóng được memory từ những kiểu instace/object này, và điều này sẽ dẫn đến memory leak. Trong thực tế những project đã làm, thì mình rất hay thường gặp những case strong reference, và mình cũng rất hay vô tình tạo ra strong reference :v  Case mình hay gặp nhất là case khi khởi tạo delegate: Trông ví dụ này có vẻ quen đúng không? :))) ở đây mình có 1 protocol DemoDelegate, và khởi tạo delegate này trong FirstClass. Và FirstClass và delegate DemoDelegate đang strong reference đến nhau. Để giải quyết vấn đề này, chúng ta có weak và unowned. Trái ngược với strong pointer, weak pointer trỏ đến một instance/object và không quyết định đến sự tồn tại của instance/object đó. Vì thế nên ARC có thể dễ dàng giải phóng bộ nhớ từ instance/object này kể cả chúng ta vẫn còn đang tham chiếu đến nó  => Weak reference rất hữu ich, giúp chúng ra tránh được việc vô tình hay cố ý tạo ra 1 strong reference cycle. Việc sử dụng weak reference thực sự quan trọng, ví dụ nếu chúng ta để ý hơn và xem source code bên trong definition của UITableView, ta có thể nhận thấy rằng tất cả delegate(bao gồm 2 var quen thuộc là dataSource và delegate) đều được sử dụng với weak khi khởi tạo. Và mình nghĩ là đến apple còn để ý và chú trọng đến việc sử dụng weak, tại sao chúng ta lại không làm như thế ? :v Ok, thêm weak là xong, đơn giản phải không nào. Tuy nhiên, khi thêm weak, lại nảy sinh vấn đề không thể compile đoạn code: Để giải quyết, theo doc Protocols của apple: Để fix, chỉ cần thêm keyword class là được Một variable kiểu unownevề cơ bản giống với variable kiểu weak, nhưng khác nhau ở chỗ: compiler sẽ make sure rằng variable này khi được gọi đến sẽ không có giá trị nil. Vậy thực sự trong trường hợp nào nên sử dụng unowned thay vì sử dụng weak ? Vẫn theo doc của Apple:  Để hiểu rõ hơn, mình có 2 ví dụ như này Ví dụ của weak reference: mình sở hữu 1 chiếc xe đạp, nhưng 1 hôm đẹp trời nào đó, mình đổi ý không muốn đạp xe nữa, thì ở đây chiếc xe đạp vẫn còn đó, có chăng chỉ là đổi chủ, trong khi mình đang ngồi 1 chiếc 4 bánh nào đó :v  Ví dụ của unowned reference: mình chơi 1 yasuo chẳng hạn :))), thằng nhân vật của mình tăng skill theo cấp độ. Tuy nhiên, khi xám màn hình, những skill đó cũng sẽ xám theo. Có nghĩa rằng là những skill này có tuổi thọ = tuổi thọ của nhân vật mình đang chơi. Triển khai trong code: Vậy là chúng ta đã hiểu phần nào về 2 keyword weak và unowned. Chúng dùng để tránh tình trạng vô tình tạo ra memory leak.  Nhưng sao để biết được có thực sự tránh được hay không? Cách đơn giản và xưa như quả đất, là sử dụng print trong 2 method init và deinit Và để ý memory trong XCode nữa :v Strong, weak, unowned là những thuật ngữ cơ bản trong swift, tuy nhiên chúng ta thường – do vô ý hoặc chủ quan – bỏ qua chúng. Điều này không thực sự ảnh hưởng quá lớn với những project nhỏ.  Tuy nhiên với những app lớn, việc quản lý bộ nhớ ra sao cho hiệu quả là 1 việc quan trọng và đáng lưu ý, bởi vì khi memory leak trở thành 1 vấn đề nghiêm trọng, thì rất khó và tốn effort để fix. 😀 REFERENCE https://docs.swift.org/swift-book/LanguageGuide/Protocols.html https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

  • Flutter: Quản lý state bằng provider.

    Ví dụ. Để minh họa, hãy xem xét ứng dụng đơn giản sau. Ứng dụng có hai màn hình riêng biệt: danh mục và giỏ hàng (được đại diện bởi các tiện ích MyCatalog và MyCart, tương ứng). Nó có thể là một ứng dụng mua sắm, nhưng bạn có thể tưởng tượng cấu trúc […]

  • Flutter Custom Radio Button với Custom Shapes

    Sự phát triển của Flutter đang trở nên phổ biến và ngày càng phổ biến hơn do có nhiều tùy biến, widget tùy chỉnh và cách tiếp cận rất dễ thực hiện. Hôm nay chúng ta sẽ tìm hiểu cách tạo nút radio tùy chỉnh Flutter với các hình dạng tùy chỉnh như hộp đựng hình […]

  • Difference between Multiprogramming, multitasking, multithreading, and multiprocessing

    1. Multiprogramming Trong một hệ thống máy tính hiện đại, thường có một số tiến trình ứng dụng đồng thời muốn thực thi. Giờ đây, hệ điều hành có trách nhiệm quản lý tất cả các quy trình một cách hiệu quả và hiệu quả. Một trong những khía cạnh quan trọng nhất của hệ […]

  • [Flutter]Push Notification

    [Flutter]Push Notification

    0. Thêm dependency Thêm flutter_local_notifications: ^9.1.2 vào pubspec.yaml. Đừng quên sử dụng Pub get để tải về. 1. Thiết lập hình ảnh biểu tượng của bạn Thêm hình ảnh vào đường dẫn này: icon path: PROJECT_NAME\android\app\src\main\res\drawable\icon.png 2. Tạo một class NotificationService Bạn sẽ nhập lớp này vào main.dart.(Chúng tôi sẽ thực hiện việc này ở bước sau 3.) Mã của […]

Got any book recommendations?