<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Middle of Nowhere</title><link>https://blog.wtcx.dev/</link><description>Recent content on Middle of Nowhere</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 18 Jan 2026 11:08:30 +0800</lastBuildDate><atom:link href="https://blog.wtcx.dev/index.xml" rel="self" type="application/rss+xml"/><item><title>Unfolding the Latency of Unbound's Forwarding Mode</title><link>https://blog.wtcx.dev/posts/2026/01/18/unfolding-the-latency-of-unbound-forwarding-mode/</link><pubDate>Sun, 18 Jan 2026 11:08:30 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2026/01/18/unfolding-the-latency-of-unbound-forwarding-mode/</guid><description>tl;dr: it&amp;rsquo;s the CNAME chasing behavior.</description></item><item><title>Lessons Learned When Building My DNS Resolver</title><link>https://blog.wtcx.dev/posts/2024/04/27/lessons-learned-building-dns-resolver/</link><pubDate>Sat, 27 Apr 2024 21:50:39 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2024/04/27/lessons-learned-building-dns-resolver/</guid><description>It&amp;rsquo;s simultaneously painful and fun.</description></item><item><title>Advent of Code 2023 Using Rust</title><link>https://blog.wtcx.dev/posts/2023/12/02/advent-of-code-2023-using-rust/</link><pubDate>Sat, 02 Dec 2023 16:51:24 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2023/12/02/advent-of-code-2023-using-rust/</guid><description>Learning Rust with Advent of Code 2023.</description></item><item><title>Troubleshooting the Connection Reset Incident</title><link>https://blog.wtcx.dev/posts/2023/09/23/troubleshooting-connection-reset-incident/</link><pubDate>Sat, 23 Sep 2023 15:40:16 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2023/09/23/troubleshooting-connection-reset-incident/</guid><description>&lt;h2 id="the-incident"&gt;The incident&lt;/h2&gt;
&lt;p&gt;Recently, a colleague told me one of their applications intermittently throws exceptions saying the connection was reset. The application sends HTTP requests to multiple service providers but the error only happens to a specific one.&lt;/p&gt;</description></item><item><title>Getting Started with Grafana Loki, Part 2: Up and Running</title><link>https://blog.wtcx.dev/posts/2023/07/15/getting-started-with-grafana-loki-up-and-running/</link><pubDate>Sat, 15 Jul 2023 22:57:52 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2023/07/15/getting-started-with-grafana-loki-up-and-running/</guid><description>&lt;div class="alert"&gt;
 &lt;div class="alert-content"&gt;
 &lt;ul&gt;
&lt;li&gt;2023/12/29: Added additional learning resources.&lt;/li&gt;
&lt;li&gt;2023/12/23: Added paragraph of 

&lt;a href="#prevent-oom-using-gomemlimit"&gt;Prevent OOM using &lt;code&gt;GOMEMLIMIT&lt;/code&gt;&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;2023/09/08: Added paragraph of 

&lt;a href="#enable-route_randomly-for-redis-cluster"&gt;Enable &lt;code&gt;route_randomly&lt;/code&gt; for Redis cluster&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;This post will focus on the day-2 operations of Grafana Loki, providing general suggestions and some caveats when deploying on 

&lt;a href="https://blog.wtcx.dev/tags/kubernetes/"&gt;Kubernetes&lt;/a&gt;
 with AWS.&lt;/p&gt;
&lt;p&gt;I highly recommend reading through the 

&lt;a href="https://grafana.com/docs/loki/latest/operations/" target="_blank" rel="noopener noreferrer"&gt;Operations&lt;/a&gt;
 section in Grafana&amp;rsquo;s documentation before diving into this article, as this post serves as a complementary resource.&lt;/p&gt;
&lt;p&gt;Additionally, this post will be updated whenever I come across noteworthy information.&lt;/p&gt;</description></item><item><title>Automatically Clean Up Dangling Jobs with Policy Engine</title><link>https://blog.wtcx.dev/posts/2022/07/09/automatically-clean-up-dangling-jobs-with-policy-engine/</link><pubDate>Sat, 09 Jul 2022 21:16:48 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2022/07/09/automatically-clean-up-dangling-jobs-with-policy-engine/</guid><description>&lt;p&gt;Last year, I was reading about 

&lt;a href="https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/" target="_blank" rel="noopener noreferrer"&gt;PSP deprecation&lt;/a&gt;
 and started wondering what could be the solutions in the future. Fortunately, there are already several policy engines like 

