Langflow AI là gì? Review & So sánh từ góc nhìn lập trình viên đã build chatbot thực tế

❓Vì sao Langflow xuất hiện?

Trong làn sóng phát triển của LLM, chatbot, RAG và AI internal tool, lập trình viên đang đối mặt với một vấn đề quen thuộc:

“Ý tưởng thì đơn giản, nhưng để build một AI workflow hoàn chỉnh bằng code thuần lại tốn rất nhiều thời gian.”

LangChain ra đời để giải quyết phần logic, nhưng khi dự án lớn dần:

  • Flow phức tạp

  • Debug khó

  • Product team khó tham gia

  • Thay đổi nhỏ cũng phải sửa code

Langflow AI xuất hiện như một lời giải:
👉 Kết hợp sức mạnh của LangChain với giao diện visual flow trực quan.

Langflow AI là gì?

Langflow là một công cụ visual builder cho phép bạn:

  • Thiết kế AI workflow / LLM pipeline bằng cách kéo – thả

  • Kết nối prompt, LLM, memory, retriever, vector DB

  • Xuất flow thành API endpoint để tích hợp vào sản phẩm thật

Nói ngắn gọn:

Langflow = LangChain + Visual UI + API-ready

Trải nghiệm thực tế: Build chatbot với Langflow

Từ góc nhìn của mình — đã build chatbot và đang sử dụng Langflow trong sản phẩm thực tế, điểm mạnh nhất của Langflow là:

🚀 Xây dựng AI workflow cực nhanh

Thay vì viết hàng trăm dòng code LangChain, bạn có thể:

  • Kéo LLM node (OpenAI, Azure OpenAI, v.v.)

  • Gắn Prompt Template

  • Thêm Memory (ConversationBuffer, Summary Memory)

  • Kết nối Retriever cho RAG

👉 Một flow chatbot hoàn chỉnh có thể build trong vài giờ, thay vì vài ngày nếu code tay.

🧠 Rất phù hợp cho chatbot, RAG và internal AI tool

Langflow hoạt động cực tốt với:

  • Chatbot hỏi đáp nội bộ

  • RAG (PDF, docs, knowledge base)

  • AI assistant cho team kỹ thuật / vận hành

  • Prototype AI cho startup

Đặc biệt, với internal tool, Langflow giúp:

  • Tech build nhanh

  • Product dễ hiểu flow

  • Iteration cực nhanh


🔌 Dễ tích hợp API cho developer

Đây là điểm developer sẽ rất thích.

Langflow cho phép:

  • Export flow thành REST API

  • Gọi từ backend (Node.js, .NET, Python)

  • Dùng như một AI service độc lập

Ví dụ use case:

  • Backend chỉ cần gọi API → nhận response từ LLM pipeline

  • Không cần embed LangChain logic vào core system

  • Dễ scale, dễ maintain

👉 Với team backend, Langflow đóng vai trò như AI microservice.

So sánh Langflow vs LangChain thuần (code tay)

Tiêu chí Langflow LangChain thuần
Tốc độ build ⭐⭐⭐⭐⭐ ⭐⭐
Debug & visualize ⭐⭐⭐⭐⭐ ⭐⭐
Độ linh hoạt ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
Product tham gia Không
Maintain lâu dài Dễ Khó khi flow phức tạp

Kết luận ngắn:

  • LangChain thuần → mạnh, linh hoạt, nhưng tốn công

  • Langflow → nhanh, trực quan, rất phù hợp build & iterate

👉 Với 80% use case chatbot / RAG, Langflow là lựa chọn hợp lý hơn.

So sánh Langflow vs Custom AI Service

Custom AI service (viết tay toàn bộ):

  • Toàn quyền kiểm soát

  • Nhưng chi phí dev + maintain cao

  • Thay đổi flow chậm

Langflow:

  • Chuẩn LangChain

  • Visual hóa rõ ràng

  • Thay đổi logic không cần refactor lớn

👉 Với startup & team nhỏ, Langflow giúp:

  • Ra sản phẩm nhanh

  • Validate idea sớm

  • Giảm chi phí kỹ thuật ban đầu


Langflow phù hợp với ai?

Theo kinh nghiệm sử dụng thực tế, Langflow rất hợp với:

  • Backend / Fullstack developer

  • Team làm chatbot, RAG

  • Startup build MVP AI

  • Người làm automation / low-code nhưng vẫn cần AI logic chuẩn

  • Team product cần hiểu AI flow

Không quá phù hợp nếu:

  • Bạn cần AI logic cực kỳ custom, low-level

  • Dự án yêu cầu tối ưu performance ở mức rất sâu


Góc nhìn cá nhân của mình

Langflow không thay thế LangChain, mà làm LangChain dễ dùng hơn rất nhiều.

Với mình:

  • Langflow dùng để build nhanh & iterate

  • LangChain thuần dùng khi cần custom sâu

Nếu bạn đang build chatbot, RAG hoặc AI internal tool mà vẫn code tay toàn bộ LangChain — rất có thể bạn đang tốn thời gian không cần thiết.


Kết luận

Langflow AI là một lựa chọn rất đáng giá cho:

  • Developer muốn build AI nhanh

  • Startup cần MVP chatbot / AI tool

  • Team nhỏ muốn giảm chi phí kỹ thuật

