Thứ Hai, 26 tháng 6, 2023

Design Patterns: Elements of Reusable Object-Oriented Software




Design Patterns: Elements of Reusable Object-Oriented Software"

Tác giả: Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (Gang of Four)

Đây là một trong những cuốn sách tôi tâm đắc trong tủ sách lập trình của mình. Tôi đọc cuốn này sau cuốn Clean Code và phải đọc đi đọc lại, vừa đọc vừa thực hành nhiều thì mới vận được “nội công thâm hậu” từ cuốn bí kíp này. Dân lập trình chuyên nghiệp chắc hẳn không thể thiếu Design Patterns. 


Dưới đây là một ví dụ thực tế dễ hiểu cho một số mẫu thiết kế thường gặp:


1. Singleton Pattern:

   Ví dụ: Lớp DatabaseConnectionManager quản lý kết nối đến cơ sở dữ liệu. Với Singleton Pattern, chúng ta có thể đảm bảo rằng chỉ có một đối tượng DatabaseConnectionManager được tạo ra và mọi yêu cầu kết nối sẽ sử dụng đối tượng duy nhất này.


2. Factory Pattern:

   Ví dụ: Lớp ShapeFactory tạo ra các đối tượng hình học như hình vuông (Square), hình chữ nhật (Rectangle) và hình tròn (Circle) dựa trên thông tin đầu vào. Bằng cách sử dụng Factory Pattern, chúng ta có thể tạo ra các đối tượng hình học mà không cần biết chi tiết về cách chúng được tạo ra.


3. Observer Pattern:

   Ví dụ: Hệ thống thông báo sự kiện đăng ký. Khi người dùng đăng ký thông tin, các thành phần quan sát (observers) như gửi email, gửi thông báo trên ứng dụng di động và cập nhật trên giao diện người dùng sẽ được thông báo và cập nhật dựa trên thông tin đăng ký.


4. Strategy Pattern:

   Ví dụ: Bộ lọc ảnh trong ứng dụng xử lý ảnh. Chúng ta có thể áp dụng một loạt các thuật toán bộ lọc như Lọc Màu Xám (Grayscale), Lọc Đỏ (Red Filter), Lọc Xanh (Blue Filter) bằng cách sử dụng Strategy Pattern. Mỗi thuật toán bộ lọc được triển khai trong một lớp riêng biệt và có thể được chọn linh hoạt để áp dụng vào ảnh.


5. Decorator Pattern:

   Ví dụ: Lớp OrderDecorator trong một hệ thống đặt hàng. Chúng ta có thể thêm các tính năng bổ sung như quà tặng, gói quà, hay dịch vụ giao hàng nhanh bằng cách sử dụng Decorator Pattern. Mỗi tính năng bổ sung sẽ được triển khai trong một lớp decorator và có thể được áp dụng linh hoạt cho một đơn hàng cụ thể.

Hy vọng rằng cuốn sách này sẽ cung cấp cho bạn kiến thức thú vị và hữu ích về mẫu thiết kế trong lập trình.

Chủ Nhật, 25 tháng 6, 2023

Hành trình lần đầu làm mẹ

 



Đau đẻ 2 ngày trời vật vã, nước mắt và cảm xúc đan xen trong lòng. Đó là những kỷ niệm đầu tiên khi trở thành một người mẹ. Con gái của mình, Misa, đã chào đời và mở ra một cuộc sống mới đầy hạnh phúc và thách thức.


Ngay từ những ngày đầu tiên, mình đã đối mặt với nhiều khó khăn và thử thách. Misa bị dị ứng với đạm sữa bò, thịt gà, trứng và cà tím. Những cơn nôn thốc, nôn tháo và nhiều lần mình phải đưa Misa đến bệnh viện cấp cứu vì tình trạng khẩn cấp. Đêm ngày mình bóp ngực và hút sữa xuyên đêm vì bị cương sữa. Mình còn phải đối mặt với việc con cắn ti mẹ khi đã mọc răng, khiến mình cảm thấy đau đớn vô cùng mỗi lần cho con ti.