&lt;a href="https://open-policy-agent.github.io/gatekeeper/website/docs/" target="_blank" rel="noopener noreferrer"&gt;OPA Gatekeeper&lt;/a&gt;
 and 

&lt;a href="https://kyverno.io/" target="_blank" rel="noopener noreferrer"&gt;Kyverno&lt;/a&gt;
 available.&lt;/p&gt;</description></item><item><title>Getting Started with Grafana Loki, Part 1: The Concepts</title><link>https://blog.wtcx.dev/posts/2022/05/02/getting-started-with-grafana-loki-the-concepts/</link><pubDate>Mon, 02 May 2022 00:08:45 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2022/05/02/getting-started-with-grafana-loki-the-concepts/</guid><description>&lt;div class="alert"&gt;
 &lt;div class="alert-content"&gt;
 &lt;ul&gt;
&lt;li&gt;2023/07/09: Added the 

&lt;a href="#query-scheduler"&gt;query-scheduler&lt;/a&gt;
, 

&lt;a href="#table-manager"&gt;table manager&lt;/a&gt;
, and 

&lt;a href="#compactor"&gt;compactor&lt;/a&gt;
.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Our logging solution for Kubernetes cluster has been 

&lt;a href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html" target="_blank" rel="noopener noreferrer"&gt;CloudWatch Logs&lt;/a&gt;
 for a long time, and we were ok with it. For applications with special requirements, we leveraged 

&lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html" target="_blank" rel="noopener noreferrer"&gt;S3&lt;/a&gt;
 for long-term, low-cost storage, then query with 

&lt;a href="https://docs.aws.amazon.com/athena/latest/ug/what-is.html" target="_blank" rel="noopener noreferrer"&gt;Athena&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>How It Works: Cluster Log Shipper as a DaemonSet</title><link>https://blog.wtcx.dev/posts/2022/04/29/how-it-works-cluster-log-shipper-as-a-daemonset/</link><pubDate>Fri, 29 Apr 2022 22:38:57 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2022/04/29/how-it-works-cluster-log-shipper-as-a-daemonset/</guid><description>&lt;p&gt;Logs are essential for almost all programs. These data provide valuable insights for application behavior and troubleshooting clues and can even transform into metrics if needed.&lt;/p&gt;
&lt;p&gt;Collecting logs for containers on a Kubernetes Worker Node is not much different than a regular VM. This post explains how it&amp;rsquo;s done.&lt;/p&gt;</description></item><item><title>Monitor your bandwidth</title><link>https://blog.wtcx.dev/posts/2022/03/27/monitor-bandwidth/</link><pubDate>Sun, 27 Mar 2022 19:57:38 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2022/03/27/monitor-bandwidth/</guid><description>&lt;div class="alert"&gt;
 &lt;div class="alert-content"&gt;
 &lt;p&gt;2022/03/29 update:&lt;/p&gt;
&lt;p&gt;In terms of bandwidth, there are actually 

&lt;a href="https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/TroubleshootingConnections.html#Network-limits" target="_blank" rel="noopener noreferrer"&gt;two metrics&lt;/a&gt;
 called &lt;code&gt;NetworkBandwidthInAllowanceExceeded&lt;/code&gt; and &lt;code&gt;NetworkBandwidthOutAllowanceExceeded&lt;/code&gt;&lt;!-- raw HTML omitted --&gt; for ElastiCache like EC2.&lt;/p&gt;
&lt;p&gt;They are better metrics to determine whether a node has already reached bandwidth limit. If these values are not yet available or not increasing, it means the node probably either hasn&amp;rsquo;t exceeded burst bandwidth or burst time.&lt;/p&gt;

 &lt;/div&gt;
&lt;/div&gt;

&lt;h2 id="the-incident"&gt;The Incident&lt;/h2&gt;
&lt;p&gt;Recently, we saw unexpectedly high traffic during a special event (well, the traffic itself was expected, just didn&amp;rsquo;t expect &lt;em&gt;this&lt;/em&gt; much), and then service went down for a few minutes. The application didn&amp;rsquo;t show high CPU utilization or memory usage, but API latency was climbing. Checked upstream services, looked all good.&lt;/p&gt;
&lt;p&gt;The service team checked the application&amp;rsquo;s logs and noticed there were many errors related to Redis.&lt;/p&gt;
&lt;p&gt;Then checked the Redis&amp;rsquo; metrics, CPU is low, memory usage is high, swap is slowly increasing, that looked not good, but shouldn&amp;rsquo;t cause connection problems. Redis latency is slightly unstable; however, it&amp;rsquo;s only a few microseconds higher.&lt;/p&gt;
&lt;p&gt;What gives?&lt;/p&gt;</description></item><item><title>The Making of Admission Webhooks, Part 2: The Implementation</title><link>https://blog.wtcx.dev/posts/2021/06/20/the-making-of-admission-webhooks-part-2-the-implementation/</link><pubDate>Sun, 20 Jun 2021 18:21:29 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2021/06/20/the-making-of-admission-webhooks-part-2-the-implementation/</guid><description>&lt;p&gt;In 