Không phải công cụ “thần thánh”, nhưng đúng bài toán – đúng thời điểm – đúng đối tượng.

Langflow giúp bạn tập trung vào sản phẩm, thay vì sa lầy vào boilerplate AI code.

AI Đang Thay Đổi Cách Lập Trình Viên Viết Code Như Thế Nào?

Bạn có bao giờ nghĩ đến việc viết code cùng một “trợ lý ảo” thông minh — người có thể hiểu ngữ cảnh, gợi ý code, và thậm chí giúp bạn sửa lỗi nhanh hơn?
Nhờ sự phát triển vượt bậc của trí tuệ nhân tạo (AI), điều đó giờ đây đã trở thành hiện thực.

AI không còn là “tương lai”, mà là công cụ thiết yếu trong hành trình lập trình hiện đại.
Từ việc gợi ý từng dòng code đến phân tích hiệu suất, AI đang thay đổi cách lập trình viên làm việc — nhanh hơn, hiệu quả hơn, và ít căng thẳng hơn.

⚙️ 1. AI Đang Thay Đổi Cách Lập Trình Như Thế Nào?

🚀 Viết code nhanh hơn

AI trở thành người bạn đồng hành của lập trình viên hiện đại.

Trước đây, để viết ra một hàm xử lý logic hoặc API endpoint, bạn phải:
1️⃣ Viết cấu trúc function
2️⃣ Gọi thư viện phù hợp
3️⃣ Thêm logic xử lý và validation
4️⃣ Debug lại cho đúng

Giờ đây, AI có thể gợi ý hoàn chỉnh toàn bộ hàm chỉ dựa trên tên function, comment, hoặc mô tả ngắn gọn.

Ví dụ:

  • Khi bạn gõ getUserByEmail, AI có thể tự động viết ra đoạn code kết nối DB, query user, và trả về kết quả JSON.

  • Với framework như NestJS, AI còn nhận biết được decorator (@Injectable(), @Controller) để hoàn thiện code theo chuẩn framework.

Nhờ vậy, bạn có thể rút ngắn 50–70% thời gian viết code lặp lại, đặc biệt trong các dự án backend lớn.
AI giống như một cộng tác viên thầm lặng, hiểu rõ phong cách code của bạn và hỗ trợ trong từng cú gõ phím.


🧩 Giảm thời gian debug

Các công cụ AI hiện nay có thể phân tích lỗi, chỉ ra nguyên nhân, và đề xuất cách sửa hợp lý.
Thay vì “ngồi mò bug” nửa ngày, bạn có thể xử lý trong vài phút.

Một số AI như ChatGPT hoặc Copilot Chat còn có khả năng đọc log hoặc stack trace, rồi giải thích lỗi bằng ngôn ngữ tự nhiên:

“Lỗi này xảy ra vì biến user có thể null — hãy thêm kiểm tra null trước khi truy cập thuộc tính user.id.”

Điều này giúp lập trình viên mới dễ hiểu hơn, không cần mất hàng giờ tra Stack Overflow.


📚 Học ngôn ngữ lập trình mới dễ dàng hơn

