<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Dev Notes — Ghi chú lập trình thực chiến</title><description>Các bài viết kỹ thuật về React, FastAPI, Docker, và SEO từ thực tế dự án.</description><link>https://seo-blog-p82.pages.dev/</link><item><title>Dùng Cloudflare Tunnel để demo localhost trên điện thoại và nhiều thiết bị</title><link>https://seo-blog-p82.pages.dev/blog/cloudflare-tunnel-localhost-demo/</link><guid isPermaLink="true">https://seo-blog-p82.pages.dev/blog/cloudflare-tunnel-localhost-demo/</guid><description>Cloudflare Tunnel (cloudflared) tạo URL public trỏ vào localhost của bạn — không cần mở port, không cần VPS, demo được ngay trên điện thoại và cho khách hàng.</description><pubDate>Wed, 10 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Docker Compose mất file upload sau khi restart container — fix bằng volume mount</title><link>https://seo-blog-p82.pages.dev/blog/docker-compose-volume-upload/</link><guid isPermaLink="true">https://seo-blog-p82.pages.dev/blog/docker-compose-volume-upload/</guid><description>File upload lưu trong container filesystem sẽ biến mất khi container bị xoá hoặc rebuild. Cách đúng là mount volume ra ngoài host.</description><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Chạy FastAPI và Socket.IO chung một process ASGI với socketio.ASGIApp</title><link>https://seo-blog-p82.pages.dev/blog/fastapi-socketio-asgi/</link><guid isPermaLink="true">https://seo-blog-p82.pages.dev/blog/fastapi-socketio-asgi/</guid><description>Hướng dẫn kết hợp FastAPI REST và Socket.IO realtime trong một server duy nhất dùng socketio.ASGIApp làm ASGI wrapper.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate></item><item><title>React Optimistic Update: Hiển thị reply ngay mà không reload trang</title><link>https://seo-blog-p82.pages.dev/blog/react-optimistic-update-reply/</link><guid isPermaLink="true">https://seo-blog-p82.pages.dev/blog/react-optimistic-update-reply/</guid><description>Thay vì gọi refetch() sau khi POST reply, append dữ liệu vào local state ngay lập tức — người dùng thấy phản hồi tức thì, không mất scroll position, Socket.IO dedup xử lý phần còn lại.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Lỗi &apos;toFixed is not a function&apos; trong React do MySQL trả DECIMAL thành string</title><link>https://seo-blog-p82.pages.dev/blog/tofixed-decimal-mysql-react/</link><guid isPermaLink="true">https://seo-blog-p82.pages.dev/blog/tofixed-decimal-mysql-react/</guid><description>Khi MySQL trả cột DECIMAL về JavaScript, giá trị là string chứ không phải number — gọi toFixed() trực tiếp sẽ crash. Bài này giải thích nguyên nhân và cách fix gọn.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item></channel></rss>