&lt;a href="https://blog.wtcx.dev/2021/05/02/the-making-of-admission-webhooks-part-1-the-concept/"&gt;part 1&lt;/a&gt;
, we briefly went through the concept of admission webhooks. In this post, we are going to build one and deploy it to a cluster.&lt;/p&gt;</description></item><item><title>The Making of Admission Webhooks, Part 1: The Concept</title><link>https://blog.wtcx.dev/posts/2021/05/02/the-making-of-admission-webhooks-part-1-the-concept/</link><pubDate>Sun, 02 May 2021 19:44:42 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2021/05/02/the-making-of-admission-webhooks-part-1-the-concept/</guid><description>&lt;p&gt;Recently, we got an internal requirement to send logs to different destinations according to the content. Since our cluster level shipper&amp;rsquo;s config is already filled with settings to send logs based on the namespace by default, and we would like to make this new feature &amp;ldquo;pluggable&amp;rdquo; and can be dynamically set by teams, leveraging admission webhooks appears to be a more reasonable choice. &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;</description></item><item><title>Query Stub Domains with CoreDNS and NodeLocal DNSCache</title><link>https://blog.wtcx.dev/posts/2021/04/28/query-stub-domains-with-coredns-nodelocal-dnscache/</link><pubDate>Wed, 28 Apr 2021 22:30:42 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2021/04/28/query-stub-domains-with-coredns-nodelocal-dnscache/</guid><description>&lt;p&gt;Recently, We started migrating our EKS 1.16 clusters to brand new 1.19 ones.&lt;/p&gt;
&lt;p&gt;Of all the changes, I am most excited about 

&lt;a href="https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/" target="_blank" rel="noopener noreferrer"&gt;NodeLocal DNSCache&lt;/a&gt;
.
It not only greatly reduced the time of DNS query latency (mostly because of these 

&lt;a href="https://mrkaran.dev/posts/ndots-kubernetes/" target="_blank" rel="noopener noreferrer"&gt;search domains&lt;/a&gt;
), but issues like conntrack races at &lt;strong&gt;very little expense.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Use Default Backend Service on ingress-nginx</title><link>https://blog.wtcx.dev/posts/2021/04/18/use-default-backend-service-on-ingress-nginx/</link><pubDate>Sun, 18 Apr 2021 13:33:52 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2021/04/18/use-default-backend-service-on-ingress-nginx/</guid><description>&lt;p&gt;We use 

&lt;a href="https://kubernetes.github.io/ingress-nginx/" target="_blank" rel="noopener noreferrer"&gt;ingress-nginx&lt;/a&gt;
 as our 