AI có thể giải thích cú pháp, gợi ý thư viện phổ biến, hoặc thậm chí chuyển đổi code giữa các ngôn ngữ (ví dụ từ C# sang Python).
Nó như một người hướng dẫn luôn sẵn sàng 24/7.


🧠 Cải thiện chất lượng code

AI không chỉ giúp viết nhanh, mà còn giúp bạn viết “đẹp” và “chuẩn” hơn.

Cụ thể:

  • Phân tích và tối ưu logic: AI phát hiện đoạn code lặp, không hiệu quả, và gợi ý cách viết ngắn gọn hơn.

  • Tự động review code: Kiểm tra naming convention, coding style, và hiệu năng.

  • Phát hiện lỗi tiềm ẩn: Như memory leak, exception chưa được xử lý, hoặc biến chưa khởi tạo.

  • Tối ưu hiệu năng: Gợi ý thuật toán hoặc cấu trúc dữ liệu tốt hơn — ví dụ chuyển từ O(n^2) sang O(n).

Nhờ vậy, lập trình viên không chỉ tiết kiệm thời gian mà còn nâng cao chất lượng phần mềm ngay từ giai đoạn phát triển.

🧰 2. Top 5 Công Cụ AI Giúp Lập Trình Viên Code Tốt Hơn

1️⃣ GitHub Copilot

  • Được phát triển bởi GitHub & OpenAI.

  • Gợi ý code theo ngữ cảnh trong hầu hết các ngôn ngữ.

  • Tích hợp tốt với VSCode, JetBrains, và nhiều IDE khác.
    💬 Copilot là “trợ lý viết code” phổ biến nhất hiện nay.


2️⃣ ChatGPT / GPT-5 của OpenAI

  • Không chỉ viết code, ChatGPT có thể giải thích, tối ưu, và gợi ý thuật toán.

  • Rất mạnh trong việc viết tài liệu, comment code, hoặc xây dựng API nhanh.
    💡 Dùng như một mentor kỹ thuật luôn sẵn sàng trò chuyện.


3️⃣ Tabnine

  • Gợi ý code bằng mô hình AI học từ codebase riêng của bạn.

  • Hỗ trợ chạy cục bộ để đảm bảo an toàn bảo mật.
    🔒 Phù hợp cho doanh nghiệp hoặc dự án nội bộ có yêu cầu bảo mật cao.


4️⃣ Amazon CodeWhisperer

  • Công cụ AI của Amazon, mạnh về hệ sinh thái AWS.

  • Gợi ý code liên quan đến cloud service, IAM, Lambda, và nhiều dịch vụ AWS khác.
    ☁️ Lý tưởng cho developer làm việc với cloud hoặc serverless.


5️⃣ Replit Ghostwriter

  • Tích hợp trực tiếp trong nền tảng Replit.

  • Hỗ trợ người mới học code, viết và chạy trực tuyến dễ dàng.
    🧑‍💻 Tốt cho người học hoặc những ai muốn “code ở mọi nơi”.

⚠️ 3. Lưu Ý Khi Sử Dụng AI Trong Lập Trình

AI rất mạnh, nhưng không hoàn hảo. Hãy nhớ những điều sau:

  • 🔍 Luôn kiểm tra lại code mà AI sinh ra. Đừng tin 100% vì có thể sai cú pháp hoặc chưa tối ưu.

  • 🔒 Không gửi dữ liệu nhạy cảm (như API key, token, source độc quyền) vào các công cụ AI công cộng.

  • 🧠 Dùng AI để học, không để phụ thuộc.
    Hãy coi AI như người bạn đồng hành, chứ không phải người thay thế.


💬 4. Kết Luận

AI đang thay đổi căn bản cách lập trình viên làm việc — từ viết code, kiểm thử đến triển khai.
Thay vì lo sợ “AI sẽ cướp việc”, hãy học cách làm việc cùng AI để phát huy tối đa năng suất và sáng tạo.

“AI không viết code thay bạn — AI giúp bạn viết code tốt hơn.” 💡

Chat GPT: Năm 2023, tôi có nên học ngành IT, lập trình viên không?

Nhân dịp ChatGPT đang hot rần rần trên các trang mạng xã hội, nên mình làm một bài phỏng vấn ngẫu hứng với nó về việc có nên học lập trình hay không? Khá là thú vị.

Năm 2023, tôi có nên học ngành IT, lập trình viên không?

Có thể, nếu bạn có nhu cầu và sở thích về công nghệ thông tin và lập trình, học ngành IT và trở thành lập trình viên có thể là một lựa chọn tốt. Thị trường công nghệ thông tin rất đầy hứng thú và có nhiều cơ hội việc làm tốt. Tuy nhiên, hãy chắc chắn rằng bạn đã tìm hiểu kỹ về lĩnh vực này và có năng lực phù hợp trước khi quyết định học ngành này.

Tôi nên chọn mảng nào, lập trình web, lập trình di dộng, hay big data, AI?

Tùy thuộc vào sở thích cá nhân, năng lực và mục tiêu cá nhân của bạn, mỗi mảng có thể có những ưu điểm riêng biệt.

  • Lập trình web: Nếu bạn thích xây dựng các trang web và ứng dụng trực tuyến, lập trình web có thể là một lựa chọn tốt cho bạn.
  • Lập trình di động: Nếu bạn quan tâm đến công nghệ di động và muốn xây dựng các ứng dụng cho các thiết bị di động, lập trình di động có thể là một lựa chọn phù hợp.
  • Big data và AI: Nếu bạn quan tâm đến các công nghệ liên quan đến lưu trữ và phân tích dữ liệu lớn, hoặc muốn xây dựng các hệ thống nhận dạng và trợ lý AI, thì mảng Big data và AI có thể là một lựa chọn tốt.

Khuyến cáo: Hãy tìm hiểu thêm về mỗi mảng và chắc chắn rằng bạn đã tìm hiểu đầy đủ về nó trước khi quyết định học.

Còn DevOps thì sao?

DevOps là một mảng liên quan đến quản lý và triển khai các dự án phần mềm. Nếu bạn thích làm việc trong môi trường đa nền tảng và muốn tìm hiểu về quá trình xây dựng và triển khai phần mềm, học DevOps có thể là một lựa chọn tốt.

DevOps yêu cầu một sự hiểu biết tốt về cả lập trình và quản trị hệ thống, vì vậy nếu bạn đã có kinh nghiệm trong một trong hai lĩnh vực này, học DevOps có thể là một bước tiếp theo hữu ích cho sự phát triển nghề nghiệp của bạn.

Tester có phải là một lựa chọn tốt để bắt đầu với ngành IT?

Tester là một vai trò quan trọng trong lĩnh vực phần mềm và có thể là một lựa chọn tốt để bắt đầu sự nghiệp trong IT, đặc biệt nếu bạn có khả năng tìm kiếm lỗi và thích làm việc với các hệ thống phần mềm.

Việc làm tester giúp bạn có cơ hội để tìm hiểu về quá trình phát triển phần mềm và các công nghệ mới, giúp bạn cải thiện khả năng phát hiện lỗi và tăng cường kinh nghiệm làm việc với các hệ thống phần mềm.

Tuy nhiên, nếu bạn muốn phát triển nghề nghiệp trong IT, học lập trình hoặc các vai trò khác trong quá trình phát triển phần mềm cũng có thể là một lựa chọn tốt cho bạn.

Tôi nên bắt đầu với ngôn ngữ lập trình nào hot nhất hiện nay?

Không có ngôn ngữ lập trình “hot nhất” mà là phù hợp với nhu cầu của bạn. Tùy thuộc vào mục đích và niềm đam mê cho lập trình, một số ngôn ngữ lập trình phổ biến và được ưa chuộng hiện nay bao gồm:

  • Python: dễ học, đa dạng và phổ biến trong các lĩnh vực AI và machine learning.
  • Java: phổ biến trong lĩnh vực enterprise và các ứng dụng di động.
  • JavaScript: phổ biến trong lĩnh vực web development.
  • C++: lựa chọn tốt cho lập trình nền tảng và game development.
  • Swift: chuyên dùng cho lập trình iOS.

Lựa chọn ngôn ngữ lập trình phù hợp của bạn phụ thuộc vào mục đích và niềm đam mê của bạn, vì vậy hãy tìm hiểu kỹ hơn về các ngôn ngữ để tìm ra ngôn ngữ phù hợp nhất cho bạn.

C#, Go lang, React Native thì sao?

  • C#: là một ngôn ngữ lập trình phổ biến và mạnh mẽ, được sử dụng trong lập trình Windows và các dự án .NET.
  • Go: là một ngôn ngữ lập trình mới và nhanh, được sử dụng trong các dự án back-end và máy chủ.
  • React Native: là một framework cho phép bạn xây dựng ứng dụng di động cho cả iOS và Android sử dụng JavaScript và React.

Tất cả các ngôn ngữ và công nghệ này đều có thể là lựa chọn tốt cho việc bắt đầu trong lĩnh vực IT, tùy thuộc vào mục đích và niềm đam mê của bạn. Hãy tìm hiểu kỹ hơn về các ngôn ngữ và công nghệ này để tìm ra lựa chọn phù hợp nhất cho bạn.

Tôi nên bắt đầu với Font-end hay Back-end?

Lựa chọn giữa việc bắt đầu với Front-end hay Back-end phụ thuộc vào sở thích và mục đích của bạn.

  • Front-end: nếu bạn thích giao diện người dùng và trải nghiệm người dùng, bạn có thể muốn bắt đầu với Front-end. Bạn sẽ làm việc với HTML, CSS, JavaScript để xây dựng giao diện trang web hoặc ứng dụng.
  • Back-end: nếu bạn thích lập trình logic và xử lý dữ liệu, bạn có thể muốn bắt đầu với Back-end. Bạn sẽ làm việc với ngôn ngữ lập trình như Python, Java, Ruby hoặc Node.js để xây dựng hạ tầng dữ liệu và xử lý dữ liệu cho trang web hoặc ứng dụng.

Cả hai Front-end và Back-end đều quan trọng và cần nhau để xây dựng một trang web hoặc ứng dụng hoàn chỉnh. Bạn có thể tìm hiểu cả hai và chọn một trong hai để bắt đầu hoặc có thể học cả hai để nâng cao kiến thức của mình.

Tôi có cần chứng chỉ của AWS hay Microsoft Azure?

Chứng chỉ AWS hay Microsoft Azure có thể giúp bạn chứng minh kiến thức và kinh nghiệm của mình với các dịch vụ điện toán đám mây của AWS hoặc Microsoft Azure. Chứng chỉ cũng có thể giúp tăng cơ hội việc làm và tăng giá trị của bạn trong thị trường lao động.

Tuy nhiên, chứng chỉ không phải là một yêu cầu bắt buộc cho mọi vị trí trong ngành IT. Tùy thuộc vào mục đích của bạn, bạn có thể muốn xem xét các chứng chỉ liên quan đến lĩnh vực mà bạn quan tâm hoặc muốn theo đuổi. Nếu bạn muốn trở thành một chuyên gia điện toán đám mây, chứng chỉ của AWS hoặc Microsoft Azure có thể là một lựa chọn tốt để bắt đầu.

Tôi cần bao nhiêu thời gian để có thể học xong một ngôn ngữ lập trình?

Thời gian cần thiết để học xong một ngôn ngữ lập trình phụ thuộc vào nhiều yếu tố như mức độ tập trung, số lần tập trung mỗi tuần, số lượng thời gian mà bạn có thể dành cho học mỗi ngày và trình độ của bạn trong lập trình.

Tổng quát, nếu bạn tập trung học mỗi ngày và có thể dành ít nhất 4-6 giờ mỗi ngày cho việc học, bạn có thể học xong cơ bản của một ngôn ngữ lập trình trong vòng 3-6 tháng. Tuy nhiên, để trở thành một lập trình viên chuyên nghiệp, bạn cần phải tiếp tục học và áp dụng kiến thức của mình trong môi trường thực tế.

Mức lương cho người mới bắt đầu khoảng bao nhiêu?

Mức lương cho một người mới bắt đầu trong ngành IT phụ thuộc vào nhiều yếu tố như loại công việc, vị trí, kinh nghiệm, kỹ năng và địa điểm. Tuy nhiên, trung bình mức lương ban đầu cho một lập trình viên mới tại Việt Nam khoảng từ 8-15 triệu đồng một tháng, tùy thuộc vào các yếu tố trên.

Sách hay khoá học phù hợp?

Nếu bạn muốn học một ngôn ngữ lập trình hoặc kỹ năng IT mới, có thể tham khảo các tài liệu sau:

  1. Sách: Bạn có thể tìm kiếm các sách chuyên sâu về ngôn ngữ lập trình hoặc kỹ năng IT mà bạn muốn học. Các sách học lập trình có thể giúp bạn cấu trúc lý thuyết và bài tập thực hành.
  2. Khoá học trực tuyến: Bạn có thể tham khảo các khoá học trực tuyến trên các trang web như Coursera, Udemy, LinkedIn Learning hoặc Edx. Đây là những nguồn tài liệu tốt để học về lập trình và các kỹ năng IT mới.

Lưu ý rằng, tùy vào mục đích học và mức độ kinh nghiệm của bạn, việc chọn sách hoặc khoá học phù hợp sẽ khác nhau.

Còn website nào khác không?

Có rất nhiều trang web khác có thể giúp bạn học về lập trình và các kỹ năng IT. Một số trang web phổ biến bao gồm:

  1. Codecademy: Trang web này cung cấp các bài học trực tuyến miễn phí cho các ngôn ngữ lập trình và các kỹ năng IT khác.
  2. W3Schools: Trang web này cung cấp các bài học miễn phí về HTML, CSS, JavaScript, và các ngôn ngữ lập trình web khác.
  3. FreeCodeCamp: Trang web này cung cấp các khóa học miễn phí cho các ngôn ngữ lập trình và các kỹ năng IT, bao gồm lập trình web, lập trình di động và big data.
  4. Khan Academy: Trang web này cung cấp các khóa học miễn phí về lập trình, toán học và các môn học khác.
  5. GitHub: Trang web này cung cấp các dự án mã nguồn mở, hỗ trợ cho việc học và chia sẻ kiến thức về lập trình.

Cảm ơn ChatGPT.

Không có gì, rất vui được giúp đỡ. Hãy hỏi tôi nếu còn câu hỏi gì nữa!

Using Serilog + Seq with Minimal API in NET 7

Nhân dịp Microsoft tung ra con hàng .NET 7, nên mình update lại cái project cũ lên .NET 7, sẵn configure lại Serilog cho nó đẩy data ra seq cho dễ đọc.

Sample sử dụng NET 7 với minial api, cũng khá là hay ho.

Đầu tiên dựng sẵn cái server seq log bằng Docker

docker run --name seqlogger -d -p 5341:5341 -p 5342:80 -e ACCEPT_EULA=Y datalust/seq

Tiếp theo tạo một ứng dụng net core đơn giản

donet new web -o AntCommerce.Module.Order

OK đã xong, cái app đơn giản.

Add thêm đồ chơi liên quan Serilog vào app

dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Enrichers.Environment
dotnet add package Serilog.Exceptions
dotnet add package Serilog.Extensions.Logging
dotnet add package Serilog.Sinks.Seq

Chúng ta có 2 cách để bắt sử dụng Serilog. Cấu hình bằng code và appSettings.json

Sử dụng code. Edit trong file Program.cs

builder.Host.UseSerilog();
Log.Logger = new LoggerConfiguration()
                .MinimumLevel.Information()
                .Enrich.FromLogContext()
                .Enrich.WithExceptionDetails()
                .Enrich.WithMachineName()
                .WriteTo.Console()
                .WriteTo.Seq("http://localhost:5341", Serilog.Events.LogEventLevel.Information)
                .CreateLogger();

Sử dụng appSettings.json. Edit trong file Program.cs

builder.Host.UseSerilog((context, loggerConfig) 
    => loggerConfig.ReadFrom.Configuration(context.Configuration));

Thêm vào file appsettings.json

  "Serilog": {
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Information",
        "System": "Information",
        "Microsoft.EntityFrameworkCore.Database.Command": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Console"
      },
      {
        "Name": "Seq",
        "Application": "Order API",
        "Args": { "serverUrl": "http://localhost:5341" }
        }
    ],
    "Enrich": [  
      "FromLogContext",
      "WithMachineName",
      "WithProcessId",
      "WithThreadId",
      "WithMachineEnvironmentName",
      "WithExceptionDetails"
    ],
    "Properties": {
      "Application": "Order API"
    }
  }