Một trong những thử thách lớn nhất mà mình đã trải qua là khi con gái mình phải chịu hành hạ vì bị viêm phổi. Con sốt cao liên tục 8 ngày mãi cho đến khi vào viện. Con phải điều trị truyền kháng sinh trong một tuần tại bệnh viện. Khi đó con chỉ mới 9 tháng tuổi. Những ngày đó, nỗi lo lắng tràn đầy trong tâm trí của mình. Những ngày nghẹt thở, nhiều nước mắt, mất sữa, mình cũng ốm theo con luôn, sốt ho dữ dội, 2 mắt đỏ lên, trắng đêm…


Trải qua hơn một năm rưỡi, mình phải ngủ nghiêng một bên. Giấc ngủ trở nên quý giá và mình thường gặp khó khăn trong việc nghỉ ngơi.


Nhưng dù có bao nhiêu khó khăn, những tháng ngày đầy mệt mỏi và thử thách, mình không bao giờ thôi cảm ơn Chúa vì đã ban cho mình một thiên thần đáng yêu vô cùng, một sản nghiệp vô giá. Những giọt nước mắt đã trở thành niềm vui và tự hào. Mỗi lần nhìn Misa mỉm cười và khỏe mạnh, mình biết rằng tất cả những vất vả đều xứng đáng. Đó là những khoảnh khắc đáng trân trọng và không thể quên trong cuộc sống của mình.


Đôi khi, khi mình nhìn lại hành trình làm mẹ, mình thấy mình đã trưởng thành và thay đổi nhiều. Misa đã làm mình trở nên mạnh mẽ hơn, kiên nhẫn hơn và biết trân trọng những giây phút hơi ngại nói lên những cảm xúc sâu thẳm này, nhưng mình muốn chia sẻ với các bà mẹ khác rằng không có gì sai khi chúng ta cảm thấy mệt mỏi hay bất lực. Có những ngày mình cảm thấy bị áp lực và không biết phải làm gì để đối mặt với mọi thứ. Nhưng trong những khoảnh khắc như vậy, khi con gái mình mỉm cười hay ôm lấy mình, mình nhận ra rằng tình yêu và sự hi sinh là những gì quan trọng nhất!


Cố lên! Fighting!!

Thứ Bảy, 24 tháng 6, 2023

Misa - Điểm tựa yêu thương và sự tự hào của Mama

 Misa, hay thân thương được gọi là Sa, là tia sáng và niềm tự hào của mama. Mỗi ngày, con mang đến những khoảnh khắc vui vẻ và hạnh phúc cho gia đình chúng ta. Khi papa chọc Sa cười, trái tim mama đầy hạnh phúc.



Mama luôn cảm thấy niềm vui tràn đầy khi nhìn thấy Sa cười tươi. Chúng ta đã tạo nên những kỷ niệm đáng nhớ, làm cho cuộc sống của chúng ta trở nên phong phú và ý nghĩa hơn.

Trong những thử thách và khó khăn của cuộc sống, tình yêu và sự hiện diện của Sa là nguồn động viên và sức mạnh lớn lao. Chúng ta vượt qua mọi khó khăn cùng nhau.

Sa, con yêu thương của mama, hãy luôn giữ nụ cười và niềm tin trong trái tim. Mama sẽ luôn ở bên cạnh con, yêu thương và chăm sóc con cho đến khi nào mama không thể làm điều đó nữa. Con là niềm tự hào và niềm vui lớn nhất của cả nhà. Hãy luôn nhớ rằng ngày con ra đời là ngày một ngôi sao xuống trần gian :)


Yêu thương vô điều kiện,

Mama của Sa

Clean Code: A Handbook of Agile Software Craftsmanship



Clean Code: A Handbook of Agile Software Craftsmanship