&lt;a href="https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/" target="_blank" rel="noopener noreferrer"&gt;Ingress Controller&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Due to business requirements, we have lots of domains to handle. It&amp;rsquo;s unrealistic to create more than one thousand ingress resources, which adds unnecessary loads to control plane and is difficult to maintain and update all of them.&lt;/p&gt;
&lt;p&gt;Luckily, ingress-nginx provides a default backend service to handle this situation.&lt;/p&gt;</description></item><item><title>Check TLS Cert Expiry With Node's TLS Module</title><link>https://blog.wtcx.dev/posts/2020/08/21/check-tls-cert-expiry-with-node-tls-module/</link><pubDate>Fri, 21 Aug 2020 23:25:45 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/08/21/check-tls-cert-expiry-with-node-tls-module/</guid><description>&lt;p&gt;There are news about some services forget to update TLS certificates from time to time.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s even more critical when you are hosting many sites with bunch of domains. Monitoring this is not difficult, it&amp;rsquo;s often caused by negligence.&lt;/p&gt;</description></item><item><title>Automatically Recover EC2 Instances That Fail Status Checks With CloudWatch Events and Lambda</title><link>https://blog.wtcx.dev/posts/2020/06/14/automatically-recover-ec2-instances-with-cloudwatch-events-and-lambda/</link><pubDate>Sun, 14 Jun 2020 00:23:29 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/06/14/automatically-recover-ec2-instances-with-cloudwatch-events-and-lambda/</guid><description>&lt;h2 id="the-incident"&gt;The Incident&lt;/h2&gt;
&lt;p&gt;Recently, some of our EKS worker nodes suddenly became unresponsive. When I was checking on the EC2 console, the status check showed &amp;ldquo;Insufficient Data&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;According to past experience, when underlying hardware somehow got impaired, we will get notifications. However, without much useful information this time, I only did some quick investigation and then had to manually terminate these instances.&lt;/p&gt;</description></item><item><title>If I Had Known This Sooner: $_</title><link>https://blog.wtcx.dev/posts/2020/05/16/if-i-had-know-sooner-bash-dollar-underscore/</link><pubDate>Sat, 16 May 2020 17:28:30 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/05/16/if-i-had-know-sooner-bash-dollar-underscore/</guid><description>&lt;p&gt;There are always times that I learned something useful and/or cool which I wish I had known sooner. So, I decided to write these little things down. Maybe these kind of things have the potential to be a series.&lt;/p&gt;</description></item><item><title>Prevent AWS CLI V2 From Using Pager</title><link>https://blog.wtcx.dev/posts/2020/02/23/prevent-aws-cli-v2-from-using-pager/</link><pubDate>Sun, 23 Feb 2020 15:30:43 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/02/23/prevent-aws-cli-v2-from-using-pager/</guid><description>&lt;p&gt;I always like to try new things out. So when I saw AWS CLI v2 is generally available, I just upgraded it without checking changes.&lt;/p&gt;
&lt;p&gt;One thing I found different after the upgrade is that, seems all outputs are redirected to things like &lt;code&gt;less&lt;/code&gt;. It&amp;rsquo;s somehow inconvenient when calling AWS CLI in a shell script:&lt;/p&gt;</description></item><item><title>List (Almost) Everything Inside a Namespace of a Kubernetes Cluster</title><link>https://blog.wtcx.dev/posts/2020/02/17/list-almost-everything-inside-a-namespace-of-a-kubernetes-cluster/</link><pubDate>Mon, 17 Feb 2020 22:21:27 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/02/17/list-almost-everything-inside-a-namespace-of-a-kubernetes-cluster/</guid><description>&lt;p&gt;One day, I was preparing to remove a no longer needed namespace of one Kubernetes cluster. Before I did that, I checked what&amp;rsquo;s inside again to be sure.&lt;/p&gt;
&lt;p&gt;So I typed &lt;code&gt;$ kubectl get all&lt;/code&gt; and see if I missed something. It turned out that several things were not listed in the output, like the ingresses I was expecting.&lt;/p&gt;</description></item><item><title>Notify Google to Update Sitemap Using Netlify Functions</title><link>https://blog.wtcx.dev/posts/2020/02/09/notify-google-to-update-sitemap-using-netlify-functions/</link><pubDate>Sun, 09 Feb 2020 19:07:35 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/02/09/notify-google-to-update-sitemap-using-netlify-functions/</guid><description>&lt;p&gt;Currently, this site is hosted on Netlify. I am pretty satisfied and don&amp;rsquo;t plan to move anytime soon. I also submitted my sitemap to Google for it to index. But the update frequency seems not very high.&lt;/p&gt;
&lt;p&gt;Fortunately, Google 

&lt;a href="https://developers.google.com/search/docs/guides/submit-URLs?hl=en" target="_blank" rel="noopener noreferrer"&gt;provides an endpoint&lt;/a&gt;
 for you to notify it. Send a &lt;code&gt;GET&lt;/code&gt; request to &lt;code&gt;http://www.google.com/ping?sitemap=${siteMapUrl}&lt;/code&gt; and you are done.&lt;/p&gt;
&lt;p&gt;But do we have to use &lt;code&gt;curl&lt;/code&gt; every time we deploy to tell Google it&amp;rsquo;s time to fetch our sitemap? Well, life is short, don&amp;rsquo;t waste time on things like that.&lt;/p&gt;</description></item><item><title>Disable T3 Unlimited Using ASG Lifecycle Hooks, CloudWatch Events, and Lambda</title><link>https://blog.wtcx.dev/posts/2020/02/08/disable-t3-unlimited-using-asg-lifecycle-hooks-cloudwatch-events-lambda/</link><pubDate>Sat, 08 Feb 2020 17:43:03 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/02/08/disable-t3-unlimited-using-asg-lifecycle-hooks-cloudwatch-events-lambda/</guid><description>&lt;p&gt;To save costs on testing environments, we use 