Bắt đầu sử dụng

Tận hưởng thành quả

Chúc các bạn vui vẻ, happy coding.

Source code: https://github.com/tuanitpro/AntCommerce

[.NET] Sử dụng Papercut-SMTP để test email trong khi develop

Trong quá trình phát triển phần mềm sẽ có rất nhiều tasks liên quan đến việc bạn phải gửi một email ra ngoài. Ví dụ: đang ký tài khoản cần gửi email để kích hoạt, hay khách hàng đặt hàng trên website của bạn.

Bạn có thể test thử quá trình này bằng cách gửi vào email của bạn, hoặc email được thiết lập trước… Tuy nhiên trong quá trình develop, rất có thể gửi nhầm vào email khách hàng, hoặc tốn thời gian setup mail server để test.

https://github.com/ChangemakerStudios/Papercut-SMTP

Papercut-SMTP tool cho phép bạn giả lập email server ngay tại máy của mình, để test xem có nhận được email hay chưa, email có đúng nội dung hay không.

Cách sử dụng khá đơn giản. Chỉ cần cấu hình trong app.config hoặc web.config

Khi bạn sử dụng SMTP trong .NET để gửi email, Papercut-SMTP sẽ đọc được nội dung đó để kiểm tra.

Chúc các bạn thành công.

