<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:version="2.0"><channel><title>Kha Thiết Giang — Full-stack Web Developer</title><description>Senior Web Developer tại TPHCM với 8+ năm kinh nghiệm phát triển web, Laravel, WordPress, CRM và kiểm thử phần mềm.</description><link>https://jangkeyte.github.io/</link><language>en</language><item><title>Roadmap to RAG, LLM &amp; AI Agents</title><link>https://jangkeyte.github.io/blog/roadmap-rag-llm-ai-agent/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/roadmap-rag-llm-ai-agent/</guid><description>A practical overview of Retrieval-Augmented Generation, Large Language Models, and AI Agent architectures.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/roadmap-rag-llm-ai-agent/&quot;&gt;https://jangkeyte.github.io/blog/roadmap-rag-llm-ai-agent/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;A practical overview of Retrieval-Augmented Generation, Large Language Models, and AI Agent architectures.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2025/04/15/roadmap-ve-rag-llm-ai-agent/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Roadmap to RAG, LLM &amp;amp; AI Agents&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2025/04/15/roadmap-ve-rag-llm-ai-agent/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h1&gt;ltpython_share&lt;/h1&gt;
&lt;p&gt;Trong kỷ nguyên AI bùng nổ, RAG, LLM và AI Agent đang trở thành những khái niệm then chốt, định hình tương lai của công nghệ.&lt;/p&gt;
&lt;p&gt;• LLMs (Large Language Models – Mô hình Ngôn ngữ Lớn): Là trái tim của nhiều ứng dụng AI hiện đại, LLMs có khả năng hiểu và tạo ra ngôn ngữ tự nhiên một cách ấn tượng. Tuy nhiên, chúng cũng tồn tại những hạn chế về kiến thức cập nhật và khả năng truy xuất thông tin tin cậy.&lt;/p&gt;
&lt;p&gt;• RAG (Retrieval-Augmented Generation – Sinh tạo tăng cường truy xuất): Giải quyết bài toán của LLMs bằng cách kết hợp khả năng sinh tạo ngôn ngữ mạnh mẽ với cơ chế truy xuất thông tin từ nguồn bên ngoài. RAG giúp LLMs tạo ra nội dung chính xác, cập nhật và bám sát ngữ cảnh.&lt;/p&gt;
&lt;p&gt;• AI Agent (Trí tuệ nhân tạo tác nhân): Bước tiến xa hơn trong việc ứng dụng LLMs, AI Agent là các hệ thống tự chủ có khả năng lập kế hoạch, ra quyết định và thực hiện hành động để đạt được mục tiêu cụ thể.&lt;/p&gt;
&lt;p&gt;Tài liệu này sẽ đi sâu vào 9 cheat sheet quan trọng, giúp bạn nắm bắt các khía cạnh cốt lõi của RAG, LLM và AI Agent, bao gồm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformer vs. Mixture of Experts (MoE) trong LLMs: So sánh kiến trúc Transformer truyền thống với kiến trúc MoE tiên tiến, giúp bạn hiểu rõ ưu nhược điểm và ứng dụng của từng loại.&lt;/li&gt;
&lt;li&gt;5 kỹ thuật tinh chỉnh LLMs (Fine-tuning): Khám phá các phương pháp hiệu quả để tinh chỉnh LLMs, giúp mô hình hoạt động tốt hơn trên các tác vụ cụ thể mà không cần đào tạo lại từ đầu.&lt;/li&gt;
&lt;li&gt;RAG vs. Agentic RAG: Phân biệt RAG cơ bản và Agentic RAG, làm rõ ưu điểm vượt trội của Agentic RAG trong việc xử lý truy vấn phức tạp và yêu cầu đa thông tin.&lt;/li&gt;
&lt;li&gt;5 mô hình thiết kế Agentic AI phổ biến: Tìm hiểu các pattern thiết kế Agentic AI thông dụng, giúp bạn xây dựng các hệ thống AI tự chủ và linh hoạt.&lt;/li&gt;
&lt;li&gt;5 chiến lược Chunking cho RAG: Nắm vững các kỹ thuật chia nhỏ văn bản (chunking) hiệu quả trong RAG, tối ưu hóa khả năng truy xuất thông tin và hiệu suất hệ thống.&lt;/li&gt;
&lt;li&gt;5 cấp độ của hệ thống Agentic AI: Hiểu rõ các mức độ tự chủ khác nhau của hệ thống Agentic AI, từ đơn giản đến phức tạp, giúp bạn lựa chọn kiến trúc phù hợp với nhu cầu.&lt;/li&gt;
&lt;li&gt;Traditional RAG vs. HyDE (Hypothetical Document Embedding): So sánh RAG truyền thống với HyDE, một phương pháp cải tiến giúp tăng cường khả năng truy xuất ngữ cảnh liên quan bằng cách sử dụng câu trả lời giả định.&lt;/li&gt;
&lt;li&gt;RAG vs. Graph RAG: Tìm hiểu về Graph RAG, giải pháp nâng cao khả năng của RAG trong việc xử lý các truy vấn đòi hỏi ngữ cảnh toàn diện và thông tin liên kết.&lt;/li&gt;
&lt;li&gt;KV Caching: Khám phá kỹ thuật KV Caching giúp tăng tốc độ suy luận của LLMs, cải thiện hiệu suất và giảm độ trễ.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Giải Thích Chi Tiết Các Khái Niệm và Thuật Ngữ&lt;/p&gt;
&lt;p&gt;Dưới đây là phần giải thích chi tiết cho từng cheat sheet, đi kèm với ví dụ minh họa (nếu có) để bạn dễ dàng hình dung.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Transformer vs. Mixture of Experts (MoE) trong LLMs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;• Transformer: Kiến trúc nền tảng của hầu hết các LLMs hiện đại, nổi bật với cơ chế self-attention, cho phép mô hình tập trung vào các phần quan trọng của dữ liệu đầu vào.Ưu điểm: Hiệu quả trong việc xử lý ngôn ngữ tuần tự, khả năng song song hóa cao.
Nhược điểm: Tính toán phức tạp, khó mở rộng quy mô mô hình.
Minh họa:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;p&gt;• Mixture of Experts (MoE): Kiến trúc tiên tiến, sử dụng nhiều “chuyên gia” (experts) nhỏ hơn trong một mô hình lớn. Router sẽ chọn các expert phù hợp để xử lý từng phần của dữ liệu đầu vào.Ưu điểm: Tăng đáng kể dung lượng mô hình mà không tăng đáng kể chi phí tính toán, cải thiện hiệu suất và khả năng chuyên môn hóa.
Nhược điểm: Phức tạp trong triển khai và đào tạo, yêu cầu cân bằng tải giữa các expert.
Minh họa:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 Kỹ Thuật Tinh Chỉnh LLMs (Fine-tuning)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tinh chỉnh LLMs là quá trình điều chỉnh mô hình pre-trained trên một tập dữ liệu và tác vụ cụ thể. Dưới đây là 5 kỹ thuật phổ biến:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full Fine-tuning: Tinh chỉnh toàn bộ tham số của mô hình.Ưu điểm: Đạt hiệu suất cao nhất, tận dụng tối đa khả năng của mô hình.
Nhược điểm: Tốn nhiều tài nguyên tính toán, dễ overfitting trên tập dữ liệu nhỏ.&lt;/li&gt;
&lt;li&gt;Parameter-Efficient Fine-tuning (PEFT): Chỉ tinh chỉnh một phần nhỏ tham số, giảm chi phí tính toán và overfitting. Ví dụ: LoRA, Adapter.Ưu điểm: Tiết kiệm tài nguyên, hiệu quả với dữ liệu hạn chế, dễ dàng chuyển đổi giữa các tác vụ.
Nhược điểm: Có thể không đạt hiệu suất tối đa như Full Fine-tuning trong một số trường hợp.&lt;/li&gt;
&lt;li&gt;Prompt Tuning: Tinh chỉnh prompt (mồi câu lệnh) đầu vào thay vì tham số mô hình.Ưu điểm: Không thay đổi tham số mô hình gốc, dễ dàng thử nghiệm và triển khai, không lo overfitting.
Nhược điểm: Hiệu suất có thể bị giới hạn so với fine-tuning tham số.&lt;/li&gt;
&lt;li&gt;Instruction Fine-tuning: Đào tạo mô hình trên tập dữ liệu hướng dẫn (instruction dataset) để cải thiện khả năng tuân theo hướng dẫn và thực hiện tác vụ.Ưu điểm: Mô hình phản hồi tốt hơn với hướng dẫn tự nhiên của người dùng, tăng tính hữu dụng.
Nhược điểm: Cần có tập dữ liệu hướng dẫn chất lượng cao.&lt;/li&gt;
&lt;li&gt;Reinforcement Learning from Human Feedback (RLHF): Sử dụng phản hồi từ con người để đào tạo mô hình thông qua học tăng cường, giúp mô hình tạo ra kết quả phù hợp với mong đợi của người dùng.Ưu điểm: Cải thiện đáng kể chất lượng và tính hữu ích của đầu ra, đặc biệt trong các tác vụ sáng tạo.
Nhược điểm: Phức tạp trong triển khai, tốn thời gian thu thập phản hồi từ con người.&lt;/li&gt;
&lt;li&gt;RAG vs. Agentic RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;• RAG (Retrieval-Augmented Generation): Quy trình cơ bản gồm hai bước:Retrieval (Truy xuất): Truy xuất thông tin liên quan từ external knowledge base dựa trên truy vấn của người dùng.
Generation (Sinh tạo): LLM sử dụng thông tin truy xuất được để tạo ra câu trả lời hoặc nội dung phù hợp.
Minh họa quy trình RAG:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;p&gt;• Agentic RAG: Nâng cấp của RAG, cho phép mô hình tự động hóa quá trình truy xuất và sinh tạo thông tin thông qua cơ chế agent. Agentic RAG có thể:Truy xuất thông tin nhiều lần: Không chỉ truy xuất một lần duy nhất, Agentic RAG có thể lặp lại quá trình truy xuất để thu thập thêm thông tin cần thiết.
Lập kế hoạch và suy luận: Phân tích truy vấn phức tạp, lập kế hoạch truy xuất thông tin và suy luận để đưa ra câu trả lời toàn diện.
Tương tác với môi trường: Gọi API, sử dụng công cụ bên ngoài để thu thập và xử lý thông tin.
Minh họa quy trình Agentic RAG:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 Mô Hình Thiết Kế Agentic AI Phổ Biến&lt;/li&gt;
&lt;li&gt;Reflexion: Agent tự đánh giá kết quả và cải thiện hành động trong tương lai dựa trên self-reflection.&lt;/li&gt;
&lt;li&gt;ReAct (Reason + Act): Kết hợp suy luận và hành động một cách xen kẽ, giúp agent giải quyết các tác vụ phức tạp.&lt;/li&gt;
&lt;li&gt;Plan-and-Execute: Agent lập kế hoạch trước khi hành động, đảm bảo các bước thực hiện logic và hiệu quả.&lt;/li&gt;
&lt;li&gt;Tool Use: Agent sử dụng các công cụ bên ngoài (API, utilities) để mở rộng khả năng và thực hiện các tác vụ đa dạng.&lt;/li&gt;
&lt;li&gt;Multi-Agent Collaboration: Nhiều agent phối hợp làm việc cùng nhau để giải quyết vấn đề, tận dụng thế mạnh của từng agent.&lt;/li&gt;
&lt;li&gt;5 Chiến Lược Chunking cho RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chunking là quá trình chia nhỏ văn bản lớn thành các đoạn nhỏ hơn (chunks) để tăng hiệu quả truy xuất trong RAG.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fixed-size Chunking: Chia văn bản thành các chunk có kích thước cố định (ví dụ: 512 tokens).Ưu điểm: Đơn giản, dễ thực hiện.
Nhược điểm: Có thể cắt ngang câu hoặc đoạn văn, làm mất ngữ cảnh.&lt;/li&gt;
&lt;li&gt;Context-aware Chunking: Chia chunk dựa trên cấu trúc ngữ nghĩa của văn bản (ví dụ: câu, đoạn văn, chương).Ưu điểm: Giữ ngữ cảnh tốt hơn, cải thiện chất lượng truy xuất.
Nhược điểm: Phức tạp hơn Fixed-size Chunking, cần phân tích cấu trúc văn bản.&lt;/li&gt;
&lt;li&gt;Recursive Chunking: Chia văn bản thành các chunk lớn, sau đó tiếp tục chia nhỏ các chunk lớn hơn thành các chunk nhỏ hơn.Ưu điểm: Tạo ra các chunk đa cấp độ, phù hợp với các truy vấn có độ chi tiết khác nhau.
Nhược điểm: Phức tạp trong triển khai và quản lý chunk.&lt;/li&gt;
&lt;li&gt;Metadata Chunking: Gắn metadata (ví dụ: tiêu đề, tác giả, ngày tháng) vào mỗi chunk, giúp lọc và truy xuất thông tin chính xác hơn.Ưu điểm: Truy xuất thông tin theo metadata, tăng tính linh hoạt và chính xác.
Nhược điểm: Yêu cầu chuẩn bị metadata cho văn bản.&lt;/li&gt;
&lt;li&gt;Semantic Chunking: Chia chunk dựa trên ngữ nghĩa của văn bản, đảm bảo các chunk có ý nghĩa độc lập và liên quan chặt chẽ đến nhau về mặt ngữ nghĩa.Ưu điểm: Truy xuất thông tin theo ngữ nghĩa, cải thiện đáng kể chất lượng và độ chính xác của RAG.
Nhược điểm: Yêu cầu mô hình hiểu ngữ nghĩa văn bản, có thể tốn nhiều chi phí tính toán.&lt;/li&gt;
&lt;li&gt;5 Cấp Độ Của Hệ Thống Agentic AI&lt;/li&gt;
&lt;li&gt;Level 1: Reflex Agents: Agent đơn giản, phản ứng trực tiếp với môi trường dựa trên các quy tắc định sẵn.&lt;/li&gt;
&lt;li&gt;Level 2: Model-Based Reflex Agents: Agent sử dụng mô hình về thế giới để đưa ra quyết định, có khả năng dự đoán và lập kế hoạch đơn giản.&lt;/li&gt;
&lt;li&gt;Level 3: Goal-Based Agents: Agent có mục tiêu rõ ràng và hành động để đạt được mục tiêu đó, có khả năng lập kế hoạch phức tạp hơn.&lt;/li&gt;
&lt;li&gt;Level 4: Utility-Based Agents: Agent tối ưu hóa utility (tiện ích) của hành động, lựa chọn hành động mang lại lợi ích cao nhất.&lt;/li&gt;
&lt;li&gt;Level 5: Learning Agents: Agent có khả năng học hỏi và cải thiện hành vi theo thời gian, thích ứng với môi trường thay đổi.&lt;/li&gt;
&lt;li&gt;Traditional RAG vs. HyDE (Hypothetical Document Embedding)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;• Traditional RAG: Truy xuất context trực tiếp dựa trên embedding của truy vấn.Vấn đề: Truy vấn và câu trả lời có thể không tương đồng về mặt ngữ nghĩa, dẫn đến truy xuất context không liên quan.&lt;/p&gt;
&lt;p&gt;• HyDE (Hypothetical Document Embedding): Cải tiến RAG bằng cách:Tạo câu trả lời giả định (Hypothetical Answer – H) cho truy vấn.
Sử dụng embedding của H để truy xuất context (C).
LLM sử dụng C và truy vấn gốc để tạo ra câu trả lời cuối cùng.
Minh họa quy trình HyDE:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;p&gt;Ưu điểm HyDE: Cải thiện khả năng truy xuất context liên quan, đặc biệt khi truy vấn và câu trả lời có sự khác biệt về mặt ngữ nghĩa.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RAG vs. Graph RAG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;• Traditional RAG: Truy xuất top-k chunks độc lập, bỏ qua thông tin liên kết giữa các chunk.Vấn đề: Khó trả lời các câu hỏi đòi hỏi ngữ cảnh toàn diện và thông tin liên kết.&lt;/p&gt;
&lt;p&gt;• Graph RAG: Sử dụng cấu trúc đồ thị để biểu diễn knowledge base, cho phép truy xuất thông tin theo đường dẫn và mối quan hệ giữa các entity.Ưu điểm: Xử lý tốt các truy vấn phức tạp, đòi hỏi ngữ cảnh toàn diện, khả năng suy luận trên đồ thị tri thức.
Nhược điểm: Phức tạp trong xây dựng và quản lý đồ thị tri thức, chi phí tính toán cao hơn.
Minh họa Graph RAG:&lt;/p&gt;
&lt;p&gt;[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;KV Caching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;• KV Caching (Key-Value Caching): Kỹ thuật lưu trữ kết quả tính toán trung gian (key-value pairs) trong quá trình suy luận của LLMs, giúp tái sử dụng kết quả đã tính toán cho các lần suy luận sau.Cơ chế: Khi LLM cần tính toán một phần nào đó, trước tiên sẽ kiểm tra KV cache. Nếu kết quả đã có trong cache, sẽ sử dụng kết quả cached thay vì tính toán lại.
Ưu điểm: Tăng tốc độ suy luận, giảm chi phí tính toán, đặc biệt hiệu quả khi có nhiều truy vấn lặp lại hoặc tương tự.
Minh họa KV Caching:[Xem sơ đồ minh họa bên dưới]&lt;/p&gt;
&lt;p&gt;Hướng Dẫn Từng Bước Cài Đặt/Triển Khai&lt;/p&gt;
&lt;p&gt;Để ứng dụng các cheat sheet trên vào thực tế, bạn có thể tham khảo các bước sau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Xác định bài toán: Phân tích rõ vấn đề bạn muốn giải quyết bằng RAG, LLM hoặc AI Agent.&lt;/li&gt;
&lt;li&gt;Lựa chọn cheat sheet phù hợp: Dựa trên bài toán và yêu cầu cụ thể, chọn cheat sheet phù hợp nhất để áp dụng. Ví dụ:Nếu cần xử lý truy vấn phức tạp, Agentic RAG và Graph RAG là lựa chọn tốt.
Nếu muốn tăng tốc độ suy luận, hãy xem xét KV Caching.
Nếu dữ liệu lớn, hãy chọn chiến lược Chunking hiệu quả.&lt;/li&gt;
&lt;li&gt;Chuẩn bị môi trường: Cài đặt các thư viện và công cụ cần thiết (ví dụ: Python, Transformers, LangChain, Haystack).&lt;/li&gt;
&lt;li&gt;Thu thập và xử lý dữ liệu: Chuẩn bị knowledge base, dữ liệu huấn luyện (nếu cần tinh chỉnh LLM).&lt;/li&gt;
&lt;li&gt;Triển khai mô hình: Viết code để hiện thực hóa ý tưởng, tích hợp các cheat sheet đã chọn vào hệ thống.&lt;/li&gt;
&lt;li&gt;Kiểm thử và đánh giá: Đảm bảo hệ thống hoạt động đúng như mong đợi, đánh giá hiệu suất và tối ưu hóa.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ví dụ code mẫu (Python + LangChain – Minh họa RAG cơ bản):&lt;/p&gt;
&lt;p&gt;[Xem ảnh dưới]&lt;/p&gt;
&lt;p&gt;Lưu ý: Đây chỉ là ví dụ cơ bản. Để triển khai các cheat sheet phức tạp hơn (Agentic RAG, Graph RAG…), bạn cần tìm hiểu sâu hơn về các framework và thư viện hỗ trợ. 8 Sync Dev sẽ có các khóa học và tài liệu chi tiết hơn về các chủ đề này trong tương lai. Hãy theo dõi kênh của chúng tôi!&lt;/p&gt;
&lt;p&gt;Best Practices và Lưu Ý Quan Trọng&lt;/p&gt;
&lt;p&gt;• Hiểu rõ bản chất từng cheat sheet: Không có cheat sheet nào là “tốt nhất” cho mọi trường hợp. Lựa chọn phù hợp phụ thuộc vào bài toán và yêu cầu cụ thể.&lt;/p&gt;
&lt;p&gt;• Thử nghiệm và đánh giá: Thực nghiệm các cheat sheet khác nhau và đánh giá hiệu quả trên dữ liệu và tác vụ của bạn.&lt;/p&gt;
&lt;p&gt;• Tối ưu hóa hiệu suất: Chú trọng đến hiệu suất và chi phí tính toán khi triển khai các hệ thống RAG, LLM và AI Agent.&lt;/p&gt;
&lt;p&gt;• Bảo mật: Đảm bảo an toàn dữ liệu và bảo mật thông tin khi sử dụng các công nghệ AI, đặc biệt khi làm việc với dữ liệu nhạy cảm.&lt;/p&gt;
&lt;p&gt;• Cập nhật kiến thức: Công nghệ AI phát triển rất nhanh chóng. Luôn cập nhật kiến thức và theo dõi các xu hướng mới nhất. 8 Sync Dev sẽ luôn đồng hành cùng bạn trên con đường này!&lt;/p&gt;
&lt;p&gt;Cùng 8 Sync Dev, chinh phục thế giới lập trình!&lt;/p&gt;
&lt;p&gt;Nguồn: 8 Sync Dev&lt;/p&gt;
&lt;h1&gt;8syncdev&lt;/h1&gt;
&lt;h1&gt;8s&lt;/h1&gt;
&lt;h1&gt;8syncdev_share&lt;/h1&gt;
&lt;h1&gt;python&lt;/h1&gt;
&lt;h1&gt;aiAgent&lt;/h1&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Tue, 15 Apr 2025 00:00:00 GMT</pubDate></item><item><title>How to Get 5TB Free OneDrive Storage (Developer Program)</title><link>https://jangkeyte.github.io/blog/onedrive-5tb-developer-program/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/onedrive-5tb-developer-program/</guid><description>Step-by-step guide to register for Microsoft&apos;s developer program and claim 5TB OneDrive storage.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/onedrive-5tb-developer-program/&quot;&gt;https://jangkeyte.github.io/blog/onedrive-5tb-developer-program/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Step-by-step guide to register for Microsoft&amp;#39;s developer program and claim 5TB OneDrive storage.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/11/17/huong-dan-dang-ky-nhan-5tb-onedrive-dung-luong-luu-tru-mien-phi/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;How to Get 5TB Free OneDrive Storage (Developer Program)&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/11/17/huong-dan-dang-ky-nhan-5tb-onedrive-dung-luong-luu-tru-mien-phi/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách nhận 5TB miễn phí trên OneDrive&lt;/strong&gt;là một mẹo hay mà bạn không nên bỏ qua nếu bạn muốn có nhiều không gian lưu trữ đám mây cho các tệp tin của bạn. Đó là một trong những lợi ích của việc tham gia Microsoft Developer Program, một chương trình miễn phí dành cho các nhà phát triển muốn khám phá và học hỏi về nền tảng Microsoft 365. Cách tham gia như thế nào? Cùng tìm hiểu qua bài viết dưới đây nhé!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OneDrive là gì?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OneDrive&lt;/strong&gt;là một dịch vụ của Microsoft, giúp bạn lưu trữ, chia sẻ và truy cập các tệp tin của bạn từ bất kỳ thiết bị nào. Bạn có thể sử dụng OneDrive để sao lưu các ảnh, video, tài liệu, âm nhạc,…&lt;/p&gt;
&lt;p&gt;Ngoài ra, bạn cũng có thể làm việc cùng nhau trên các tệp tin Office với người khác thông qua ứng dụng này.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hướng dẫn cách nhận 5TB miễn phí trên OneDrive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mình sẽ hướng dẫn các bạn cách đăng ký tài khoản Microsoft Developer Program để nhận 5TB dung lượng lưu trữ miễn phí trên OneDrive cùng với các ứng dụng Microsoft 365. Bạn hãy làm theo các bước hướng dẫn như sau:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách đăng ký tài khoản Microsoft Developer Program&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;**Bước 1:**Mở trang&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-365/dev-program&quot;&gt;Microsoft 365 Developer Program&lt;/a&gt;và nhấn “Join now”.&lt;/p&gt;
&lt;p&gt;**Bước 2:**Đăng nhập vào tài khoản Microsoft, nếu chưa có tài khoản thì đăng ký một tài khoản Microsoft mới.&lt;/p&gt;
&lt;p&gt;**Bước 3:**Nhập quốc gia, công ty, ngôn ngữ và tích chọn chấp nhận điều khoản &amp;gt; Nhấn “Next”&lt;/p&gt;
&lt;p&gt;**Bước 4:**Chọn một trong các lựa chọn về mục tiêu chính &amp;gt; Nhấn “Next”&lt;/p&gt;
&lt;p&gt;**Bước 5:**Chọn các lĩnh vực quan tâm &amp;gt; Nhấn “Save”.&lt;/p&gt;
&lt;p&gt;**Bước 6:**Chọn “Instant Sandbox” &amp;gt; Next.&lt;/p&gt;
&lt;p&gt;**Bước 7:**Tạo tên người dùng và mật khẩu cho tài khoản Admin &amp;gt; Continue&lt;/p&gt;
&lt;p&gt;**Bước 8:**Điền số điện thoại &amp;gt; Send code&lt;/p&gt;
&lt;p&gt;**Bước 9:**Điền mã code nhận được từ điện thoại &amp;gt; Set up&lt;/p&gt;
&lt;p&gt;Đến đây bạn đã hoàn thành bước đăng ký tài khoản Microsoft Developer Program, bạn sẽ có một tài khoản Microsoft 365 E5 developer subscription với dung lượng lưu trữ mặc định là 1TB trên OneDrive. Truy cập vào&lt;a href=&quot;https://developer.microsoft.com/en-us/microsoft-365/profile&quot;&gt;trang thông tin&lt;/a&gt;của Microsoft Developer sẽ thấy được thông tin chi tiết.
Email này là email Admin của bạn&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách nhận 5TB miễn phí trên OneDrive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Để nâng hạn mức lên 5TB, bạn cần làm các bước sau:&lt;/p&gt;
&lt;p&gt;**Bước 1:**Bạn nhấn vào “Go to supscription” &amp;gt; Điền mật khẩu &amp;gt; Đăng nhập&lt;/p&gt;
&lt;p&gt;**Bước 2:**Cài đặt ứng dụng Microsoft Authenticator trên điện thoại để có thể xác minh 2 bước, bạn cứ thao tác trên máy tính, sau đó tới bước dùng điện thoại quét mã QR là có thể đăng nhập tài khoản trên điện thoại.&lt;/p&gt;
&lt;p&gt;**Bước 3:**Khi đăng nhập vào Microsoft 365, bạn nhấn vào mục “Admin”&lt;/p&gt;
&lt;p&gt;Bước này sẽ đưa bạn đến trang Microsoft 365 admin center, nơi bạn có thể quản lý các thiết lập của sandbox của bạn.&lt;/p&gt;
&lt;p&gt;**Bước 5:**Chọn “Show all” tìm “All admin center” &amp;gt; Chọn “Sharepoint”&lt;/p&gt;
&lt;p&gt;**Bước 6:**Nhấn chọn mục “Settings” &amp;gt; OneDrive Storage limit. Điền “5120” rồi nhấn “Save” để lưu lại&lt;/p&gt;
&lt;p&gt;**Bước 8:**Trở lại trang Microsoft 365 admin center, chọn tab Users &amp;gt; “Active users” &amp;gt; Chọn tên tài khoản của bạn &amp;gt; Nhấn vào tab “OneDrive” &amp;gt; Chọn “Edit”&lt;/p&gt;
&lt;p&gt;**Bước 9:**Tích chọn “Maximum storage for this user” &amp;gt; Nhấn “Save”&lt;/p&gt;
&lt;p&gt;Lúc này bạn đã nâng hạn mức lưu trữ lên 5TB thành công!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách kiểm tra dung lượng lưu trữ trên OneDrive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Để kiểm tra dung lượng lưu trữ trên OneDrive có đúng là được 5TB không, bạn hãy làm như sau:&lt;/p&gt;
&lt;p&gt;**Bước 1:**Vào lại&lt;a href=&quot;https://www.office.com&quot;&gt;trang chủ Office&lt;/a&gt;&amp;gt; Nhấn vào biểu tượng 9 chấm &amp;gt; Chọn “OneDrive”&lt;/p&gt;
&lt;p&gt;**Bước 2:**Bấm vào biểu tượng bánh răng &amp;gt; Chọn “OneDrive Settings”&lt;/p&gt;
&lt;p&gt;**Bước 3:**Chọn “More Settings” &amp;gt; “Storage Metrics”&lt;/p&gt;
&lt;p&gt;Bước này sẽ hiển thị dung lượng đã sử dụng và còn trống của OneDrive. Bạn sẽ thấy có tổng cộng 5 TB xài tẹt ga.&lt;/p&gt;
&lt;h2&gt;Mẹo&lt;/h2&gt;
&lt;p&gt;Một mẹo nhỏ để Microsoft Renew lại tài khoản Dev cho bạn là thường xuyên tương tác với tài khoản, Upload Code lên Github, tạo thêm tài khoản mới.&lt;/p&gt;
&lt;p&gt;Đặc biệt là&lt;a href=&quot;https://admin.microsoft.com/Adminportal/Home?#/featureexplorer/security/AddDomain&quot;&gt;Add Domain&lt;/a&gt;vào tài khoản Microsoft 365 Developer Program thì gần như bạn sẽ được sử dụng vĩnh viễn.&lt;/p&gt;
&lt;p&gt;Bước 1: Vào trang quản lý admin Microsoft 365 để Add Domain nhấn chọn Get started&lt;/p&gt;
&lt;p&gt;Bước 2: Nhập tên miền rồi nhấn chọn “Use this domain”&lt;/p&gt;
&lt;p&gt;Bước 3: Chọn “Add a TXT record…” rồi nhấn “Continue”&lt;/p&gt;
&lt;p&gt;Bước 4: Thêm các record theo yêu cầu rồi chọn “Verify”&lt;/p&gt;
&lt;p&gt;Bước 5: Sau khi kết nối thành công là hoàn thành, tuy nhiên nếu muốn dùng email domain và các dịch vụ khác thì cần xác minh thêm 3 record nữa. Chọn “Add your own DNS records”&lt;/p&gt;
&lt;p&gt;Bước 6: Thêm các record được yêu cầu để xác thực&lt;/p&gt;
&lt;p&gt;Bước 7: Hoàn thành xác thực có thể thay đổi tên đăng nhập thành email domain cho dễ nhớ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png&quot; alt=&quot;🙂&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lời Kết&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Vậy là bạn đã biết&lt;strong&gt;cách nhận 5TB miễn phí trên OneDrive&lt;/strong&gt;bằng cách đăng ký tài khoản Microsoft Developer Program. Đây là một cách đơn giản và hiệu quả để có nhiều không gian lưu trữ đám mây cho các tệp tin của bạn. Chúc bạn thành công!&lt;/p&gt;
&lt;p&gt;Bonus thêm cho bạn nào có tài khoản của trường edu.vn thì có thể đăng ký sử dụng miễn phí 1TB vĩnh viễn nha.
Link đăng ký:&lt;a href=&quot;https://www.microsoft.com/vi-vn/education/products/office&quot;&gt;https://www.microsoft.com/vi-vn/education/products/office&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cứ vào rồi điền email trường, chọn sinh viên, điền thông tin và mã xác nhận là xong.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sun, 17 Nov 2024 00:00:00 GMT</pubDate></item><item><title>The Feynman Technique for Learning</title><link>https://jangkeyte.github.io/blog/feynman-technique-learning/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/feynman-technique-learning/</guid><description>Learn faster by teaching — the Feynman technique explained with practical steps.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/feynman-technique-learning/&quot;&gt;https://jangkeyte.github.io/blog/feynman-technique-learning/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Learn faster by teaching — the Feynman technique explained with practical steps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/08/17/ky-thuat-feynman/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;The Feynman Technique for Learning&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/08/17/ky-thuat-feynman/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;LÀM THẾ NÀO BẠN CÓ THỂ NHỚ NHỮNG GÌ BẠN ĐÃ ĐỌC
Giảng dạy là cách hiệu quả nhất để đưa thông tin vào tâm trí bạn. Ngoài ra, đây là một cách dễ dàng kiểm tra xem bạn có nhớ những gì mình đã đọc hay không. Bởi vì trước khi dạy, bạn phải thực hiện một số bước: lọc thông tin có liên quan, sắp xếp thông tin này và diễn đạt rõ ràng bằng vốn từ vựng của riêng bạn.
Không ai có thể vượt qua Feynman trong việc làm chủ quá trình này. Những người cùng thời biết đến ông vì ông có thể giải thích những quá trình phức tạp nhất bằng ngôn ngữ đơn giản nhất. Họ đặt biệt danh cho Feynman là “Người giải thích vĩ đại”.
Nếu bạn đang tìm kiếm một cách để thúc đẩy quá trình học tập và muốn trở nên thông minh hơn, thì Kỹ thuật Feynman có thể là cách tốt nhất để bạn học mọi thứ.
Kỹ thuật Feynman là một phương pháp giúp chúng ta ghi nhớ những gì đã đọc bằng cách sử dụng các khái niệm liên kết và xây dựng. Đó là một công cụ để ghi nhớ những gì bạn đã đọc bằng cách giải thích nó bằng ngôn ngữ đơn giản, dễ hiểu.
Kỹ thuật Feynman không chỉ là một công thức tuyệt vời để học mà còn là một cánh cửa dẫn đến một cách suy nghĩ khác cho phép bạn chia nhỏ các ý tưởng và định nghĩa lại chúng.
Điều tôi thích ở khái niệm này là cách tiếp cận: trí thông minh là một quá trình phát triển, kết hợp độc đáo với công trình của Carol Dweck, người đã mô tả chính xác sự khác biệt giữa tư duy cố định và tư duy phát triển.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f33c.png&quot; alt=&quot;🌼&quot;&gt;&lt;/p&gt;
&lt;p&gt;4 BƯỚC BẠN CẦN THỰC HIỆN
Về bản chất, kỹ thuật Feynman bao gồm bốn bước: xác định chủ đề, giải thích nội dung, xác định lỗ hổng kiến thức của bạn, đơn giản hóa giải thích của bạn. Đây là cách nó được áp dụng cho bất kỳ cuốn sách nào bạn đọc:&lt;/p&gt;
&lt;h1&gt;1 – CHỌN CUỐN SÁCH BẠN MUỐN GHI NHỚ&lt;/h1&gt;
&lt;p&gt;Sau khi bạn đọc xong một cuốn sách đáng nhớ, hãy lấy ra một tờ giấy trắng. Ghi lại tên sách.
Sau đó, hãy nhớ lại tất cả các nguyên tắc và điểm mấu chốt mà bạn muốn ghi nhớ. Nhiều người mắc sai lầm ở bước này, họ chỉ sao chép mục lục hoặc những dòng highlight của bản thân. Họ không gợi nhớ lại thông tin mình đã đọc, do đó, họ không thể học được gì cả.
Thay vào đó, điều bạn nên làm là tự nhớ lại các khái niệm và ý tưởng. Bước này đòi hỏi trí tuệ của bạn. Nhưng bằng cách suy nghĩ về các khái niệm, bạn đang tạo ra một trải nghiệm học tập hiệu quả.
Trong khi viết những điểm mấu chốt, hãy cố gắng sử dụng ngôn ngữ đơn giản nhất bạn có thể. Thông thường, chúng ta sử dụng những biệt ngữ phức tạp để che giấu sự không biết của mình. Những “từ ngữ to tát” và những “từ ngữ chuyên môn” khiến chúng ta không thể đi sâu vào vấn đề.&lt;/p&gt;
&lt;h1&gt;2 – GIẢ VỜ BẠN ĐANG GIẢI THÍCH NỘI DUNG CHO MỘT ĐỨA TRẺ 12 TUỔI&lt;/h1&gt;
&lt;p&gt;Điều này nghe có vẻ đơn giản nhưng nó không hề đơn giản. Trên thực tế, việc giải thích một khái niệm càng đơn giản càng tốt đòi hỏi sự hiểu biết sâu sắc.
Bởi vì khi bạn giải thích một ý tưởng từ đầu đến cuối cho một đứa trẻ 12 tuổi, bạn buộc mình phải đơn giản hóa các mối liên kết giữa các khái niệm.
Nếu bạn xung quanh bạn không có đứa trẻ nào 12 tuổi, hãy tìm một người bạn quan tâm đến vấn đề đó, ghi âm tin nhắn thoại để giải thích cho những người có cùng chí hướng với bạn hoặc viết ra lời giải thích của bạn dưới dạng bài đánh giá trên Amazon, Goodreads hoặc Quora.&lt;/p&gt;
&lt;h1&gt;3 – XÁC ĐỊNH LỖ HỔNG KIẾN THỨC CỦA BẠN VÀ ĐỌC LẠI&lt;/h1&gt;
&lt;p&gt;Giải thích những điểm mấu chốt của cuốn sách giúp bạn nhận ra những gì mình vẫn chưa hiểu. Sẽ có những chỗ bạn hiểu rất rõ. Ở có chỗ bạn sẽ hơi lấn cấn.
Chỉ khi bạn tìm thấy lỗ hổng kiến thức (tức là bạn thấy mình bỏ qua một khía cạnh quan trọng, hoặc khó khăn trong việc dùng từ hoặc liên kết các ý tưởng với nhau) bạn mới thực sự bắt đầu học.
Khi bạn biết mình đang mắc kẹt ở đâu, hãy cầm cuốn sách lên và đọc lại đoạn đó cho đến khi bạn có thể giải thích nó bằng ngôn ngữ đơn giản của mình.
Lấp lỗ hổng kiến thức là bước cần thiết để bạn thực sự nhớ những gì mình đã đọc và nếu bạn bỏ qua bước này, bạn sẽ ảo tưởng về kiến thức của mình.&lt;/p&gt;
&lt;h1&gt;4 ĐƠN GIẢN HÓA GIẢI THÍCH CỦA BẠN&lt;/h1&gt;
&lt;p&gt;Tùy thuộc vào độ phức tạp của cuốn sách, bạn có thể giải thích và ghi nhớ các ý tưởng của tác giả luôn. Tuy nhiên, nếu bạn cảm thấy không chắc chắn, hãy thực hiện thêm bước đơn giản hóa này.
Hãy đọc to các ghi chú của bạn và sắp xếp chúng thành một câu chuyện đơn giản nhất có thể. Nếu lời giải thích nghe có vẻ đơn giản, đó là một dấu hiệu tuyệt vời cho thấy bạn đã thành công.
Chỉ khi bạn có thể giải thích bằng ngôn ngữ đơn giản thì bạn mới biết rằng bạn thực sự hiểu nội dung mình đã đọc.
Chúng ta lấy kiến thức và ý kiến của những người khác dựa trên sự tin tưởng; vốn là cách học nhàn rỗi và hời hợt. Điều chúng ta cần phải biến chúng thành của riêng mình. Chúng ta cũng giống như một người khi cần lửa thì sang nhà hàng xóm xin, thấy một ngọn lửa rất ấm thế là ngồi tại chỗ sưởi ấm và rồi không nhớ mang về nhà. Chúng ta có ích lợi gì khi bụng đầy thịt nhưng nó không được tiêu hóa, nếu nó không được chuyển hóa thì sao có thể nuôi dưỡng và nâng đỡ chúng ta?
Kỹ thuật Feynman là một cách tuyệt vời để biến sự khôn ngoan từ sách thành của riêng bạn. Đó là một cách để chia nhỏ các ý tưởng và định nghĩa lại chúng.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 17 Aug 2024 00:00:00 GMT</pubDate></item><item><title>How to Increase TikTok Likes</title><link>https://jangkeyte.github.io/blog/huong-dan-tang-like-tiktok/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/huong-dan-tang-like-tiktok/</guid><description>Tips and strategies for growing engagement and likes on TikTok.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/huong-dan-tang-like-tiktok/&quot;&gt;https://jangkeyte.github.io/blog/huong-dan-tang-like-tiktok/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Tips and strategies for growing engagement and likes on TikTok.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/05/02/huong-dan-tang-like-tiktok/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;How to Increase TikTok Likes&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/05/02/huong-dan-tang-like-tiktok/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tăng view TikTok bằng FireLiker&lt;/li&gt;
&lt;li&gt;Tăng view TikTok bằng Allsmo&lt;/li&gt;
&lt;li&gt;Tăng view TikTok bằng TikTok Viewer&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;&lt;strong&gt;Tăng view Tiktok bằng FireLiker&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Đầu tiên, phải kể đến công cụ giúp hack view TikTok nhanh chỉ trong vòng 1 giây – FireLiker. Công cụ này sẽ giúp bạn tăng view từ từ, mỗi lần sử dụng sẽ tăng được 50 lượt xem. Dưới đây là hướng dẫn sử dụng FireLiker cho những ai còn đang cảm thấy mới lạ với công cụ hỗ trợ tăng view này.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 1&lt;/strong&gt;: Truy cập vào trang web&lt;a href=&quot;https://fireliker.com/&quot;&gt;FireLiker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 2&lt;/strong&gt;: Nhập&lt;strong&gt;Tên người dùng&lt;/strong&gt;hay còn gọi là&lt;strong&gt;Username&lt;/strong&gt;trên TikTok của bạn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 3&lt;/strong&gt;: Sau đó, các bạn chờ một lúc, hệ thống của FireLiker sẽ yêu cầu bạn xác nhận bằng mã captcha. Bạn nhập mã chính xác và ấn&lt;strong&gt;Continue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 4&lt;/strong&gt;: Sau đó, bạn ấn vào&lt;strong&gt;Auto views&lt;/strong&gt;-&amp;gt;&lt;strong&gt;Visit Bugsliker&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 5&lt;/strong&gt;: Cuối cùng, giao diện sẽ hiện ra các video TikTok của bạn như trên hình. Bạn lựa chọn video muốn tăng view và ấn vào nút&lt;strong&gt;Send views&lt;/strong&gt;bên cạnh để hoàn tất việc tăng lượt xem.&lt;/p&gt;
&lt;p&gt;Lưu ý rằng sau khi thành công tăng lượt xem, bạn cần phải đợi 15 phút mới có thể tiếp tục thực hiện thao tác tăng view TikTok trên FireLike.&lt;/p&gt;
&lt;h2&gt;Tăng view tiktok bằng allsmo&lt;/h2&gt;
&lt;p&gt;Một công cụ khác cũng vô cùng hiệu quả và tiện ích là Allsmo. Mỗi lần sử dụng Allsmo, bạn có thể tăng đến 1000 lượt views cho các video của mình. Ngoài bản dùng miễn phí, Allsmo còn cung cấp bản dùng trả phí với những tính năng vượt trội hơn. Các bạn có thể tham khảo cách sử dụng Allsmo sau đây nhé.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 1&lt;/strong&gt;: Truy cập vào trang web&lt;a href=&quot;https://www.allsmo.com/&quot;&gt;Allsmo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 2&lt;/strong&gt;: Bạn kéo xuống dưới và chọn mục&lt;strong&gt;TikTok Auto Views&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 3&lt;/strong&gt;: Sau khi đánh dấu tích vào ô&lt;strong&gt;Tôi không phải là người máy&lt;/strong&gt;để xác nhận, giao diện sẽ hiện ra những điều khoản của Allsmo. Bạn chỉ cần ấn&lt;strong&gt;I Agree&lt;/strong&gt;để sang bước tiếp theo.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 4&lt;/strong&gt;: Allsmo sẽ gợi ý cho bạn hai gói tăng view miễn phí để bạn lựa chọn. Hãy chọn gói nào phù hợp với mong muốn của bạn.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 5&lt;/strong&gt;: Cuối cùng, bạn nhập đường link video muốn tăng lượt xem, tên người dùng trên TikTok và email để liên hệ. Allsmo sẽ hỗ trợ tăng view cho bạn sau 10 phút.&lt;/p&gt;
&lt;h2&gt;Tăng view TikTok bằng TikTok Viewer&lt;/h2&gt;
&lt;p&gt;Khác với hai công cụ trên, TikTok Viewer yêu cầu bạn phải tải về máy tính. Các bạn lưu ý cần phải cài đặt python phiên bản mới nhất thì mới có thể sử dụng được phần mềm này. Sapo sẽ hướng dẫn cụ thể các bước để tải và sử dụng công cụ này dưới đây.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 1&lt;/strong&gt;: Đầu tiên, bạn hãy ấn vào đường&lt;a href=&quot;https://www.fshare.vn/file/8M7T9IJUFAXI?token=1645674432&quot;&gt;link tải&lt;/a&gt;này để tải TikTok Viewer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 2&lt;/strong&gt;: Bạn bắt đầu giải nén ứng dụng.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 3&lt;/strong&gt;: Bấm tổ hợp phím&lt;strong&gt;Windows + R&lt;/strong&gt;và nhập&lt;strong&gt;CMD&lt;/strong&gt;vào ô open để mở command prompt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 4&lt;/strong&gt;: Khi cửa sổ command prompt xuất hiện, bạn trỏ đến file mà mình vừa giải nén ở bước 1.&lt;/p&gt;
&lt;p&gt;Sau khi nhập xong, bạn cách xuống dòng và nhập thêm dòng lệnh&lt;strong&gt;pip install -r requirements.txt&lt;/strong&gt;vào cửa sổ CMD để thực hiện module hỗ trợ cho tool.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 5&lt;/strong&gt;: Sau đó, bạn vào thư mục của tool Tiktok và nhấn chạy file&lt;strong&gt;chromedriver&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Sau khi thao tác xong, bạn hãy quay lại cửa sổ CMD và thực hiện nhập lệnh&lt;strong&gt;py tiktoktool.py&lt;/strong&gt;để kích hoạt công cụ hack view TikTok.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bước 6&lt;/strong&gt;: Giao diện sẽ hiện ra ba sự lựa chọn cho bạn là tăng view, tăng like và tăng follow như hình dưới.&lt;/p&gt;
&lt;p&gt;Để tăng view TikTok, bạn chọn số 1 và dán link video muốn tăng lượt xem ở bên dưới.&lt;/p&gt;
&lt;p&gt;Việc cuối cùng cần làm chỉ là xác nhận lại với mã captcha. Sau đó, bạn đợi một khoảng thời gian để phần mềm tăng view TikTok cho bạn. TikTok Viewer không giới hạn lượt view, bạn càng đợi lâu thì số view của bạn càng được nhiều. Sau thời gian chờ đợi, bạn hãy tắt tab đi và thực hiện lại với các video khác nhé.&lt;/p&gt;
&lt;p&gt;Trên đây là top 3 công cụ tăng view TikTok hiệu quả mà Sapo muốn giới thiệu tới các nhà bán hàng. Ngoài ra, để có thể đạt được hiệu quả cao hơn trong việc tăng view TikTok, bạn hãy tham khảo thêm bài viết&lt;a href=&quot;https://www.sapo.vn/blog/cach-quay-tik-tok&quot;&gt;Cách quay Tik Tok hay và đẹp ảo diệu để bán hàng giúp hút triệu view&lt;/a&gt;để tìm hiểu thêm cách quay video TikTok sao cho thật chuyên nghiệp và thu hút người xem nhé.&lt;/p&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;/h2&gt;
&lt;h2&gt;&lt;/h2&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Thu, 02 May 2024 00:00:00 GMT</pubDate></item><item><title>Check If a JavaScript File Is Already Included</title><link>https://jangkeyte.github.io/blog/check-javascript-already-included/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/check-javascript-already-included/</guid><description>A simple JavaScript snippet to detect whether a script has already been loaded on the page.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/check-javascript-already-included/&quot;&gt;https://jangkeyte.github.io/blog/check-javascript-already-included/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;A simple JavaScript snippet to detect whether a script has already been loaded on the page.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/02/21/check-file-javascript-da-include-chua/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Check If a JavaScript File Is Already Included&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;function isScriptAlreadyIncluded(src){
    var scripts = document.getElementsByTagName(&amp;quot;script&amp;quot;);
    for(var i = 0; i &amp;lt; scripts.length; i++)
       if(scripts[i].getAttribute(&amp;#39;src&amp;#39;) == src) return true;
    return false;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/02/21/check-file-javascript-da-include-chua/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function isScriptAlreadyIncluded(src){
    var scripts = document.getElementsByTagName(&amp;quot;script&amp;quot;);
    for(var i = 0; i &amp;lt; scripts.length; i++)
       if(scripts[i].getAttribute(&amp;#39;src&amp;#39;) == src) return true;
    return false;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Wed, 21 Feb 2024 00:00:00 GMT</pubDate></item><item><title>Disable a Website After a Deadline</title><link>https://jangkeyte.github.io/blog/disable-website-by-deadline/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/disable-website-by-deadline/</guid><description>Use JavaScript to automatically disable or redirect a website when a time limit is reached.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/disable-website-by-deadline/&quot;&gt;https://jangkeyte.github.io/blog/disable-website-by-deadline/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Use JavaScript to automatically disable or redirect a website when a time limit is reached.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/01/27/vo-hieu-hoa-website-theo-thoi-gian/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Disable a Website After a Deadline&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// Next time use letsdeel.com to make sure you get paid

(function(){

	/* change these variables as you wish */

	var due_date = new Date(&amp;#39;2017-02-27&amp;#39;);

	var days_deadline = 60;

	/* stop changing here */



	var current_date = new Date();

	var utc1 = Date.UTC(due_date.getFullYear(), due_date.getMonth(), due_date.getDate());

	var utc2 = Date.UTC(current_date.getFullYear(), current_date.getMonth(), current_date.getDate());

	var days = Math.floor((utc2 - utc1) / (1000 * 60 * 60 * 24));



	if(days &amp;gt; 0) {

		var days_late = days_deadline-days;

		var opacity = (days_late*100/days_deadline)/100;

			opacity = (opacity &amp;lt; 0) ? 0 : opacity;

			opacity = (opacity &amp;gt; 1) ? 1 : opacity;

		if(opacity &amp;gt;= 0 &amp;amp;&amp;amp; opacity &amp;lt;= 1) {

			document.getElementsByTagName(&amp;quot;BODY&amp;quot;)[0].style.opacity = opacity;

		}



	}



})()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2024/01/27/vo-hieu-hoa-website-theo-thoi-gian/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Next time use letsdeel.com to make sure you get paid

(function(){

	/* change these variables as you wish */

	var due_date = new Date(&amp;#39;2017-02-27&amp;#39;);

	var days_deadline = 60;

	/* stop changing here */



	var current_date = new Date();

	var utc1 = Date.UTC(due_date.getFullYear(), due_date.getMonth(), due_date.getDate());

	var utc2 = Date.UTC(current_date.getFullYear(), current_date.getMonth(), current_date.getDate());

	var days = Math.floor((utc2 - utc1) / (1000 * 60 * 60 * 24));



	if(days &amp;gt; 0) {

		var days_late = days_deadline-days;

		var opacity = (days_late*100/days_deadline)/100;

			opacity = (opacity &amp;lt; 0) ? 0 : opacity;

			opacity = (opacity &amp;gt; 1) ? 1 : opacity;

		if(opacity &amp;gt;= 0 &amp;amp;&amp;amp; opacity &amp;lt;= 1) {

			document.getElementsByTagName(&amp;quot;BODY&amp;quot;)[0].style.opacity = opacity;

		}



	}



})()
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 27 Jan 2024 00:00:00 GMT</pubDate></item><item><title>Replace Hardcoded WordPress Caption Shortcode with HTML5</title><link>https://jangkeyte.github.io/blog/wordpress-caption-shortcode-html5/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/wordpress-caption-shortcode-html5/</guid><description>Modernize WordPress image captions by replacing legacy shortcode output with semantic HTML5.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/wordpress-caption-shortcode-html5/&quot;&gt;https://jangkeyte.github.io/blog/wordpress-caption-shortcode-html5/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Modernize WordPress image captions by replacing legacy shortcode output with semantic HTML5.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/31/thay-code-cung-shortcode-caption-trong-wordpress/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Replace Hardcoded WordPress Caption Shortcode with HTML5&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;add_filter(&amp;#39;img_caption_shortcode&amp;#39;, &amp;#39;jangkeyte_img_caption_shortcode_filter&amp;#39;,10,3);
/**
 * Filter to replace the [caption] shortcode text with HTML5 compliant code
 *
 * @return text HTML content describing embedded figure
 **/
if (! function_exists(&amp;#39;jangkeyte_img_caption_shortcode_filter&amp;#39;)) {
    function jangkeyte_img_caption_shortcode_filter($val, $attr, $content = null)
    {
        extract(shortcode_atts(array(
            &amp;#39;id&amp;#39;    =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;align&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;width&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;caption&amp;#39; =&amp;gt; &amp;#39;&amp;#39;
        ), $attr));

        if ( 1 &amp;gt; (int) $width || empty($caption) )
            return $val;

        $capid = &amp;#39;&amp;#39;;
        if ( $id ) {
            $id = esc_attr($id);
            $capid = &amp;#39;id=&amp;quot;figcaption_&amp;#39;. $id . &amp;#39;&amp;quot; &amp;#39;;
            $id = &amp;#39;id=&amp;quot;&amp;#39; . $id . &amp;#39;&amp;quot; aria-labelledby=&amp;quot;figcaption_&amp;#39; . $id . &amp;#39;&amp;quot; &amp;#39;;
        }

        return &amp;#39;&amp;lt;figure &amp;#39; . $id . &amp;#39;class=&amp;quot;wp-caption &amp;#39; . esc_attr($align) . &amp;#39;&amp;quot; &amp;gt;&amp;#39; . do_shortcode( $content ) . &amp;#39;&amp;lt;figcaption &amp;#39; . $capid . &amp;#39;class=&amp;quot;wp-caption-text text-center&amp;quot;&amp;gt;&amp;#39; . $caption . &amp;#39;&amp;lt;/figcaption&amp;gt;&amp;lt;/figure&amp;gt;&amp;#39;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.wp-caption {
/* Force the box to be 100% */
width: 100% !important;
}

#content .wp-caption a img {
/* Scale down if too big */
max-width: 99.03225806%; /* 614/620 */
height: auto;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/31/thay-code-cung-shortcode-caption-trong-wordpress/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Dùng filter trong function&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;add_filter(&amp;#39;img_caption_shortcode&amp;#39;, &amp;#39;jangkeyte_img_caption_shortcode_filter&amp;#39;,10,3);
/**
 * Filter to replace the [caption] shortcode text with HTML5 compliant code
 *
 * @return text HTML content describing embedded figure
 **/
if (! function_exists(&amp;#39;jangkeyte_img_caption_shortcode_filter&amp;#39;)) {
    function jangkeyte_img_caption_shortcode_filter($val, $attr, $content = null)
    {
        extract(shortcode_atts(array(
            &amp;#39;id&amp;#39;    =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;align&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;width&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,
            &amp;#39;caption&amp;#39; =&amp;gt; &amp;#39;&amp;#39;
        ), $attr));

        if ( 1 &amp;gt; (int) $width || empty($caption) )
            return $val;

        $capid = &amp;#39;&amp;#39;;
        if ( $id ) {
            $id = esc_attr($id);
            $capid = &amp;#39;id=&amp;quot;figcaption_&amp;#39;. $id . &amp;#39;&amp;quot; &amp;#39;;
            $id = &amp;#39;id=&amp;quot;&amp;#39; . $id . &amp;#39;&amp;quot; aria-labelledby=&amp;quot;figcaption_&amp;#39; . $id . &amp;#39;&amp;quot; &amp;#39;;
        }

        return &amp;#39;&amp;lt;figure &amp;#39; . $id . &amp;#39;class=&amp;quot;wp-caption &amp;#39; . esc_attr($align) . &amp;#39;&amp;quot; &amp;gt;&amp;#39; . do_shortcode( $content ) . &amp;#39;&amp;lt;figcaption &amp;#39; . $capid . &amp;#39;class=&amp;quot;wp-caption-text text-center&amp;quot;&amp;gt;&amp;#39; . $caption . &amp;#39;&amp;lt;/figcaption&amp;gt;&amp;lt;/figure&amp;gt;&amp;#39;;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hoặc dùng CSS canh chỉnh style&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.wp-caption {
/* Force the box to be 100% */
width: 100% !important;
}

#content .wp-caption a img {
/* Scale down if too big */
max-width: 99.03225806%; /* 614/620 */
height: auto;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Tue, 31 Oct 2023 00:00:00 GMT</pubDate></item><item><title>Two Keywords to Understand and Solve Any Life Problem</title><link>https://jangkeyte.github.io/blog/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/</guid><description>A mindset framework using two key concepts to get to the root cause of problems.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/&quot;&gt;https://jangkeyte.github.io/blog/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;A mindset framework using two key concepts to get to the root cause of problems.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Two Keywords to Understand and Solve Any Life Problem&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/2-tu-khoa-de-hieu-va-giai-quyet-tan-goc-moi-van-de-trong-cuoc-song/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;(1) “Dính” và “Tách”&lt;/p&gt;
&lt;p&gt;Đây là hai từ khóa để hiểu và giải quyết tận gốc mọi vấn đề xảy ra trong cuộc sống.&lt;/p&gt;
&lt;p&gt;Bản chất cuộc sống này chỉ đơn giản là một chuỗi các vấn đề liên tục xảy ra từ khi sinh ra cho đến khi đăng xuất.&lt;/p&gt;
&lt;p&gt;Khoan gán nhãn cho vấn đề là xấu hay tốt. Nó là những sự kiện xảy ra xung quanh cuộc sống cá nhân của bạn.&lt;/p&gt;
&lt;p&gt;Đừng xù lông lên với vấn đề, vì hết vấn đề là hết trải nghiệm sống.&lt;/p&gt;
&lt;p&gt;Tin vui là đời vẫn luôn sòng phẳng. Vấn đề là thứ ai hay thứ gì trên đời cũng liên tục và luôn luôn gặp phải. Thế nên ít nhất bạn cũng nên hiểu rằng dù có gặp bao nhiêu vấn đề và lớn đến cỡ nào thì bạn cũng không hề thiệt thòi chút nào cả…&lt;/p&gt;
&lt;p&gt;(2) Không chắc bạn có nhận ra không nhưng bài viết này thực sự sẽ là món quà lớn cho những ai thực sự muốn hiểu. Chỉ hai từ khóa này thôi, bạn có thể hiểu đến tận gốc sự thật về vấn đề và cách để chơi với nó.&lt;/p&gt;
&lt;p&gt;Không có khó khăn hay nỗi khổ nào nằm trong hai chữ “vấn đề” cả. Vấn đề sẽ chỉ có cơ hội tạo ra sự khó chịu khi bạn vô tình hãy cố ý “dính” vào nó.&lt;/p&gt;
&lt;p&gt;Xin nhấn mạnh lại, bản chất của vấn đề chỉ là một sự kiện nào đó xảy ra ở bên ngoài bạn, nó hoàn toàn vô hại. Và nó lập tức trở nên có hại khi bạn đồng hóa bản thân với nó, dính chặt vào nó. Bạn tưởng mình là nó hoặc phải chịu trách nhiệm với nó… Một loạt cách bịa đặt để hợp lý hóa việc ôm nó vào lòng.&lt;/p&gt;
&lt;p&gt;Và cách để chơi với vấn đề nằm gọn ở từ khóa thứ hai, đó là “tách”.&lt;/p&gt;
&lt;p&gt;Vấn đề là vấn đề, bạn là bạn. Sự thật rõ như ban ngày nhưng thật khó để nhận ra với những tâm trí đã quá quen với suy diễn…&lt;/p&gt;
&lt;p&gt;(3) Công việc gặp vướng mắc à? Ừ thì nó mắc, bạn muốn giải quyết nó không? Nếu có thì xắn tay lên giải quyết nó. Chắc chắn chỉ xảy ra hai trường hợp, bạn giải quyết được nó hoặc không. Chỉ thế thôi, đừng suy diễn thêm rằng giải quyết được thì mới vui, còn không được thì nên buồn.&lt;/p&gt;
&lt;p&gt;Vợ chồng cãi cọ – chỉ là một vở kịch nhỏ thôi mà. Tận dụng ngay hai từ khóa này để thí nghiệm xem. Bạn sẽ có lúc giật mình tỉnh táo.&lt;/p&gt;
&lt;p&gt;Bạn phát hiện mình đang “dính” và bạn thử “tách”. Trả lại vấn đề cho vấn đề, trả lại bạn cho chính bạn. Những khoảnh khắc sáng suốt đột ngột ấy sẽ ngày một nhiều lên…&lt;/p&gt;
&lt;p&gt;(4) Đủ lâu bạn sẽ cảm nhận được một chiếc công tắc kỳ diệu ở trong mình: dính – tách, lại dính rồi lại tách.&lt;/p&gt;
&lt;p&gt;Nhận thức nó, thực tập nó, không cần tin mình. Tự cảm nhận sự hiệu quả và năng lực kiểm soát để trải nghiệm cuộc sống thú vị này theo cách của bạn.&lt;/p&gt;
&lt;p&gt;Hiểu đến gốc rễ tạo ra sự chủ động, chủ động chọn ra vào, dính tách một cách tỉnh táo sẽ dễ dàng tạo ra sự thư giãn và dễ chịu vô cùng.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Thu, 05 Oct 2023 00:00:00 GMT</pubDate></item><item><title>The Dangerous Confusion Between Growth and Efficiency</title><link>https://jangkeyte.github.io/blog/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/</guid><description>Why conflating personal development with productivity can lead to burnout and wrong priorities.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/&quot;&gt;https://jangkeyte.github.io/blog/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Why conflating personal development with productivity can lead to burnout and wrong priorities.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;The Dangerous Confusion Between Growth and Efficiency&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/hieu-lam-tai-hai-giua-phat-trien-va-hieu-qua/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Hiểu lầm tai hại giữa “phát triển” và “hiệu quả”…&lt;/p&gt;
&lt;p&gt;Quá nhiều luận điểm kiểu: Không cạnh tranh làm sao phát triển? Không ganh đua thì làm gì có động lức phấn đấu… Thoạt nghe có vẻ rất lọt tai. Nghe sơ sơ cũng dễ gật gù thuyết phục nhưng đào hẳn xuống thì phầm chìm to vật vã và nói lên điều khác hẳn. Rằng rất nhiều người đang hiểu lầm “công cụ” thành “mục đích”.&lt;/p&gt;
&lt;p&gt;Công cụ chỉ tốt khi đưa chúng ta đến mong muốn cuối cùng!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;&quot;&gt;&lt;/a&gt;Chúng ta luôn có thể chọn hợp tác thay vì cạnh tranh, chúng ta cũng luôn có quyền chọn cùng tiến lên thay vì trèo lên nhau để tiến. Chúng ta hoàn toàn có thể chọn những cuộc chạy đua vì sức khỏe thay vì thành tích. Lao động để tận hưởng sự dễ chịu của việc vận động thay vì để chứng minh tao là thằng chịu thương chịu khó.&lt;/p&gt;
&lt;p&gt;Để ý thử xem, xung quanh bạn đầy rẫy những người đang núp bóng phát triển để ganh đua, trong khi thứ mang về trong hầu hết những cuộc đua phát triển là sự mệt mỏi và ham muốn không hồi kết. Mà cách đích cuối cùng của động cơ là sự dễ chịu trong tâm hồn thì bị quên lãng. Triệu chứng khỏi cần thống kê và quá dễ thấy là mức độ căng thẳng, vật lộn với cuộc sống có vẻ đang tỷ lệ thuận với sự phát triển theo cách hiểu thông thường.&lt;/p&gt;
&lt;p&gt;Mình chưa bao giờ phủ nhận việc phát triển nhưng núp bóng nó để ganh đua và cổ xúy cho sự so sánh tiêu cực kiểu phân tầng lớp, cạnh tranh, vượt lên trên người khác thì chắc chắn không mang lại hiệu quả.&lt;/p&gt;
&lt;p&gt;Vẫn là trò cũ rích mà mình đã nói ở tập “bẫy đóng khung và lựa chọn”. Rõ ràng bạn luôn có quyền phát triển mà không cần phải hơn thua. Bạn cũng luôn có quyền tiến lên liên tục mà không quan tậm đến kẻ nào đang ở trước hay đằng sau bạn. Cứ phát triển thoải mái, phát triển hết khả năng bạn có để tận hưởng cuộc sống này!&lt;/p&gt;
&lt;p&gt;Lý thuyết cạnh tranh hay ganh đua để phát triển chỉ là trò bịp của định kiến.&lt;/p&gt;
&lt;p&gt;Phá cái khung ra và chọn điều bạn muốn. Sự cải thiện lập tức về mặt cảm xúc sẽ là điểm tựa đáng tin nhất để bạn biết mình đang sống khôn ngoan.&lt;/p&gt;
&lt;p&gt;Họ đi lùi mà dễ chịu bền vững thì họ đúng. Bạn phát triển và thăng hạng ào ào trong những cuộc tranh đua mà không thấy vui vẻ thì bạn sai. Còn ai đó vừa sáng tạo, vừa phát triển mạnh mẽ cả vật chất lẫn tinh thần, họ dễ chịu và thích thú với quá trình đó và không xâm phạm tự do của đối tượng khác thì tuyệt vời. Một sự phát triển tích cực và không núp bóng thứ gì tiêu cực cả.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Thu, 05 Oct 2023 00:00:00 GMT</pubDate></item><item><title>The Best Place to Practice Meditation</title><link>https://jangkeyte.github.io/blog/noi-ly-tuong-nhat-de-tu-tap/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/noi-ly-tuong-nhat-de-tu-tap/</guid><description>Reflections on finding the ideal environment for meditation and self-cultivation.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/noi-ly-tuong-nhat-de-tu-tap/&quot;&gt;https://jangkeyte.github.io/blog/noi-ly-tuong-nhat-de-tu-tap/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Reflections on finding the ideal environment for meditation and self-cultivation.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/noi-ly-tuong-nhat-de-tu-tap/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;The Best Place to Practice Meditation&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/10/05/noi-ly-tuong-nhat-de-tu-tap/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Nó hệt chuyện kho báu ở gầm giường mà đến cuối đời mới phát hiện…&lt;/p&gt;
&lt;p&gt;Cũng không ngoa khi ví von chúng ta đang ở thiên đàng mà cứ thích đóng kịch và nhập vai sống trong địa ng*c. Mình muốn nói đến chuyện tu tập.Đừng tôn giáo hóa, cũng đừng thuật ngữ hóa từ vựng này. Bản chất của việc tu tập chỉ đơn giản là thực hành một triết lý sống nào đó để tìm kiếm sự bình an, dễ chịu. Bạn có thích dùng từ này hay không, có hiểu hay cố tình không hiểu đi chăng nữa thì tất cả chúng ta đều đang tu tập. Chỉ là hệ thống niềm tin, định kiến khác nhau nên gần tám tỷ người là gần tám tỷ pháp khác nhau.Có người thì chọn tôn giáo để tu tập. Có những người thì thích sống theo tín ngưỡng. Không ít người chọn lối sống hướng tâm linh. Cũng phổ biến vô cùng nhóm người chỉ bám vào khoa học để làm động cơ cho hầu hết mọi quyết định của mình.Tất cả đều là những hình thức khác nhau của tu tập. Mục đích chung không có gì để bàn cãi đó là hướng tới sự dễ chịu trong lòng – tất cả chỉ là công cụ.Vấn đề là có quá nhiều trường phái, quá nhiều tư tưởng, quá nhiều pháp tu khiến những người thực sự bắt đầu dằn vặt bản thân về triết lý sống cảm thấy mông lung, rối bời.Lăn lộn với đời thì thấy bon chen vất vả. Buông bỏ lên núi thì sợ nhàm chán chả còn gì vui. Tin Chúa nhưng đôi khi lại thấy thuyết phục bởi một quan điểm Phật giáo, theo Phật lâu rồi nhiều lúc lại giật mình bởi lý thuyết logic của một triết gia.Ngàn lần thì mình vẫn phải nhấn mạnh lại rằng đúng – sai là trò nghịch ngợm. Thứ duy nhất, đáng tin nhất và quan trọng nhất bạn cần bám vào phải là hiệu quả về mặt cảm xúc cá nhân. Mọi lời khẳng định từ một đối tượng khác đều chỉ để tham khảo.Nếu hướng đi nào khiến cảm xúc tích cực của bạn được cải thiện rõ rệt và bền vững thì con đường đó thuộc về bạn. Còn càng đi càng thấy tối tăm và mệt mỏi thì bạn nên biết mình phải quay đầu.Một sự thật rõ ràng là chúng ta được tạo hóa cho cơ thể này để trải nghiệm nhị nguyên thông qua các giác quan. Việc thả mình vào guồng quay của xã hội cùng những hoạt động phổ biến của đồng loại thực sự là cách khôn ngoan để tu tập.Đã là thực tập thì nơi có nhiều vấn đề để xử lý mới là nơi lý tưởng nhất để sớm trưởng thành!Buông bỏ để lên núi bạn nghĩ sẽ có gì nhiều để thực hành? Thả mình nhẹ tênh giữa xã hội xô bồ mới thực sự là kết quả thành công bền vững của một triết lý sống mạnh mẽ, hiệu quả.Có quá nhiều người chỉ thực sự dễ chịu và bình an khi thiền, khi đến chùa hoặc trong khóa lễ của các tôn giáo nhưng lại rất nhanh đánh mất sự bình an khi quay về cuộc sống thường ngày. Vì họ để cuộc sống cuốn đi, chứ chưa từng biết và thử dùng chính môi trường sống có quá nhiều bài tập hay để luyện tập.Đời là nơi lý tưởng để đi tìm lẽ sống và thử nghiệm liên tục xem lối sống bạn chọn đã thực sự hiệu quả!&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Thu, 05 Oct 2023 00:00:00 GMT</pubDate></item><item><title>How Should You Start a Business?</title><link>https://jangkeyte.github.io/blog/bat-dau-khoi-nghiep-kieu-gi-2/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/bat-dau-khoi-nghiep-kieu-gi-2/</guid><description>Practical thoughts on entrepreneurship — mindset, validation, and getting started.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/bat-dau-khoi-nghiep-kieu-gi-2/&quot;&gt;https://jangkeyte.github.io/blog/bat-dau-khoi-nghiep-kieu-gi-2/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Practical thoughts on entrepreneurship — mindset, validation, and getting started.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/29/bat-dau-khoi-nghiep-kieu-gi-2/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;How Should You Start a Business?&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/29/bat-dau-khoi-nghiep-kieu-gi-2/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Ghi chú: Không đọc bài này thì đừng mơ đến khởi nghiệp nhé, siêu hay và ý nghĩa – đáng giá triệu $!
“Tôi mất hơn 5 tiếng để nghĩ và viết cái note này, vì thế bạn đừng tiếc 5 phút ngồi đọc vì biết đâu 1 ngày nào đó bạn cũng sẽ mở công ty. Chắc chắn note này sẽ giúp bạn rất nhiều đấy”.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TS Alan Phan
Những gì tôi sắp viết bạn sẽ không thấy trong sách nào hay báo chí nào, mong rằng sau bài này sẽ có nhiều người cân nhắc cơ hội nghiệp của mình là khởi nghiệp. Vì những người viết báo khởi nghiệp không phải là những người khởi nghiệp, có phỏng vấn đại gia thì người ta cũng sẽ trả lời kiểu trả lời báo chí và những đại gia thường bận quá chẳng chịu viết. Nếu họ có viết sách thì khi đó họ đã quá thành công và không còn nhớ cái tâm trạng và hiểu biết của họ thời chập chững như nào nữa. Tôi nghĩ rằng bài này rất hợp với nhiều người vì tôi đang ở trong đúng cái chân núi đó, tiền không nhiều, mắc sai sót hàng ngày nhưng cũng có trải nghiệm và thành tựu nhất định.&lt;/li&gt;
&lt;li&gt;TẠI SAO TÔI LẠI ỦNG HỘ BẠN KHỞI NGHIỆP
Vì 1 nền kinh tế luôn cần có những người giải quyết những vấn đề ngổn ngang, luôn cần những sản phẩm dịch vụ mới. Khởi nghiệp thì tất cả thời gian là của bạn, thích làm lúc nào thì làm, bạn sẽ giàu, rất giàu, siêu siêu giàu nếu thành công. Nhưng chuyện không dễ như thế, bạn sẽ có thể mất nhiều tiền, tuyệt vọng, gia đình mắng chửi…
Tôi biết rất nhiều người khởi nghiệp nhưng không như ý và mất mát rất nhiều, nhưng qua đó họ đều trưởng thành hơn, không có gì là thất bại nếu như mình học được từ nó. Không có thất bại, tất cả chỉ là thử thách – tên 1 quyển sách rất nổi tiếng của chủ tịch HuynDai. Bạn chỉ cần đúng 1 tố chất là có thể trở thành doanh nhân được, đó là yêu thích giải quyết vấn đề, còn lại mọi thứ khác đều học và luyện tập được bằng ý chí và quyết tâm.
Có thể bạn không biết chứ 1 người làm chủ như xôi Yến (1 cửa hàng xôi gần hồ Gươm, trên đường Nguyễn Hữu Huân) 1 tháng cũg phải bỏ túi 4-500 triệu đồng tiền lãi. Hoặc 1 chị học FTU chỉ mới K44-1987 mà đã tự mua được 1 cái nhà trên Kim Mã 5 Tỉ nhờ mở Take One. Anh Điệp -CEO Vật Giá sinh năm 1979-FTU K36- tài sản giờ cũng tầm vài trăm tỉ và còn rất nhiều thành phần đại gia âm thầm khác…
Thế giới của những người khởi nghiệp thường không được nhiều người biết đến vì không có trường nào dạy, cũng không bao giờ được in trong quyển Những Điều Cần Biết về Tuyển Sinh. Đại học là dạy nghề để làm thuê. Các phụ huynh thì luôn muốn con mình “ổn định”, nhưng sự thật là nghèo ổn định, biết bao giờ mới mua được cái nhà cái xế hộp ở Hà Nội chật chội này đây.&lt;/li&gt;
&lt;li&gt;DOANH NHÂN KHỞI NGHIỆP LÀ NHƯ THẾ NÀO
Để làm 1 cái gì đó thành công thì mình phải thật rõ cái hình ảnh mà mình muốn trở thành. Doanh nhân không phải là người có nhiều tiền, được gọi là doanh nhân có từ “nhân” đằng sau thì họ phải theo 1 cái gì đó lớn hơn chính sự thoả mãn giàu sang của bản thân. Khởi nghiệp là để thoả mãn ước mơ, đam mê và vì những gì xung quanh xã hội mình đang sống. Cái tên của họ vẫn còn mãi sau khi họ chết đi, điều đó mới thực sự đáng mơ ước. Họ luôn cân nhắc môi trường và lợi ích của người tiêu dùng với từng sản phẩm và dịch vụ của họ. Làm ra tiền bằng mọi cách chính đáng chứ không phải bằng mọi giá.&lt;/li&gt;
&lt;li&gt;CẦN CHUẨN BỊ GÌ ĐỂ KHỞI NGHIỆP
Vượt qua rào cản tâm lý để bắt đầu:
Người Việt Nam không có thói quen chào đón với thất bại, họ không muốn con mình làm 1 cái gì đó mạo hiểm và họ sẽ bằng mọi cách ngăn cản. Gia đình thường muốn con mình “tập trung học” mà không biết rằng trường đại học cũng chẳng dạy gì giúp cho nghề nghiệp nhiều. Bạn phải “tập” cho bố mẹ quen với việc không thể can thiệp được tương lai con mình nữa, xác định cho gia đình biết trước là khởi nghiệp sẽ có thể mất tiền và mất nhiều thứ vì thế không nên dầy vò con khi ngã và hãy để cho con ngã vài lần con sẽ tự đứng lên đi tiếp (Cách tốt hơn là đừng cho bố mẹ biết).
Rào cản tiếp theo là giới hạn của chính bản thân các bạn. Bạn có 1 ý tưởng bạn cho là siêu phàm, bạn dành vài tháng để nghĩ về nó nhưng cũng chẳng dám làm gì với nó vì “ngại”, bạn quá thoải mái với vòng an toàn của mình, và bạn tự thuyết phục bản thân mình rằng là mình chưa đủ chín để thực thi ý tưỏng này. Để vượt được rào cản này thì bạn phải tập được cho mình thói quen luôn và ngay, nói theo ngôn ngữ trẻ hiện nay là “thích thì nhích”. Bằng mọi giá từ bỏ thói quen trì hoãn, nếu để tới mai thì sẽ còn ngày kia và tuần sau, tháng sau và không bao giờ nữa.
Còn về việc thiếu nguồn lực thì bạn nên biết rằng khởi nghiệp là lúc nào bạn cũng thiếu thốn nguồn lực, làm ít thiếu ít làm nhiều thiếu nhiều. Thời điểm tốt nhất là hôm nay chứ không phải ngày mai. Hành trình vạn dặm bắt đầu từ chỉ 1 bước đầu tiên, muốn tắm nước lạnh thì phải dội nước vào chân mình trước đã. Đúng là nếu muốn vấp ngã thì chỉ nên chọn lúc mình đang còn trẻ và sung sức để đứng dậy được, chẳng có thời gian nào tốt hơn thời gian sinh viên này đâu. Nghĩ nhiều mà không làm thì cũng giống như người làm mà không nghĩ.&lt;/li&gt;
&lt;li&gt;HỌC GÌ TRƯỚC TIÊN: Giao tiếp – Bán hàng
Bài học đầu tiên là phải biết quí trọng đồng tiền để thấy bố mẹ làm ra tiền vất vả như thế nào. Giao tiếp là kĩ năng sống còn để thành công, còn bán hàng là kĩ năng sống còn của doanh nhân. Hãy tham gia 1 công việc bán hàng nào đó mà cần mình phải vượt qua ngại ngùng nói trước đám đông và biết chấp nhận sự từ chối của người khác 1 cách vui vẻ, học được cái tinh thần không bỏ cuộc là cực kì quan trọng. Khi khởi nghiệp thì đích thân chủ cũng là người bán hàng, kế toán, quét dọn, sản xuất …
Bán hàng là 1 nghề vinh quang vì họ nuôi sống cả tổ chức, hãy luôn coi mỗi lần bán hàng là 1 thử thách mình cần chinh phục. Tập bán thật nhiều các loại hàng hoá có thể vào để hiểu được cách tiếp cận với khách hàng cá nhân và khách hàng tổ chức khác nhau như nào. Tôi còn nhớ có lần xách rượu cần tới từng phòng kí túc xá Xây Dựng hỏi bán hồi gần tết, phòng nào cũng thích lắm nhưng toàn đứa hết tiền chẳng thèm mua. )). Nghĩ lại hồi ấy thì cũng ngại ngùng thật. Bất kể việc bạn làm nó “chuối củ” đến đâu thì sau này vẫn luôn là 1 kỉ niệm đẹp, vì thế đừng ngại làm những thứ mình chưa bao giờ làm.&lt;/li&gt;
&lt;li&gt;BẮT ĐẦU KINH DOANH NHỎ
Khi đã “mặt dầy” thì hãy bắt đầu làm những việc mà cần mình phải bắt đầu làm 1 việc nào đó mà mình phải đứng mũi chịu sào lo toan toàn bộ. Nhớ câu thần chú “start small, really small”. Một số người thích kinh doanh và có 1 ý tưởng hay thường có 1 kiểu khởi nghiệp hài hước là dồn toàn bộ tiền của mình vào khởi nghiệp và làm cho nó thật hoành tráng tử tế. Họ đâu biết rằng 99,99% phi vụ kinh doanh đầu tay là sẽ thất bại. Không phải vì ý tưỏng tồi mà do khả năng thực thi của họ không tốt. Làm 1 vài phi vụ kinh doanh nhỏ sẽ dạy cho bạn những bài học rất ngấm về tiếp thị, vận chuyển hậu cần (logistic), chọn địa điểm (location), trang trí, bán hàng, đàm phán, mua hàng, chuẩn bị và lập kế hoạch, giữ được tinh thần chiến đấu không bỏ cuộc…
Học bơi thì phải uống chục lít nước trong bể mới thành được, chỉ đọc sách không làm bạn trở thành doanh nhân, phải đích thân xông pha. Street-smart là cực kì quan trọng, cũng quan trọng như book-smart vậy (xin lỗi vì phải dùng thuật ngữ tiếng Anh vì tiếng Việt diễn giải rất dài).
Nhiều giảng viên môn kinh doanh của đại học Việt Nam tệ là vì họ không gần doanh nghiệp, những gì họ dạy thường từ sách, và số ít họ là kinh doanh 1 cái gì đó thực sự nên đừng trông chờ gì từ nên giáo dục đại học mà khởi nghiệp. Bạn học về “chiến lược”, “thương hiệu”… toàn là thứ dùng cho doanh nghiệp lớn. Doanh nghiệp khởi sự thì cái cần dùng khác sách giáo trình rất rất nhiều. Bạn có thể bắt đầu nhỏ như bán hoa 8/3, to hơn có thể mua quần áo về bán online…và nên bắt đầu bằng 1 nhóm vài người chứ không nên làm 1 mình để học cách làm việc nhóm nữa.
Một phần rất quan trọng là phải bắt đầu xây cho mình 1 hệ sinh thái khởi nghiệp. Không nên nghe lời, không nên ở gần những người có tư tưởng ổn định và an nhàn, họ sẽ cố dìm bạn xuống cho “ổn định” được như họ, họ sẽ nói cả ngàn lí do rằng bạn sẽ không thành công và ý tưởng của bạn không đáng giá. Tìm những người bạn muốn khởi nghiệp và những anh chị đã khởi nghiệp để học hỏi. Chỉ có những người khởi nghiệp mới nâng đỡ và mang lại niềm vui cho nhau lúc trái gió giở trời.
Bên cạnh họ bạn sẽ thấy khó khăn nhẹ đi và thử thách sẽ trở nên thú vị hơn. Có những bài học không cần phải trả giá vẫn học được. Và không có người hướng dẫn thì bạn sẽ đi rất chậm. Đợi khi ra trường có công việc “ổn định” và thu nhập mới khởi nghiệp? Không. Bạn chẳng cần kinh nghiệm từ các tập đoàn bằng khả năng xoay sở của bạn kià.
Đọc sách, đọc nhiều sách về kinh doanh và khởi nghiệp. Tôi đọc và nghe audiobook cũng phải 3-400 quyển. Gần như tất cả những gì tôi làm và định làm là sách đã mang cho tôi ý tưởng hết cả rồi. Các doanh nhân tỉ đô cũng đọc cực kì nhiều sách. Sinh viên chỉ hay chăm đọc k14, những từ mà người ta đọc nhiều nhất chắc là “lộ hàng”, “hiếp dâm”, “chân dài”… 1 tháng hãy đọc lấy 1 quyển sách, giảm thời gian đọc những thứ giải trí và chỉ thoả mãn trí tò mò.&lt;/li&gt;
&lt;li&gt;KINH DOANH THẬT SỰ
Thời điểm bạn đã có 1 ý tưởng tiềm năng đã đến và bạn muốn bắt tay vào làm cho nó thành 1 gia tài . Lúc này là tiền thật và người thật, không còn mang tính lướt sóng như trước nữa. Vì không biết được những điều sắp tới này nên rất nhiều bạn trẻ đã phá sản trong tức tưởi và tiếc nuối. Hãy tự viết nó lên tường và nhắc mình không được quên.
Oh yeah! Ý tưởng của mình trị giá cả triệu đô ấy chứ!
Luôn bắt đầu kinh doanh bằng việc thử nghiệm sức sống của ý tưởng trước. Bắt buộc. Bạn có ý tưởng làm đồ ăn chay giao tận nhà thì đừng vội mua đồ đạc bàn ghế đầu tư website vội. Hãy thử xem thị trường của bạn rộng đến mức nào và khả năng cung ứng của bạn đến mức nào. Làm thử 1 cái blog, quảng cáo quanh khu văn phòng mình, tự nấu nướng tại nhà và giao đi. Từ ý tưởng đến thực tế là 1 câu chuyện hoàn toàn khác, thị trường có thể không lớn như bạn nghĩ đâu. Chưa gì đã mua rất nhiều đồ đạc, thuê nhà cửa thì bạn sẽ có thể lãng phí rất nhiều.
Khởi nghiệp là để xây dựng gia tài, chứ không phải là để chứng tỏ bạn thông minh nhường nào. Lập kế hoạch và luôn tính toán từ trước. Rủi ro là đương nhiên nhưng tính sao cho bạn không quá đau thương khi vấp ngã, vẫn còn chí hướng để làm tiếp. Nhiều người ngã quá đau nên cứ nghĩ lại là thấy sợ.
Nên nhớ rằng ý tưởng rất rẻ, quan trọng là thực thi. Nokia ngày xưa là công ty làm bột gỗ, Deawoo là 1 xưởng dệt may… Ý tưởng gì không quan trọng bằng khả năng thực thi của bạn lớn như nào. Có 1 công ty ở Mỹ trị giá tới 6 tỉ đô chỉ đơn giản là làm gấu bông theo đơn đặt hàng, khách hàng được tự tay khâu gấu. Theo 1 lời khuyên của 1 lão làng là chỉ nên khởi nghiệp với 1 ý tưởng cũ và mình làm tốt hơn, mình là có thể có lãi, mình đáp ứng 1 loại khách hàng tốt hơn sẽ đảm bảo khả năng thành công cao hơn nhiều. Đừng “quyết chiến” với 1 ý tưởng mà chưa từng tồn tại trên thế giới bao giờ, khả năng thất bại sẽ rất cao.&lt;/li&gt;
&lt;li&gt;TIỀN
Máu của doanh nghiệp, và thường là doanh nghiệp chết vì hết tiền. Do đó khi bắt đầu bạn phải tìm mọi cách và mọi giá để tiết kiệm tiền đầu tư vào doanh nghiệp. Thường chi phí sẽ bị đội lên gấp 3-4 lần so với cái bản nháp 1 trang “kế hoạch kinh doanh” của bạn. Phải chi li và tính sao cho mình đủ tiền 1 năm, đừng trông chờ là làm 3-4 tháng có doanh thu sẽ bù để làm tiếp. Mua sắm đồ cũ, tăng xin, dùng phần mềm nguồn mở, web tự đi nhờ viết, logo search google rồi tùy biến chẳng hạn .
Đồ cũ mình mua mà bán lại thì cũng được gần như giá trị lúc mua về nên bạn sẽ vẫn giữ được rất nhiều tiền còn lại, còn tiền là còn bày keo khác được. Hết tiền là bạn sẽ rất khó xin hoặc vay ai khác nữa lắm. Có 1 điều lầm tưởng là khởi nghiệp cần phải rất nhiều tiền nhưng thực tế là cần khả năng xoay tiền của bạn hơn. Dù thế nào thì bạn cũng chẳng bao giờ đủ tiền để làm doanh nghiệp đầu tay đâu, càng làm càng thiếu. Và khởi nghiệp nên dùng tiền của chính mình chứ không phải tiền bố mẹ cho để đảm bảo từng quyết định dùng người, từng quyết định mua sắm của mình là chính xác.&lt;/li&gt;
&lt;li&gt;NGƯỜI
Chỉ nên khởi nghiệp với đội ngũ sáng lập không quá 2 người làm điều hành. Người thứ 3 thể nào làm cho mâu thuẫn. Các bạn thử điểm các công ty lớn mà thành công chúng ta biết đều 2 người hoặc 1 người. Google là Sergey Brin và Larry Page, Apple là 2 bác Steve, Microsoft là Bill Gate và Paul Allen (Steve Balmer là vào để điều hành giúp thôi chứ không phải cùng khởi sự). Sai sót về tuyển người có thể kết liễu doanh nghiệp của bạn, hãy chọn cho team mình những người nào họ không làm việc vì tiền mà làm vì yêu ý tưởng.
Chọn những người mình yêu quí được và chơi được để khó khăn còn thông cảm được cho nhau. Chỉ chọn những người nào có tiềm năng gắn bó lâu dài với doanh nghiệp của mình. Hãy đối xử với nhân viên thật tốt như anh em, vì họ là những người mình gặp nhiều, quyết định chất lượng cuộc sống của mình mà. Chỉ có những người như thế mới làm cho lúc khó khăn và nản trở nên dễ dàng hơn. Khởi nghiệp sẽ hứa hẹn rất nhiều sóng gió và khó khăn đấy.
Nuôi doanh nghiệp khởi sự cũng giống như nuôi 1 đứa trẻ sơ sinh, nó chỉ có mục tiêu là sống, có cái ăn và không mắc bệnh tật gì. Đừng cho nó ăn quá nhiều để cố gắng làm nó lớn thật nhanh. Tìm hiểu và áp dụng Lean StartUp (khởi nghiệp tinh gọn?). Tức là khách hàng cũng chính là 1 phần trong chu trình sản xuất và xây dựng sản phẩm. Như google docs là vừa làm vừa sửa liên tục theo yêu cầu khách hàng, còn Microsoft Word là 2 năm mới ra 1 lần thì lỗi phát hiện cũng không kịp sửa.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Nếu bạn đọc được đến tận dòng cuối cùng này mà vẫn thấy hấp dẫn thì có lẽ bạn có thể trở thành doanh nhân khởi nghiệp đấy. Với công sức tôi bỏ ra, tôi muốn giúp được nhiều người nhất có thể. Để công bằng, bạn like thì phải share lại cho càng nhiều người càng tốt nhé, lan toả tri thức nào.&lt;/h2&gt;
&lt;p&gt;Nguồn: TS. Alan Phan&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Fri, 29 Sep 2023 00:00:00 GMT</pubDate></item><item><title>Generate QR Codes Simply with Laravel</title><link>https://jangkeyte.github.io/blog/tao-ma-qr-code-don-gian-bang-laravel/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/tao-ma-qr-code-don-gian-bang-laravel/</guid><description>Build a QR code generator in Laravel using popular packages and clean API design.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/tao-ma-qr-code-don-gian-bang-laravel/&quot;&gt;https://jangkeyte.github.io/blog/tao-ma-qr-code-don-gian-bang-laravel/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Build a QR code generator in Laravel using popular packages and clean API design.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/25/tao-ma-qr-code-don-gian-bang-laravel/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Generate QR Codes Simply with Laravel&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;composer require simplesoftwareio/simple-qrcode
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;QrCode&amp;#39; =&amp;gt; SimpleSoftwareIO\QrCode\Facades\QrCode::class
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/25/tao-ma-qr-code-don-gian-bang-laravel/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Import package QR code&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;composer require simplesoftwareio/simple-qrcode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Đôi với Laravel &amp;lt;= 5.4 ta cấu hình Service Provider, trong file config/app.php ta đăng kí trong mảng providers&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;và thêm Aliases&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;QrCode&amp;#39; =&amp;gt; SimpleSoftwareIO\QrCode\Facades\QrCode::class
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;và trong mảng aliases&lt;/p&gt;
&lt;p&gt;Sau đó run&lt;code&gt;composer dumpautoload&lt;/code&gt;để reload lại composer auto load cache&lt;/p&gt;
&lt;h2&gt;Cách sử dụng cơ bản&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Bạn có thể tạo QR code nhanh chóng chứa chuối string bằng cách sử dụng method &lt;code&gt;QrCode::generate(&amp;quot;string&amp;quot;)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Thêm 1 qr-code route trong file routes/web.php để test:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Route::get(&amp;#39;qr-code&amp;#39;, function () {
    return QrCode::size(500)-&amp;gt;generate(&amp;#39;Welcome to jangkeyte.com!&amp;#39;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;size() method giúp chúng ta thay đổi size của QR code.&lt;/li&gt;
&lt;li&gt;truy cập route của bạn để xem kq(vd: localhost/qr-code). Bạn có thể scan QR code bằng smartphone và bạn sẽ nhìn thấy text được hiển thị&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hoặc bạn có thể hiển thị QR code trong laravel blade template:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{!! QrCode::generate(&amp;#39;Welcome to jangkeyte.com!&amp;#39;); !!}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Thay đổi màu của QR code&lt;/h2&gt;
&lt;p&gt;Bạn có thể dùng hai method color(red, green, blue) and backgroundColor(red, green, blue) để thay đổi màu nền và mã của QR code.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Route::get(&amp;#39;qr-code&amp;#39;, function () {
    return QrCode::backgroundColor(255, 255, 0)-&amp;gt;color(255, 0, 127)
                   -&amp;gt;size(500)-&amp;gt;generate(&amp;#39;Welcome to kerneldev.com!&amp;#39;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chú ý: nhiều bộ đọc khó khăn khi gặp QR code màu nên khuyên bạn nên dùng với phiên bản đen trắng mặt định nếu bạn muốn mã QR code của mình hoạt động hầu hết với các máy quét&lt;/p&gt;
&lt;h2&gt;Chèn image vào bên trong QR code&lt;/h2&gt;
&lt;p&gt;Bạn cũng có thể chèn một hình ảnh vào giữa QR code của mình bằng phương thức merge(‘filename.png’) và method này chỉ có thể chấp nhận các file .png và bạn cũng cần format response back png.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Route::get(&amp;#39;qr-code&amp;#39;, function () {
        $pngImage = QrCode::format(&amp;#39;png&amp;#39;)-&amp;gt;merge(&amp;#39;ss.png&amp;#39;, 0.3, true)
                        -&amp;gt;size(500)-&amp;gt;errorCorrection(&amp;#39;H&amp;#39;)
                        -&amp;gt;generate(&amp;#39;Welcome to kerneldev.com!&amp;#39;);

        return response($pngImage)-&amp;gt;header(&amp;#39;Content-type&amp;#39;,&amp;#39;image/png&amp;#39;);
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bạn cũng có thể render trong blade template như sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;img src=&amp;quot;data:image/png;base64, {!! base64_encode(QrCode::format(&amp;#39;png&amp;#39;)-&amp;gt;merge(&amp;#39;ss.png&amp;#39;, 0.3, true)-&amp;gt;size(500)-&amp;gt;errorCorrection(&amp;#39;H&amp;#39;)-&amp;gt;generate(&amp;#39;Welcome to jangkeyte.com!&amp;#39;)) !!} &amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chú ý: mặc định merge() function tìm kiếm file trong thư mục public nên hãy chắc rằng bạn đã để image ở đó&lt;/p&gt;
&lt;h2&gt;Encoding data đặc biệt trong QR code của bạn&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Email: Tự động điền địa chỉ email, chủ đề và nội dung của email.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;QrCode::email($to_address, $subject, $body);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ví dụ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//Specify email address, subject and the body
QrCode::email(&amp;#39;test@jangkeyte.com&amp;#39;, &amp;#39;Thank you for the QR code tutorial.&amp;#39;, &amp;#39;This was awesome!.&amp;#39;);

//Specify subject and the body, let user enter the to_address
QrCode::email(null, &amp;#39;Hi  there.&amp;#39;, &amp;#39;This is the message body.&amp;#39;);

//Specify just email address
QrCode::email(&amp;#39;test@jangkeyte.com&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Phone number: Mở ứng dụng điện thoại và quay số điện thoại được chỉ định.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QrCode::phoneNumber($number);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ví dụ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QrCode::phoneNumber(&amp;#39;776-004-1698&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SMS (Text messaege): Mở ứng dụng nhắn tin và điền số điện thoại hoặc nội dung tin nhắn.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QrCode::SMS($number, $message);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ví dụ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;//Specify just the phone number to send the message to
QrCode::SMS(&amp;#39;555-555-5555&amp;#39;);

//Specify phone number as well as the message
QrCode::SMS(&amp;#39;555-555-5555&amp;#39;, &amp;#39;Body of the message&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Geo co-ordinates: Hiển thị vị trí được chỉ định trong một ứng dụng map.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QrCode::geo($latitude, $longitude);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ví dụ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;QrCode::geo(13.3499, 74.798059);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bài viết được lấy từ nguồn:&lt;a href=&quot;https://kerneldev.com/qr-codes-in-laravel-complete-guide/&quot;&gt;https://kerneldev.com/qr-codes-in-laravel-complete-guide/&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Mon, 25 Sep 2023 00:00:00 GMT</pubDate></item><item><title>Build a Simple Sidebar with Bootstrap 5</title><link>https://jangkeyte.github.io/blog/tao-sidebar-don-gian-voi-bootstrap-5/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/tao-sidebar-don-gian-voi-bootstrap-5/</guid><description>Create a responsive collapsible sidebar layout using Bootstrap 5 components.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/tao-sidebar-don-gian-voi-bootstrap-5/&quot;&gt;https://jangkeyte.github.io/blog/tao-sidebar-don-gian-voi-bootstrap-5/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Create a responsive collapsible sidebar layout using Bootstrap 5 components.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/12/tao-sidebar-don-gian-voi-bootstrap-5/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Build a Simple Sidebar with Bootstrap 5&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;row flex-nowrap&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;col-auto px-0&amp;quot;&amp;gt;
            &amp;lt;div id=&amp;quot;sidebar&amp;quot; class=&amp;quot;collapse collapse-horizontal show border-end&amp;quot;&amp;gt;
                &amp;lt;div id=&amp;quot;sidebar-nav&amp;quot; class=&amp;quot;list-group border-0 rounded-0 text-sm-start min-vh-100&amp;quot;&amp;gt;
                    Nội dung sidebar
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;main class=&amp;quot;col ps-md-2 pt-2&amp;quot;&amp;gt;
            &amp;lt;a href=&amp;quot;#&amp;quot; data-bs-target=&amp;quot;#sidebar&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;border rounded-3 p-1 text-decoration-none&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;bi bi-list bi-lg py-2 p-1&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;div class=&amp;quot;page-header pt-3&amp;quot;&amp;gt;
                &amp;lt;h2&amp;gt;Bootstrap 5 Sidebar Menu - Simple&amp;lt;/h2&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;p class=&amp;quot;lead&amp;quot;&amp;gt;A offcanvas &amp;quot;push&amp;quot; vertical nav menu example.&amp;lt;/p&amp;gt;
            &amp;lt;hr&amp;gt;
            &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;col-12&amp;quot;&amp;gt;
                    Nội dung content
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ul class=&amp;quot;flex-column mb-sm-auto mb-0 align-items-center align-items-sm-start&amp;quot; id=&amp;quot;sidebar-menu&amp;quot;&amp;gt;
    &amp;lt;li class=&amp;quot;d-block w-100&amp;quot;&amp;gt;
        &amp;lt;a href=&amp;quot;#vespa-menu&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;nav-link px-0 align-middle &amp;quot;&amp;gt;
            &amp;lt;span class=&amp;quot;ms-1 d-none d-sm-inline fw-bold text-dark&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt;
        &amp;lt;/a&amp;gt;
        &amp;lt;ul class=&amp;quot;collapse nav flex-column ms-1 text-dark&amp;quot; id=&amp;quot;vespa-menu&amp;quot; data-bs-parent=&amp;quot;#sidebar-menu&amp;quot;&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; GTS&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; GTV&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; Primavera&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li class=&amp;quot;w-100&amp;quot;&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; Sprint&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;d-block w-100&amp;quot;&amp;gt;
        &amp;lt;a href=&amp;quot;#piaggio-menu&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;nav-link px-0 align-middle &amp;quot;&amp;gt;
            &amp;lt;span class=&amp;quot;ms-1 d-none d-sm-inline fw-bold text-dark&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt;
        &amp;lt;/a&amp;gt;
        &amp;lt;ul class=&amp;quot;collapse nav flex-column ms-1 text-dark&amp;quot; id=&amp;quot;piaggio-menu&amp;quot; data-bs-parent=&amp;quot;#sidebar-menu&amp;quot;&amp;gt;
            &amp;lt;li class=&amp;quot;w-100&amp;quot;&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt; Liberty&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt; Medley&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/09/12/tao-sidebar-don-gian-voi-bootstrap-5/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Tạo khung cho sidebar và content&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;container-fluid&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;row flex-nowrap&amp;quot;&amp;gt;
        &amp;lt;div class=&amp;quot;col-auto px-0&amp;quot;&amp;gt;
            &amp;lt;div id=&amp;quot;sidebar&amp;quot; class=&amp;quot;collapse collapse-horizontal show border-end&amp;quot;&amp;gt;
                &amp;lt;div id=&amp;quot;sidebar-nav&amp;quot; class=&amp;quot;list-group border-0 rounded-0 text-sm-start min-vh-100&amp;quot;&amp;gt;
                    Nội dung sidebar
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;main class=&amp;quot;col ps-md-2 pt-2&amp;quot;&amp;gt;
            &amp;lt;a href=&amp;quot;#&amp;quot; data-bs-target=&amp;quot;#sidebar&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;border rounded-3 p-1 text-decoration-none&amp;quot;&amp;gt;&amp;lt;i class=&amp;quot;bi bi-list bi-lg py-2 p-1&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/a&amp;gt;
            &amp;lt;div class=&amp;quot;page-header pt-3&amp;quot;&amp;gt;
                &amp;lt;h2&amp;gt;Bootstrap 5 Sidebar Menu - Simple&amp;lt;/h2&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;p class=&amp;quot;lead&amp;quot;&amp;gt;A offcanvas &amp;quot;push&amp;quot; vertical nav menu example.&amp;lt;/p&amp;gt;
            &amp;lt;hr&amp;gt;
            &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
                &amp;lt;div class=&amp;quot;col-12&amp;quot;&amp;gt;
                    Nội dung content
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/main&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Thiết lập menu đơn giản cho sidebar&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;ul class=&amp;quot;flex-column mb-sm-auto mb-0 align-items-center align-items-sm-start&amp;quot; id=&amp;quot;sidebar-menu&amp;quot;&amp;gt;
    &amp;lt;li class=&amp;quot;d-block w-100&amp;quot;&amp;gt;
        &amp;lt;a href=&amp;quot;#vespa-menu&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;nav-link px-0 align-middle &amp;quot;&amp;gt;
            &amp;lt;span class=&amp;quot;ms-1 d-none d-sm-inline fw-bold text-dark&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt;
        &amp;lt;/a&amp;gt;
        &amp;lt;ul class=&amp;quot;collapse nav flex-column ms-1 text-dark&amp;quot; id=&amp;quot;vespa-menu&amp;quot; data-bs-parent=&amp;quot;#sidebar-menu&amp;quot;&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; GTS&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; GTV&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; Primavera&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li class=&amp;quot;w-100&amp;quot;&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Vespa&amp;lt;/span&amp;gt; Sprint&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li class=&amp;quot;d-block w-100&amp;quot;&amp;gt;
        &amp;lt;a href=&amp;quot;#piaggio-menu&amp;quot; data-bs-toggle=&amp;quot;collapse&amp;quot; class=&amp;quot;nav-link px-0 align-middle &amp;quot;&amp;gt;
            &amp;lt;span class=&amp;quot;ms-1 d-none d-sm-inline fw-bold text-dark&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt;
        &amp;lt;/a&amp;gt;
        &amp;lt;ul class=&amp;quot;collapse nav flex-column ms-1 text-dark&amp;quot; id=&amp;quot;piaggio-menu&amp;quot; data-bs-parent=&amp;quot;#sidebar-menu&amp;quot;&amp;gt;
            &amp;lt;li class=&amp;quot;w-100&amp;quot;&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt; Liberty&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;a href=&amp;quot;#&amp;quot; class=&amp;quot;nav-link px-0&amp;quot;&amp;gt; &amp;lt;span class=&amp;quot;d-none d-sm-inline&amp;quot;&amp;gt;Piaggio&amp;lt;/span&amp;gt; Medley&amp;lt;/a&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Tue, 12 Sep 2023 00:00:00 GMT</pubDate></item><item><title>List Databases and Download Backups via PHP</title><link>https://jangkeyte.github.io/blog/lay-danh-sach-database-va-tai-ve-backup/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/lay-danh-sach-database-va-tai-ve-backup/</guid><description>PHP script to enumerate MySQL databases and export backup files programmatically.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/lay-danh-sach-database-va-tai-ve-backup/&quot;&gt;https://jangkeyte.github.io/blog/lay-danh-sach-database-va-tai-ve-backup/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;PHP script to enumerate MySQL databases and export backup files programmatically.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/08/02/lay-danh-sach-database-va-tai-ve-backup/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;List Databases and Download Backups via PHP&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

ini_set(&amp;#39;display_errors&amp;#39;, 1);
ini_set(&amp;#39;display_startup_errors&amp;#39;, 1);
error_reporting(E_ALL);

/**
 * Tùy theo tài khoản đăng nhập mà sẽ load tất cả database được phân quyền
 */
$user = &amp;#39;root&amp;#39;;
$pass = &amp;#39;&amp;#39;;
$host = &amp;#39;localhost&amp;#39;;

$db_backup_folder = &amp;quot;db_backup&amp;quot;;
$dir = dirname(__FILE__);

/**
 * Kiểm tra thông tin cung cấp có kết nối được hay không
 */
$link = mysqli_connect($host, $user, $pass);
if (!$link) {
    die(&amp;#39;Not connected : &amp;#39; . mysql_error());
}

if (!$db_list = mysqli_query($link, &amp;quot;SHOW DATABASES&amp;quot;))
    printf(&amp;quot;Error: %s\n&amp;quot;, mysqli_error($link));

/**
 * Tiến hành lấy các database được phép truy cập
 */
$db_list_filtered = array();
$filter = array(&amp;quot;information_schema&amp;quot;, &amp;quot;mysql&amp;quot;, &amp;quot;performance_schema&amp;quot;);
while ($row = mysqli_fetch_row($db_list)) {
    if (!in_array($row[0], $filter)){
        $sql=&amp;quot;SELECT table_schema &amp;#39;db_name&amp;#39;,
            SUM( data_length + index_length) / (1024 * 1024) &amp;#39;db_size_in_mb&amp;#39;
            FROM information_schema.TABLES
            WHERE table_schema=&amp;#39;$row[0]&amp;#39; GROUP BY table_schema ;&amp;quot;;
        $query=mysqli_query($link, $sql);
        $data=mysqli_fetch_row($query);
        $db_list_filtered[$row[0]] = $data[1];
    }
}

/**
 * Kiểm tra nếu đang thực hiện thao tác sao lưu thì tiến hành sao lưu cơ sở dữ liệu vào thư mục đã chỉ định trước đó
 */
if (isset($_GET[&amp;#39;dump&amp;#39;]) &amp;amp;&amp;amp; array_key_exists($_GET[&amp;#39;dump&amp;#39;], $db_list_filtered)){
    $mysqldump=exec(&amp;#39;which mysqldump&amp;#39;);
    $dbfilename = $_GET[&amp;#39;dump&amp;#39;];
    $now = new DateTime();
    $dbfilepath = $db_backup_folder.&amp;#39;/&amp;#39;.$dbfilename.$now-&amp;gt;format(&amp;#39;_Y-m-d_H-i-s&amp;#39;).&amp;#39;.sql&amp;#39;;
    $command = &amp;quot;mysqldump --user={$user} --password={$pass} --host={$host} {$dbfilename} --result-file={$dbfilepath}&amp;quot;;
    exec($command);
}

/**
 * Kiểm tra nếu thư mục sao lưu không tồn tại thì tiến hành tạo thư mục và cấp quyền truy cập tối đa
 */
if (!file_exists($db_backup_folder)) {
    mkdir($db_backup_folder, 0777, true);
}

/**
 * Lấy danh sách các bản sao lưu trong thư mục sao lưu để hiển thị và tải về
 */
$files = new FilesystemIterator($db_backup_folder);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;

      &amp;lt;title&amp;gt;Tập lệnh kết xuất PHP MySQL đơn giản&amp;lt;/title&amp;gt;
      &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;Jang Keyte&amp;quot;&amp;gt;

      &amp;lt;meta property=&amp;quot;og:title&amp;quot; content=&amp;quot;Tập lệnh kết xuất PHP MySQL đơn giản&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:type&amp;quot; content=&amp;quot;script&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;

      &amp;lt;style&amp;gt;
          .check-list {
              margin: 0;
              padding-left: 1.2rem;
          }
          .check-list li {
              position: relative;
              list-style-type: none;
              padding-left: 2.5rem;
              margin-bottom: 0.5rem;
          }
          :root{
            --pseudo-display: none;
            }
          .check-list li:before {
              content:&amp;#39;&amp;#39;;
              display: var(--pseudo-display);
              position: absolute;
              left: 0;
              top: 4px;
              border: 4px solid #f3f3f3;
              border-radius: 50%;
              border-top: 4px solid #030303;
              width: 10px;
              height: 10px;
              animation: spin 2s linear infinite;
          }
          /* Boilerplate stuff */
          *, *:before, *:after {
              box-sizing: border-box;
          }
          html {
              -webkit-font-smoothing: antialiased;
              font-family:&amp;quot;Helvetica Neue&amp;quot;, sans-serif;
              font-size: 62.5%;
          }
          body {
              font-size: 1.6rem;
              /* 18px */
              background-color: #efefef;
              color: #324047
          }
          html, body, section {
              height: 100%;
          }
          section {
              margin-left: auto;
              margin-right: auto;
              display: flex;
              align-items: center;
          }
          div {
              margin: auto;
          }

            @keyframes spin {
              0% { transform: rotate(0deg); }
              100% { transform: rotate(360deg); }
            }
      &amp;lt;/style&amp;gt;

    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;section&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách cơ sở dữ liệu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!$db_list_filtered) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy cơ sở dữ liệu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach ($db_list_filtered as $key =&amp;gt; $value) echo &amp;#39;&amp;lt;li onclick=&amp;quot;MysqlDump(\&amp;#39;&amp;#39;.$key.&amp;#39;\&amp;#39;)&amp;quot;&amp;gt;&amp;#39;.$key.&amp;#39; : &amp;#39;.number_format($value, 2).&amp;#39; MB &amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách bản sao lưu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!iterator_count($files)) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy bản sao lưu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach($files as $file) echo &amp;#39;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#39;.$db_backup_folder.&amp;#39;/&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;quot; download&amp;gt;&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;lt;/a&amp;gt; : &amp;#39;.number_format($file-&amp;gt;getSize()/1024/1024, 2).&amp;#39; MB&amp;#39;.&amp;#39; : &amp;#39;.date(&amp;#39;m/d/Y H:i:s&amp;#39;, $file-&amp;gt;getMTime()).&amp;#39;&amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/section&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;script&amp;gt;
        function MysqlDump(dbName) {
            const root = document.querySelector(&amp;quot;:root&amp;quot;);
            root.style.setProperty(&amp;quot;--pseudo-display&amp;quot;, &amp;#39;block&amp;#39;);

            fetch(&amp;quot;?dump=&amp;quot;+dbName)
                .then(response =&amp;gt; {
                    if (response.status !== 200) {
                        console.log(&amp;#39;Hình như đã có vấn đề. Mã trạng thái: &amp;#39; + response.status);
                        return;
                    }
                    return response.status;
                })
                .then(res =&amp;gt; {
                    window.location.reload();
                })
                .
            catch (err =&amp;gt; {
                console.log(&amp;#39;Lỗi tìm nạp :-S&amp;#39;, err);
            });
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/08/02/lay-danh-sach-database-va-tai-ve-backup/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Kết nối và xử lý dữ liệu&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

ini_set(&amp;#39;display_errors&amp;#39;, 1);
ini_set(&amp;#39;display_startup_errors&amp;#39;, 1);
error_reporting(E_ALL);

/**
 * Tùy theo tài khoản đăng nhập mà sẽ load tất cả database được phân quyền
 */
$user = &amp;#39;root&amp;#39;;
$pass = &amp;#39;&amp;#39;;
$host = &amp;#39;localhost&amp;#39;;

$db_backup_folder = &amp;quot;db_backup&amp;quot;;
$dir = dirname(__FILE__);

/**
 * Kiểm tra thông tin cung cấp có kết nối được hay không
 */
$link = mysqli_connect($host, $user, $pass);
if (!$link) {
    die(&amp;#39;Not connected : &amp;#39; . mysql_error());
}

if (!$db_list = mysqli_query($link, &amp;quot;SHOW DATABASES&amp;quot;))
    printf(&amp;quot;Error: %s\n&amp;quot;, mysqli_error($link));

/**
 * Tiến hành lấy các database được phép truy cập
 */
$db_list_filtered = array();
$filter = array(&amp;quot;information_schema&amp;quot;, &amp;quot;mysql&amp;quot;, &amp;quot;performance_schema&amp;quot;);
while ($row = mysqli_fetch_row($db_list)) {
    if (!in_array($row[0], $filter)){
        $sql=&amp;quot;SELECT table_schema &amp;#39;db_name&amp;#39;,
            SUM( data_length + index_length) / (1024 * 1024) &amp;#39;db_size_in_mb&amp;#39;
            FROM information_schema.TABLES
            WHERE table_schema=&amp;#39;$row[0]&amp;#39; GROUP BY table_schema ;&amp;quot;;
        $query=mysqli_query($link, $sql);
        $data=mysqli_fetch_row($query);
        $db_list_filtered[$row[0]] = $data[1];
    }
}

/**
 * Kiểm tra nếu đang thực hiện thao tác sao lưu thì tiến hành sao lưu cơ sở dữ liệu vào thư mục đã chỉ định trước đó
 */
if (isset($_GET[&amp;#39;dump&amp;#39;]) &amp;amp;&amp;amp; array_key_exists($_GET[&amp;#39;dump&amp;#39;], $db_list_filtered)){
    $mysqldump=exec(&amp;#39;which mysqldump&amp;#39;);
    $dbfilename = $_GET[&amp;#39;dump&amp;#39;];
    $now = new DateTime();
    $dbfilepath = $db_backup_folder.&amp;#39;/&amp;#39;.$dbfilename.$now-&amp;gt;format(&amp;#39;_Y-m-d_H-i-s&amp;#39;).&amp;#39;.sql&amp;#39;;
    $command = &amp;quot;mysqldump --user={$user} --password={$pass} --host={$host} {$dbfilename} --result-file={$dbfilepath}&amp;quot;;
    exec($command);
}

/**
 * Kiểm tra nếu thư mục sao lưu không tồn tại thì tiến hành tạo thư mục và cấp quyền truy cập tối đa
 */
if (!file_exists($db_backup_folder)) {
    mkdir($db_backup_folder, 0777, true);
}

/**
 * Lấy danh sách các bản sao lưu trong thư mục sao lưu để hiển thị và tải về
 */
$files = new FilesystemIterator($db_backup_folder);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hiển thị giao diện đơn giản&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;

      &amp;lt;title&amp;gt;Tập lệnh kết xuất PHP MySQL đơn giản&amp;lt;/title&amp;gt;
      &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;Jang Keyte&amp;quot;&amp;gt;

      &amp;lt;meta property=&amp;quot;og:title&amp;quot; content=&amp;quot;Tập lệnh kết xuất PHP MySQL đơn giản&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:type&amp;quot; content=&amp;quot;script&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;

      &amp;lt;style&amp;gt;
          .check-list {
              margin: 0;
              padding-left: 1.2rem;
          }
          .check-list li {
              position: relative;
              list-style-type: none;
              padding-left: 2.5rem;
              margin-bottom: 0.5rem;
          }
          :root{
            --pseudo-display: none;
            }
          .check-list li:before {
              content:&amp;#39;&amp;#39;;
              display: var(--pseudo-display);
              position: absolute;
              left: 0;
              top: 4px;
              border: 4px solid #f3f3f3;
              border-radius: 50%;
              border-top: 4px solid #030303;
              width: 10px;
              height: 10px;
              animation: spin 2s linear infinite;
          }
          /* Boilerplate stuff */
          *, *:before, *:after {
              box-sizing: border-box;
          }
          html {
              -webkit-font-smoothing: antialiased;
              font-family:&amp;quot;Helvetica Neue&amp;quot;, sans-serif;
              font-size: 62.5%;
          }
          body {
              font-size: 1.6rem;
              /* 18px */
              background-color: #efefef;
              color: #324047
          }
          html, body, section {
              height: 100%;
          }
          section {
              margin-left: auto;
              margin-right: auto;
              display: flex;
              align-items: center;
          }
          div {
              margin: auto;
          }

            @keyframes spin {
              0% { transform: rotate(0deg); }
              100% { transform: rotate(360deg); }
            }
      &amp;lt;/style&amp;gt;

    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;section&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách cơ sở dữ liệu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!$db_list_filtered) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy cơ sở dữ liệu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach ($db_list_filtered as $key =&amp;gt; $value) echo &amp;#39;&amp;lt;li onclick=&amp;quot;MysqlDump(\&amp;#39;&amp;#39;.$key.&amp;#39;\&amp;#39;)&amp;quot;&amp;gt;&amp;#39;.$key.&amp;#39; : &amp;#39;.number_format($value, 2).&amp;#39; MB &amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách bản sao lưu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!iterator_count($files)) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy bản sao lưu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach($files as $file) echo &amp;#39;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#39;.$db_backup_folder.&amp;#39;/&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;quot; download&amp;gt;&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;lt;/a&amp;gt; : &amp;#39;.number_format($file-&amp;gt;getSize()/1024/1024, 2).&amp;#39; MB&amp;#39;.&amp;#39; : &amp;#39;.date(&amp;#39;m/d/Y H:i:s&amp;#39;, $file-&amp;gt;getMTime()).&amp;#39;&amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/section&amp;gt;
    &amp;lt;/body&amp;gt;
    &amp;lt;script&amp;gt;
        function MysqlDump(dbName) {
            const root = document.querySelector(&amp;quot;:root&amp;quot;);
            root.style.setProperty(&amp;quot;--pseudo-display&amp;quot;, &amp;#39;block&amp;#39;);

            fetch(&amp;quot;?dump=&amp;quot;+dbName)
                .then(response =&amp;gt; {
                    if (response.status !== 200) {
                        console.log(&amp;#39;Hình như đã có vấn đề. Mã trạng thái: &amp;#39; + response.status);
                        return;
                    }
                    return response.status;
                })
                .then(res =&amp;gt; {
                    window.location.reload();
                })
                .
            catch (err =&amp;gt; {
                console.log(&amp;#39;Lỗi tìm nạp :-S&amp;#39;, err);
            });
        }
    &amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Wed, 02 Aug 2023 00:00:00 GMT</pubDate></item><item><title>Build Bootstrap-like Columns with CSS Flexbox</title><link>https://jangkeyte.github.io/blog/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/</guid><description>Recreate Bootstrap&apos;s grid column system from scratch using modern CSS flexbox.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/&quot;&gt;https://jangkeyte.github.io/blog/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Recreate Bootstrap&amp;#39;s grid column system from scratch using modern CSS flexbox.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/08/02/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Build Bootstrap-like Columns with CSS Flexbox&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.container {
  margin-top: 25px;
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}

@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
}
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
}

[class^=&amp;quot;col-&amp;quot;] {
  //show Grid
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: #eee;
  border: 1px solid #ccc;
}

[class^=&amp;quot;col-&amp;quot;] {
  overflow:hidden;
}

/*======== NOW LETS ADD FLEXBOX ========*/
.row {
  display: flex;
  flex-wrap: wrap;

  @for $i from 1 through 12 {
    [class*=&amp;quot;col-#{$i}&amp;quot;] {
      flex: $i 0 (100% / 12 * $i);
    }

    [class*=&amp;quot;col-#{$i}&amp;quot;]:last-child {
      flex: 0 0 (100% / 12 * $i);
    }
  }

  @media (min-width: 768px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-sm-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-sm-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }

  @media (min-width: 992px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-md-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-md-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }

  @media (min-width: 1200px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-lg-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-lg-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.container {
  margin-top: 25px;
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}
.row {
  display: flex;
  flex-wrap: wrap;
}
[class^=&amp;quot;col-&amp;quot;] {
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: #eee;
  border: 1px solid #ccc;
}
[class^=&amp;quot;col-&amp;quot;] {
  overflow: hidden;
}
.row [class*=&amp;quot;col-1&amp;quot;] {
  flex: 1 0 8.3333333333%;
}
.row [class*=&amp;quot;col-1&amp;quot;]:last-child {
  flex: 0 0 8.3333333333%;
}
.row [class*=&amp;quot;col-2&amp;quot;] {
  flex: 2 0 16.6666666667%;
}
.row [class*=&amp;quot;col-2&amp;quot;]:last-child {
  flex: 0 0 16.6666666667%;
}
.row [class*=&amp;quot;col-3&amp;quot;] {
  flex: 3 0 25%;
}
.row [class*=&amp;quot;col-3&amp;quot;]:last-child {
  flex: 0 0 25%;
}
.row [class*=&amp;quot;col-4&amp;quot;] {
  flex: 4 0 33.3333333333%;
}
.row [class*=&amp;quot;col-4&amp;quot;]:last-child {
  flex: 0 0 33.3333333333%;
}
.row [class*=&amp;quot;col-5&amp;quot;] {
  flex: 5 0 41.6666666667%;
}
.row [class*=&amp;quot;col-5&amp;quot;]:last-child {
  flex: 0 0 41.6666666667%;
}
.row [class*=&amp;quot;col-6&amp;quot;] {
  flex: 6 0 50%;
}
.row [class*=&amp;quot;col-6&amp;quot;]:last-child {
  flex: 0 0 50%;
}
.row [class*=&amp;quot;col-7&amp;quot;] {
  flex: 7 0 58.3333333333%;
}
.row [class*=&amp;quot;col-7&amp;quot;]:last-child {
  flex: 0 0 58.3333333333%;
}
.row [class*=&amp;quot;col-8&amp;quot;] {
  flex: 8 0 66.6666666667%;
}
.row [class*=&amp;quot;col-8&amp;quot;]:last-child {
  flex: 0 0 66.6666666667%;
}
.row [class*=&amp;quot;col-9&amp;quot;] {
  flex: 9 0 75%;
}
.row [class*=&amp;quot;col-9&amp;quot;]:last-child {
  flex: 0 0 75%;
}
.row [class*=&amp;quot;col-10&amp;quot;] {
  flex: 10 0 83.3333333333%;
}
.row [class*=&amp;quot;col-10&amp;quot;]:last-child {
  flex: 0 0 83.3333333333%;
}
.row [class*=&amp;quot;col-11&amp;quot;] {
  flex: 11 0 91.6666666667%;
}
.row [class*=&amp;quot;col-11&amp;quot;]:last-child {
  flex: 0 0 91.6666666667%;
}
.row [class*=&amp;quot;col-12&amp;quot;] {
  flex: 12 0 100%;
}
.row [class*=&amp;quot;col-12&amp;quot;]:last-child {
  flex: 0 0 100%;
}
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
  .row [class*=&amp;quot;col-sm-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-sm-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-sm-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-sm-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-sm-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-sm-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-sm-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-sm-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
  .row [class*=&amp;quot;col-md-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-md-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-md-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-md-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-md-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-md-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-md-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-md-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-md-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-md-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-md-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-md-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-md-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-md-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-md-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-md-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-md-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-md-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-md-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-md-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-md-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-md-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-md-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-md-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
  .row [class*=&amp;quot;col-lg-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-lg-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-lg-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-lg-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-lg-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-lg-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-lg-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-lg-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/08/02/tu-tao-phan-chia-cot-bootstrap-voi-css-flexbox/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Trong quá trình làm website chắc hẳn 99.99% chúng ta sẽ cần dùng tới Bootstrap để tạo layout cho dễ và nhanh gọn lẹ. Nhưng nếu cứ thế kéo cả bộ CSS và JS của boostrap vào thì sẽ lãng phí rất nhiều tài nguyên không sử dụng và tối ưu dữ liệu, trải nghiệm người dùng.&lt;/p&gt;
&lt;p&gt;Ở đây mình trích lọc ra 1 đoạn ngắn CSS đủ dùng để chia layout cho giao diện website cho các loại thiết bị mobile, tablet và desktop. Các bạn có thể thoải mái sử dụng và chia sẻ nhé&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png&quot; alt=&quot;🙂&quot;&gt;&lt;/p&gt;
&lt;p&gt;SCSS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.container {
  margin-top: 25px;
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}

@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
}
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
}

[class^=&amp;quot;col-&amp;quot;] {
  //show Grid
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: #eee;
  border: 1px solid #ccc;
}

[class^=&amp;quot;col-&amp;quot;] {
  overflow:hidden;
}

/*======== NOW LETS ADD FLEXBOX ========*/
.row {
  display: flex;
  flex-wrap: wrap;

  @for $i from 1 through 12 {
    [class*=&amp;quot;col-#{$i}&amp;quot;] {
      flex: $i 0 (100% / 12 * $i);
    }

    [class*=&amp;quot;col-#{$i}&amp;quot;]:last-child {
      flex: 0 0 (100% / 12 * $i);
    }
  }

  @media (min-width: 768px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-sm-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-sm-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }

  @media (min-width: 992px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-md-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-md-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }

  @media (min-width: 1200px) {
    @for $i from 1 through 12 {
      [class*=&amp;quot;col-lg-#{$i}&amp;quot;] {
        flex: $i 0 (100% / 12 * $i);
      }

      [class*=&amp;quot;col-lg-#{$i}&amp;quot;]:last-child {
        flex: 0 0 (100% / 12 * $i);
      }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CSS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}
.container {
  margin-top: 25px;
  padding-right: 15px;
  padding-left: 15px;
  margin-right: auto;
  margin-left: auto;
}
.row {
  display: flex;
  flex-wrap: wrap;
}
[class^=&amp;quot;col-&amp;quot;] {
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: #eee;
  border: 1px solid #ccc;
}
[class^=&amp;quot;col-&amp;quot;] {
  overflow: hidden;
}
.row [class*=&amp;quot;col-1&amp;quot;] {
  flex: 1 0 8.3333333333%;
}
.row [class*=&amp;quot;col-1&amp;quot;]:last-child {
  flex: 0 0 8.3333333333%;
}
.row [class*=&amp;quot;col-2&amp;quot;] {
  flex: 2 0 16.6666666667%;
}
.row [class*=&amp;quot;col-2&amp;quot;]:last-child {
  flex: 0 0 16.6666666667%;
}
.row [class*=&amp;quot;col-3&amp;quot;] {
  flex: 3 0 25%;
}
.row [class*=&amp;quot;col-3&amp;quot;]:last-child {
  flex: 0 0 25%;
}
.row [class*=&amp;quot;col-4&amp;quot;] {
  flex: 4 0 33.3333333333%;
}
.row [class*=&amp;quot;col-4&amp;quot;]:last-child {
  flex: 0 0 33.3333333333%;
}
.row [class*=&amp;quot;col-5&amp;quot;] {
  flex: 5 0 41.6666666667%;
}
.row [class*=&amp;quot;col-5&amp;quot;]:last-child {
  flex: 0 0 41.6666666667%;
}
.row [class*=&amp;quot;col-6&amp;quot;] {
  flex: 6 0 50%;
}
.row [class*=&amp;quot;col-6&amp;quot;]:last-child {
  flex: 0 0 50%;
}
.row [class*=&amp;quot;col-7&amp;quot;] {
  flex: 7 0 58.3333333333%;
}
.row [class*=&amp;quot;col-7&amp;quot;]:last-child {
  flex: 0 0 58.3333333333%;
}
.row [class*=&amp;quot;col-8&amp;quot;] {
  flex: 8 0 66.6666666667%;
}
.row [class*=&amp;quot;col-8&amp;quot;]:last-child {
  flex: 0 0 66.6666666667%;
}
.row [class*=&amp;quot;col-9&amp;quot;] {
  flex: 9 0 75%;
}
.row [class*=&amp;quot;col-9&amp;quot;]:last-child {
  flex: 0 0 75%;
}
.row [class*=&amp;quot;col-10&amp;quot;] {
  flex: 10 0 83.3333333333%;
}
.row [class*=&amp;quot;col-10&amp;quot;]:last-child {
  flex: 0 0 83.3333333333%;
}
.row [class*=&amp;quot;col-11&amp;quot;] {
  flex: 11 0 91.6666666667%;
}
.row [class*=&amp;quot;col-11&amp;quot;]:last-child {
  flex: 0 0 91.6666666667%;
}
.row [class*=&amp;quot;col-12&amp;quot;] {
  flex: 12 0 100%;
}
.row [class*=&amp;quot;col-12&amp;quot;]:last-child {
  flex: 0 0 100%;
}
@media (min-width: 768px) {
  .container {
    width: 750px;
  }
  .row [class*=&amp;quot;col-sm-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-sm-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-sm-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-sm-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-sm-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-sm-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-sm-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-sm-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-sm-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-sm-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
@media (min-width: 992px) {
  .container {
    width: 970px;
  }
  .row [class*=&amp;quot;col-md-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-md-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-md-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-md-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-md-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-md-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-md-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-md-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-md-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-md-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-md-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-md-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-md-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-md-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-md-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-md-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-md-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-md-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-md-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-md-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-md-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-md-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-md-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-md-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
@media (min-width: 1200px) {
  .container {
    width: 1170px;
  }
  .row [class*=&amp;quot;col-lg-1&amp;quot;] {
    flex: 1 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-1&amp;quot;]:last-child {
    flex: 0 0 8.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-2&amp;quot;] {
    flex: 2 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-2&amp;quot;]:last-child {
    flex: 0 0 16.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-3&amp;quot;] {
    flex: 3 0 25%;
  }
  .row [class*=&amp;quot;col-lg-3&amp;quot;]:last-child {
    flex: 0 0 25%;
  }
  .row [class*=&amp;quot;col-lg-4&amp;quot;] {
    flex: 4 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-4&amp;quot;]:last-child {
    flex: 0 0 33.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-5&amp;quot;] {
    flex: 5 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-5&amp;quot;]:last-child {
    flex: 0 0 41.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-6&amp;quot;] {
    flex: 6 0 50%;
  }
  .row [class*=&amp;quot;col-lg-6&amp;quot;]:last-child {
    flex: 0 0 50%;
  }
  .row [class*=&amp;quot;col-lg-7&amp;quot;] {
    flex: 7 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-7&amp;quot;]:last-child {
    flex: 0 0 58.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-8&amp;quot;] {
    flex: 8 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-8&amp;quot;]:last-child {
    flex: 0 0 66.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-9&amp;quot;] {
    flex: 9 0 75%;
  }
  .row [class*=&amp;quot;col-lg-9&amp;quot;]:last-child {
    flex: 0 0 75%;
  }
  .row [class*=&amp;quot;col-lg-10&amp;quot;] {
    flex: 10 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-10&amp;quot;]:last-child {
    flex: 0 0 83.3333333333%;
  }
  .row [class*=&amp;quot;col-lg-11&amp;quot;] {
    flex: 11 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-11&amp;quot;]:last-child {
    flex: 0 0 91.6666666667%;
  }
  .row [class*=&amp;quot;col-lg-12&amp;quot;] {
    flex: 12 0 100%;
  }
  .row [class*=&amp;quot;col-lg-12&amp;quot;]:last-child {
    flex: 0 0 100%;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Code mẫu tham khảo:&lt;a href=&quot;https://codepen.io/jangkeyte/pen/GRwzJaW&quot;&gt;https://codepen.io/jangkeyte/pen/GRwzJaW&lt;/a&gt;&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Wed, 02 Aug 2023 00:00:00 GMT</pubDate></item><item><title>Laravel Service Container and Binding</title><link>https://jangkeyte.github.io/blog/service-container-va-binding-trong-laravel/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/service-container-va-binding-trong-laravel/</guid><description>Understanding dependency injection, service container, and binding types in Laravel.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/service-container-va-binding-trong-laravel/&quot;&gt;https://jangkeyte.github.io/blog/service-container-va-binding-trong-laravel/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Understanding dependency injection, service container, and binding types in Laravel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/06/20/service-container-va-binding-trong-laravel/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Laravel Service Container and Binding&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// Binding bình thường nhận tham số là Closure
$this-&amp;gt;app-&amp;gt;bind(&amp;#39;MyUser&amp;#39;, function($app) {
    return new \App\Models\User;
});

// Binding duy nhất 1 lần nhận tham số là Closure
$this-&amp;gt;app-&amp;gt;singleton(&amp;#39;MyUser&amp;#39;, function($app) {
    return new \App\Models\User;
});

// Binding duy nhất 1 lần nhưng nhận tham số là object
$user = new \App\Models\User; // Khởi tạo object lần đầu
$this-&amp;gt;app-&amp;gt;instance(&amp;#39;MyUser&amp;#39;, $user);

// Binding tự động injection
$this-&amp;gt;app-&amp;gt;when(&amp;#39;App\Models\User&amp;#39;) // chứa tham số namespace class nhận dependency, có thể nhận mảng.
    -&amp;gt;needs(&amp;#39;$id&amp;#39;) // chứa tên biến hoặc class
    -&amp;gt;give(1); // chứa giá trị của needs, có thể là Closure (trong trường hợp muốn gán giá trị là một object class...)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/06/20/service-container-va-binding-trong-laravel/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Service container trong Laravel chính là công cụ hữu ích để quản lý các class dependency và depedency injection.&lt;/p&gt;
&lt;p&gt;Binding dùng để đăng ký một class hay interface trong service container.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Binding simple (truyền tên class hoặc interface muốn đăng ký cùng với một Closure trả về lớp được khởi tạo)&lt;/li&gt;
&lt;li&gt;Binding singleton (khai báo với Laravel rằng khi khởi tạo class này thì chỉ một lần duy nhất, những yêu cầu khởi tạo kế tiếp trong cùng một request chỉ trả lại object đã tạo lần đầu)&lt;/li&gt;
&lt;li&gt;Binding instance (giống singleton nhưng object khởi tạo đầu tiên không phải ở trong Closure mà là ở ngoài, nằm ở trước bind&lt;/li&gt;
&lt;li&gt;Binding primitives (tự động inject các dependency vào trong class)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Binding bình thường nhận tham số là Closure
$this-&amp;gt;app-&amp;gt;bind(&amp;#39;MyUser&amp;#39;, function($app) {
    return new \App\Models\User;
});

// Binding duy nhất 1 lần nhận tham số là Closure
$this-&amp;gt;app-&amp;gt;singleton(&amp;#39;MyUser&amp;#39;, function($app) {
    return new \App\Models\User;
});

// Binding duy nhất 1 lần nhưng nhận tham số là object
$user = new \App\Models\User; // Khởi tạo object lần đầu
$this-&amp;gt;app-&amp;gt;instance(&amp;#39;MyUser&amp;#39;, $user);

// Binding tự động injection
$this-&amp;gt;app-&amp;gt;when(&amp;#39;App\Models\User&amp;#39;) // chứa tham số namespace class nhận dependency, có thể nhận mảng.
    -&amp;gt;needs(&amp;#39;$id&amp;#39;) // chứa tên biến hoặc class
    -&amp;gt;give(1); // chứa giá trị của needs, có thể là Closure (trong trường hợp muốn gán giá trị là một object class...)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Tue, 20 Jun 2023 00:00:00 GMT</pubDate></item><item><title>Simple Role &amp; Permission in Laravel Without Packages</title><link>https://jangkeyte.github.io/blog/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/</guid><description>Implement role-based access control in Laravel using native Eloquent relationships.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/&quot;&gt;https://jangkeyte.github.io/blog/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Implement role-based access control in Laravel using native Eloquent relationships.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/06/03/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Simple Role &amp;amp; Permission in Laravel Without Packages&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;composer create-project --prefer-dist laravel/breeze New_Project
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DB_DATABASE= laravel //tên database
DB_USERNAME= root    //username
DB_PASSWORD=         //password
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:model Permission -m
php artisan make:model Role -m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/06/03/phan-quyen-don-gian-bang-role-va-permission-trong-laravel-khong-dung-package/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;**Bước 1:**Tạo dự án Laravel, nếu đã có dự án sẵn có thể bỏ qua bước này&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;composer create-project --prefer-dist laravel/breeze New_Project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cập nhật file**.env&lt;strong&gt;để kết nối&lt;/strong&gt;database**&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DB_DATABASE= laravel //tên database
DB_USERNAME= root    //username
DB_PASSWORD=         //password
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước 2:&lt;strong&gt;Tạo&lt;/strong&gt;model&lt;/strong&gt;và&lt;strong&gt;migration&lt;/strong&gt;của&lt;strong&gt;Role&lt;/strong&gt;và&lt;strong&gt;Permission&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:model Permission -m
php artisan make:model Role -m
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 3:**Cập nhật các file migration&lt;/p&gt;
&lt;p&gt;Bảng&lt;strong&gt;User&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
        Schema::create(&amp;#39;users&amp;#39;, function (Blueprint $table) {
            $table-&amp;gt;id();
            $table-&amp;gt;string(&amp;#39;name&amp;#39;);
            $table-&amp;gt;string(&amp;#39;email&amp;#39;)-&amp;gt;unique();
            $table-&amp;gt;timestamp(&amp;#39;email_verified_at&amp;#39;)-&amp;gt;nullable();
            $table-&amp;gt;string(&amp;#39;password&amp;#39;);
            $table-&amp;gt;rememberToken();
            $table-&amp;gt;timestamps();
        });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bảng&lt;strong&gt;Role&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
    Schema::create(&amp;#39;roles&amp;#39;, function (Blueprint $table) {
        $table-&amp;gt;id();
        $table-&amp;gt;string(&amp;#39;name&amp;#39;);
        $table-&amp;gt;string(&amp;#39;slug&amp;#39;);
        $table-&amp;gt;timestamps();
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bảng&lt;strong&gt;Permission&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
    Schema::create(&amp;#39;permissions&amp;#39;, function (Blueprint $table) {
        $table-&amp;gt;id();
        $table-&amp;gt;string(&amp;#39;name&amp;#39;);
        $table-&amp;gt;string(&amp;#39;slug&amp;#39;);
        $table-&amp;gt;timestamps();
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước 4:&lt;strong&gt;Tạo pivot table&lt;/strong&gt;users_permissions&lt;/strong&gt;để kết nối các&lt;strong&gt;role&lt;/strong&gt;và&lt;strong&gt;permission&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:migration create_users_permissions_table --create=users_permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cập nhật nội dung file migrate của&lt;strong&gt;users_permissions&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
    Schema::create(&amp;#39;users_permissions&amp;#39;, function (Blueprint $table) {
        $table-&amp;gt;unsignedInteger(&amp;#39;user_id&amp;#39;);
        $table-&amp;gt;unsignedInteger(&amp;#39;permission_id&amp;#39;);

        //FOREIGN KEY
        $table-&amp;gt;foreign(&amp;#39;user_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;users&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);
        $table-&amp;gt;foreign(&amp;#39;permission_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;permissions&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);

        //PRIMARY KEYS
        $table-&amp;gt;primary([&amp;#39;user_id&amp;#39;,&amp;#39;permission_id&amp;#39;]);
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tạo bảng pivot table&lt;strong&gt;users_roles&lt;/strong&gt;để phân quyền&lt;strong&gt;role&lt;/strong&gt;cho&lt;strong&gt;user&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:migration create_users_roles_table --create=users_roles
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cập nhật nội dung file migrate của&lt;strong&gt;users_roles&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
    Schema::create(&amp;#39;users_roles&amp;#39;, function (Blueprint $table) {
        $table-&amp;gt;unsignedInteger(&amp;#39;user_id&amp;#39;);
        $table-&amp;gt;unsignedInteger(&amp;#39;role_id&amp;#39;);

     //FOREIGN KEY
       $table-&amp;gt;foreign(&amp;#39;user_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;users&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);
       $table-&amp;gt;foreign(&amp;#39;role_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;roles&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);

     //PRIMARY KEYS
       $table-&amp;gt;primary([&amp;#39;user_id&amp;#39;,&amp;#39;role_id&amp;#39;]);
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tạo bảng pivot table&lt;strong&gt;roles_permissions&lt;/strong&gt;để phân quyền&lt;strong&gt;permission&lt;/strong&gt;cho&lt;strong&gt;user&lt;/strong&gt;. Ví dụ,&lt;strong&gt;user&lt;/strong&gt;có quyền xem đối với bài đăng còn với tư cách là&lt;strong&gt;admin&lt;/strong&gt;có quyền chỉnh sửa hoặc xóa bài đăng&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:migration create_roles_permissions_table --create=roles_permissions
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cập nhật nội dung file migrate của&lt;strong&gt;roles_permissions&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function up()
{
    Schema::create(&amp;#39;roles_permissions&amp;#39;, function (Blueprint $table) {
         $table-&amp;gt;unsignedInteger(&amp;#39;role_id&amp;#39;);
         $table-&amp;gt;unsignedInteger(&amp;#39;permission_id&amp;#39;);

         //FOREIGN KEY
         $table-&amp;gt;foreign(&amp;#39;role_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;roles&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);
         $table-&amp;gt;foreign(&amp;#39;permission_id&amp;#39;)-&amp;gt;references(&amp;#39;id&amp;#39;)-&amp;gt;on(&amp;#39;permissions&amp;#39;)-&amp;gt;onDelete(&amp;#39;cascade&amp;#39;);

         //PRIMARY KEYS
         $table-&amp;gt;primary([&amp;#39;role_id&amp;#39;,&amp;#39;permission_id&amp;#39;]);
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chạy câu lệnh sau để tự động tạo database&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Bước 5:&lt;strong&gt;Tạo&lt;/strong&gt;relationships&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Tạo quan hệ giữa hai bảng&lt;strong&gt;roles&lt;/strong&gt;và&lt;strong&gt;permissions&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cập nhật file&lt;strong&gt;App/Role.php&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function permissions() {
   return $this-&amp;gt;belongsToMany(Permission::class,&amp;#39;roles_permissions&amp;#39;);
}
public function users() {
   return $this-&amp;gt;belongsToMany(User::class,&amp;#39;users_roles&amp;#39;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cập nhật file&lt;strong&gt;App/Permission.php&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function roles() {
   return $this-&amp;gt;belongsToMany(Role::class,&amp;#39;roles_permissions&amp;#39;);

}
public function users() {
   return $this-&amp;gt;belongsToMany(User::class,&amp;#39;users_permissions&amp;#39;);

}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 6:**Tạo Traits&lt;/p&gt;
&lt;p&gt;Tạo traits&lt;strong&gt;HasPermissionsTrait.php&lt;/strong&gt;đặt trong thư mục&lt;strong&gt;app\Traits&lt;/strong&gt;với nội dung sau&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;namespace App\Traits;

use App\Models\Permission;
use App\Models\Role;

trait HasPermissionsTrait {

   public function givePermissionsTo(... $permissions) {

        $permissions = $this-&amp;gt;getAllPermissions($permissions);
        if($permissions === null) {
          return $this;
        }
        $this-&amp;gt;permissions()-&amp;gt;saveMany($permissions);
        return $this;
      }

      public function withdrawPermissionsTo( ... $permissions ) {

        $permissions = $this-&amp;gt;getAllPermissions($permissions);
        $this-&amp;gt;permissions()-&amp;gt;detach($permissions);
        return $this;

      }

      public function refreshPermissions( ... $permissions ) {

        $this-&amp;gt;permissions()-&amp;gt;detach();
        return $this-&amp;gt;givePermissionsTo($permissions);
      }

      public function hasPermissionTo($permission) {

        return $this-&amp;gt;hasPermissionThroughRole($permission) || $this-&amp;gt;hasPermission($permission);
      }

      public function hasPermissionThroughRole($permission) {

        foreach ($permission-&amp;gt;roles as $role){
          if($this-&amp;gt;roles-&amp;gt;contains($role)) {
            return true;
          }
        }
        return false;
      }

      public function hasRole( ... $roles ) {

        foreach ($roles as $role) {
          if ($this-&amp;gt;roles-&amp;gt;contains(&amp;#39;slug&amp;#39;, $role)) {
            return true;
          }
        }
        return false;
      }

      public function roles() {

        return $this-&amp;gt;belongsToMany(Role::class,&amp;#39;users_roles&amp;#39;);

      }
      public function permissions() {

        return $this-&amp;gt;belongsToMany(Permission::class,&amp;#39;users_permissions&amp;#39;);

      }
      protected function hasPermission($permission) {

        return (bool) $this-&amp;gt;permissions-&amp;gt;where(&amp;#39;slug&amp;#39;, $permission-&amp;gt;slug)-&amp;gt;count();
      }

      protected function getAllPermissions(array $permissions) {

        return Permission::whereIn(&amp;#39;slug&amp;#39;,$permissions)-&amp;gt;get();

      }

    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sử dụng traits cho model&lt;strong&gt;User&lt;/strong&gt;trong&lt;strong&gt;app\Models\User.php&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;namespace App\Models;

use App\Traits\HasPermissionsTrait;

class User extends Authenticatable
{
    use HasPermissionsTrait; //Import The Trait
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 7:**Tạo custom Provider&lt;/p&gt;
&lt;p&gt;Để có thể sử dụng lệnh Laravel directive “&lt;strong&gt;can”&lt;strong&gt;để kiểm tra xem User có quyền nào đó hay không&lt;/strong&gt;$user-&amp;gt;can()&lt;strong&gt;thay vì sử dụng hàm&lt;/strong&gt;$user-&amp;gt;hasPermissionTo()&lt;/strong&gt;. Tạo mới provider&lt;strong&gt;PermissionsServiceProvider&lt;/strong&gt;để ủy quyền.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:provider PermissionsServiceProvider
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Đăng ký trong method&lt;strong&gt;boot&lt;/strong&gt;như sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function boot()
{
    try {
        Permission::get()-&amp;gt;map(function ($permission) {
            Gate::define($permission-&amp;gt;slug, function ($user) use ($permission) {
                return $user-&amp;gt;hasPermissionTo($permission);
            });
        });
    } catch (\Exception $e) {
        report($e);
        return false;
    }

    //Blade directives
    Blade::directive(&amp;#39;role&amp;#39;, function ($role) {
            return &amp;quot;if(auth()-&amp;gt;check() &amp;amp;&amp;amp; auth()-&amp;gt;user()-&amp;gt;hasRole({$role})) :&amp;quot;; //return this if statement inside php tag
    });

    Blade::directive(&amp;#39;endrole&amp;#39;, function ($role) {
            return &amp;quot;endif;&amp;quot;; //return this endif statement inside php tag
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tiếp tục đăng ký&lt;strong&gt;PermissionsServiceProvider&lt;/strong&gt;trong&lt;strong&gt;config\app.php&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#39;providers&amp;#39; =&amp;gt; [
    App\Providers\PermissionsServiceProvider::class,
 ],
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 8:**Tạo dữ liệu để test&lt;/p&gt;
&lt;p&gt;Đăng ký route để tạo mới&lt;strong&gt;user, roler, permission&lt;/strong&gt;và các bảng pivot liên quan&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Route::get(&amp;#39;/roles&amp;#39;, [PermissionController::class, &amp;#39;create&amp;#39;]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Xử lý trong&lt;strong&gt;App\Http\Controller\PermissionController&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;namespace App\Http\Controllers;

use App\Models\Permission;
use App\Models\Role;
use App\Models\User;
use Illuminate\Http\Request;

class PermissionController extends Controller
{

   public function Permission()
   {
   	$user_permission = Permission::where(&amp;#39;slug&amp;#39;,&amp;#39;create-tasks&amp;#39;)-&amp;gt;first();
   	$admin_permission = Permission::where(&amp;#39;slug&amp;#39;, &amp;#39;edit-users&amp;#39;)-&amp;gt;first();

   	//RoleTableSeeder.php
   	$user_role = new Role();
   	$user_role-&amp;gt;slug = &amp;#39;user&amp;#39;;
   	$user_role-&amp;gt;name = &amp;#39;Người dùng&amp;#39;;
   	$user_role-&amp;gt;save();
   	$user_role-&amp;gt;permissions()-&amp;gt;attach($user_permission);

   	$admin_role = new Role();
   	$admin_role-&amp;gt;slug = &amp;#39;admin&amp;#39;;
   	$admin_role-&amp;gt;name = &amp;#39;Quản trị viên&amp;#39;;
   	$admin_role-&amp;gt;save();
   	$admin_role-&amp;gt;permissions()-&amp;gt;attach($admin_permission);

   	$user_role = Role::where(&amp;#39;slug&amp;#39;,&amp;#39;user&amp;#39;)-&amp;gt;first();
   	$admin_role = Role::where(&amp;#39;slug&amp;#39;, &amp;#39;admin&amp;#39;)-&amp;gt;first();

   	$createTasks = new Permission();
   	$createTasks-&amp;gt;slug = &amp;#39;create-tasks&amp;#39;;
   	$createTasks-&amp;gt;name = &amp;#39;Create Tasks&amp;#39;;
   	$createTasks-&amp;gt;save();
   	$createTasks-&amp;gt;roles()-&amp;gt;attach($user_role);

   	$editUsers = new Permission();
   	$editUsers-&amp;gt;slug = &amp;#39;edit-users&amp;#39;;
   	$editUsers-&amp;gt;name = &amp;#39;Edit Users&amp;#39;;
   	$editUsers-&amp;gt;save();
   	$editUsers-&amp;gt;roles()-&amp;gt;attach($admin_role);

   	$user_role = Role::where(&amp;#39;slug&amp;#39;,&amp;#39;user&amp;#39;)-&amp;gt;first();
   	$admin_role = Role::where(&amp;#39;slug&amp;#39;, &amp;#39;admin&amp;#39;)-&amp;gt;first();
   	$user_perm = Permission::where(&amp;#39;slug&amp;#39;,&amp;#39;create-tasks&amp;#39;)-&amp;gt;first();
   	$admin_perm = Permission::where(&amp;#39;slug&amp;#39;,&amp;#39;edit-users&amp;#39;)-&amp;gt;first();

   	$user = new User();
   	$user-&amp;gt;name = &amp;#39;Test_User&amp;#39;;
   	$user-&amp;gt;email = &amp;#39;test_user@gmail.com&amp;#39;;
   	$user-&amp;gt;password = bcrypt(&amp;#39;1234567&amp;#39;);
   	$user-&amp;gt;save();
   	$user-&amp;gt;roles()-&amp;gt;attach($user_role);
   	$user-&amp;gt;permissions()-&amp;gt;attach($user_perm);

   	$admin = new User();
   	$admin-&amp;gt;name = &amp;#39;Test_Admin&amp;#39;;
   	$admin-&amp;gt;email = &amp;#39;test_admin@gmail.com&amp;#39;;
   	$admin-&amp;gt;password = bcrypt(&amp;#39;admin1234&amp;#39;);
   	$admin-&amp;gt;save();
   	$admin-&amp;gt;roles()-&amp;gt;attach($admin_role);
   	$admin-&amp;gt;permissions()-&amp;gt;attach($admin_perm);


   	return redirect()-&amp;gt;back();
   }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Truy cập vào route url để tạo dữ liệu&lt;a href=&quot;http://localhost/roles&quot;&gt;http://localhost/roles&lt;/a&gt;, có thể xử lý dữ liệu bằng các cách sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$user = $request-&amp;gt;user();
dd($user-&amp;gt;hasRole(&amp;#39;user&amp;#39;)); //sẽ return true, nếu user có role
dd($user-&amp;gt;givePermissionsTo(&amp;#39;create-tasks&amp;#39;));// sẽ return về permission, không thì trả về null
dd($user-&amp;gt;can(&amp;#39;create-tasks&amp;#39;)); // sẽ return true, nếu user có  permission
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tương tự khi sử dụng trong&lt;strong&gt;blade&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@role(&amp;#39;user&amp;#39;)
This is user role
@endrole

@role(&amp;#39;admin&amp;#39;)
This is admin role
@endrole
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 9:**Cài đặt trong Middleware&lt;/p&gt;
&lt;p&gt;Đăng ký mới một&lt;strong&gt;middleware&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan make:middleware RoleMiddleware
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Xử lý&lt;strong&gt;RoleMiddleware&lt;/strong&gt;để check&lt;strong&gt;role&lt;/strong&gt;và&lt;strong&gt;permission&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;

class RoleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle($request, Closure $next, $role, $permission = null)
    {
        $roles = explode(&amp;quot;|&amp;quot;, $role);
        $can_access = false;
        foreach ($roles as $user_role) {
            if($request-&amp;gt;user()-&amp;gt;hasRole($user_role)) {
                $can_access = true;
            }
        }

        if($permission != null &amp;amp;&amp;amp; $request-&amp;gt;user()-&amp;gt;can($permission)) {
            $can_access = true;
        }

        return $can_access ? $next($request) : abort(401);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Đăng ký&lt;strong&gt;RoleMiddleware&lt;/strong&gt;vào trong&lt;strong&gt;App\Http\Kernel.php&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;protected $routeMiddleware = [
   &amp;#39;role&amp;#39; =&amp;gt; \App\Http\Middleware\RoleMiddleware::class,
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Có thể sử dụng role trong&lt;strong&gt;midleware&lt;/strong&gt;để check quyền hạn user&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
Route::group([&amp;#39;middleware&amp;#39; =&amp;gt; [&amp;#39;web&amp;#39;, &amp;#39;role:admin|user&amp;#39;]], function() {

    Route::get(&amp;#39;/user&amp;#39;, function() {
       return &amp;#39;Welcome...!!&amp;#39;;
    });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Có thể sử dụng trực tiếp trong&lt;strong&gt;Controller&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public function __construct()
{
  $this-&amp;gt;middleware(&amp;#39;auth&amp;#39;);
}

public function store(Request $request)
{
   if ($request-&amp;gt;user()-&amp;gt;can(&amp;#39;create-tasks&amp;#39;)) {
       ...
   }
}

public function destroy(Request $request, $id)
{
   if ($request-&amp;gt;user()-&amp;gt;can(&amp;#39;delete-tasks&amp;#39;)) {
     ...
   }

}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 03 Jun 2023 00:00:00 GMT</pubDate></item><item><title>Dump MySQL Database with PHP</title><link>https://jangkeyte.github.io/blog/how-to-dump-mysql-in-php/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/how-to-dump-mysql-in-php/</guid><description>A lightweight PHP approach to export MySQL databases without external tools.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/how-to-dump-mysql-in-php/&quot;&gt;https://jangkeyte.github.io/blog/how-to-dump-mysql-in-php/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;A lightweight PHP approach to export MySQL databases without external tools.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/22/how-to-dump-mysql-in-php/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Dump MySQL Database with PHP&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Cho phép hiển thị thông tin lỗi trong quá trình xử lý
 */
ini_set(&amp;#39;display_errors&amp;#39;, 1);
ini_set(&amp;#39;display_startup_errors&amp;#39;, 1);
error_reporting(E_ALL);

/**
 * Tùy theo tài khoản đăng nhập mà sẽ load tất cả database được phân quyền
 */
$user = &amp;#39;root&amp;#39;;
$pass = &amp;#39;&amp;#39;;
$host = &amp;#39;localhost&amp;#39;;

$db_backup_folder = &amp;quot;db_backup&amp;quot;;
$dir = dirname(__FILE__);
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Kiểm tra thông tin cung cấp có kết nối được hay không
 */
$link = mysqli_connect($host, $user, $pass);
if (!$link) {
    die(&amp;#39;Not connected : &amp;#39; . mysql_error());
}

if (!$db_list = mysqli_query($link, &amp;quot;SHOW DATABASES&amp;quot;))
    printf(&amp;quot;Error: %s\n&amp;quot;, mysqli_error($link));
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Tiến hành lấy các database được phép truy cập
 */
$db_list_filtered = array();
$filter = array(&amp;quot;information_schema&amp;quot;, &amp;quot;mysql&amp;quot;, &amp;quot;performance_schema&amp;quot;);
while ($row = mysqli_fetch_row($db_list)) {
    if (!in_array($row[0], $filter)){
        $sql=&amp;quot;SELECT table_schema &amp;#39;db_name&amp;#39;,
            SUM( data_length + index_length) / (1024 * 1024) &amp;#39;db_size_in_mb&amp;#39;
            FROM information_schema.TABLES
            WHERE table_schema=&amp;#39;$row[0]&amp;#39; GROUP BY table_schema ;&amp;quot;;
        $query=mysqli_query($link, $sql);
        $data=mysqli_fetch_row($query);
        $db_list_filtered[$row[0]] = $data[1];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/22/how-to-dump-mysql-in-php/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Sao lưu cơ sở dữ liệu MySQL bằng PHP
**Bước 1:**Setup thông số kết nối và cho phép hiển thị lỗi&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Cho phép hiển thị thông tin lỗi trong quá trình xử lý
 */
ini_set(&amp;#39;display_errors&amp;#39;, 1);
ini_set(&amp;#39;display_startup_errors&amp;#39;, 1);
error_reporting(E_ALL);

/**
 * Tùy theo tài khoản đăng nhập mà sẽ load tất cả database được phân quyền
 */
$user = &amp;#39;root&amp;#39;;
$pass = &amp;#39;&amp;#39;;
$host = &amp;#39;localhost&amp;#39;;

$db_backup_folder = &amp;quot;db_backup&amp;quot;;
$dir = dirname(__FILE__);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 2:**Kiểm tra thông tin tài khoản được cung cấp có quyền truy cập hay không&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Kiểm tra thông tin cung cấp có kết nối được hay không
 */
$link = mysqli_connect($host, $user, $pass);
if (!$link) {
    die(&amp;#39;Not connected : &amp;#39; . mysql_error());
}

if (!$db_list = mysqli_query($link, &amp;quot;SHOW DATABASES&amp;quot;))
    printf(&amp;quot;Error: %s\n&amp;quot;, mysqli_error($link));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 3:**Nếu thông tin kết nối chính xác, tiến hành lấy các bảng cơ sở dữ liệu được phép truy cập&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/**
 * Tiến hành lấy các database được phép truy cập
 */
$db_list_filtered = array();
$filter = array(&amp;quot;information_schema&amp;quot;, &amp;quot;mysql&amp;quot;, &amp;quot;performance_schema&amp;quot;);
while ($row = mysqli_fetch_row($db_list)) {
    if (!in_array($row[0], $filter)){
        $sql=&amp;quot;SELECT table_schema &amp;#39;db_name&amp;#39;,
            SUM( data_length + index_length) / (1024 * 1024) &amp;#39;db_size_in_mb&amp;#39;
            FROM information_schema.TABLES
            WHERE table_schema=&amp;#39;$row[0]&amp;#39; GROUP BY table_schema ;&amp;quot;;
        $query=mysqli_query($link, $sql);
        $data=mysqli_fetch_row($query);
        $db_list_filtered[$row[0]] = $data[1];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 4:**Kiểm tra nếu người dùng đang thực hiện thao tác sao lưu bằng cách nhấn vào tên cơ sở dữ liệu thì tiến hành thực hiện sao lưu theo yêu cầu và lưu trữ vào thư mục được chỉ định ở bước 1&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
/**
 * Kiểm tra nếu đang thực hiện thao tác sao lưu thì tiến hành sao lưu cơ sở dữ liệu vào thư mục đã chỉ định trước đó
 */
if (isset($_GET[&amp;#39;dump&amp;#39;]) &amp;amp;&amp;amp; array_key_exists($_GET[&amp;#39;dump&amp;#39;], $db_list_filtered)){
    $mysqldump=exec(&amp;#39;which mysqldump&amp;#39;);
    $dbfilename = $_GET[&amp;#39;dump&amp;#39;];
    $now = new DateTime();
    $dbfilepath = $db_backup_folder.&amp;#39;/&amp;#39;.$dbfilename.$now-&amp;gt;format(&amp;#39;_Y-m-d_H-i-s&amp;#39;).&amp;#39;.sql&amp;#39;;
    $command = &amp;quot;mysqldump --user={$user} --password={$pass} --host={$host} {$dbfilename} --result-file={$dbfilepath}&amp;quot;;
    exec($command);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 5:**Kiểm tra nếu thư mục chỉ định không tồn tại thì tiến hành tạo mới và cấp full quyền truy cập&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
/**
 * Kiểm tra nếu thư mục sao lưu không tồn tại thì tiến hành tạo thư mục và cấp quyền truy cập tối đa
 */
if (!file_exists($db_backup_folder)) {
    mkdir($db_backup_folder, 0777, true);
}

/**
 * Lấy danh sách các bản sao lưu trong thư mục sao lưu để hiển thị và tải về
 */
$files = new FilesystemIterator($db_backup_folder);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 6:**Tạo giao diện hiển thị danh sách các cơ sở dữ liệu được phép truy cập và danh sách các bản sao lưu đã thực hiện&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;
    &amp;lt;head&amp;gt;
      &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;

      &amp;lt;title&amp;gt;Tập lệnh kết xuất PHP MySQL đơn giản&amp;lt;/title&amp;gt;
      &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;
      &amp;lt;meta name=&amp;quot;author&amp;quot; content=&amp;quot;Jang Keyte&amp;quot;&amp;gt;

      &amp;lt;meta property=&amp;quot;og:title&amp;quot; content=&amp;quot;Tập lệnh kết xuất PHP MySQL đơn giản&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:type&amp;quot; content=&amp;quot;script&amp;quot;&amp;gt;
      &amp;lt;meta property=&amp;quot;og:description&amp;quot; content=&amp;quot;Cách dễ dàng để kết xuất (sao lưu) cơ sở dữ liệu MySQL bằng tập lệnh PHP&amp;quot;&amp;gt;

    &amp;lt;/head&amp;gt;

    &amp;lt;body&amp;gt;
        &amp;lt;section&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách cơ sở dữ liệu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!$db_list_filtered) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy cơ sở dữ liệu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach ($db_list_filtered as $key =&amp;gt; $value) echo &amp;#39;&amp;lt;li onclick=&amp;quot;MysqlDump(\&amp;#39;&amp;#39;.$key.&amp;#39;\&amp;#39;)&amp;quot;&amp;gt;&amp;#39;.$key.&amp;#39; : &amp;#39;.number_format($value, 2).&amp;#39; MB &amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div&amp;gt;
                &amp;lt;h2&amp;gt;Danh sách bản sao lưu&amp;lt;/h2&amp;gt;
                &amp;lt;ul class=&amp;quot;check-list&amp;quot;&amp;gt;
                    &amp;lt;?php if(!iterator_count($files)) echo &amp;#39;&amp;lt;ol&amp;gt;Không tìm thấy bản sao lưu nào!&amp;lt;/ol&amp;gt;&amp;#39; ?&amp;gt;
                    &amp;lt;?php foreach($files as $file) echo &amp;#39;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;&amp;#39;.$db_backup_folder.&amp;#39;/&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;quot; download&amp;gt;&amp;#39;.$file-&amp;gt;getFilename().&amp;#39;&amp;lt;/a&amp;gt; : &amp;#39;.number_format($file-&amp;gt;getSize()/1024/1024, 2).&amp;#39; MB&amp;#39;.&amp;#39; : &amp;#39;.date(&amp;#39;m/d/Y H:i:s&amp;#39;, $file-&amp;gt;getMTime()).&amp;#39;&amp;lt;/li&amp;gt;&amp;#39; ?&amp;gt;
                &amp;lt;/ul&amp;gt;
            &amp;lt;/div&amp;gt;
        &amp;lt;/section&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 6.1:**Thêm một chút style cho hiển thị giao diện dễ nhìn hơn&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
    .check-list {
        margin: 0;
        padding-left: 1.2rem;
    }
    .check-list li {
        position: relative;
        list-style-type: none;
        padding-left: 2.5rem;
        margin-bottom: 0.5rem;
    }
    :root{
    --pseudo-display: none;
    }
    .check-list li:before {
        content:&amp;#39;&amp;#39;;
        display: var(--pseudo-display);
        position: absolute;
        left: 0;
        top: 4px;
        border: 4px solid #f3f3f3;
        border-radius: 50%;
        border-top: 4px solid #030303;
        width: 10px;
        height: 10px;
        animation: spin 2s linear infinite;
    }
    /* Boilerplate stuff */
    *, *:before, *:after {
        box-sizing: border-box;
    }
    html {
        -webkit-font-smoothing: antialiased;
        font-family:&amp;quot;Helvetica Neue&amp;quot;, sans-serif;
        font-size: 62.5%;
    }
    body {
        font-size: 1.6rem;
        /* 18px */
        background-color: #efefef;
        color: #324047
    }
    html, body, section {
        height: 100%;
    }
    section {
        margin-left: auto;
        margin-right: auto;
        display: flex;
        align-items: center;
    }
    div {
        margin: auto;
    }

    @keyframes spin {
        0% { transform: rotate(0deg); }
        100% { transform: rotate(360deg); }
    }
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**Bước 6.2:**Viết script xử lý hiển thị thông tin trả về&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    function MysqlDump(dbName) {
        const root = document.querySelector(&amp;quot;:root&amp;quot;);
        root.style.setProperty(&amp;quot;--pseudo-display&amp;quot;, &amp;#39;block&amp;#39;);

        fetch(&amp;quot;?dump=&amp;quot;+dbName)
            .then(response =&amp;gt; {
                if (response.status !== 200) {
                    console.log(&amp;#39;Hình như đã có vấn đề. Mã trạng thái: &amp;#39; + response.status);
                    return;
                }
                return response.status;
            })
            .then(res =&amp;gt; {
                window.location.reload();
            })
            .
        catch (err =&amp;gt; {
            console.log(&amp;#39;Lỗi tìm nạp :-S&amp;#39;, err);
        });
    }
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Mon, 22 May 2023 00:00:00 GMT</pubDate></item><item><title>Clean Up Redundant Data in WordPress Database</title><link>https://jangkeyte.github.io/blog/xoa-du-lieu-du-thua-trong-database-wordpress/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/xoa-du-lieu-du-thua-trong-database-wordpress/</guid><description>SQL queries and tips to remove revisions, transients, and orphaned data from WordPress.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/xoa-du-lieu-du-thua-trong-database-wordpress/&quot;&gt;https://jangkeyte.github.io/blog/xoa-du-lieu-du-thua-trong-database-wordpress/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;SQL queries and tips to remove revisions, transients, and orphaned data from WordPress.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/13/xoa-du-lieu-du-thua-trong-database-wordpress/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Clean Up Redundant Data in WordPress Database&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM eot3utvmj_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM eot3utvmj_comments);

DELETE FROM eot3utvmj_commentmeta WHERE meta_key LIKE &amp;#39;%akismet%&amp;#39;;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM eot3utvmj_postmeta WHERE meta_key = &amp;quot;_edit_lock&amp;quot;;

DELETE FROM eot3utvmj_postmeta WHERE meta_key = &amp;quot;_edit_last&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
DELETE FROM eot3utvmj_options WHERE option_name LIKE (&amp;#39;%\_transient\_%&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/13/xoa-du-lieu-du-thua-trong-database-wordpress/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Chọn xóa dữ liệu comment&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM eot3utvmj_commentmeta WHERE comment_id NOT IN (SELECT comment_id FROM eot3utvmj_comments);

DELETE FROM eot3utvmj_commentmeta WHERE meta_key LIKE &amp;#39;%akismet%&amp;#39;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chọn xóa dữ liệu post_meta&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM eot3utvmj_postmeta WHERE meta_key = &amp;quot;_edit_lock&amp;quot;;

DELETE FROM eot3utvmj_postmeta WHERE meta_key = &amp;quot;_edit_last&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chọn xóa dữ liệu options:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
DELETE FROM eot3utvmj_options WHERE option_name LIKE (&amp;#39;%\_transient\_%&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nếu bị spam contact từ flamingo của Contact Form 7 thì thực hiện xóa thêm&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DELETE FROM eot3utvmj_posts WHERE post_status=&amp;quot;flamingo_spam&amp;quot;;
DELETE FROM eot3utvmj_posts WHERE post_type=&amp;quot;flamingo_inbound&amp;quot;;
DELETE FROM eot3utvmj_posts WHERE post_type=&amp;quot;flamingo_contact&amp;quot;;

DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_field_ten-khach-hang&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_field_so-dien-thoai&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_field_noi-dung&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_from&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_from_email&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_from_name&amp;quot;;
DELETE FROM eot3utvmj_postmeta WHERE meta_key=&amp;quot;_subject&amp;quot;;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 13 May 2023 00:00:00 GMT</pubDate></item><item><title>Make HTML Table Rows Clickable</title><link>https://jangkeyte.github.io/blog/tao-chuc-nang-clickable-cho-row-trong-table/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/tao-chuc-nang-clickable-cho-row-trong-table/</guid><description>JavaScript and CSS techniques to make entire table rows navigate on click.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/tao-chuc-nang-clickable-cho-row-trong-table/&quot;&gt;https://jangkeyte.github.io/blog/tao-chuc-nang-clickable-cho-row-trong-table/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;JavaScript and CSS techniques to make entire table rows navigate on click.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/06/tao-chuc-nang-clickable-cho-row-trong-table/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Make HTML Table Rows Clickable&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;tr class=&amp;quot;table-default clickable-row&amp;quot; data-href=&amp;quot;/user/detail/1&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;jQuery(document).ready(function($) {
    $(&amp;quot;.clickable-row&amp;quot;).click(function() {
        window.location = $(this).data(&amp;quot;href&amp;quot;);
    });
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/06/tao-chuc-nang-clickable-cho-row-trong-table/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Thêm thuộc tính clickable-row vào thẻ &lt;tr&gt; của table&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;tr class=&amp;quot;table-default clickable-row&amp;quot; data-href=&amp;quot;/user/detail/1&amp;quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Viết script xử lý thao tác click vào row đó và chuyển tới href chỉ định&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;jQuery(document).ready(function($) {
    $(&amp;quot;.clickable-row&amp;quot;).click(function() {
        window.location = $(this).data(&amp;quot;href&amp;quot;);
    });
});
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 06 May 2023 00:00:00 GMT</pubDate></item><item><title>Simple Docker Setup for Laravel Apps</title><link>https://jangkeyte.github.io/blog/xay-dung-docker-cho-laravel-app/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/xay-dung-docker-cho-laravel-app/</guid><description>Dockerfile and docker-compose configuration for running Laravel in containers.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/xay-dung-docker-cho-laravel-app/&quot;&gt;https://jangkeyte.github.io/blog/xay-dung-docker-cho-laravel-app/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Dockerfile and docker-compose configuration for running Laravel in containers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/05/xay-dung-docker-cho-laravel-app/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Simple Docker Setup for Laravel Apps&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;1.0&amp;#39; # xác định phiên bản docker
services:
  # The Application - Laravel Container
  app:
      container_name: laravel_app # tên tham chiếu đến container - có thể tùy ý lựa chọn
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/app.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container. Ở đây, development/app.dockerfile nghĩa là docker file được để trong development của thư mục laravel gốc
      volumes:
        - ./storage:/var/www/storage # định nghĩa nơi lưu trữ chia sẻ giữa ứng dụng và docker container đang chạy
      env_file: &amp;#39;.env.prod&amp;#39; # nơi định nghĩa file .env của laravel
      environment: # khai báo các biến môi trường
        - &amp;quot;DB_HOST=database&amp;quot;
        - &amp;quot;REDIS_HOST=cache&amp;quot;

  # The Web Server - NGINX Container
  web:
      container_name: nginx_server # tên tham chiếu đến container
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/web.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container.
      volumes:
        - ./storage/logs/:/var/log/nginx # ở đây ta chia sẻ folder log của laravel với log của nginx
      ports:
        - 8990:80 # định nghĩa port mà docker container sẽ lắng nghe, port của máy chủ / port của docker container

  # The Database - MYSQL container
  database:
      container_name: mysql_database # tên tham chiếu đến container
      image: mysql:8.0.30 # ở đây ta dùng luôn từ 1 image sẵn là mysql:8.0.30 chứ không tự định nghĩa docker file nữa
      volumes:
        - ./dbdata:/var/lib/mysql # định nghĩa nơi lưu trữ chia sẻ giữa database và mysql
      environment:
        - &amp;quot;MYSQL_DATABASE=laravel&amp;quot;
        - &amp;quot;MYSQL_USER=test&amp;quot;
        - &amp;quot;MYSQL_PASSWORD=test&amp;quot;
        - &amp;quot;MYSQL_ROOT_PASSWORD=root&amp;quot;
      ports:
        - 8991:3306 # ở đây mysql container sẽ lắng nghe từ cổng 8991 trên máy chủ và 3306 trên mạng của container
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Build container từ image: php:7.2-fpm
FROM php:8.1-fpm

# Thực thi command copy các folder tương ứng từ máy chủ vào docker container
COPY composer.lock composer.json /var/www/
COPY database /var/www/database

# Set không gian làm việc docker container vào thẳng /var/www, sau này chạy các command ở bash thì không cần cd vào đó
WORKDIR /var/www

# Cài đặt các trình phục thuộc mà laravel cần (tương tự composer install ở máy chủ và 1 số phần khác), lưu ý dòng if(hash_file(&amp;#39;SHA384&amp;#39;... vì mỗi lần cập nhật thì giá trị băm sẽ thay đổi, cho nên cần Get Hash Value
RUN apt-get update &amp;amp;&amp;amp; apt-get -y install git &amp;amp;&amp;amp; apt-get -y install zip
RUN php -r &amp;quot;copy(&amp;#39;https://getcomposer.org/installer&amp;#39;, &amp;#39;composer-setup.php&amp;#39;);&amp;quot; &amp;amp;&amp;amp; php -r &amp;quot;if (hash_file(&amp;#39;SHA384&amp;#39;, &amp;#39;composer-setup.php&amp;#39;) === &amp;#39;55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae&amp;#39;) { echo &amp;#39;Installer verified&amp;#39;; } else { echo &amp;#39;Installer corrupt&amp;#39;; unlink(&amp;#39;composer-setup.php&amp;#39;); } echo PHP_EOL;&amp;quot; &amp;amp;&amp;amp; php composer-setup.php &amp;amp;&amp;amp; php -r &amp;quot;unlink(&amp;#39;composer-setup.php&amp;#39;);&amp;quot; &amp;amp;&amp;amp; php composer.phar install --no-dev --no-scripts &amp;amp;&amp;amp; rm composer.phar

# Copy toàn bộ source code vào foler làm việc
COPY . /var/www
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache

RUN php artisan cache:clear
RUN php artisan optimize
RUN apt-get install -y libmcrypt-dev libmagickwand-dev --no-install-recommends &amp;amp;&amp;amp; pecl install mcrypt-1.0.6 &amp;amp;&amp;amp; docker-php-ext-install pdo_mysql &amp;amp;&amp;amp; docker-php-ext-enable mcrypt

RUN mv .env.prod .env
RUN php artisan optimize
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# build container từ iamge: nginx:1.10-alpine và thay thế default.conf của nginx bằng vhost.conf
# Vì vậy ta cần tạo file vhost.conf cùng thư mục với web.dockerfile (development)
FROM nginx:1.10-alpine
ADD development/vhost.conf /etc/nginx/conf.d/default.conf
COPY public /var/www/public
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/05/xay-dung-docker-cho-laravel-app/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h3&gt;1. Tạo&lt;code&gt;docker-compose&lt;/code&gt;file chứa tất cả các docker container cần dùng&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;version: &amp;#39;1.0&amp;#39; # xác định phiên bản docker
services:
  # The Application - Laravel Container
  app:
      container_name: laravel_app # tên tham chiếu đến container - có thể tùy ý lựa chọn
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/app.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container. Ở đây, development/app.dockerfile nghĩa là docker file được để trong development của thư mục laravel gốc
      volumes:
        - ./storage:/var/www/storage # định nghĩa nơi lưu trữ chia sẻ giữa ứng dụng và docker container đang chạy
      env_file: &amp;#39;.env.prod&amp;#39; # nơi định nghĩa file .env của laravel
      environment: # khai báo các biến môi trường
        - &amp;quot;DB_HOST=database&amp;quot;
        - &amp;quot;REDIS_HOST=cache&amp;quot;

  # The Web Server - NGINX Container
  web:
      container_name: nginx_server # tên tham chiếu đến container
      build: # sử dụng để build 1 image từ dockerfile
        context: ./ # đường dẫn vào bên trong thư mục sourcecode của laravel app, dùng ./ vì hiện tại file docker-compose đang đặt ở thư mục gốc của laravel app
        dockerfile: development/web.dockerfile # docker image được build từ Dockerfile, thường là thêm các lệnh bổ sung sẽ được chạy trong container.
      volumes:
        - ./storage/logs/:/var/log/nginx # ở đây ta chia sẻ folder log của laravel với log của nginx
      ports:
        - 8990:80 # định nghĩa port mà docker container sẽ lắng nghe, port của máy chủ / port của docker container

  # The Database - MYSQL container
  database:
      container_name: mysql_database # tên tham chiếu đến container
      image: mysql:8.0.30 # ở đây ta dùng luôn từ 1 image sẵn là mysql:8.0.30 chứ không tự định nghĩa docker file nữa
      volumes:
        - ./dbdata:/var/lib/mysql # định nghĩa nơi lưu trữ chia sẻ giữa database và mysql
      environment:
        - &amp;quot;MYSQL_DATABASE=laravel&amp;quot;
        - &amp;quot;MYSQL_USER=test&amp;quot;
        - &amp;quot;MYSQL_PASSWORD=test&amp;quot;
        - &amp;quot;MYSQL_ROOT_PASSWORD=root&amp;quot;
      ports:
        - 8991:3306 # ở đây mysql container sẽ lắng nghe từ cổng 8991 trên máy chủ và 3306 trên mạng của container
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. Tạo&lt;code&gt;Dockerfile&lt;/code&gt;cho các mục vừa khai báo ở&lt;code&gt;docker-compose&lt;/code&gt;trong thư mục&lt;code&gt;development&lt;/code&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;code&gt;app.dockerfile&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# Build container từ image: php:7.2-fpm
FROM php:8.1-fpm

# Thực thi command copy các folder tương ứng từ máy chủ vào docker container
COPY composer.lock composer.json /var/www/
COPY database /var/www/database

# Set không gian làm việc docker container vào thẳng /var/www, sau này chạy các command ở bash thì không cần cd vào đó
WORKDIR /var/www

# Cài đặt các trình phục thuộc mà laravel cần (tương tự composer install ở máy chủ và 1 số phần khác), lưu ý dòng if(hash_file(&amp;#39;SHA384&amp;#39;... vì mỗi lần cập nhật thì giá trị băm sẽ thay đổi, cho nên cần Get Hash Value
RUN apt-get update &amp;amp;&amp;amp; apt-get -y install git &amp;amp;&amp;amp; apt-get -y install zip
RUN php -r &amp;quot;copy(&amp;#39;https://getcomposer.org/installer&amp;#39;, &amp;#39;composer-setup.php&amp;#39;);&amp;quot; &amp;amp;&amp;amp; php -r &amp;quot;if (hash_file(&amp;#39;SHA384&amp;#39;, &amp;#39;composer-setup.php&amp;#39;) === &amp;#39;55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae&amp;#39;) { echo &amp;#39;Installer verified&amp;#39;; } else { echo &amp;#39;Installer corrupt&amp;#39;; unlink(&amp;#39;composer-setup.php&amp;#39;); } echo PHP_EOL;&amp;quot; &amp;amp;&amp;amp; php composer-setup.php &amp;amp;&amp;amp; php -r &amp;quot;unlink(&amp;#39;composer-setup.php&amp;#39;);&amp;quot; &amp;amp;&amp;amp; php composer.phar install --no-dev --no-scripts &amp;amp;&amp;amp; rm composer.phar

# Copy toàn bộ source code vào foler làm việc
COPY . /var/www
RUN chown -R www-data:www-data /var/www/storage /var/www/bootstrap/cache

RUN php artisan cache:clear
RUN php artisan optimize
RUN apt-get install -y libmcrypt-dev libmagickwand-dev --no-install-recommends &amp;amp;&amp;amp; pecl install mcrypt-1.0.6 &amp;amp;&amp;amp; docker-php-ext-install pdo_mysql &amp;amp;&amp;amp; docker-php-ext-enable mcrypt

RUN mv .env.prod .env
RUN php artisan optimize
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;web.dockerfile&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# build container từ iamge: nginx:1.10-alpine và thay thế default.conf của nginx bằng vhost.conf
# Vì vậy ta cần tạo file vhost.conf cùng thư mục với web.dockerfile (development)
FROM nginx:1.10-alpine
ADD development/vhost.conf /etc/nginx/conf.d/default.conf
COPY public /var/www/public
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;vhost.conf&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# vhost.conf
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;3. Tạo&lt;code&gt;.dockerignore&lt;/code&gt;để bỏ qua các file không muốn upload lên git&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#Ignore passwords file
passwords.txt

#Ignore logs directory
logs/

#Ignore the git and cache folders
.git
.cache

#Ingore all markdown and class files
*.md
**/*.class

#Ignore ISO images
*.iso
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. Kiểm tra lại cấu trúc projects&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;root folder&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;docker-compose.yml&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.env.prod&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;development folder:&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;.dockerignore&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;app.dockerfile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;web.dockerfile&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;vhost.conf&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. Build các container của project và chạy&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;docker-compose up --build
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sau khi build thì lần sau chỉ cần chạy docker-compose up để chạy.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Fri, 05 May 2023 00:00:00 GMT</pubDate></item><item><title>Build a Filter Trait for Fast Laravel Query Filtering</title><link>https://jangkeyte.github.io/blog/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/</guid><description>Reusable Eloquent trait for dynamic query filters in Laravel applications.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/&quot;&gt;https://jangkeyte.github.io/blog/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Reusable Eloquent trait for dynamic query filters in Laravel applications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/01/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Build a Filter Trait for Fast Laravel Query Filtering&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Traits;

use App\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;

trait Filterable
{
    public function scopeFilter(Builder $builder, BaseFilter $filters, array $filterFields = [&amp;#39;*&amp;#39;], array $orderFields = [])
    {
        return $filters-&amp;gt;apply($builder, $filterFields, $orderFields);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Filters;

use App\Helpers\Common\StringHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class BaseFilter
{
    /**
     * @var Request
     */
    public $request;

    /**
     * @var array
     */
    protected $filters;

    /**
     * @var array
     */
    protected $search = [];

    /**
     * @var $builder
     */
    protected $builder;

    /**
     * @var string|null
     */
    protected $orderField = null;

    /**
     * @var string
     */
    protected $orderType = &amp;#39;desc&amp;#39;;

    /**
     * @var $filterable
     */
    protected $filterable;

    /**
     * QueryFilter constructor.
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        $this-&amp;gt;request = $request;
        $this-&amp;gt;filters = $this-&amp;gt;request-&amp;gt;all();
    }

    /**
     * @param Builder $builder
     * @param array $filterFields
     * @param array $orderFields
     * @return Builder
     */
    public function apply(Builder $builder, array $filterFields, array $orderFields = [])
    {
        $this-&amp;gt;builder = $builder;
        $this-&amp;gt;orderFields = $orderFields;

        foreach ($this-&amp;gt;filters as $name =&amp;gt; $value)
        {
            $method = &amp;#39;filter&amp;#39; . Str::studly($name);

            if (is_null($value) || $value == &amp;#39;&amp;#39;) {
                continue;
            }

            if (method_exists($this, $method)) {
                $this-&amp;gt;{$method}($value);
                continue;
            }

            if (empty($this-&amp;gt;filterable) || !is_array($this-&amp;gt;filterable)) {
                continue;
            }

            if (in_array($name, $this-&amp;gt;filterable)) {
                $this-&amp;gt;builder-&amp;gt;where($name, $value);
                continue;
            }

            if (key_exists($name, $this-&amp;gt;filterable)) {
                $this-&amp;gt;builder-&amp;gt;where($this-&amp;gt;filterable[$name], $value);
                continue;
            }
        }

        return $this-&amp;gt;builder;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Filters;

class UserFilter extends BaseFilter
{
    protected $filterable = [
        &amp;#39;id&amp;#39;,
        &amp;#39;author_id&amp;#39;,
        &amp;#39;birth_day&amp;#39;,
        &amp;#39;gender&amp;#39;,
    ];

    public function filterName($name)
    {
        return $this-&amp;gt;builder-&amp;gt;where(&amp;#39;name&amp;#39;, &amp;#39;like&amp;#39;, &amp;#39;%&amp;#39; . $name . &amp;#39;%&amp;#39;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/05/01/xay-dung-traits-filter-de-loc-du-lieu-query-fillter-nhanh-trong-laravel/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Tạo một Traits Filterable trong thư mục App\Traits đặt tên là Filterable&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Traits;

use App\Filters\BaseFilter;
use Illuminate\Database\Eloquent\Builder;

trait Filterable
{
    public function scopeFilter(Builder $builder, BaseFilter $filters, array $filterFields = [&amp;#39;*&amp;#39;], array $orderFields = [])
    {
        return $filters-&amp;gt;apply($builder, $filterFields, $orderFields);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Trait này sẽ được gọi ở mỗi model cần filter, tạo thêm một class base filter trong App\Filters đặt tên là BaseFilter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Filters;

use App\Helpers\Common\StringHelper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class BaseFilter
{
    /**
     * @var Request
     */
    public $request;

    /**
     * @var array
     */
    protected $filters;

    /**
     * @var array
     */
    protected $search = [];

    /**
     * @var $builder
     */
    protected $builder;

    /**
     * @var string|null
     */
    protected $orderField = null;

    /**
     * @var string
     */
    protected $orderType = &amp;#39;desc&amp;#39;;

    /**
     * @var $filterable
     */
    protected $filterable;

    /**
     * QueryFilter constructor.
     * @param Request $request
     */
    public function __construct(Request $request)
    {
        $this-&amp;gt;request = $request;
        $this-&amp;gt;filters = $this-&amp;gt;request-&amp;gt;all();
    }

    /**
     * @param Builder $builder
     * @param array $filterFields
     * @param array $orderFields
     * @return Builder
     */
    public function apply(Builder $builder, array $filterFields, array $orderFields = [])
    {
        $this-&amp;gt;builder = $builder;
        $this-&amp;gt;orderFields = $orderFields;

        foreach ($this-&amp;gt;filters as $name =&amp;gt; $value)
        {
            $method = &amp;#39;filter&amp;#39; . Str::studly($name);

            if (is_null($value) || $value == &amp;#39;&amp;#39;) {
                continue;
            }

            if (method_exists($this, $method)) {
                $this-&amp;gt;{$method}($value);
                continue;
            }

            if (empty($this-&amp;gt;filterable) || !is_array($this-&amp;gt;filterable)) {
                continue;
            }

            if (in_array($name, $this-&amp;gt;filterable)) {
                $this-&amp;gt;builder-&amp;gt;where($name, $value);
                continue;
            }

            if (key_exists($name, $this-&amp;gt;filterable)) {
                $this-&amp;gt;builder-&amp;gt;where($this-&amp;gt;filterable[$name], $value);
                continue;
            }
        }

        return $this-&amp;gt;builder;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tạo một class UserFilter riêng cho model User kế thừa từ BaseFilter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php

namespace App\Filters;

class UserFilter extends BaseFilter
{
    protected $filterable = [
        &amp;#39;id&amp;#39;,
        &amp;#39;author_id&amp;#39;,
        &amp;#39;birth_day&amp;#39;,
        &amp;#39;gender&amp;#39;,
    ];

    public function filterName($name)
    {
        return $this-&amp;gt;builder-&amp;gt;where(&amp;#39;name&amp;#39;, &amp;#39;like&amp;#39;, &amp;#39;%&amp;#39; . $name . &amp;#39;%&amp;#39;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cách sử dụng:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ở model User sử dụng use Traits Filterable&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
&amp;lt;?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Modules\TreeManager\src\Traits\Filterable;

class User extends Model
{
    use Filterable;

    protected $dates = [&amp;#39;deleted_at&amp;#39;];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;lúc này ở model User sẽ call function scopeFilter ở Traits Filterable, có nghĩa là mỗi khi chúng ta gọi đến User::filter() thì Laravel sẽ hiểu được là đang gọi đến 1 local scope như ở trên. Mỗi lần gọi đến hàm filter cần truyền vào một instance của class UserFilter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* Cách sử dụng */
$userFilter = new UserFilter($request);
User::filter($userFilter)-&amp;gt;get();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Khi đó hàm scopeFilter trong trait chúng ta khai báo sẽ được gọi và gọi đến function apply.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
public function scopeFilter(Builder $builder, QueryFilter $filters, array $filterFields = [&amp;#39;*&amp;#39;], array $orderFields = [])
{
    return $filters-&amp;gt;apply($builder, $filterFields, $orderFields);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tham số $request từ form gửi lên bằng POST, class BaseFilter sẽ tự tách nó ra thành mảng chứa các biến và gán vào biến $filters trong contructor.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
public function __construct(Request $request)
{
    $this-&amp;gt;request = $request;
    $this-&amp;gt;filters = $this-&amp;gt;request-&amp;gt;all();
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Biến này sẽ được dùng để duyệt mảng trích xuất từng $name ra để làm scope và so sánh với biến $filterable là một array sẽ chứa các trường mong muốn filter theo điều kiện trong UserFilter, nếu tồn tại sẽ tiến hành xử lý thêm vào query builder, nếu không tồn tại sẽ next.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
protected $filterable = [
    &amp;#39;id&amp;#39;,
    &amp;#39;author_id&amp;#39;,
    &amp;#39;birth_day&amp;#39;,
    &amp;#39;gender&amp;#39;,
];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ví dụ: input gender gửi lên sẽ được duyệt và gọi scopeGender, nếu cần xử lý thêm trong query builder thì có thể tự tạo thêm các scope trong UserFilter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
public function filterName($name)
{
    return $this-&amp;gt;builder-&amp;gt;where(&amp;#39;name&amp;#39;, &amp;#39;like&amp;#39;, &amp;#39;%&amp;#39; . $name . &amp;#39;%&amp;#39;);
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Mon, 01 May 2023 00:00:00 GMT</pubDate></item><item><title>Generate Laravel Test Data with Factories &amp; Seeders</title><link>https://jangkeyte.github.io/blog/tao-du-lieu-test-laravel/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/tao-du-lieu-test-laravel/</guid><description>Use model factories and database seeders to populate realistic test data in Laravel.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/tao-du-lieu-test-laravel/&quot;&gt;https://jangkeyte.github.io/blog/tao-du-lieu-test-laravel/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Use model factories and database seeders to populate realistic test data in Laravel.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/04/29/tao-du-lieu-test-laravel/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Generate Laravel Test Data with Factories &amp;amp; Seeders&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;
namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory&amp;lt;\App\Models\Tree&amp;gt;
 */
class TreeFactory extends Factory
{
    /**
     * Define the model&amp;#39;s default state.
     *
     * @return array&amp;lt;string, mixed&amp;gt;
     */
    public function definition(): array
    {
        $area = fake()-&amp;gt;randomElement([&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;]);
        $cluster = fake()-&amp;gt;randomElement([&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;, &amp;#39;C&amp;#39;, &amp;#39;D&amp;#39;, &amp;#39;E&amp;#39;, &amp;#39;F&amp;#39;, &amp;#39;G&amp;#39;, &amp;#39;H&amp;#39;]);
        $size = fake()-&amp;gt;randomFloat(1, 1, 5);
        return [
            &amp;#39;uid&amp;#39; =&amp;gt; fake()-&amp;gt;numerify($area . $cluster . &amp;#39;######&amp;#39;),
            &amp;#39;name&amp;#39; =&amp;gt; fake()-&amp;gt;name(),
            &amp;#39;type&amp;#39; =&amp;gt; fake()-&amp;gt;numberBetween(1, 5),
            &amp;#39;family&amp;#39; =&amp;gt; fake()-&amp;gt;randomDigitNotNull(),
            &amp;#39;unit&amp;#39; =&amp;gt; fake()-&amp;gt;randomDigitNotNull(),
            &amp;#39;age&amp;#39; =&amp;gt; fake()-&amp;gt;randomFloat(1, 1, 20),
            &amp;#39;value&amp;#39; =&amp;gt; fake()-&amp;gt;sentence(),
            &amp;#39;cluster&amp;#39; =&amp;gt; $cluster,
            &amp;#39;area&amp;#39; =&amp;gt; $area,
            &amp;#39;image&amp;#39; =&amp;gt; fake()-&amp;gt;imageUrl($width=400, $height=400),
            &amp;#39;locate&amp;#39; =&amp;gt; &amp;#39;10.&amp;#39; . fake()-&amp;gt;numberBetween(1000, 999999) . &amp;#39;,106.&amp;#39; . fake()-&amp;gt;numberBetween(1000, 999999),
            &amp;#39;status&amp;#39; =&amp;gt; fake()-&amp;gt;numberBetween(1, 5),
            &amp;#39;birthday&amp;#39; =&amp;gt; fake()-&amp;gt;dateTime(),
            &amp;#39;size&amp;#39; =&amp;gt; $size,
            &amp;#39;height&amp;#39; =&amp;gt; fake()-&amp;gt;randomFloat(1, 1, 10),
            &amp;#39;perimeter&amp;#39; =&amp;gt; $size * 3.14,
            &amp;#39;history&amp;#39; =&amp;gt; fake()-&amp;gt;paragraph(),
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class TreeSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        \App\Models\Tree::factory(10)-&amp;gt;create();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;php artisan db:seed --class=TreeSeeder
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/04/29/tao-du-lieu-test-laravel/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Tạo một Factory&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory&amp;lt;\App\Models\Tree&amp;gt;
 */
class TreeFactory extends Factory
{
    /**
     * Define the model&amp;#39;s default state.
     *
     * @return array&amp;lt;string, mixed&amp;gt;
     */
    public function definition(): array
    {
        $area = fake()-&amp;gt;randomElement([&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;]);
        $cluster = fake()-&amp;gt;randomElement([&amp;#39;A&amp;#39;, &amp;#39;B&amp;#39;, &amp;#39;C&amp;#39;, &amp;#39;D&amp;#39;, &amp;#39;E&amp;#39;, &amp;#39;F&amp;#39;, &amp;#39;G&amp;#39;, &amp;#39;H&amp;#39;]);
        $size = fake()-&amp;gt;randomFloat(1, 1, 5);
        return [
            &amp;#39;uid&amp;#39; =&amp;gt; fake()-&amp;gt;numerify($area . $cluster . &amp;#39;######&amp;#39;),
            &amp;#39;name&amp;#39; =&amp;gt; fake()-&amp;gt;name(),
            &amp;#39;type&amp;#39; =&amp;gt; fake()-&amp;gt;numberBetween(1, 5),
            &amp;#39;family&amp;#39; =&amp;gt; fake()-&amp;gt;randomDigitNotNull(),
            &amp;#39;unit&amp;#39; =&amp;gt; fake()-&amp;gt;randomDigitNotNull(),
            &amp;#39;age&amp;#39; =&amp;gt; fake()-&amp;gt;randomFloat(1, 1, 20),
            &amp;#39;value&amp;#39; =&amp;gt; fake()-&amp;gt;sentence(),
            &amp;#39;cluster&amp;#39; =&amp;gt; $cluster,
            &amp;#39;area&amp;#39; =&amp;gt; $area,
            &amp;#39;image&amp;#39; =&amp;gt; fake()-&amp;gt;imageUrl($width=400, $height=400),
            &amp;#39;locate&amp;#39; =&amp;gt; &amp;#39;10.&amp;#39; . fake()-&amp;gt;numberBetween(1000, 999999) . &amp;#39;,106.&amp;#39; . fake()-&amp;gt;numberBetween(1000, 999999),
            &amp;#39;status&amp;#39; =&amp;gt; fake()-&amp;gt;numberBetween(1, 5),
            &amp;#39;birthday&amp;#39; =&amp;gt; fake()-&amp;gt;dateTime(),
            &amp;#39;size&amp;#39; =&amp;gt; $size,
            &amp;#39;height&amp;#39; =&amp;gt; fake()-&amp;gt;randomFloat(1, 1, 10),
            &amp;#39;perimeter&amp;#39; =&amp;gt; $size * 3.14,
            &amp;#39;history&amp;#39; =&amp;gt; fake()-&amp;gt;paragraph(),
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tạo một Seeder&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class TreeSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        \App\Models\Tree::factory(10)-&amp;gt;create();
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Chạy command&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;php artisan db:seed --class=TreeSeeder
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 29 Apr 2023 00:00:00 GMT</pubDate></item><item><title>Fix Undefined Variable $errors in Laravel</title><link>https://jangkeyte.github.io/blog/xu-ly-loi-undefined-variable-errors-trong-laravel/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/xu-ly-loi-undefined-variable-errors-trong-laravel/</guid><description>Common causes and solutions for the undefined $errors variable in Blade templates.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/xu-ly-loi-undefined-variable-errors-trong-laravel/&quot;&gt;https://jangkeyte.github.io/blog/xu-ly-loi-undefined-variable-errors-trong-laravel/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Common causes and solutions for the undefined $errors variable in Blade templates.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/04/11/xu-ly-loi-undefined-variable-errors-trong-laravel/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Fix Undefined Variable $errors in Laravel&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Route::group([&amp;#39;middleware&amp;#39; =&amp;gt; [&amp;#39;web&amp;#39;]], function () {
    //routes here
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/04/11/xu-ly-loi-undefined-variable-errors-trong-laravel/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Bên trong tệp routes.php, hãy tạo các định tuyến của bạn trong khối sau&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Route::group([&amp;#39;middleware&amp;#39; =&amp;gt; [&amp;#39;web&amp;#39;]], function () {
    //routes here
});
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Tue, 11 Apr 2023 00:00:00 GMT</pubDate></item><item><title>Add a Call-Now Button in WordPress Without a Plugin</title><link>https://jangkeyte.github.io/blog/call-now-button-without-plugin-wordpress/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/call-now-button-without-plugin-wordpress/</guid><description>Floating call button implementation using WordPress hooks and minimal CSS/JS.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/call-now-button-without-plugin-wordpress/&quot;&gt;https://jangkeyte.github.io/blog/call-now-button-without-plugin-wordpress/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Floating call button implementation using WordPress hooks and minimal CSS/JS.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/01/07/call-now-button-without-plugin-wordpress/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Add a Call-Now Button in WordPress Without a Plugin&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;quick-alo-phone quick-alo-green quick-alo-show&amp;quot; id=&amp;quot;quick-alo-phoneIcon&amp;quot;&amp;gt;
   &amp;lt;a href=&amp;quot;tel:01674596344&amp;quot; title=&amp;quot;Liên hệ nhanh&amp;quot;&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-circle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-circle-fill&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-img-circle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
   &amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.quick-alo-phone{
    display: block;
}

.quick-alo-phone.quick-alo-static {
    opacity:.6;
}
.quick-alo-phone.quick-alo-hover,
.quick-alo-phone:hover {
    opacity:1;
}
.quick-alo-ph-circle {
    width:160px;
    height:160px;
    top:20px;
    left:20px;
    position:absolute;
    background-color:transparent;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid rgba(30,30,30,0.4);
    border:2px solid #bfebfc 9;
    opacity:.1;
    -webkit-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -moz-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -ms-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -o-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -webkit-transition:all .5s;
    -moz-transition:all .5s;
    -o-transition:all .5s;
    transition:all .5s;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-circle {
    -webkit-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-circle {
    -webkit-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone:hover .quick-alo-ph-circle {
    border-color:#00aff2;
    opacity:.5;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-circle {
    border-color:#75eb50;
    border-color:#baf5a7 9;
    opacity:.5;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-circle {
    border-color:#00aff2;
    border-color:#bfebfc 9;
    opacity:.5;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-circle {
    border-color:#ccc;
    opacity:.5;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-circle {
    border-color:#75eb50;
    opacity:.5;
}
.quick-alo-ph-circle-fill {
    width:100px;
    height:100px;
    top:50px;
    left:50px;
    position:absolute;
    background-color:#000;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid transparent;
    opacity:.1;
    -webkit-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -moz-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -ms-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -o-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -webkit-transition:all .5s;
    -moz-transition:all .5s;
    -o-transition:all .5s;
    transition:all .5s;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-circle-fill {
    -webkit-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-circle-fill {
    -webkit-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    opacity:0 !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone:hover .quick-alo-ph-circle-fill {
    background-color:rgba(0,175,242,0.5);
    background-color:#00aff2 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-circle-fill {
    background-color:rgba(117,235,80,0.5);
    background-color:#baf5a7 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-circle-fill {
    background-color:rgba(0,175,242,0.5);
    background-color:#a6e3fa 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-circle-fill {
    background-color:rgba(204,204,204,0.5);
    background-color:#ccc 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-circle-fill {
    background-color:rgba(117,235,80,0.5);
    opacity:.75 !important;
}
.quick-alo-ph-img-circle {
    width:60px;
    height:60px;
    top:70px;
    left:70px;
    position:absolute;
    background:rgba(30,30,30,0.1) url(&amp;quot;https://i.imgur.com/YWJeVO2.png&amp;quot;) no-repeat center center;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid transparent;
    opacity:.7;
    -webkit-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -moz-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -ms-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -o-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-img-circle {
    -webkit-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-img-circle {
    -webkit-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone:hover .quick-alo-ph-img-circle {
    background-color:#00aff2;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-img-circle {
    background-color:#75eb50;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-img-circle {
    background-color:#00aff2;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-img-circle {
    background-color:#ccc;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-img-circle {
    background-color:#75eb50;
}
@-moz-keyframes quick-alo-circle-anim {
    0% {
        -moz-transform:rotate(0) scale(.5) skew(1deg);
        opacity:.1;
        -moz-opacity:.1;
        -webkit-opacity:.1;
        -o-opacity:.1;
    }
    30% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.5;
        -moz-opacity:.5;
        -webkit-opacity:.5;
        -o-opacity:.5;
    }
    100% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
        opacity:.6;
        -moz-opacity:.6;
        -webkit-opacity:.6;
        -o-opacity:.1;
    }
}
@-webkit-keyframes quick-alo-circle-anim {
    0% {
        -webkit-transform:rotate(0) scale(.5) skew(1deg);
        -webkit-opacity:.1;
    }
    30% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        -webkit-opacity:.5;
    }
    100% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
        -webkit-opacity:.1;
    }
    }
    @-o-keyframes quick-alo-circle-anim {
    0% {
        -o-transform:rotate(0) kscale(.5) skew(1deg);
        -o-opacity:.1;
    }
    30% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        -o-opacity:.5;
    }
    100% {
        -o-transform:rotate(0) scale(1) skew(1deg);
        -o-opacity:.1;
    }
}
@-moz-keyframes quick-alo-circle-fill-anim {
    0% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -moz-transform:rotate(0) -moz-scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-webkit-keyframes quick-alo-circle-fill-anim {
    0% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-o-keyframes quick-alo-circle-fill-anim {
    0% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -o-transform:rotate(0) scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-moz-keyframes quick-alo-circle-img-anim {
    0% {
        transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -moz-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -moz-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -moz-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -moz-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
    }
}
@-webkit-keyframes quick-alo-circle-img-anim {
    0% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -webkit-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -webkit-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -webkit-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -webkit-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
}
@-o-keyframes quick-alo-circle-img-anim {
    0% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -o-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -o-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -o-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -o-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
}
.quick-alo-phone {
    position: fixed;
    background-color: transparent;
    width: 150px;
    height: 150px;
    cursor: pointer;
    z-index: 200000 !important;
    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0);
    -webkit-transition: visibility .5s;
    -moz-transition: visibility .5s;
    -o-transition: visibility .5s;
    transition: visibility .5s;
    right: 10px;
    bottom: 10px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2023/01/07/call-now-button-without-plugin-wordpress/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;HTML&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&amp;quot;quick-alo-phone quick-alo-green quick-alo-show&amp;quot; id=&amp;quot;quick-alo-phoneIcon&amp;quot;&amp;gt;
   &amp;lt;a href=&amp;quot;tel:01674596344&amp;quot; title=&amp;quot;Liên hệ nhanh&amp;quot;&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-circle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-circle-fill&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;div class=&amp;quot;quick-alo-ph-img-circle&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
   &amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CSS&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.quick-alo-phone{
    display: block;
}

.quick-alo-phone.quick-alo-static {
    opacity:.6;
}
.quick-alo-phone.quick-alo-hover,
.quick-alo-phone:hover {
    opacity:1;
}
.quick-alo-ph-circle {
    width:160px;
    height:160px;
    top:20px;
    left:20px;
    position:absolute;
    background-color:transparent;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid rgba(30,30,30,0.4);
    border:2px solid #bfebfc 9;
    opacity:.1;
    -webkit-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -moz-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -ms-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -o-animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    animation:quick-alo-circle-anim 1.2s infinite ease-in-out;
    -webkit-transition:all .5s;
    -moz-transition:all .5s;
    -o-transition:all .5s;
    transition:all .5s;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-circle {
    -webkit-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
    animation:quick-alo-circle-anim 1.1s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-circle {
    -webkit-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
    animation:quick-alo-circle-anim 2.2s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone:hover .quick-alo-ph-circle {
    border-color:#00aff2;
    opacity:.5;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-circle {
    border-color:#75eb50;
    border-color:#baf5a7 9;
    opacity:.5;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-circle {
    border-color:#00aff2;
    border-color:#bfebfc 9;
    opacity:.5;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-circle,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-circle {
    border-color:#ccc;
    opacity:.5;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-circle {
    border-color:#75eb50;
    opacity:.5;
}
.quick-alo-ph-circle-fill {
    width:100px;
    height:100px;
    top:50px;
    left:50px;
    position:absolute;
    background-color:#000;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid transparent;
    opacity:.1;
    -webkit-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -moz-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -ms-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -o-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out;
    -webkit-transition:all .5s;
    -moz-transition:all .5s;
    -o-transition:all .5s;
    transition:all .5s;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-circle-fill {
    -webkit-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
    animation:quick-alo-circle-fill-anim 1.7s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-circle-fill {
    -webkit-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    animation:quick-alo-circle-fill-anim 2.3s infinite ease-in-out !important;
    opacity:0 !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone:hover .quick-alo-ph-circle-fill {
    background-color:rgba(0,175,242,0.5);
    background-color:#00aff2 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-circle-fill {
    background-color:rgba(117,235,80,0.5);
    background-color:#baf5a7 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-circle-fill {
    background-color:rgba(0,175,242,0.5);
    background-color:#a6e3fa 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-circle-fill,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-circle-fill {
    background-color:rgba(204,204,204,0.5);
    background-color:#ccc 9;
    opacity:.75 !important;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-circle-fill {
    background-color:rgba(117,235,80,0.5);
    opacity:.75 !important;
}
.quick-alo-ph-img-circle {
    width:60px;
    height:60px;
    top:70px;
    left:70px;
    position:absolute;
    background:rgba(30,30,30,0.1) url(&amp;quot;https://i.imgur.com/YWJeVO2.png&amp;quot;) no-repeat center center;
    -webkit-border-radius:100%;
    -moz-border-radius:100%;
    border-radius:100%;
    border:2px solid transparent;
    opacity:.7;
    -webkit-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -moz-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -ms-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -o-animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    animation:quick-alo-circle-img-anim 1s infinite ease-in-out;
    -webkit-transform-origin:50% 50%;
    -moz-transform-origin:50% 50%;
    -ms-transform-origin:50% 50%;
    -o-transform-origin:50% 50%;
    transform-origin:50% 50%;
}
.quick-alo-phone.quick-alo-active .quick-alo-ph-img-circle {
    -webkit-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
    animation:quick-alo-circle-img-anim 1s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-static .quick-alo-ph-img-circle {
    -webkit-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -moz-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -ms-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    -o-animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
    animation:quick-alo-circle-img-anim 0s infinite ease-in-out !important;
}
.quick-alo-phone.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone:hover .quick-alo-ph-img-circle {
    background-color:#00aff2;
}
.quick-alo-phone.quick-alo-green.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone.quick-alo-green:hover .quick-alo-ph-img-circle {
    background-color:#75eb50;
}
.quick-alo-phone.quick-alo-green .quick-alo-ph-img-circle {
    background-color:#00aff2;
}
.quick-alo-phone.quick-alo-gray.quick-alo-hover .quick-alo-ph-img-circle,
.quick-alo-phone.quick-alo-gray:hover .quick-alo-ph-img-circle {
    background-color:#ccc;
}
.quick-alo-phone.quick-alo-gray .quick-alo-ph-img-circle {
    background-color:#75eb50;
}
@-moz-keyframes quick-alo-circle-anim {
    0% {
        -moz-transform:rotate(0) scale(.5) skew(1deg);
        opacity:.1;
        -moz-opacity:.1;
        -webkit-opacity:.1;
        -o-opacity:.1;
    }
    30% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.5;
        -moz-opacity:.5;
        -webkit-opacity:.5;
        -o-opacity:.5;
    }
    100% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
        opacity:.6;
        -moz-opacity:.6;
        -webkit-opacity:.6;
        -o-opacity:.1;
    }
}
@-webkit-keyframes quick-alo-circle-anim {
    0% {
        -webkit-transform:rotate(0) scale(.5) skew(1deg);
        -webkit-opacity:.1;
    }
    30% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        -webkit-opacity:.5;
    }
    100% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
        -webkit-opacity:.1;
    }
    }
    @-o-keyframes quick-alo-circle-anim {
    0% {
        -o-transform:rotate(0) kscale(.5) skew(1deg);
        -o-opacity:.1;
    }
    30% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        -o-opacity:.5;
    }
    100% {
        -o-transform:rotate(0) scale(1) skew(1deg);
        -o-opacity:.1;
    }
}
@-moz-keyframes quick-alo-circle-fill-anim {
    0% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -moz-transform:rotate(0) -moz-scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -moz-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-webkit-keyframes quick-alo-circle-fill-anim {
    0% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -webkit-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-o-keyframes quick-alo-circle-fill-anim {
    0% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
    50% {
        -o-transform:rotate(0) scale(1) skew(1deg);
        opacity:.2;
    }
    100% {
        -o-transform:rotate(0) scale(.7) skew(1deg);
        opacity:.2;
    }
}
@-moz-keyframes quick-alo-circle-img-anim {
    0% {
        transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -moz-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -moz-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -moz-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -moz-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -moz-transform:rotate(0) scale(1) skew(1deg);
    }
}
@-webkit-keyframes quick-alo-circle-img-anim {
    0% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -webkit-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -webkit-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -webkit-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -webkit-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -webkit-transform:rotate(0) scale(1) skew(1deg);
    }
}
@-o-keyframes quick-alo-circle-img-anim {
    0% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
    10% {
        -o-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    20% {
        -o-transform:rotate(25deg) scale(1) skew(1deg);
    }
    30% {
        -o-transform:rotate(-25deg) scale(1) skew(1deg);
    }
    40% {
        -o-transform:rotate(25deg) scale(1) skew(1deg);
    }
    50% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
    100% {
        -o-transform:rotate(0) scale(1) skew(1deg);
    }
}
.quick-alo-phone {
    position: fixed;
    background-color: transparent;
    width: 150px;
    height: 150px;
    cursor: pointer;
    z-index: 200000 !important;
    -webkit-backface-visibility: hidden;
    -webkit-transform: translateZ(0);
    -webkit-transition: visibility .5s;
    -moz-transition: visibility .5s;
    -o-transition: visibility .5s;
    transition: visibility .5s;
    right: 10px;
    bottom: 10px;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Sat, 07 Jan 2023 00:00:00 GMT</pubDate></item><item><title>Cách giải eval+gzinflate+base64_decode cho Newbie</title><link>https://jangkeyte.github.io/blog/cach-giai-evalgzinflatebase64-decode-cho-newbie/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/cach-giai-evalgzinflatebase64-decode-cho-newbie/</guid><description>Cách giải eval+gzinflate+base64_decode cho Newbie</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/cach-giai-evalgzinflatebase64-decode-cho-newbie/&quot;&gt;https://jangkeyte.github.io/blog/cach-giai-evalgzinflatebase64-decode-cho-newbie/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Technical article from Jang Keyte&amp;#39;s Blog.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/10/26/cach-giai-evalgzinflatebase64_decode-cho-newbie/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Cach Giai Evalgzinflatebase64 Decode Cho Newbie&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;eval(gzinflate(base64_decode(&amp;quot;DdA3sqtIAADAu/zovSLASkBtbQBIeCcECEi2MIMYYUcwuNPvP0AnDda8+3mfcKi7fAE/RT6DK/dfBcqxAj9/5FLVZ2RKknR7YOFEJGPKMuoyKacMaNphhpBsvkHMmDvBtk7B6wSa98HWIT+anHPevw0pl2iQVlaIaptf6zmd4XabLoHG8uUnq0KQiDfzC8SXX8ZExFSHAR0EXma74KZRBHpvTC2aal20tbwpOZjOfkK/Rw7auyhvhXQhh+3a0iGOgDcpDxIz0JJtH+zi/eGn4sKmibueOOj5RuH2D2Xh3ikgxt9L3FWW9hB7wSxav15R8K6GRvVh1BdpOlnjGW4Lr6rnUzO/EgctgTDgna+L56nhZsRnel7cxBUFspVLnpOcuNI026ftHIlHVjOrmcKbdb/GkwefK2xVlZyGaVKpbaMvx8d5oz3zvHfM05V2Qr72Z1N+TPs4BY1jJQx8TPnHX7VpC4FOjT4jr9tfunaFnMoHHS3RrgdKSktD7Dn7yySWiffFJC8PVoqibc7AcomVekS9eLtWh46VuCJ71ITPWni6oW4Pasd9kmGyAD9Sj7+j6DoJenynrvOifXbBrajuU5bcyzaskwi+brlT6bJf0rfZd5TKsR7IXwej3pQgxTVOGaZ7r837uiJoealahYlWCAqn4WUzPaklZ92ZIqXkWDx/2Y/BD9ezM23R18CkplVBkwrbfXNqLQyzZQwg8miYmZ4zpSkzmHtBfp5ElY2lFeLMHZEt5FJEdBxfweEMwMn2IXBet8dRc0NBvyCidcGiizViGToYOmx1d4bBtyu/FSkxH34ingbtYm+mrj15ig2HLP4wjsAl4+94RPOWSqzi6c1rQVTrvsLngrRAjqxg+ORyjJvoSJ60kVn8FHpPHICc1HZdggR9JpwbloCM3bvmkUbcmoXtHCFBrrxIkpvz75/f399//gc=&amp;quot;)));
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Coded by RedPhoenix89
function de_eval($code,$time = 1) {
 $code = trim($code,&amp;#39; ?&amp;gt;&amp;lt;? &amp;#39;);
 $code = trim($code,&amp;#39; ?&amp;gt;&amp;lt;?php &amp;#39;);
 $code = trim($code);
 if ($time == 1) $code = &amp;quot;eval(gzinflate(base64_decode(&amp;#39;&amp;quot;.$code.&amp;quot;&amp;#39;)))&amp;quot;;
 if (preg_match(&amp;quot;#^eval\(gzinflate\(base64_decode\((.*?)\)\)\)#&amp;quot;,$code)) {
  $code = preg_replace(&amp;quot;#^eval\(gzinflate\(base64_decode\((.*?)\)\)\)#&amp;quot;,&amp;quot;\\1&amp;quot;,$code);
  $code = gzinflate(base64_decode($code));
  return de_eval($code,$time+1);
 }
 else return $code;
}
$code = &amp;quot;DdA3sqtIAADAu/zovSLASkBtbQBIeCcECEi2MIMYYUcwuNPvP0AnDda8+3mfcKi7fAE/RT6DK/dfBcqxAj9/5FLVZ2RKknR7YOFEJGPKMuoyKacMaNphhpBsvkHMmDvBtk7B6wSa98HWIT+anHPevw0pl2iQVlaIaptf6zmd4XabLoHG8uUnq0KQiDfzC8SXX8ZExFSHAR0EXma74KZRBHpvTC2aal20tbwpOZjOfkK/Rw7auyhvhXQhh+3a0iGOgDcpDxIz0JJtH+zi/eGn4sKmibueOOj5RuH2D2Xh3ikgxt9L3FWW9hB7wSxav15R8K6GRvVh1BdpOlnjGW4Lr6rnUzO/EgctgTDgna+L56nhZsRnel7cxBUFspVLnpOcuNI026ftHIlHVjOrmcKbdb/GkwefK2xVlZyGaVKpbaMvx8d5oz3zvHfM05V2Qr72Z1N+TPs4BY1jJQx8TPnHX7VpC4FOjT4jr9tfunaFnMoHHS3RrgdKSktD7Dn7yySWiffFJC8PVoqibc7AcomVekS9eLtWh46VuCJ71ITPWni6oW4Pasd9kmGyAD9Sj7+j6DoJenynrvOifXbBrajuU5bcyzaskwi+brlT6bJf0rfZd5TKsR7IXwej3pQgxTVOGaZ7r837uiJoealahYlWCAqn4WUzPaklZ92ZIqXkWDx/2Y/BD9ezM23R18CkplVBkwrbfXNqLQyzZQwg8miYmZ4zpSkzmHtBfp5ElY2lFeLMHZEt5FJEdBxfweEMwMn2IXBet8dRc0NBvyCidcGiizViGToYOmx1d4bBtyu/FSkxH34ingbtYm+mrj15ig2HLP4wjsAl4+94RPOWSqzi6c1rQVTrvsLngrRAjqxg+ORyjJvoSJ60kVn8FHpPHICc1HZdggR9JpwbloCM3bvmkUbcmoXtHCFBrrxIkpvz75/f399//gc=&amp;quot;; // Nhập nội dung code cần giải
echo de_eval($code);b
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/10/26/cach-giai-evalgzinflatebase64_decode-cho-newbie/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Cach 1: Thay eval thành echo&lt;/p&gt;
&lt;p&gt;Cách 2: Viết tool để tự động giải mã&lt;/p&gt;
&lt;p&gt;Đoạn code này đã được mã hóa 10 lần&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;eval(gzinflate(base64_decode(&amp;quot;DdA3sqtIAADAu/zovSLASkBtbQBIeCcECEi2MIMYYUcwuNPvP0AnDda8+3mfcKi7fAE/RT6DK/dfBcqxAj9/5FLVZ2RKknR7YOFEJGPKMuoyKacMaNphhpBsvkHMmDvBtk7B6wSa98HWIT+anHPevw0pl2iQVlaIaptf6zmd4XabLoHG8uUnq0KQiDfzC8SXX8ZExFSHAR0EXma74KZRBHpvTC2aal20tbwpOZjOfkK/Rw7auyhvhXQhh+3a0iGOgDcpDxIz0JJtH+zi/eGn4sKmibueOOj5RuH2D2Xh3ikgxt9L3FWW9hB7wSxav15R8K6GRvVh1BdpOlnjGW4Lr6rnUzO/EgctgTDgna+L56nhZsRnel7cxBUFspVLnpOcuNI026ftHIlHVjOrmcKbdb/GkwefK2xVlZyGaVKpbaMvx8d5oz3zvHfM05V2Qr72Z1N+TPs4BY1jJQx8TPnHX7VpC4FOjT4jr9tfunaFnMoHHS3RrgdKSktD7Dn7yySWiffFJC8PVoqibc7AcomVekS9eLtWh46VuCJ71ITPWni6oW4Pasd9kmGyAD9Sj7+j6DoJenynrvOifXbBrajuU5bcyzaskwi+brlT6bJf0rfZd5TKsR7IXwej3pQgxTVOGaZ7r837uiJoealahYlWCAqn4WUzPaklZ92ZIqXkWDx/2Y/BD9ezM23R18CkplVBkwrbfXNqLQyzZQwg8miYmZ4zpSkzmHtBfp5ElY2lFeLMHZEt5FJEdBxfweEMwMn2IXBet8dRc0NBvyCidcGiizViGToYOmx1d4bBtyu/FSkxH34ingbtYm+mrj15ig2HLP4wjsAl4+94RPOWSqzi6c1rQVTrvsLngrRAjqxg+ORyjJvoSJ60kVn8FHpPHICc1HZdggR9JpwbloCM3bvmkUbcmoXtHCFBrrxIkpvz75/f399//gc=&amp;quot;)));
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Viết chương trình như sau để giải mã nó&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Coded by RedPhoenix89
function de_eval($code,$time = 1) {
 $code = trim($code,&amp;#39; ?&amp;gt;&amp;lt;? &amp;#39;);
 $code = trim($code,&amp;#39; ?&amp;gt;&amp;lt;?php &amp;#39;);
 $code = trim($code);
 if ($time == 1) $code = &amp;quot;eval(gzinflate(base64_decode(&amp;#39;&amp;quot;.$code.&amp;quot;&amp;#39;)))&amp;quot;;
 if (preg_match(&amp;quot;#^eval\(gzinflate\(base64_decode\((.*?)\)\)\)#&amp;quot;,$code)) {
  $code = preg_replace(&amp;quot;#^eval\(gzinflate\(base64_decode\((.*?)\)\)\)#&amp;quot;,&amp;quot;\\1&amp;quot;,$code);
  $code = gzinflate(base64_decode($code));
  return de_eval($code,$time+1);
 }
 else return $code;
}
$code = &amp;quot;DdA3sqtIAADAu/zovSLASkBtbQBIeCcECEi2MIMYYUcwuNPvP0AnDda8+3mfcKi7fAE/RT6DK/dfBcqxAj9/5FLVZ2RKknR7YOFEJGPKMuoyKacMaNphhpBsvkHMmDvBtk7B6wSa98HWIT+anHPevw0pl2iQVlaIaptf6zmd4XabLoHG8uUnq0KQiDfzC8SXX8ZExFSHAR0EXma74KZRBHpvTC2aal20tbwpOZjOfkK/Rw7auyhvhXQhh+3a0iGOgDcpDxIz0JJtH+zi/eGn4sKmibueOOj5RuH2D2Xh3ikgxt9L3FWW9hB7wSxav15R8K6GRvVh1BdpOlnjGW4Lr6rnUzO/EgctgTDgna+L56nhZsRnel7cxBUFspVLnpOcuNI026ftHIlHVjOrmcKbdb/GkwefK2xVlZyGaVKpbaMvx8d5oz3zvHfM05V2Qr72Z1N+TPs4BY1jJQx8TPnHX7VpC4FOjT4jr9tfunaFnMoHHS3RrgdKSktD7Dn7yySWiffFJC8PVoqibc7AcomVekS9eLtWh46VuCJ71ITPWni6oW4Pasd9kmGyAD9Sj7+j6DoJenynrvOifXbBrajuU5bcyzaskwi+brlT6bJf0rfZd5TKsR7IXwej3pQgxTVOGaZ7r837uiJoealahYlWCAqn4WUzPaklZ92ZIqXkWDx/2Y/BD9ezM23R18CkplVBkwrbfXNqLQyzZQwg8miYmZ4zpSkzmHtBfp5ElY2lFeLMHZEt5FJEdBxfweEMwMn2IXBet8dRc0NBvyCidcGiizViGToYOmx1d4bBtyu/FSkxH34ingbtYm+mrj15ig2HLP4wjsAl4+94RPOWSqzi6c1rQVTrvsLngrRAjqxg+ORyjJvoSJ60kVn8FHpPHICc1HZdggR9JpwbloCM3bvmkUbcmoXtHCFBrrxIkpvz75/f399//gc=&amp;quot;; // Nhập nội dung code cần giải
echo de_eval($code);b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run thử để xem kết quả. Cho dù nó được mã hóa bao nhiêu lần thì tool này đều giải được hết.&lt;/p&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Wed, 26 Oct 2022 00:00:00 GMT</pubDate></item><item><title>Configure Custom Domain Email on Yandex</title><link>https://jangkeyte.github.io/blog/huong-dan-cau-hinh-mail-domain-tren-yandex/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/huong-dan-cau-hinh-mail-domain-tren-yandex/</guid><description>DNS and Yandex Mail setup guide for hosting email on your own domain.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/huong-dan-cau-hinh-mail-domain-tren-yandex/&quot;&gt;https://jangkeyte.github.io/blog/huong-dan-cau-hinh-mail-domain-tren-yandex/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;DNS and Yandex Mail setup guide for hosting email on your own domain.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/09/14/huong-dan-cau-hinh-mail-domain-tren-yandex/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Configure Custom Domain Email on Yandex&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;yandex-verification: 62627fa96ef3e21e
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 redirect=_spf.yandex.net
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 ip4:IP-1 ip4:IP-2 ip4:IP-3 include:_spf.yandex.net ~all
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/09/14/huong-dan-cau-hinh-mail-domain-tren-yandex/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Đăng ký tài khoản Yandex và truy cập vào trang quản trị:&lt;a href=&quot;https://admin.yandex.ru&quot;&gt;https://admin.yandex.ru&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Bước 1: Xác nhận tên miền thuộc về bạn&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Có 3 cách xác thực lần lượt là: bản ghi DNS, thẻ meta trên website và file html trên website. Ở đây mình sẽ dùng cách xác thực là bản ghi DNS.&lt;/p&gt;
&lt;p&gt;– Thêm bản ghi DNS (bản ghi tài nguyên) thuộc loại TXT với các tham số sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;yandex-verification: 62627fa96ef3e21e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Host điền @ hoặc để trống&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Bước 2: cấu hình dns của nhà cung cấp&lt;/strong&gt;&lt;/em&gt;
với ncc pavietnam thì cấu hình như sau:
host: @ | type: MX | address: mr.pavietnam.vn | priority: 300
với yandex thì cấu hình như sau:
host: @ | type: MX | address: mx.yandex.net | priority: 21600&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Bước 3: Thiết lập bản ghi SPF để email không bị spam&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;– Thêm bản ghi DNS (bản ghi tài nguyên) thuộc loại TXT với các tham số sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 redirect=_spf.yandex.net
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;– Nếu bạn muốn gửi email không chỉ từ máy chủ Yandex, hãy chỉ định máy chủ bổ sung ở định dạng sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=spf1 ip4:IP-1 ip4:IP-2 ip4:IP-3 include:_spf.yandex.net ~all
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;trong đó: IP-1, IP-2, IP-3 – IP addresses of additional servers.&lt;/p&gt;
&lt;p&gt;Host điền @ hoặc để trống&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Bước 4: Thiết lập chữ ký DKIM để email của bạn không bị spam&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;– Thêm bản ghi DNS (bản ghi tài nguyên) thuộc loại TXT với các tham số sau:&lt;/p&gt;
&lt;p&gt;Host: mail._domainkey&lt;/p&gt;
&lt;p&gt;Address điền nội dung như sau:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;v=DKIM1; k=rsa; t=s; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDzaEVyWAkGRzc3HdDhhOKZkdXyaiTk/FCcLEYAF0M8JUQUmD7q5U98sRycrTS9DMwvHZ4fk/og2SHQFr1IgJiKP00oO/UvUEru9S/J/hwRguAWtfI1lr6fzt7jBAXwgz3+kiganLvpORKv4e0K/+DLrCwgPf50d7wlYgYvUd4I/QIDAQAB
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Wed, 14 Sep 2022 00:00:00 GMT</pubDate></item><item><title>Change the WordPress Login URL</title><link>https://jangkeyte.github.io/blog/doi-duong-link-dang-nhap-wordpress/</link><guid isPermaLink="true">https://jangkeyte.github.io/blog/doi-duong-link-dang-nhap-wordpress/</guid><description>Secure your WordPress site by customizing the default wp-login.php path.</description><content:encoded>&lt;blockquote&gt;This rendering was automatically generated by Frosti Feed and may have formatting issues. For the best experience, please visit: &lt;a href=&quot;https://jangkeyte.github.io/blog/doi-duong-link-dang-nhap-wordpress/&quot;&gt;https://jangkeyte.github.io/blog/doi-duong-link-dang-nhap-wordpress/&lt;/a&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;lt;&amp;lt;&lt;en&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;Secure your WordPress site by customizing the default wp-login.php path.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Originally published on &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/05/16/doi-duong-link-dang-nhap-wordpress/&quot;&gt;Jang Keyte&amp;#39;s Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This article covers &lt;strong&gt;Change the WordPress Login URL&lt;/strong&gt; — practical notes from real-world web development experience.&lt;/p&gt;
&lt;h3&gt;Code Examples&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;
function redirect_page() {
    if (isset($_SERVER[&amp;#39;HTTPS&amp;#39;]) &amp;amp;&amp;amp;
        ($_SERVER[&amp;#39;HTTPS&amp;#39;] == &amp;#39;on&amp;#39; ||
            $_SERVER[&amp;#39;HTTPS&amp;#39;] == 1) ||
        isset($_SERVER[&amp;#39;HTTP_X_FORWARDED_PROTO&amp;#39;]) &amp;amp;&amp;amp;
        $_SERVER[&amp;#39;HTTP_X_FORWARDED_PROTO&amp;#39;] == &amp;#39;https&amp;#39;) {
            $protocol = &amp;#39;https://&amp;#39;;
        }
        else {
            $protocol = &amp;#39;http://&amp;#39;;
        }
    $currenturl = $protocol . $_SERVER[&amp;#39;HTTP_HOST&amp;#39;] . $_SERVER[&amp;#39;REQUEST_URI&amp;#39;];
    $currenturl_relative = wp_make_link_relative($currenturl);

    switch ($currenturl_relative) {
        case &amp;#39;/topcomsg&amp;#39;:
            setcookie(&amp;quot;jk-shield&amp;quot;, &amp;quot;jangkeyte&amp;quot;);
            $urlto = home_url(&amp;#39;/wp-login.php&amp;#39;);
            break;

        default:
            return;
    }

    if ($currenturl != $urlto)
        exit( wp_redirect( $urlto ) );
}
add_action( &amp;#39;template_redirect&amp;#39;, &amp;#39;redirect_page&amp;#39; );
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;
/**
 * Check to see if the current page is the login/register page.
 *
 * @return bool
 */
if ( ! function_exists( &amp;#39;is_login_page&amp;#39; ) ) {
  function is_login_page() {
    return in_array(
      $GLOBALS[&amp;#39;pagenow&amp;#39;],
      array( &amp;#39;wp-login.php&amp;#39;, &amp;#39;wp-register.php&amp;#39; ),
      true
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;if ( is_login_page() ) {
    if ( !isset( $_COOKIE[&amp;quot;jk-shield&amp;quot;]) ) {
        header( &amp;#39;Location: &amp;#39; . $_SERVER[&amp;#39;HTTP_HOST&amp;#39;] );
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Read More&lt;/h3&gt;
&lt;p&gt;For the full Vietnamese version, switch language using the &lt;strong&gt;VI | EN&lt;/strong&gt; toggle above, or visit the &lt;a href=&quot;https://jangkeyte.wordpress.com/2022/05/16/doi-duong-link-dang-nhap-wordpress/&quot;&gt;original post&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&amp;lt;&amp;lt;&lt;vi&gt;&amp;gt;&amp;gt;&lt;/p&gt;
&lt;p&gt;Tạo hàm check đường dẫn đăng nhập và set cookie lưu trữ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
function redirect_page() {
    if (isset($_SERVER[&amp;#39;HTTPS&amp;#39;]) &amp;amp;&amp;amp;
        ($_SERVER[&amp;#39;HTTPS&amp;#39;] == &amp;#39;on&amp;#39; ||
            $_SERVER[&amp;#39;HTTPS&amp;#39;] == 1) ||
        isset($_SERVER[&amp;#39;HTTP_X_FORWARDED_PROTO&amp;#39;]) &amp;amp;&amp;amp;
        $_SERVER[&amp;#39;HTTP_X_FORWARDED_PROTO&amp;#39;] == &amp;#39;https&amp;#39;) {
            $protocol = &amp;#39;https://&amp;#39;;
        }
        else {
            $protocol = &amp;#39;http://&amp;#39;;
        }
    $currenturl = $protocol . $_SERVER[&amp;#39;HTTP_HOST&amp;#39;] . $_SERVER[&amp;#39;REQUEST_URI&amp;#39;];
    $currenturl_relative = wp_make_link_relative($currenturl);

    switch ($currenturl_relative) {
        case &amp;#39;/topcomsg&amp;#39;:
            setcookie(&amp;quot;jk-shield&amp;quot;, &amp;quot;jangkeyte&amp;quot;);
            $urlto = home_url(&amp;#39;/wp-login.php&amp;#39;);
            break;

        default:
            return;
    }

    if ($currenturl != $urlto)
        exit( wp_redirect( $urlto ) );
}
add_action( &amp;#39;template_redirect&amp;#39;, &amp;#39;redirect_page&amp;#39; );
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Tạo hàm kiểm tra xem có phải trang wp-login.php hoặc trang wp-register.php&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
/**
 * Check to see if the current page is the login/register page.
 *
 * @return bool
 */
if ( ! function_exists( &amp;#39;is_login_page&amp;#39; ) ) {
  function is_login_page() {
    return in_array(
      $GLOBALS[&amp;#39;pagenow&amp;#39;],
      array( &amp;#39;wp-login.php&amp;#39;, &amp;#39;wp-register.php&amp;#39; ),
      true
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Khi truy cập vào wp-login.php tiến hành kiểm tra xem cookie đã được set hay chưa, nếu chưa thì trả về trang chủ&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if ( is_login_page() ) {
    if ( !isset( $_COOKIE[&amp;quot;jk-shield&amp;quot;]) ) {
        header( &amp;#39;Location: &amp;#39; . $_SERVER[&amp;#39;HTTP_HOST&amp;#39;] );
    }
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><dc:creator>Kha Thiết Giang</dc:creator><pubDate>Mon, 16 May 2022 00:00:00 GMT</pubDate></item></channel></rss>