&lt;a href="https://docs.aws.amazon.com/autoscaling/ec2/userguide/asg-purchase-options.html" target="_blank" rel="noopener noreferrer"&gt;multiple instance types&lt;/a&gt;
 with 100% Spot ratio and &lt;code&gt;lowest-price&lt;/code&gt; allocation strategy for several auto scaling groups.&lt;/p&gt;
&lt;p&gt;We combined several instance types like &lt;code&gt;c5.xlarge&lt;/code&gt;, &lt;code&gt;m5.xlarge&lt;/code&gt;, &lt;code&gt;t3.xlarge&lt;/code&gt;, &lt;code&gt;t3a.xlarge&lt;/code&gt;. It works fine so far, but &lt;code&gt;t3&lt;/code&gt; and &lt;code&gt;t3a&lt;/code&gt; instances come with unlimited credits enabled by default. If applications run on these instances suddenly start misbehaving, the cost will increase after accumulated credits burn out.&lt;/p&gt;</description></item><item><title>The Long Way to Windows Container on Amazon EKS: Node Affinity</title><link>https://blog.wtcx.dev/posts/2020/01/04/the-long-way-to-windows-container-on-amazon-eks-node-affinity/</link><pubDate>Sat, 04 Jan 2020 18:59:19 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/01/04/the-long-way-to-windows-container-on-amazon-eks-node-affinity/</guid><description>&lt;p&gt;After dealing with the 

&lt;a href="../the-long-way-to-windows-container-on-amazon-eks-vpc-resource-controller/"&gt;vpc-resource-controller&lt;/a&gt;
, I can finally see the IIS page. But a running sample does not mean anything. So I wrapped a few deployment YAML up to see if our workloads work.&lt;/p&gt;</description></item><item><title>The Long Way to Windows Container on Amazon EKS: VPC Resource Controller</title><link>https://blog.wtcx.dev/posts/2020/01/04/the-long-way-to-windows-container-on-amazon-eks-vpc-resource-controller/</link><pubDate>Sat, 04 Jan 2020 17:50:35 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2020/01/04/the-long-way-to-windows-container-on-amazon-eks-vpc-resource-controller/</guid><description>&lt;p&gt;Amazon EKS, which was previously called Amazon Elastic Container Service for Kubernetes, is the managed Kubernetes service of theirs. We already have some services (Linux containers) running on production environments for while. It is battle-tested and works well if you ask me.&lt;/p&gt;
&lt;p&gt;Due to the characteristic of several Windows-based services &lt;del&gt;that are unlikely to run on other platforms in the foreseeable future&lt;/del&gt;, we have been discussing the feasibility of running Windows Containers on EKS.&lt;/p&gt;</description></item><item><title>Passed Certified Kubernetes Administrator</title><link>https://blog.wtcx.dev/posts/2019/12/19/passed-cka/</link><pubDate>Thu, 19 Dec 2019 23:51:35 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/12/19/passed-cka/</guid><description>&lt;p&gt;I recently passed the Certified Kubernetes Administrator exam. One of the questions I was getting a lot is what motivates me to take the exam in the first place.&lt;/p&gt;</description></item><item><title>Specify DNS Servers Based on Domains on macOS</title><link>https://blog.wtcx.dev/posts/2019/12/13/specify-dns-server-based-on-domains/</link><pubDate>Fri, 13 Dec 2019 23:56:54 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/12/13/specify-dns-server-based-on-domains/</guid><description>&lt;p&gt;A few months ago, I noticed that I couldn&amp;rsquo;t visit to any &lt;code&gt;.dev&lt;/code&gt; domains when using the corporation&amp;rsquo;s network. It was inconvenient, but I didn&amp;rsquo;t overthink it at that time.&lt;/p&gt;</description></item><item><title>Debug in VSCode: Attach Debugger to Containers</title><link>https://blog.wtcx.dev/posts/2019/09/28/vscode-node-attach-to-containers/</link><pubDate>Sat, 28 Sep 2019 14:49:31 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/09/28/vscode-node-attach-to-containers/</guid><description>&lt;p&gt;We all need to debug node program from time to time. If you are using VSCode as your IDE, it&amp;rsquo;s pretty straightforward.&lt;/p&gt;
&lt;p&gt;Debugging with local files is even more comfortable. However, when you need to debug node program in a container, there are a few caveats need to notice.&lt;/p&gt;</description></item><item><title>Keep Your Promises with Bluebird</title><link>https://blog.wtcx.dev/posts/2019/07/21/keep-your-promises-with-bluebird/</link><pubDate>Sun, 21 Jul 2019 15:46:50 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/07/21/keep-your-promises-with-bluebird/</guid><description>&lt;p&gt;