C# Làm sao thoát khỏi if / switch case quá nhiều?

Câu lệnh điều kiện if hay switch case là thường gặp trong lập trinh. Tuy nhiên khi mà if quá nhiều trong một block code, hay switch case quá nhiều thì nó sẽ gây phức tạp và dễ xảy ra bug. Cũng như khó khăn khi viết Unit Tests. Clean code khuyên rằng không nên dùng quá 4 câu lệnh if trong 1 block code.
Vậy đâu là giải pháp để tránh vấn đề này. Trong .NET có hỗ trợ một kiểu dữ liệu đó là Dictionary. Bạn sẽ gặp đâu đó nói rằng Dictionary còn phức tạp hơn, khó tiếp cận hơn if condition nữa. Điều đó là đúng, tuy nhiên qua các ví dụ dưới đây sẽ giúp bạn thấy dễ dàng làm chủ Dictionary hơn, và tránh phải if else, hay switch case quá nhiều.

Vậy Dictionary là gì?

Dictionary is a data structure for storing a group of objects. Objects are stored as key/value pairs collection which is useful and generic in different object oriented programming languages.

Dictionary can be used for mappings, in-memory cache, tables etc.

Dictionary’s key and value are generic types. In this way delegates can be set as key or value.

Hiểu đơn giản, Dictionary trong C# là một Collections lưu trữ dữ liệu dưới dạng cặp Key – Value. Key đại diện cho 1 khoá giống như chỉ số phần tử của mảng và Value chính là giá trị tương ứng của khoá đó. Ta sẽ dử dụng Key để truy cập đến Value tương ứng.

