<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on Góc của Aperture</title>
    <link>https://blog.haivq.com/posts/</link>
    <description>Recent content in Posts on Góc của Aperture</description>
    <generator>Hugo</generator>
    <language>vi-VN</language>
    <copyright>© Aperture Prometheus :: 2018 - 2026</copyright>
    <lastBuildDate>Mon, 11 May 2026 17:25:13 +0700</lastBuildDate>
    <atom:link href="https://blog.haivq.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Một vài kinh nghiệm rút ra sau khi thi và đạt chứng chỉ RHCSA v10</title>
      <link>https://blog.haivq.com/posts/rhcsa-v10-experience/</link>
      <pubDate>Sat, 09 May 2026 23:00:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/rhcsa-v10-experience/</guid>
      <description>&lt;h1 id=&#34;hoàn-cảnh&#34;&gt;Hoàn cảnh&lt;/h1&gt;&#xA;&lt;p&gt;Câu chuyện bắt đầu khi sếp nhắc nhở tôi rằng mỗi nhân viên ở Red Hat phải có tối thiểu 2 certificate Red Hat đang active, và bắt buộc phải có 1 certificate đã active trước tháng 6 này. Các certificate của tôi đều đã hết hạn, nên hiện tại trong tháng 5 tôi phải ôn và gia hạn lại một chứng chỉ. Dựa vào công việc của tôi đang làm, thì tôi cần phải thi lấy 3 chứng chỉ sau:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cài đặt OpenShift trên Homelab</title>
      <link>https://blog.haivq.com/posts/openshift-demo-on-local-machine/</link>
      <pubDate>Wed, 24 Sep 2025 12:58:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/openshift-demo-on-local-machine/</guid>
      <description>&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Một đề bài phỏng vấn vào cửa gần đây của tôi với Red Hat là làm một bài thuyết trình bao gồm:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Cách thức triển khai OpenShift lên homelab của mình.&lt;/li&gt;&#xA;&lt;li&gt;Ví dụ một phương thức triển khai một ứng dụng trên OpenShift (từ lúc nó còn là code đến khi nó biến thành một cái Web App chạy được).&lt;/li&gt;&#xA;&lt;li&gt;Cách thức scale và monitor ứng dụng.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Tôi có 1 tuần để chuẩn bị, tìm hiểu. Với background Kubernetes rồi thì có lẽ tôi cần phải tìm hiểu thêm về OpenShift. Và bài blog này sẽ kể về quá trình tôi cài đặt nó lên trên môi trường homelab của mình.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kinh nghiệm sau khi dành gần một năm chạy code xử lý ảnh trên Cloudflare Workers</title>
      <link>https://blog.haivq.com/posts/one-year-of-img-proc-on-cf-worker/</link>
      <pubDate>Tue, 27 May 2025 14:37:11 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/one-year-of-img-proc-on-cf-worker/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Đọc phần trước của bài viết này tại đây: &lt;a href=&#34;https://blog.haivq.com/posts/image-transform-with-cf-workers-experience/&#34;&gt;Trải nghiệm khi xử lý ảnh trên Cloudflare Workers&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Tiếp tục nội dung của bài viết &lt;a href=&#34;https://blog.haivq.com/posts/image-transform-with-cf-workers-experience/&#34;&gt;cũ&lt;/a&gt;, sau một năm sử dụng Cloudflare Workers để xử lý ảnh bằng thư viện &lt;a href=&#34;https://github.com/silvia-odwyer/photon&#34;&gt;Photon&lt;/a&gt;, tôi đã rút ra được một vài kinh nghiệm và giới hạn của Cloudflare Workers khi sử dụng nó để làm các tác vụ nặng về tính toán.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sử dụng `libopenshot` thay cho `moviepy` để render video</title>
      <link>https://blog.haivq.com/posts/libopenshot-for-video-rendering/</link>
      <pubDate>Wed, 12 Mar 2025 14:37:11 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/libopenshot-for-video-rendering/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Blog ngắn chia sẻ câu chuyện là chính, nếu bạn thấy tò mò tôi sẽ viết thêm một bài ví dụ về sử dụng &lt;code&gt;libopenshot&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Một trong những job gần đây nhất của tôi là làm một renderer để render số lượng lớn các video ngắn &lt;a href=&#34;https://en.wikipedia.org/wiki/Brain_rot&#34;&gt;&lt;code&gt;brain rot&lt;/code&gt;&lt;/a&gt; theo định dạng có sẵn để upload chúng lên TikTok, Instagram Reels hay Youtube Shorts, hoặc các video dài dạng tin tức phóng sự kèm TTS để đọc văn bản. Và tất nhiên việc đầu tiên tôi làm là lên Google tìm xem có cái thư viện nào code sẵn hay chưa rồi dùng thẳng luôn cho khoẻ. Cuối cùng tôi tìm thấy thư viện phổ biến nhất để làm việc này: &lt;a href=&#34;https://github.com/Zulko/moviepy&#34;&gt;&lt;code&gt;moviepy&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trải nghiệm khi xử lý ảnh trên Cloudflare Workers</title>
      <link>https://blog.haivq.com/posts/image-transform-with-cf-workers-experience/</link>
      <pubDate>Wed, 21 Aug 2024 16:13:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/image-transform-with-cf-workers-experience/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Bài viết cập nhật về giải pháp này ở đây: &lt;a href=&#34;https://blog.haivq.com/posts/one-year-of-img-proc-on-cf-worker/&#34;&gt;Kinh nghiệm sau khi dành gần một năm xử lý ảnh trên Cloudflare Workers&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Code demo của bài blog được để ở &lt;a href=&#34;https://github.com/aperture147/cf-workers-watermark&#34;&gt;link GitHub này&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Gần đây tôi có 1 bài toán như sau:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Lưu trữ ảnh trên R2 Bucket&lt;/li&gt;&#xA;&lt;li&gt;Ảnh gốc không được để lộ ra ngoài&lt;/li&gt;&#xA;&lt;li&gt;Khi khách lấy ảnh ra, tối ưu kích thước ảnh và thêm watermark&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Có hai cách sau mà tôi đã cân nhắc, kèm theo ưu nhược điểm:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Xử lý vấn đề `Waiting for table metadata lock` khi `ALTER TABLE` trên InnoDB, MySQL 8</title>
      <link>https://blog.haivq.com/posts/alter-table-metadata-lock/</link>
      <pubDate>Wed, 17 Jul 2024 18:30:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/alter-table-metadata-lock/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Lưu ý: Bài viết này áp dụng với MySQL 8, vậy nên không chắc mọi thứ vẫn sẽ hoạt động đúng với MySQL 5.7 trở xuống.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Vấn đề ở trên gặp phải khi tôi cần phải chạy lệnh sau để update Character Set và Collation từ &lt;code&gt;latin&lt;/code&gt; sang &lt;code&gt;utf8&lt;/code&gt; của một bảng trong MySQL. Đúng ra tôi nên đặt Collation và Character Set thành &lt;code&gt;utf8&lt;/code&gt;/&lt;code&gt;utf8_unicode_ci&lt;/code&gt; ngay từ đầu, nhưng do sơ suất nên giờ phải convert như thế này:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Phương pháp ma quỷ để gộp chung Pandas, NumPy và SciPy vào chung một layer lambda để chạy trên Python 3.10 mà không quá dung lượng 250M</title>
      <link>https://blog.haivq.com/posts/pandas-numpy-scipy-into-one/</link>
      <pubDate>Mon, 22 Apr 2024 00:20:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/pandas-numpy-scipy-into-one/</guid>
      <description>&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Mọi thứ bắt đầu khi tôi được giao một task yêu cầu phải migrate tất cả function lambda của hệ thống từ Python 3.8 lên một phiên bản mới hơn do Python 3.8 sẽ kết thúc vòng đời (EOL) vào 10/2024. Sau một hồi cân nhắc thì tôi quyết định update lên 3.10. Mọi người có thể hỏi vì sao không update thằng lên 3.11+, câu trả lời đơn giản là vì nhiều thư viện Python hiện tại chưa support các bản mới như vậy, điển hình là PyTorch. Hơn nữa, các phiên bản mới có nhiều tính năng mới không dùng và có thể gây ra bug tiềm tàng. Dùng bản cũ ít tính năng thì sẽ bớt entropy để gây ra lỗi.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Trải nghiệm thiết kế web server sử dụng giải pháp của Cloudflare</title>
      <link>https://blog.haivq.com/posts/cloudflare-workers-experience/</link>
      <pubDate>Tue, 23 Jan 2024 14:14:00 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/cloudflare-workers-experience/</guid>
      <description>&lt;h1 id=&#34;đặt-vấn-đề&#34;&gt;Đặt vấn đề&lt;/h1&gt;&#xA;&lt;p&gt;Sau một thời gian dài, rất dài làm việc với AWS, Azure, Oracle Cloud, tôi chợt nhận ra tất cả những nhà cung cấp trên có một đặc điểm chung như sau:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Khá rẻ khi đang dev&lt;/li&gt;&#xA;&lt;li&gt;Giá tăng theo cấp số nhân khi bắt đầu có khách sử dụng, do thiết kế phải sử dụng rất nhiều các dịch vụ built in của nền tảng&lt;/li&gt;&#xA;&lt;li&gt;Vẫn còn gồng được được khi bắt đầu serve lượng nhỏ người dùng nhưng khi phải gánh một hệ thống khủng để gánh một lượng lớn khách thì giá sẽ cao vọt lên.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Với một người có kinh tế eo hẹp, không được funding vốn từ bất kì đối tượng nào mà phải tự gồng gánh từ hạ tầng đến lương nhân viên, thì việc vỡ nợ trước khi sản phẩm ra tiền là viễn cảnh không hề xa.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Các phương pháp đặt ID trong CSDL</title>
      <link>https://blog.haivq.com/posts/id-generating/</link>
      <pubDate>Thu, 16 Dec 2021 15:21:33 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/id-generating/</guid>
      <description>&lt;h1 id=&#34;đặt-vấn-đề&#34;&gt;Đặt vấn đề&lt;/h1&gt;&#xA;&lt;p&gt;Một trong những việc quan trọng nhất khi lưu dữ liệu xuống bất kì đâu chính là đặt cho chúng một cái tên. Theo tôi một cách đặt tên được gọi là tốt cần phải thoả mãn các điều kiện sau:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Đảm bảo tính độc lập và duy nhất. Nhập nhằng về tên sẽ khiến việc truy xuất dữ liệu khó hơn rất nhiều&lt;/li&gt;&#xA;&lt;li&gt;Kích thước không quá lớn vì tên quá lớn khi lưu vào, tìm kiếm và lấy ra sẽ mất nhiều thời gian&lt;/li&gt;&#xA;&lt;li&gt;Cách đặt tên đơn giản. Quy tắc đặt tên quá phức tạp khi gặp lỗi sẽ rất khó sửa, cũng như khó bảo trì&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Nhưng để một cách đặt tên được gọi là tốt để làm UID trong CSDL nên có thêm các yếu tố sau:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Một vài kinh nghiệm của tôi khi sử dụng AWS Lambda</title>
      <link>https://blog.haivq.com/posts/aws-lambda-experiences/</link>
      <pubDate>Sat, 11 Dec 2021 15:29:17 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/aws-lambda-experiences/</guid>
      <description>&lt;h1 id=&#34;mở-đầu&#34;&gt;Mở đầu&lt;/h1&gt;&#xA;&lt;p&gt;Một trong những xu hướng mà tôi được tiếp cận khi sang làm DevOps ở một division trong Caterpillar chính là công nghệ Serverless. Project đầu tiên mà tôi nhận được chính là migrate hệ thống từ sử dụng server vật lý cổ điển lên sử dụng AWS Lambda. Đây là một trải nghiệm vô cùng thú vị khi tôi có cơ hội rất tốt để có thêm một mindset mới để thiết kế một hệ thống dựa hoàn toàn vào một nhà cung cấp hạ tầng và không phải lo lắng về những lỗi về server cổ điển như trước. Tất nhiên, không có bữa trưa nào là miễn phí, việc chuyển giao không chỉ đơn giản là port các method trong code cũ thành các function và cứ thế mà nó chạy, tôi đã tốn khá nhiều thời gian để re-engineer lại hệ thống để đảm bảo chi phí tiết kiệm và tốc độ được cải thiện. Dưới đây là một vài kinh nghiệm tôi thu thập được trong quá trình chuyển giao.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cài đặt Self-Signed SSL để đảm bảo bảo mật connect tới Cloudflare</title>
      <link>https://blog.haivq.com/posts/self-signed-cert-cloudflare/</link>
      <pubDate>Tue, 23 Nov 2021 13:57:17 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/self-signed-cert-cloudflare/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Lưu ý: Phương pháp này không hoàn toàn ngăn chặn Man-in-the-Middle attack nếu hacker can thiệp được vào tầng network, do Cloudflare không verify độ uy tín của certificate nên hacker có thể chen vào giữa luồng network bằng cách cung cấp certificate của riêng hắn rồi proxy ngược vào server. Để đảm bảo End-to-End Encryption hoạt động một cách chính xác, tham khảo document này: &lt;a href=&#34;https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/full-strict/&#34;&gt;Full (strict) - SSL/TLS encryption modes&lt;/a&gt;. Như vậy Cloudflare chỉ thực hiện request đến server nếu như server đó sử dụng certificate của mà Cloudflare cho là an toàn, bao gồm các certificate có CA uy tín hoặc cerficate được sign bởi Cloudflare.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Những lý do để sử dụng Cloudflare</title>
      <link>https://blog.haivq.com/posts/reason-to-use-cloudflare/</link>
      <pubDate>Sun, 21 Nov 2021 13:57:17 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/reason-to-use-cloudflare/</guid>
      <description>&lt;p&gt;Hiện tại như thiết kế điển hình của các hệ thống nằm trên AWS, Azure, ta đều có Load Balancer đứng trước chúng, không cho phép traffic chảy trực tiếp vào server. Như vậy, các server nằm phía sau tương đối an toàn khỏi các cuộc tấn công liên quan đến viêc lộ địa chỉ IP của server. Nhưng việc sử dụng Cloudflare sẽ giúp được các vấn đề sau đây:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tạo một cluster Kubernetes đơn giản trên PC, sử dụng k3s và Rancher 2.5</title>
      <link>https://blog.haivq.com/posts/pc-rancher-k3s/</link>
      <pubDate>Mon, 04 Oct 2021 00:48:26 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/pc-rancher-k3s/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;Hiện tại đã có bản Rancher 2.6 trở lên với giao diện mới hơn.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h1 id=&#34;mở-đầu-câu-chuyện&#34;&gt;Mở đầu câu chuyện&lt;/h1&gt;&#xA;&lt;p&gt;Kubernetes gần đây đã trở thành một công nghệ nổi tiếng. Không chỉ gắn liên với việc quản lý các cluster lớn, rất nhiều framework hay các stack công nghệ bây giờ đều hỗ trợ k8s (điển hình nhất là kubeflow, nginx). Việc học k8s gần như không còn là môt lựa chọn mà trở thành một yêu cầu quan trọng cho nhiều công việc. Những ai đã/đang sử dụng k8s đều phải công nhận đây là một công nghệ rất mạnh và mềm dẻo, nhưng kèm theo đó là một nhược điểm rất lớn cố hữu: &lt;strong&gt;Rất khó sử dụng&lt;/strong&gt;. Với những dev không phải quản lý hệ thống nhiều, việc điều khiển một cluster k8s thực sự là một cực hình do phải điều khiển nó thông quan &lt;code&gt;kubectl&lt;/code&gt; - một CLI có quá nhiều thứ phải nhớ. Ngoài ra để deploy bất kì thứ gì lên đó, chúng ta phải viết một file yml dài ngoằng khó hiểu, liệt kê đầy đủ tất cả những gì cần phải có để một chương trình có thể chạy. Và tất nhiên k8s mặc định hoàn toàn không có giao diện. Kubernetes Dashboard (UI chính thức của k8s) cuối cùng vẫn bắt bạn phải viết yml. Rất nhiều config lưu trong k8s không thể lưu chính xác, và kết quả bạn lại phải viết thêm yml để phục vụ các config đó. Vậy nên yêu cầu của chúng ta khi deploy một cluster k8s ở máy bàn cá nhân cần phải thoả mãn các tiêu chí sau:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quản lý tài nguyên cho cluster Kubernetes</title>
      <link>https://blog.haivq.com/posts/k8s-resource-manager/</link>
      <pubDate>Mon, 04 Oct 2021 00:46:21 +0700</pubDate>
      <guid>https://blog.haivq.com/posts/k8s-resource-manager/</guid>
      <description>&lt;h1 id=&#34;đặt-vấn-đề&#34;&gt;Đặt vấn đề&lt;/h1&gt;&#xA;&lt;p&gt;Một trong những thiếu sót khi sử dụng k8s trong môi trường production là không thiết đặt giới hạn tài nguyên cho hệ thống. Khi bạn không giới hạn tài nguyên cho các pod trong k8s, không sớm thì muộn sẽ có một thời điểm server của bạn sẽ hết sạch tài nguyên (điển hình là hết CPU và RAM). Việc này rất dễ xảy ra chạy các workload nặng trên nhiều node có cấu hình khác nhau. Cuối cùng server của bạn sẽ crash, hoặc là chạy rất chậm, khiến hệ thống trở nên kém ổn định, thậm chí là mất mát dữ liệu, gây tổn thất về uy tín và tiền bạc. Vậy một trong những việc đầu tiên khi một đưa bất kì thứ gì lên k8s là phải thiết đặt tài nguyên cho nó.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