&lt;a href="http://bluebirdjs.com/docs/getting-started.html" target="_blank" rel="noopener noreferrer"&gt;Bluebird&lt;/a&gt;
 is a promise library I&amp;rsquo;ve used for almost every project. I remember when I was learning promise a few years ago, it took me a while to understand it.&lt;/p&gt;
&lt;p&gt;One day, I was searching for some related materials, I found Bluebird. I was wondering what&amp;rsquo;s the reason for using a third party library when Node.js already has native Promise support at that point? Well, it turns out there are plenty. Although some of its features can be achieved with today&amp;rsquo;s Node.js, bluebird still can give you a lot of benefits.&lt;/p&gt;</description></item><item><title>Notes: Kinesis Agent for Windows</title><link>https://blog.wtcx.dev/posts/2019/03/17/notes-kinesis-agent-for-windows/</link><pubDate>Sun, 17 Mar 2019 13:45:53 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/03/17/notes-kinesis-agent-for-windows/</guid><description>&lt;p&gt;Recently I have to study Kinesis agent for Windows, so here we are. Actually AWS documents are pretty good for most of the time, this post is just some kind of crash course.&lt;/p&gt;</description></item><item><title>About</title><link>https://blog.wtcx.dev/about/</link><pubDate>Wed, 20 Feb 2019 11:34:25 +0800</pubDate><guid>https://blog.wtcx.dev/about/</guid><description>&lt;p&gt;I am a dedicated DevOps, SRE, and backend engineer with expertise in building robust and scalable systems. My work involves cloud infrastructure, containers, serverless architecture and implementing best practices for reliability and performance.&lt;/p&gt;
&lt;p&gt;One of my passions is sharing my knowledge and insights on DevOps, containers, and programming on my blog, where I delve into practical tips, industry trends, and lessons learned (hopefully not the hard way).&lt;/p&gt;
&lt;p&gt;In addition to my technical pursuits, I&amp;rsquo;m an avid metalhead, finding solace in the energetic and dynamic world of heavy music. When I&amp;rsquo;m not immersed in coding and automation, you can probably find me exploring new bands.&lt;/p&gt;</description></item><item><title>Passed AWS Certified Developer - Associate</title><link>https://blog.wtcx.dev/posts/2019/02/19/passed-aws-dva/</link><pubDate>Tue, 19 Feb 2019 19:39:40 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/02/19/passed-aws-dva/</guid><description>&lt;p&gt;I quit my job before Chinese New Year. Days after that are just plain boring and anxious. It&amp;rsquo;s basically endless interviews and waiting for the results. I gotta say life like that is not really productive.&lt;/p&gt;
&lt;p&gt;It became even more boring when the Chinese New Year vacation started. Almost entire country is not working, let alone interviewing. In order to kill some time, I decided to prepare for AWS certifications. It&amp;rsquo;s funny because the last time I saw someone having AWS certifications is on one of the interviewers&amp;rsquo; blog. I wasn&amp;rsquo;t sure whether it&amp;rsquo;s useful or not. But it wouldn&amp;rsquo;t hurt to get one.&lt;/p&gt;</description></item><item><title>Started a Blog Again</title><link>https://blog.wtcx.dev/posts/2019/02/19/started-a-blog-again/</link><pubDate>Tue, 19 Feb 2019 15:34:12 +0800</pubDate><guid>https://blog.wtcx.dev/posts/2019/02/19/started-a-blog-again/</guid><description>&lt;p&gt;I can&amp;rsquo;t remember how many times I started a blog. It&amp;rsquo;s just like new year resolutions, it sounds good and you are so motivated at first, until the passion is gone (which is way faster than you think).&lt;/p&gt;
&lt;p&gt;Anyway, here I am, started another blog. This blog will mainly focus on technical things (if these are technical enough 🤷‍♂️) and some life thoughts, and some notes/reflections while I am learning new things.&lt;/p&gt;</description></item></channel></rss>