Tác giả: Robert C. Martin (Uncle Bob)

Ngày mới chân ướt chân ráo sang Nhật, tôi đã được một anh đồng nghiệp giới thiệu cho một cuốn sách rất hay. Cuốn sách này đã đồng hành cùng tôi trong sự nghiệp lập trình của mình. Đó chính là Clean Code.

"Clean Code" là một cuốn sách kinh điển trong lĩnh vực lập trình. Tác giả Robert C. Martin, hay được gọi là Uncle Bob, đưa ra những nguyên tắc và phương pháp để viết mã code sạch, dễ đọc, dễ hiểu và dễ bảo trì.


Cuốn sách tập trung vào các nguyên tắc thiết kế và các kỹ thuật lập trình chuyên nghiệp, nhằm giúp các lập trình viên cải thiện chất lượng mã nguồn và làm việc hiệu quả hơn trong các dự án phần mềm. Nó bao gồm nhiều ví dụ cụ thể và hướng dẫn chi tiết để minh họa các khía cạnh của mã code sạch.


"Clean Code" là một cuốn sách cần đọc cho bất kỳ lập trình viên nào muốn nâng cao kỹ năng lập trình của mình và trở thành một nhà phát triển phần mềm chuyên nghiệp. Nó không chỉ giúp bạn viết mã code tốt hơn, mà còn giúp bạn hiểu và đáp ứng tốt hơn với yêu cầu và thay đổi trong quá trình phát triển phần mềm.


Dưới đây là một tóm tắt ngắn gọn về những ý hay trong cuốn sách "Clean Code":


1. Mã code nên được viết sao cho dễ đọc, dễ hiểu và dễ bảo trì.

2. Đặt tên biến, hàm và lớp một cách rõ ràng và mô tả chính xác chức năng của chúng.

3. Hạn chế kích thước của các phương thức và lớp, đảm bảo chúng chỉ thực hiện một nhiệm vụ duy nhất.

4. Tuân thủ các nguyên tắc thiết kế như SOLID để xây dựng mã code linh hoạt và dễ mở rộng.

5. Áp dụng các kỹ thuật tái cấu trúc để giảm độ phức tạp và tăng tính tái sử dụng của mã code.

6. Thực hiện các bài kiểm tra và đảm bảo tính ổn định của mã code thông qua việc sử dụng kiểm thử đơn vị và kiểm thử tự động.

7. Đọc và hiểu mã code hiện có trước khi thay đổi hoặc bảo trì, và luôn tuân thủ quy tắc "đừng làm rối mã code hiện có".

8. Đặt chất lượng mã code lên hàng đầu và không chấp nhận sự cẩu thả hay việc bỏ qua các quy tắc lập trình.

Hy vọng rằng cuốn sách này sẽ giúp bạn trở thành một lập trình viên tốt hơn và phát triển các phần mềm chất lượng.

Thứ Sáu, 23 tháng 6, 2023

[Java] Tìm hiểu về việc sắp xếp mảng theo thứ tự tăng dần



Trong lĩnh vực lập trình, sắp xếp mảng là một chủ đề quan trọng và thú vị. Trong bài viết này, chúng ta sẽ phân tích một đoạn code Java đơn giản nhưng mạnh mẽ, giúp chúng ta hiểu cách sắp xếp một mảng theo thứ tự tăng dần.


Đoạn code sau đây thực hiện thuật toán sắp xếp nổi bọt (bubble sort) để sắp xếp một mảng:


public class BubbleSort {

    public static void bubbleSort(int[] arr) {

        int n = arr.length;

        for (int i = 0; i < n - 1; i++) {

            for (int j = 0; j < n - i - 1; j++) {

                if (arr[j] > arr[j + 1]) {

                    // Hoán đổi hai phần tử

                    int temp = arr[j];

                    arr[j] = arr[j + 1];

                    arr[j + 1] = temp;

                }

            }

        }

    }


