Ghi chú
Blog
Ghi chú về frontend, SEO, AI, phân tích dữ liệu và việc xây dựng sản phẩm thực tế.
37 bài viết
DeepSeek tăng giá — tôi tìm được cùng V4 Flash rẻ hơn cả mức giá cũ
Sáng 17 tháng 8, tôi nhận ra chi phí DeepSeek API tăng lên khoảng năm lần so với bình thường. Sau đó tôi tìm và thử một provider khác chạy đúng checkpoint DeepSeek-V4-Flash-0731 với giá hiện tại thấp hơn khoảng 45% so với mức giá cũ của DeepSeek.
Cách tôi chuyển WebP động, GIF và APNG sang H.264 MP4 mà không làm hỏng khung hình hay thời gian
Quy trình sản xuất của tôi tái tạo các khung hình đầy đủ mà người dùng thực sự thấy, giữ nguyên thời gian nguồn, chọn một CFR cho mỗi MP4 cuối, dùng khung chung nhỏ nhất mà không phóng to, mã hóa các đoạn H.264 tương thích, ghép chúng mà không qua lần mã hóa mất dữ liệu thứ hai, rồi xác thực cả tệp lẫn việc phân phối qua HTTP. Trong một lần chạy được đo, 217 WebP động với tổng dung lượng 1.49 GB trở thành một H.264 MP4 78.49 MB.
Tôi từng cảnh báo cho mọi thứ: biến nhiễu lỗi trình duyệt thành hệ thống giám sát production thực sự hữu ích
Hệ thống báo lỗi frontend ban đầu của tôi coi việc chặn quảng cáo, lỗi GTM, AbortError, Script error mơ hồ và lỗi chunk Next.js thực sự là cùng một mức độ. Sau đó tôi xây lại hệ thống giám sát dựa trên nguồn sở hữu, tác động lên người dùng, chất lượng bằng chứng, tương quan sự kiện và khả năng phục hồi.
Vì sao tab Next.js cũ có thể hỏng sau khi triển khai: HTML lỗi thời, chunk bị thiếu và lệch phiên bản
Sau một lần triển khai, hệ thống giám sát sản xuất của tôi ghi nhận một chunk thuộc chính ứng dụng Next.js không tải được. Nhật ký chứng minh sự cố đã xảy ra, chứ không chứng minh nguyên nhân. Từ trường hợp đó, bài viết phân tích tab mở lâu, HTML lỗi thời, tài nguyên /_next/static bị thiếu, lệch phiên bản, thời gian lưu giữ, deploymentId, thứ tự phát hành, giám sát và phục hồi có kiểm soát.
Một tick đã làm hỏng CFR của tôi: vì sao 5580 không phải 5625 và 3751 không phải 3750
Bộ kiểm tra của tôi liên tục từ chối MP4 16 fps vì một gói có thời lượng 5580 tick thay vì 5625. Sau đó nó phát hiện 3751 tick ở nơi 24 fps phải chính xác là 3750. Hai lỗi này buộc tôi tách riêng thời gian của nguồn, lượng tử hóa CFR, cơ sở thời gian MP4, PTS/DTS, ghép kênh và kiểm tra ở cấp gói.
Cách tôi giảm một video vận hành từ ~280 MB xuống ~50 MB bằng H.264
Một video thật trong hệ thống vận hành đã giảm từ khoảng 280 MB xuống khoảng 50 MB sau khi tôi xây dựng lại cấu hình H.264 quanh CRF 28, x264 veryslow, giới hạn độ phân giải thuộc lớp 720p, tốc độ khung hình thực sự hữu ích và yêu cầu giải mã vừa phải. Ở giai đoạn trước, chính ví dụ đó đã giảm từ khoảng 350 xuống 238 MB; kiểm tra thư viện cũ cũng cho thấy các tệp H.264 ở mức vài megabit mỗi giây là chuyện phổ biến.
Tôi xây dựng Gitae để chẩn đoán sự cố website sâu hơn việc chỉ báo “up hay down”
Tôi xây dựng Gitae để trả lời một câu hỏi thực tế: website thật sự không truy cập được hay vấn đề chỉ nằm ở phía local? Công cụ kết hợp kiểm tra từ VDS bên ngoài ở Moscow và Helsinki với DNS, HTTPS/TLS, port, routing, IP, hosting và tín hiệu CMS, coi mỗi kết quả là bằng chứng hỗ trợ chứ không phải kết luận tuyệt đối.
Vì sao TypeScript hoạt động rất tốt với Codex khi xây phần mềm production
Trong môi trường production, TypeScript mang lại cho Codex thứ mà một prompt hay không thể thay thế: contract kiểm tra được bằng máy, feedback nhanh từ compiler và con đường an toàn hơn cho các refactor lớn.
Tôi xây dựng Jurfi.com: studio trên trình duyệt cho bản nháp pháp lý có cấu trúc
Tôi xây dựng Jurfi.com để biến biểu mẫu và mẫu tài liệu thành các bản nháp pháp lý có cấu trúc ngay trong trình duyệt, lưu bản nháp cục bộ và giữ việc rà soát như một phần rõ ràng của quy trình, mà không tuyên bố phần mềm có thể thay thế luật sư.
Doanh thu SaaS đầu tiên của tôi: một khoản thanh toán thực sự chứng minh điều gì
Khoản thanh toán đầu tiên cho một sản phẩm SaaS do tôi tự xây dựng có giá trị nhỏ, nhưng nó thay đổi chất lượng bằng chứng tôi có. Đây là những gì một giao dịch có thể xác nhận, những gì nó chưa thể chứng minh và vì sao khả năng lặp lại quan trọng hơn bản thân cột mốc.
Cách tôi dùng Codex để review 15 dự án mà vẫn giữ quyền kiểm soát thủ công
Review 15 dự án phần mềm trước đây đồng nghĩa với việc chìm trong các bước kiểm tra lặp lại. Codex giúp tôi rà bug, test, SEO, bản dịch, localization và tính nhất quán nhanh hơn rất nhiều, nhưng tôi luôn coi phát hiện của AI là manh mối chứ không phải kết luận, và mọi thay đổi đều phải được tôi xác minh.
Vì sao tôi dùng 3–5% cuối của giới hạn Codex trên ChatGPT Plus cho các tác vụ engineering lớn — Cập nhật: đến mùa hè 2026 cách này không còn hoạt động
Cập nhật: đến mùa hè 2026 workflow này không còn đáng tin cậy với tôi. Bộ đếm 5 giờ biến mất khỏi tài khoản, chỉ còn giới hạn tuần hiển thị và tác vụ dài có thể dừng khi giới hạn tuần cạn.
Tôi đã đăng 10.000 bài SEO bằng AI và cuối cùng website về 0 trang được Google lập chỉ mục
Xuất bản hàng loạt bằng AI ban đầu trông như một đường tắt: Google crawl toàn bộ 10.000 URL bài viết được tạo, nhưng chỉ khoảng 1.000 trang thực sự được index, xuất hiện trên Search và mang lại traffic thật. Sau đó chính các trang này cũng biến mất dần, cho đến khi toàn bộ website về 0 trang được lập chỉ mục. Trải nghiệm này thay đổi cách tôi nhìn AI, SEO, dịch thuật và trách nhiệm biên tập.
Năm năm với MacBook M1 8/256GB: Vì sao tôi vẫn chưa thay máy
Tôi mua chiếc MacBook M1 bản cơ bản với 8GB bộ nhớ và SSD 256GB với giá khoảng 1.000 USD, rồi dùng máy khoảng 15 giờ mỗi ngày cho lập trình, xử lý media, viết lách, học tập và các dự án cá nhân. Năm năm sau, tôi thấy rõ giới hạn của nó, nhưng lý do nghĩ đến nâng cấp là vì workload của tôi lớn hơn, không phải vì chiếc máy đã hết hữu dụng.
Tôi dịch blog sang 20 ngôn ngữ bằng ChatGPT — rồi bắt đầu nhận traffic tìm kiếm từ khắp thế giới
AI đã thay đổi hoàn toàn chi phí của việc xuất bản đa ngôn ngữ với tôi. Từ một blog chỉ có một ngôn ngữ, tôi chuyển sang xuất bản mỗi bài ở tối đa 20 ngôn ngữ và tạo thêm nhiều điểm vào từ tìm kiếm tự nhiên.
Tôi ra mắt QRViz như một trình tạo QR tĩnh miễn phí — và đặt cược việc phân phối vào SEO
QRViz là một công cụ tạo mã QR tĩnh chạy trong trình duyệt, không phải nền tảng campaign. Tôi ra mắt qrviz.com như một công cụ tạo mã QR miễn phí, không ngân sách quảng cáo, không paid acquisition và không funnel kiếm tiền. Việc được người dùng tìm thấy phụ thuộc hoàn toàn vào SEO, nên phân phối là phần bất định nhất.
Vì sao tôi thấy kiếm khách hàng khó hơn xây một SaaS
Bài học trực tiếp từ trải nghiệm xây SaaS của tôi: engineering cho feedback rõ và kiểm tra được, còn phân phối, positioning, messaging và retention cần một vòng lặp khác, khó dự đoán hơn nhiều.
Tôi tự xây một sản phẩm SaaS. Khi bật thanh toán, công việc đã thay đổi
Tôi xây sản phẩm này một mình vào buổi tối, cuối tuần và ngày nghỉ. Khi thanh toán được bật, bug, onboarding, moderation, retention và niềm tin không còn là việc để sau mà trở thành một phần của việc vận hành sản phẩm thật.
I Got 550 Views from One Image, Voiceover, and Subtitles: What Three Shorts Tests Actually Taught Me
A simple YouTube Short built from one static image, a voiceover, and subtitles reached 550 views. After three early tests, the useful lesson was not a proven formula, but a repeatable way to experiment without confusing a promising signal with proof.
Tôi thấy gần 6.000 đơn ứng tuyển cho một vị trí Frontend ở Moscow. Con số đó nói gì — và không nói gì — về thị trường IT Nga
Cuối 2023, recruiter nói với tôi rằng 300–500 hồ sơ cho một vị trí đã là rất nhiều. Đến ngày 20 tháng 1 năm 2026, tôi thấy một vị trí Frontend cấp trung ở Moscow tiến sát 6.000 đơn chỉ trong vài giờ. Đây là cách tôi phân biệt tín hiệu thật sự của con số đó với những điều nó không thể chứng minh.
DeepSeek đã thay đổi workflow Node.js của tôi thế nào: hơn 4.000 commit trong sáu tháng
Biểu đồ GitHub năm 2025 của tôi đi từ gần như trống sang hơn 4.000 commit trong nửa cuối năm. Bài viết này nói về cách AI coding thay đổi workflow side project Node.js của tôi, nơi nó tiết kiệm thời gian, nơi nó sai và vì sao verification vẫn quan trọng hơn tốc độ sinh code.
My First TikTok at 28: What a Vertical Product Demo Taught Me About Traffic
At 28, I posted my first TikTok and cross-posted the same product demo to Reels and Shorts. The useful lesson was not the view count: it was how much a 9:16 frame changes a desktop interface, and how to measure short-form traffic without confusing reach with acquisition.
Tôi mua một tên miền 25 năm tuổi: URL chết nhận hơn 1.000 request mỗi ngày
Sau khi ra mắt website trên một tên miền được đăng ký lần đầu vào năm 2000, tôi thấy hơn 1.000 request mỗi ngày vào URL cũ và hơn 900 lỗi trong Yandex Webmaster chỉ sau một đêm. Bài viết phân biệt điều tôi thực sự xác nhận được, lý do dùng 410 có chọn lọc và cách tôi sẽ audit một tên miền cũ hiện nay.
Yandex đã lập chỉ mục 12.500 trang nhưng lưu lượng từ Nga gần như bằng 0: vấn đề Cloudflare tôi đã bỏ sót
Yandex đã lập chỉ mục 12.500 trang, nhưng lưu lượng từ Nga gần như bằng 0. Tôi khoanh vùng vấn đề xuống đường đi mạng, tắt proxy Cloudflare, chuyển cache, nén và bảo vệ cơ bản sang Nginx trên VDS của mình rồi khôi phục khả năng truy cập.
Website Next.js tĩnh của tôi nhận hàng nghìn lượt quét lỗ hổng mỗi ngày. Nginx gần như không bận tâm
Log của tôi đầy những probe tìm WordPress, PHP backdoor, .env và .git/config. Trên stack Next.js tĩnh + Nginx, phần lớn chỉ kết thúc bằng miss và 404 có chi phí thấp, trong khi tải CPU không thay đổi lúc tôi quan sát. Đây là điều trải nghiệm đó thực sự nói về bảo mật website tĩnh — và những gì nó không chứng minh.
Yandex mang traffic đến website mới của tôi trong khi Google gần như đứng yên
Trên cùng một dự án mới, Google chỉ tạo ra khoảng 300 lượt nhấp trong một giai đoạn dài, còn Yandex Webmaster cho thấy đà tăng rõ rệt, có lúc báo +500% lượt nhấp. Điều quan trọng là phân biệt dữ liệu thực sự chứng minh điều gì và điều gì vẫn chỉ là giả thuyết.
Yandex lập chỉ mục 4.278 trang Next.js của tôi chỉ sau một đêm — điều đó thực sự chứng minh gì?
Yandex gần như đồng loạt đưa 4.278 trang được tạo tĩnh bằng Next.js của tôi vào chỉ mục. Đây là một cột mốc kỹ thuật thực sự, nhưng không phải bằng chứng về thứ hạng hay lưu lượng truy cập. Bài viết này phân biệt rõ điều mà kết quả đó nói được về SSG và SEO lập trình, và điều nó không thể chứng minh.
Tháng SEO đầu tiên của tôi: 632 lượt truy cập tự nhiên và một lần kiểm tra traffic bot
Tôi dùng một side project cá nhân để chuẩn bị cho sáng kiến SEO lớn hơn ở công ty. Sau một tháng, dự án có 632 lượt truy cập tự nhiên, nhưng một ngày đạt 83 lượt truy cập cho thấy traffic đáng ngờ và sai lệch khi replay có thể khiến kết quả trông tốt hơn thực tế.
Tôi suýt bỏ qua Yandex Webmaster. Hai tuần sau, nó mang lại nhiều traffic hơn Google
Tôi làm một side project bằng Next.js để thực hành trước một dự án công việc mà SEO sẽ rất quan trọng. Trong hai tuần đầu, tôi ghi nhận 58 khách từ Google và 200 từ Yandex, rồi hiểu rõ vì sao traffic, indexing và diagnostics phải được tách riêng.
Yandex Metrica vs Google Analytics: Vì sao sau một tuần tôi thích Metrica hơn
Tôi chạy Google Analytics và Yandex Metrica song song trong một tuần trên một dự án mới. Metrica được tôi mở nhiều hơn chủ yếu nhờ Webvisor và session replay, nhưng đó là kết luận về workflow của tôi, không phải bằng chứng rằng một nền tảng tốt hơn cho tất cả mọi người.
Yandex crawl blog của tôi mà bỏ /en. Redirect 308 đã ngăn các URL thành 404
Sau khi thêm khoảng 3.000 trang /en/blog/... vào sitemap, tôi thấy Yandex thử các đường dẫn tương ứng /blog/.... Những redirect 308 đã có sẵn khiến các request đó không kết thúc ở 404. Bài học quan trọng không phải là Yandex “làm hỏng” sitemap, mà là một lớp redirect sạch có thể tăng độ bền cho kiến trúc URL đến mức nào.
Hai website mới tăng vọt trên Google rồi traffic giảm khoảng 10× chỉ sau vài ngày
Trong hai lần ra mắt liên tiếp, impressions trên Google tăng mạnh ngay lập tức rồi traffic giảm xuống khoảng một phần mười chỉ sau vài ngày. Mẫu hình là có thật; tôi không thể chứng minh nguyên nhân là “Google honeymoon”.
2.000 trang biến mất khỏi tìm kiếm Yandex chỉ sau một đêm. Đây là điều tôi thực sự có thể kết luận
Trong Yandex Webmaster, tôi thấy 2.000 trên khoảng 8.000 trang không còn tham gia tìm kiếm. Mức giảm 25% rất đáng chú ý, nhưng bài học quan trọng hơn là không đánh đồng thay đổi trạng thái tìm kiếm quan sát được với một nguyên nhân đã được chứng minh.
Tôi đã đặt hơn 10 câu hỏi tại MoscowJS 66 và giành hai giải thưởng
Tại MoscowJS 66, tôi đã đặt hơn 10 câu hỏi trong các bài nói về bot Telegram, LangChain.js, kiến trúc site builder và kiểm thử kiểu TypeScript. Hai câu được chọn là câu hỏi hay nhất và tôi ra về với hai giải thưởng.
Những gì tôi mang về từ PiterJS #79: monolith cũ, FrontOps, hiệu năng web và những câu hỏi tốt hơn
PiterJS #79 tại St. Petersburg tập trung vào việc duy trì những hệ thống đã tồn tại: monolith legacy, FrontOps và các chỉ số hiệu năng web. Tôi ra về với ghi chú thực tế, hai giải thưởng từ phần Q&A và một lời nhắc về giá trị của việc thật sự tham gia các meetup trực tiếp.
I Launched a Next.js Blog in 21 Languages. Here’s What 439 Google Impressions Actually Told Me
In its first week, my 21-language Next.js blog recorded 439 Google impressions and 5 clicks. Later, 436 of 471 pages were indexed. The useful lesson was learning to separate visibility, indexing, and actual search performance.
MoscowJS 65 sau sáu năm làm việc với JavaScript: vì sao tôi vẫn đi meetup địa phương
Ngày 5 tháng 6 năm 2025, tôi tham dự MoscowJS 65 tại T Bank. Bốn bài nói tiếp cận AI từ những góc khác nhau, nhưng điều tôi rút ra lại đơn giản hơn: meetup địa phương vẫn mang lại thứ mà tài liệu và video ghi hình không thể thay thế hoàn toàn.