Chúng ta có bài toán cho phép ứng dụng có thể kết nối đến nhiều loại data source khác nhau. MySql, SqlServer, MongoDb, Redis, Xml…

ConnectionDataHelper.cs

public class ConnectionDataHelper
    {
        public static void ConnectToMySql()
        {
            Console.WriteLine("Connect to MySql");
        }

        public static void ConnectToSqlServer()
        {
            Console.WriteLine("Connect to Sql Server");
        }

        public static void ConnectToMongoDb()
        {
            Console.WriteLine("Connect to MongdoDb");
        }

        public static void ConnectToRedis()
        {
            Console.WriteLine("Connect to Redis");
        }

        public static void ConnectToXml()
        {
            Console.WriteLine("Connect to Xml");
        }
    }

Ví dụ dùng if else.

    
internal class Program
    {
        private static void Main(string[] args)
        {
            DataSource dataSource = DataSource.MySql;
            Console.WriteLine("Connection to DB Source: " + dataSource.ToString());
            if (dataSource == DataSource.MySql)
            {
                ConnectionDataHelper.ConnectToMySql();
            }
            else if (dataSource == DataSource.SqlServer)
            {
                ConnectionDataHelper.ConnectToSqlServer();
            }
            else if (dataSource == DataSource.MongoDb)
            {
                ConnectionDataHelper.ConnectToMongoDb();
            }
            else if (dataSource == DataSource.Redis)
            {
                ConnectionDataHelper.ConnectToRedis();
            }
            else if (dataSource == DataSource.Xml)
            {
                ConnectionDataHelper.ConnectToXml();
            }

            Console.ReadKey();
        }

        private enum DataSource
        {
            MySql,
            SqlServer,
            MongoDb,
            Redis,
            Xml
        }
    }

Cách viết switch case dễ đọc hơn một chút, nhưng vẫn còn dài

internal class Program
    {
        private static void Main(string[] args)
        {
            DataSource dataSource = DataSource.MySql;
            Console.WriteLine("Connection to DB Source: " + dataSource.ToString());
            switch (dataSource)
            {
                case DataSource.MySql:
                    ConnectionDataHelper.ConnectToMySql();
                    break;

                case DataSource.SqlServer:
                    ConnectionDataHelper.ConnectToSqlServer();
                    break;

                case DataSource.MongoDb:
                    ConnectionDataHelper.ConnectToMongoDb();
                    break;

                case DataSource.Redis:
                    ConnectionDataHelper.ConnectToRedis();
                    break;

                case DataSource.Xml:
                    ConnectionDataHelper.ConnectToXml();
                    break;
            }

            Console.ReadKey();
        }

        private enum DataSource
        {
            MySql,
            SqlServer,
            MongoDb,
            Redis,
            Xml
        }
    }

Bây giờ chúng ta thử chuyển sang sử dụng Dictionary.

internal class Program
    {
        private static void Main(string[] args)
        {
            var actionMap = new Dictionary()
            {
                {DataSource.MySql, ConnectionDataHelper.ConnectToMySql},
                {DataSource.SqlServer, ConnectionDataHelper.ConnectToSqlServer},
                {DataSource.MongoDb, ConnectionDataHelper.ConnectToMongoDb},
                {DataSource.Redis, ConnectionDataHelper.ConnectToRedis},
                {DataSource.Xml, ConnectionDataHelper.ConnectToXml},
            };
            DataSource dataSource = DataSource.SqlServer;
            Console.WriteLine("Connection to DB Source: " + dataSource.ToString());
            if (actionMap.ContainsKey(dataSource))
            {
                actionMap[dataSource]();
            }

            Console.ReadKey();
        }

        private enum DataSource
        {
            MySql,
            SqlServer,
            MongoDb,
            Redis,
            Xml
        }
    }