    public static void main(String[] args) {

        int[] arr = {64, 34, 25, 12, 22, 11, 90};

        bubbleSort(arr);

        System.out.println("Mảng sau khi sắp xếp:");

        for (int i = 0; i < arr.length; i++) {

            System.out.print(arr[i] + " ");

        }

    }

}

```


Trong đoạn code trên, chúng ta định nghĩa một lớp `BubbleSort` với phương thức `bubbleSort` để thực hiện thuật toán sắp xếp nổi bọt. Thuật toán này lặp qua mảng nhiều lần, so sánh các phần tử kề nhau và hoán đổi chúng nếu cần. Quá trình này được thực hiện cho đến khi mảng được sắp xếp hoàn toàn.


Phương thức `main` trong đoạn code chứa một mảng chưa sắp xếp và gọi phương thức `bubbleSort` để sắp xếp mảng đó. Sau đó, chúng ta in ra mảng sau khi đã sắp xếp.


Thuật toán sắp xếp nổi bọt có độ phức tạp thời gian là O(n^2), tuy nhiên, nó dễ hiểu và đơn giản để triển khai.Đoạn code trên là một ví dụ đơn giản nhưng mạnh mẽ về thuật toán sắp xếp nổi bọt. Dưới đây là một số điểm quan trọng để hiểu về đoạn code này:


1. Hai vòng lặp lồng nhau: Đoạn code sử dụng hai vòng lặp lồng nhau để duyệt qua mảng và so sánh các phần tử. Vòng lặp bên ngoài (`for i`) duyệt qua mảng từ phần tử đầu tiên đến phần tử thứ hai từ cuối (vì sau mỗi lần lặp, phần tử cuối cùng sẽ là phần tử lớn nhất đã được đặt đúng vị trí). Vòng lặp bên trong (`for j`) so sánh các phần tử kề nhau và hoán đổi chúng nếu cần.


2. Điều kiện so sánh và hoán đổi: Trong vòng lặp bên trong, đoạn code kiểm tra xem phần tử hiện tại (`arr[j]`) có lớn hơn phần tử tiếp theo (`arr[j + 1]`) hay không. Nếu đúng, hai phần tử này sẽ được hoán đổi vị trí. Điều này đảm bảo rằng phần tử lớn hơn sẽ di chuyển dần về cuối mảng.


3. Độ phức tạp thời gian: Thuật toán sắp xếp nổi bọt có độ phức tạp thời gian là O(n^2), với n là số lượng phần tử trong mảng. Điều này có nghĩa rằng thời gian thực hiện sẽ tăng theo bình phương của số lượng phần tử. Điều này làm cho thuật toán không hiệu quả với các mảng lớn.


4. Đầu vào và kết quả: Đoạn code cung cấp một mảng chưa sắp xếp và sau khi sử dụng phương thức `bubbleSort`, mảng được sắp xếp theo thứ tự tăng dần. Kết quả được in ra màn hình để kiểm tra.


Trên đây là phân tích của đoạn code sắp xếp mảng bằng thuật toán nổi bọt trong Java. Đoạn code này cho chúng ta cái nhìn cơ bản về cách sắp xếp một mảng theo thứ tự tăng dần.



Nếu bạn muốn khám phá sâu hơn về thuật toán sắp xếp nổi bọt và các thuật toán sắp xếp khác, dưới đây là một số điều bạn có thể tìm hiểu:


1. Tối ưu hóa thuật toán: Đoạn code sắp xếp nổi bọt trong ví dụ trên có thể được tối ưu hóa để giảm số lần so sánh và hoán đổi phần tử. Bạn có thể tìm hiểu về các cách tối ưu hóa như cắt bớt số lần lặp, kiểm tra xem mảng đã được sắp xếp hay chưa để kết thúc sớm hơn.


2. Các thuật toán sắp xếp khác: Ngoài thuật toán sắp xếp nổi bọt, có nhiều thuật toán sắp xếp khác có hiệu suất tốt hơn, chẳng hạn như sắp xếp chèn (insertion sort), sắp xếp chọn (selection sort), sắp xếp nhanh (quick sort), và sắp xếp trộn (merge sort). Mỗi thuật toán có cách tiếp cận và độ phức tạp thời gian khác nhau, và nói chung, các thuật toán nhanh hơn sẽ được ưu tiên trong các tình huống lớn hơn.


3. Sử dụng Collection Framework trong Java: Java cung cấp sẵn một số cấu trúc dữ liệu và giao diện sắp xếp trong Collection Framework như `ArrayList`, `LinkedList`, `TreeSet` và `TreeMap`. Các cấu trúc này có khả năng tự động sắp xếp các phần tử và cho phép bạn thực hiện các thao tác sắp xếp một cách dễ dàng.


4. Độ phức tạp thời gian của các thuật toán sắp xếp: Hiểu về độ phức tạp thời gian của các thuật toán sắp xếp là quan trọng để chọn thuật toán phù hợp cho vấn đề của bạn. Ngoài độ phức tạp thời gian O(n^2) của sắp xếp nổi bọt, bạn cũng có thể tìm hiểu về thuật toán sắp xếp O(n log n) như quick sort và merge sort.


Hy vọng rằng bài viết này đã giúp bạn có cái nhìn tổng quan về thuật toán sắp xếp nổi bọt và khám phá thêm về các thuật toán sắp xếp khác trong Java. 

Thứ Sáu, 31 tháng 7, 2020

Hành trình kỷ niệm cùng Anime Nhật Bản

 


Thời đại học là thời kỳ của những kỷ niệm đáng nhớ và những người bạn đặc biệt. Cùng với mấy đứa bạn thân, tôi đã khám phá thế giới phong phú và thú vị của anime Nhật Bản. Những bộ phim hoạt hình này đã trở thành một phần không thể thiếu trong cuộc sống của chúng tôi. Hôm nay, hãy cùng nhau hồi tưởng về những kỷ niệm ngọt ngào và khám phá những tác phẩm anime nổi tiếng mà chúng tôi đã yêu thích.


1. "Spirit Away":

Đây là bộ phim hoạt hình Nhật Bản đầu tiên tôi từng xem. Câu chuyện về cuộc phiêu lưu của cô bé Chihiro trong thế giới linh hồn đã ghi dấu trong trái tim tôi. Đồ hoạ tuyệt đẹp và cốt truyện kỳ ảo đã khiến tôi cảm thấy thật sự hấp dẫn và đặc biệt.


2. "Your Name":

Bộ phim này kể về câu chuyện tình yêu giữa hai người trẻ tuổi, Taki và Mitsuha, mà tình yêu của họ được liên kết bởi một hiện tượng kỳ lạ. Với đồ hoạ tuyệt đẹp và câu chuyện xúc động, "Your Name" đã chinh phục trái tim của rất nhiều người và trở thành một trong những tác phẩm anime nổi tiếng nhất.


3. "Attack on Titan":

Bộ phim này mang đến một thế giới tưởng tượng đầy kịch tính, nơi con người chiến đấu chống lại những sinh vật khổng lồ có tên là Titans. Với cốt truyện gây căng thẳng và hình ảnh đậm chất hành động, "Attack on Titan" đã thu hút sự quan tâm của rất nhiều khán giả trên toàn thế giới.


"Studio Ghibli"

Không thể không nhắc đến hãng phim hoạt hình nổi tiếng Studio Ghibli, với những tác phẩm kinh điển như "My Neighbor Totoro", "Princess Mononoke", và "Spirited Away". Các bộ phim của Studio Ghibli mang đến không chỉ những câu chuyện tuyệt vời mà còn cảm xúc sâu lắng về tình người, tự nhiên và môi trường. Studio Ghibli đã tạo ra những tác phẩm đầy màu sắc và tình cảm, làm say đắm hàng triệu trái tim trên khắp thế giới.


Nhớ thật! Giờ đây, bọn tui đã trưởng thành và mỗi người đều đã có gia đình riêng, có lẽ không còn cơ hội ngồi chung xem phim hoạt hình như trước nữa. Nhưng những kỷ niệm ấy vẫn luôn ấm áp trong lòng chúng tui. Xin chúc mỗi đứa đạt được thành công và hạnh phúc trong cuộc sống dù ở bất kỳ nơi nào. Hãy luôn nhớ nhau và giữ kỷ niệm đáng yêu về những ngày thơ ấu đầy màu sắc và niềm vui. Anime Nhật Bản đã mang đến cho chúng tui nhiều niềm vui và kỷ niệm đáng nhớ, và nó sẽ mãi là một phần không thể thiếu trong cuộc sống của chúng ta.

Thứ Sáu, 27 tháng 9, 2019

Một Ngày Tràn Đầy Niềm Vui





 Hôm nay, là một ngày đặc biệt trong cuộc sống của tôi - một ngày trôi qua thật nhiều niềm vui.


Buổi sáng, khi tôi mở cửa sổ, ánh nắng mặt trời ấm áp chào đón tôi bằng những tia sáng lung linh. Tôi cảm nhận được sự tươi mới và hi vọng trong không khí. Đó là một bắt đầu hoàn hảo cho một ngày đầy niềm vui.


Đầu tiên, tôi đã có một buổi sáng thú vị tại công việc. Cùng đồng nghiệp, chúng tôi đã hoàn thành dự án lớn mà đã làm việc cùng nhau trong thời gian dài. Cảm giác hoàn thành nhiệm vụ và thành công đã tràn đầy niềm vui và động lực cho chúng tôi.


Trưa nay, tôi đã gặp lại nhóm bạn thân của mình. Chúng tôi đã cùng nhau đi ăn trưa và chia sẻ những câu chuyện, cười đùa và gặp gỡ sau một thời gian dài xa cách. Tình bạn và sự gắn kết này mang đến cho tôi niềm vui và sự cảm nhận rằng luôn có những người bạn đáng tin cậy bên cạnh.


Buổi chiều, tôi quyết định dành thời gian cho bản thân. Tôi đi dạo quanh công viên, ngắm nhìn những đóa hoa tươi rực rỡ và thả mình vào không gian yên bình. Cảm giác hòa mình vào thiên nhiên và thư giãn giúp tôi cảm nhận thêm niềm vui đơn giản trong cuộc sống.


Cuối cùng, buổi tối, tôi đã tổ chức một bữa tiệc nhỏ tại nhà với gia đình và người thân yêu. Chúng tôi đã thưởng thức những món ăn ngon, chia sẻ những câu chuyện và tạo ra những kỷ niệm đáng nhớ. Sự ấm áp và tình thân gia đình đã tạo nên không khí hạnh phúc và niềm vui thật sự.



Ngày hôm nay đã kết thúc, và tôi không thể không cảm nhận được sự biết ơn với một ngày tràn đầy niềm vui như vậy. Mỗi khoảnh khắc đều đáng quý và đáng nhớ. Không biết ngày mai sẽ ra sao, nhưng điều quan trọng là hãy cảm nhận và trân trọng những niềm vui nhỏ bé trong cuộc sống hàng ngày.


Đó là một ngày trôi qua thật nhiều niềm vui của tôi. Hy vọng bài viết này đã mang đến cho bạn một chút lạc quan và cảm nhận về những niềm vui trong cuộc sống. Hãy trân trọng những khoảnh khắc nhỏ bé và tìm thấy niềm vui ở những điều đơn giản xung quanh bạn!


NHÌN LẠI SỰ NGHIỆP - TẬP 2

  Mình làm việc tại Fsoft Đà Nẵng trong 2 năm với vai trò Developer của dự án ERP làm cho khách hàng Nhật.     Sau đó mình tham gia khoá học...