Rõ ràng code đã ngắn gọn hơn rất nhiều. Tất nhiên thực tế các function của chúng ta sẽ phức tạp hơn một chút, có input, output. Bây giờ sửa lại ConnectionDataHelper để nhận vào một connectionString, và return về một trạng thái true/false. IsConnected.

ConnectionDataHelper.cs

    public class ConnectionDataHelper
    {
        public static bool ConnectToMySql(string connectionString)
        {
            Console.WriteLine("Connect to MySql: " + connectionString);
            return true;
        }

        public static bool ConnectToSqlServer(string connectionString)
        {
            Console.WriteLine("Connect to Sql Server: " + connectionString);
            return true;
        }

        public static bool ConnectToMongoDb(string connectionString)
        {
            Console.WriteLine("Connect to MongdoDb: " + connectionString);
            return true;
        }

        public static bool ConnectToRedis(string connectionString)
        {
            Console.WriteLine("Connect to Redis: " + connectionString);
            return true;
        }

        public static bool ConnectToXml(string connectionString)
        {
            Console.WriteLine("Connect to Xml: " + connectionString);
            return true;
        }
    }
internal class Program
    {
        private static void Main(string[] args)
        {
            var actionMap = new Dictionary>()
            {
                {DataSource.MySql, ConnectionDataHelper.ConnectToMySql},
                {DataSource.SqlServer, ConnectionDataHelper.ConnectToSqlServer},
                {DataSource.MongoDb, ConnectionDataHelper.ConnectToMongoDb},
                {DataSource.Redis, ConnectionDataHelper.ConnectToRedis},
                {DataSource.Xml, ConnectionDataHelper.ConnectToXml},
            };
            DataSource dataSource = DataSource.SqlServer;
            Console.WriteLine("Connection to DB Source: " + dataSource.ToString());
            var connectionString = "DataSource=; UserId=; Password=";
            bool isConnected = false;
            if (actionMap.ContainsKey(dataSource))
            {
                isConnected = actionMap[dataSource](connectionString);
            }
            Console.WriteLine("Is Connected" + isConnected);
            Console.ReadKey();
        }

        private enum DataSource
        {
            MySql,
            SqlServer,
            MongoDb,
            Redis,
            Xml
        }
    }

Kết quả:

Chúc các bạn thành công.

Powershell scripts for MSSQL or MongoDB backup

Trong thế giới nguy hiểm hiện nay của tin tặc và hacker rình rập ngày đêm, thì việc bảo vệ thành quả, sản phẩm của bạn hết sức quan trọng.

Một số cách thức phá hoại tiêu biểu

  • Xóa sạch database của bạn, để lại thông tin email/bitcoin address đòi chuộc
  • Encrypt toàn bộ data trên server của bạn và để lại thông tin email/bitcoin address đòi chuộc

Chính việc này dẫn đến nhu cầu backup nhanh chóng và kịp thời, đồng thời phải tự động hóa quá trình này.

Script Powershell dưới đây chia sẻ cách Backup database trên Server của bạn, đồng thời đẩy lên gitlab.com để lưu trữ, sau đó thông báo cho bạn kết quả thực hiện.

Bước 1: Tạo script Backup MongoDB/MSSQL

# Xóa backup cũ
Remove-Item -LiteralPath Folder_Path_Backup_MongoDB -recurse -force
# Thực hiện backup & nén file
mongodump -d MongoDB_Name -o Folder_Path_Backup_MongoDB 
$date = Get-Date -Format "yyyyMMddHHmm"
Compress-Archive -Path Folder_Path_Backup_MongoDB\MongoDB_Name\* -DestinationPath Folder_Path_Backup_MongoDB\MongoDB_Name_$date.zip  -force  
# Commit lên gitlab. Folder chứa backup phải setup git trước
CD Folder_Path_Backup_MongoDB 
git add *; 
git commit -m 'Backup Database MongoDB'; 
git push -q origin master
# Gửi noti lên bot
wget https://bot.tuanitpro.com/api/v1/send?text=Backup_MongoDB%20successfully -UseBasicParsing

Script backup SQL Server

Remove-Item -LiteralPath Folder_Path_Backup_MSSQL -recurse -force
New-Item -ItemType "directory" -Path "Folder_Path_Backup_MSSQL"
$date = Get-Date -Format "yyyyMMddHHmm"
Backup-SqlDatabase -ServerInstance ".\SQLEXPRESS" -Database "DB_Name" -BackupFile "Folder_Path_Backup_MSSQL\DB_Name_$date.bak"

CD "Folder_Path_Backup_MSSQL"
git add *; 
git commit -m 'Backup Database MSSQL'; 
git push -q origin master

wget https://bot.tuanitpro.com/api/v1/send?text=Backup_MSSQL%20successfully -UseBasicParsing

Lưu script lại để dùng cho mục đích chạy auto.
Bước 2: Thêm vào Task Scheduler của Windows để thực hiện chạy mỗi ngày.

-ExecutionPolicy Bypass C:\data\backup-mongodb.ps1

Chúc các bạn thành công.

Cấu hình Jenkins Reverse Proxy cho IIS

Bước 1: Cài đặt IIS, thêm sites mới cho Jenkins.

Bước 2: Cài đặt URL Rewrite và IIS ARR

Bước 3: Chọn Application Request Routing Cache -> Server Proxy Settings

Bước 4: Cấu hình IIS site jenkins theo domain

Bước 5: Thêm file web.config vào folder chứa jenkins

Bước 6: Copy nội dung web.config dưới đây vào file của bạn, thay nội dung domain thành của bạn

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<outboundRules>
<rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1" enabled="true">
<match filterByTags="A, Form, Img" pattern="^http(s)?://localhost:80/(.*)" />
<action type="Rewrite" value="http{R:1}://jenkins.tuanitpro.com/{R:2}" />
</rule>
<rule name="RestorageAccessEncoding" preCondition="RestorageAccessEncoding" enabled="true">
<match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
<action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
</rule>
<preConditions>
<preCondition name="ResponseIsHtml1">
<add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
</preCondition>
<preCondition name="RestorageAccessEncoding">
<add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" />
</preCondition>
</preConditions>
</outboundRules>
<rules>
<rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://localhost:80/{R:1}" />
<serverVariables>
<set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCONDING}" />
<set name="HTTP_ACCEPT_ENCODING" value="" />

<set name="HTTP_FORWARDED" value="for={REMOTE_ADDR};by={LOCAL_ADDR};host=&quot;{HTTP_HOST}&quot;;proto=&quot;https&quot;" />
</serverVariables>

</rule>
</rules>
</rewrite>
<urlCompression doStaticCompression="false" />
</system.webServer>
</configuration>

Nguồn tham khảo:

– https://wiki.jenkins.io/display/JENKINS/Running+Jenkins+behind+IIS

– https://rlevchenko.com/2018/12/27/using-iis-as-a-reverse-proxy-for-jenkins/

Jenkins là gì? Cách cài đặt Jenkins trên Windows

Jenkins là gì?

Jenkins là một opensource dùng để thực hiện chức năng tích hợp liên tục (gọi là CI – Continuous Integration) và xây dựng các tác vụ tự động hóa. Nó tích hợp các source code của các members trong team lại nhanh chóng một cách liên tục, theo dõi sự thực thi và trạng thái thông qua các bước kiểm thử (Integration testunits test). Tất nhiên là nhằm giúp sản phẩm chạy ổn định.

CI/CD với jenkins
Các hệ thống tích hợp liên tục (CI) là một phần quan trọng của bất kỳ nhóm Agile nào vì chúng giúp thực thi các lý tưởng phát triển Agile.
Đây là một công cụ xây dựng liên tục, cho phép các nhóm tập trung vào công việc của họ bằng cách tự động hóa quá trình xây dựng, quản lý nhân tạo và quy trình triển khai.
Chức năng và tính linh hoạt cốt lõi của Jenkins cho phép nó phù hợp với nhiều môi trường khác nhau và có thể giúp hợp lý hóa quy trình phát triển cho tất cả các bên liên quan.

CI là gì? CD là gì?

Credit: Dzone

CI là viết tắt của Continuous Integration

Là tích hợp liên tục, nhằm liên tục tích hợp các source code của các thành viên trong team lại một cách nhanh chóng. Giúp kiểm soát được tình hình phát triển thông qua các bước kiểm thử unit tests, Integration tests.

CI Workflow

Chu trình làm việc

  1. Bước đầu tiên, các thành viên trong team dev sẽ bắt đầu pull code mới nhất từ repo về branch để thực hiện các yêu cầu chức năng nhất định.
  2. Tiếp đó là quá trình lập trình và test code để đảm bảo chất lượng của chức năng cũng như toàn bộ source code.
  3. Thành viên code xong thì sẵn sàng cho việc commit vào branch develop của team.
  4. Thành viên cập nhật code mới từ repo về local repo
  5. Merge code và giải quyết conflict.
  6. Build và đảm bảo code pass qua các tests dưới local.
  7. Commit code lên repo
  8. Máy chủ CI lắng nghe các thay đổi code từ repository và có thể tự động build/test, sau đó đưa ra các thông báo (pass/failure) cho các thành viên.

CD là viết tắt của Continuous Delivery

Continuous Delivery là chuyển giao liên tục, là 1 tập hợp các kỹ thuật để triển khai tích hợp souce code trên môi trường staging ( một môi trường rất giống với môi trường production). Với cách này ta có thể đảm bảo source code được review, kiểm thử một cách tỉ mỉ trước khi deploy lên môi trường production.

Jenkins Workflow

Cài đặt Jenkins trên Windows 10 / Windows Server

Download bản cài đặt cho windows tại địa chỉ: https://www.jenkins.io/download/

Mặc định Jenkins sẽ chạy ở địa chỉ localhost:8080. Bạn có thể thay đổi lại PORT trong file jenkins.xml để an toàn hoặc riêng tư hơn.

Chờ quá trình cài đặt Plugins hoàn tất là xong. Mặc định Jenkins chỉ truy cập được từ internal. Để có thể truy cập Jenkins từ ngoài mạng internet, ví dụ https://jenkins.tuanitpro.com/ chúng ta cần cấu hình Reverse Proxy cho IIS.