<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Shing Lyu - Articles</title>
    <description>Shing Lyu&apos;s Portfolio and Blog</description>
    <link>https://shinglyu.com</link>
    
      
      <item>
        <title>ADR in Code: Architecture Compliance with AI Code Reviews</title>
        
        <description>&lt;p&gt;In my &lt;a href=&quot;/architecture/2026/02/17/adr-as-event-sourcing.html&quot;&gt;previous post about ADR as Event Sourcing&lt;/a&gt;, I talked about capturing architecture decisions continuously as they happen, not months later when everyone’s forgotten the context. But writing ADRs is only half the battle. The other half is actually &lt;em&gt;enforcing&lt;/em&gt; them—and that’s where most teams fail. ADRs sit in a separate wiki or documentation tool like Confluence or Notion, gradually becoming archaeology rather than law.&lt;/p&gt;

&lt;p&gt;What if we could give our AI code reviewer the ADRs as instructions, so it flags violations automatically on every pull request?&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 01 Mar 2026 17:00:00 +0000</pubDate>
        <link>https://shinglyu.com/blog/2026/03/01/ai-adr-code-review.html</link>
        <guid isPermaLink="true">https://shinglyu.com/blog/2026/03/01/ai-adr-code-review.html</guid>
      </item>
      
    
      
      <item>
        <title>ADR as Event Sourcing: Rethinking Software Architecture Documentation in the Age of AI</title>
        
        <description>&lt;p&gt;Does any organization actually have good, up-to-date software architecture documentation? I’ve worked with enough teams to know the answer is almost always “no.” Most architecture docs become outdated the moment they’re written. Engineers don’t have time to maintain documentation while shipping features. Traditional Architecture Decision Records (ADRs) are often written after decisions are made, not during the decision-making process. And when you’re busy, you simply forget to document parts of your architecture, leaving it spotty and unreliable. With Generative AI, I think we should treat ADRs more like event sourcing—capturing decisions as they happen, not reconstructing them from memory weeks later.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 17 Feb 2026 23:00:00 +0000</pubDate>
        <link>https://shinglyu.com/architecture/2026/02/17/adr-as-event-sourcing.html</link>
        <guid isPermaLink="true">https://shinglyu.com/architecture/2026/02/17/adr-as-event-sourcing.html</guid>
      </item>
      
    
      
      <item>
        <title>My Complete Remote Vibe Coding Setup for Busy Parents</title>
        
        <description>&lt;p&gt;As a busy parent, I often only have 5-10 minutes of uninterrupted work time before my child needs attention. Traditional coding workflows—where you need a laptop open, an IDE running with AI agents actively working, and constant supervision—simply don’t work for someone in my situation. I needed a setup that could run in the background without any intervention, could be accessed from any device including my phone or tablet, and would let me make meaningful progress in short bursts throughout the day. Here’s the complete remote vibe coding workflow I’ve built using GitHub Copilot and Cloudflare Pages.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 28 Jan 2026 23:00:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2026/01/28/my-remote-vibe-coding-setup.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2026/01/28/my-remote-vibe-coding-setup.html</guid>
      </item>
      
    
      
      <item>
        <title>TOGAF Practitioner exam tips: A strategic approach to passing</title>
        
        <description>&lt;p&gt;The TOGAF Practitioner exam can be challenging, but with the right strategy, you can significantly improve your chances of success. Unlike the Foundation exam which tests knowledge recall, the Practitioner exam tests your ability to apply TOGAF principles in realistic scenarios. Here’s a battle-tested approach that helped me pass the exam.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 21 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/enterprise-architecture/2026/01/21/togaf-practitioner-exam-tips.html</link>
        <guid isPermaLink="true">https://shinglyu.com/enterprise-architecture/2026/01/21/togaf-practitioner-exam-tips.html</guid>
      </item>
      
    
      
      <item>
        <title>10 Years of shinglyu.com</title>
        
        <description>&lt;p&gt;In September 2008, I wrote my first blog post, a humble guide about fixing missing screen resolutions in Ubuntu. Eighteen years and 88 posts later, I’m celebrating a different milestone: the 10th anniversary of moving this blog to its permanent home on shinglyu.com. What started as a way to document Linux troubleshooting tips has evolved into something far more significant: a chronicle of my entire career, from browser hacker to cloud architect, and a testament to the power of owning your own platform.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 17 Jan 2026 11:00:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2026/01/17/10-years-of-shinglyu-com.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2026/01/17/10-years-of-shinglyu-com.html</guid>
      </item>
      
    
      
      <item>
        <title>Poor Man&apos;s Raycast: Replace Raycast Features Using Only macOS Built-ins</title>
        
        <description>&lt;p&gt;I was really into Raycast. The global hotkeys, the instant app launching, the clipboard management – it transformed how I worked on my Mac. But I really don’t want to use their AI features. I found out it’s quite difficult to completely turn them off. With sensitive data flowing through my clipboard and workflows, I want absolute certainty that nothing leaves my machine. Also, Raycast is always in the gray area for corporate IT, and I live in the constant fear of it being banned by my employer.&lt;/p&gt;

&lt;p&gt;That’s when I discovered something surprising: I could rebuild almost everything I loved about Raycast using tools that were already on my Mac.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 09 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2026/01/09/poor-mans-raycast-replace-app-launcher-features-using-only-macos-built-ins.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2026/01/09/poor-mans-raycast-replace-app-launcher-features-using-only-macos-built-ins.html</guid>
      </item>
      
    
      
      <item>
        <title>Vibe Operations—The Next Indispensable Trend</title>
        
        <description>&lt;p&gt;The industry chatter is loud about “vibe coding”—the AI-assisted writing of software. Yet, as someone who’s spent years observing how we build and manage cloud infrastructure (and recently preparing for the Google Cloud Professional Cloud Architect exam), I’ve noticed a much more profound trend quietly emerging on the operations side. It’s not about “vibe coding,” it’s about Vibe Operations.&lt;/p&gt;

&lt;p&gt;For me, the realization hit while deep in hands-on labs that exposed the current limitations of our tooling. The true AI revolution isn’t just about speeding up code creation; it’s about fundamentally changing operational speed, precision, and skills acquisition for cloud architects and DevOps teams.&lt;/p&gt;

&lt;p&gt;The core of this trend lies in the &lt;strong&gt;Gemini CLI in Cloud Shell&lt;/strong&gt;. I believe this tool points to the future of cloud interaction.&lt;/p&gt;

&lt;h2 id=&quot;how-i-use-the-gemini-cli&quot;&gt;How I Use the Gemini CLI&lt;/h2&gt;
&lt;p&gt;For those who don’t spend a lot of time in the command line, here is the basic workflow:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Open Cloud Shell: From the Google Cloud console, you click the small terminal icon. This launches a fully provisioned Linux terminal right in your browser.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Invoke Gemini: Inside the Cloud Shell terminal, I start the AI agent by typing the command &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;gemini&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Describe Intent: Instead of looking up complex commands, I simply describe the resource or action I need (e.g., “create a private GKE cluster in region europe-west4 with an auto-scaling node pool. Explain the command you are about to run in detail.”).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Review and Execute: The Gemini CLI generates the precise gcloud command, which I can review for correctness and then execute instantly with a single keypress. This allows me to both operate faster and learn the exact syntax in context.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

 (more...)</description>
        
        <pubDate>Fri, 07 Nov 2025 22:10:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2025/11/07/vibe-operations-the-next-indispensable-trend.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2025/11/07/vibe-operations-the-next-indispensable-trend.html</guid>
      </item>
      
    
      
      <item>
        <title>Google Cloud Professional Cloud Architect Exam Changes October 2025: Key Updates You Need to Know</title>
        
        <description>&lt;p&gt;While working on my &lt;a href=&quot;/web/2025/10/08/serverless-rust-on-gcp-cloud-run-from-basic-deployment-to-optimized-container-builds.html&quot;&gt;recent exploration of Rust on Google Cloud Run&lt;/a&gt;, I was impressed by how seamless and developer-friendly the experience turned out to be. The container-based approach provided more flexibility and better tooling integration than I expected, sparking my interest in Google Cloud’s broader ecosystem and architectural patterns.&lt;/p&gt;

&lt;p&gt;This hands-on experience led me to consider pursuing the Professional Cloud Architect certification. As I began researching study materials and exam guides, I discovered that Google Cloud was releasing an updated version of the certification exam in October 2025. Rather than rush into the old version, I decided to wait and understand what changes were coming. The updates include new AI-focused content and formal incorporation of the Well-Architected Framework principles.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 28 Oct 2025 21:34:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/10/28/google-cloud-professional-cloud-architect-exam-changes-october-2025-key-updates-you-need-to-know.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/10/28/google-cloud-professional-cloud-architect-exam-changes-october-2025-key-updates-you-need-to-know.html</guid>
      </item>
      
    
      
      <item>
        <title>Poor Man&apos;s Raycast: Replace Raycast Features Using Only macOS Built-ins</title>
        
        <description>&lt;p&gt;I was really into Raycast. The global hotkeys, the instant app launching, the clipboard management – it transformed how I worked on my Mac. But I really don’t want to use their AI features. For the AI features it provides, I prefer using my own LLM provider. But I found out it’s quite difficult to completely turn it off. With sensitive data flowing through my clipboard and workflows, I want absolute certainty that nothing leaves my machine. Also Raycast is always in the gray area for corporate IT, and I live in the constant fear of it being banned by my employer.&lt;/p&gt;

&lt;p&gt;That’s when I discovered something surprising: I could rebuild almost everything I loved about Raycast using tools that were already on my Mac.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 17 Oct 2025 20:49:00 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2025/10/17/poor-mans-raycast-replace-raycast-features-using-only-macos-built-ins.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2025/10/17/poor-mans-raycast-replace-raycast-features-using-only-macos-built-ins.html</guid>
      </item>
      
    
      
      <item>
        <title>Serverless Rust on GCP Cloud Run: From Basic Deployment to Optimized Container Builds</title>
        
        <description>&lt;p&gt;A few weeks ago, I published a &lt;a href=&quot;/web/2025/09/16/rust-serverless-on-the-big-three-clouds-aws-azure-and-gcp-compared.html&quot;&gt;comparison of Rust across AWS Lambda, Azure Functions, and GCP’s serverless offerings&lt;/a&gt;. I was pretty harsh on GCP, essentially dismissing Cloud Run as “not really serverless” and suggesting Google was missing the boat entirely.&lt;/p&gt;

&lt;p&gt;The GCP community didn’t let that slide.&lt;/p&gt;

&lt;p&gt;Multiple comments and messages pointed out that I hadn’t given Cloud Run a fair evaluation. They were right. I was so focused on function-as-a-service models that I didn’t appreciate what GCP was actually offering with their “serverless containers” approach.&lt;/p&gt;

&lt;p&gt;I had wrongly assumed that “containers” meant always-on hosts, but Cloud Run actually uses a &lt;a href=&quot;https://cloud.google.com/run/docs/securing/security&quot;&gt;microVM security model&lt;/a&gt; that provides strong isolation while still billing you only for the time your function runs - just like other serverless platforms.&lt;/p&gt;

&lt;p&gt;So I did what any curious engineer should do: I went back and gave it another try.&lt;/p&gt;

&lt;p&gt;And honestly? I was pleasantly surprised. Cloud Run’s container-first approach actually works brilliantly with Rust, and the developer experience is surprisingly smooth once you understand the optimization patterns.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 08 Oct 2025 19:41:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/10/08/serverless-rust-on-gcp-cloud-run-from-basic-deployment-to-optimized-container-builds.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/10/08/serverless-rust-on-gcp-cloud-run-from-basic-deployment-to-optimized-container-builds.html</guid>
      </item>
      
    
      
      <item>
        <title>Rust Serverless on the Big Three Clouds: AWS, Azure, and GCP Compared</title>
        
        <description>&lt;p&gt;When you’re choosing a cloud platform for your next Rust serverless project, the landscape can be confusing. Each of the big three cloud providers—AWS, Azure, and Google Cloud Platform—offers different levels of maturity and support for Rust in serverless environments. I’ve spent some time experimenting with two platforms (more on why I’m missing one later), and the differences are more significant than you might expect.&lt;/p&gt;

&lt;p&gt;Why does this comparison matter? Rust brings compelling advantages to serverless computing: it runs with low resource requirements and delivers high performance, which translates to improved performance and lower cloud costs. Additionally, Rust eliminates many bugs during compile time, so your code is less like a ticking time bomb that will break during runtime. This means less late night on-call madness and happier developers.&lt;/p&gt;

&lt;h2 id=&quot;what-i-mean-by-serverless&quot;&gt;What I Mean by “Serverless”&lt;/h2&gt;

&lt;p&gt;Before diving into the comparison, let me clarify what I mean by “serverless” in this context. Many cloud providers give vague definitions, so here’s my own practical definition that guided this evaluation.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 16 Sep 2025 20:23:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/09/16/rust-serverless-on-the-big-three-clouds-aws-azure-and-gcp-compared.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/09/16/rust-serverless-on-the-big-three-clouds-aws-azure-and-gcp-compared.html</guid>
      </item>
      
    
      
      <item>
        <title>When Customers Say No: The Unexpected Door Solution Architects Should Never Ignore</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;“Sorry, but that just won’t work for our organization.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ever been in a customer meeting where the conversation seems to hit a brick wall? As a solution architect, you pitch your best cloud strategy, only to be met with a polite—sometimes not-so-polite—rejection. Most folks would pack up and move on. But what if this is the moment you should lean in and ask… why?&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 07 Sep 2025 20:47:03 +0000</pubDate>
        <link>https://shinglyu.com/blog/2025/09/07/when-customers-say-no-the-unexpected-door-solution-architects-should-never-ignore.html</link>
        <guid isPermaLink="true">https://shinglyu.com/blog/2025/09/07/when-customers-say-no-the-unexpected-door-solution-architects-should-never-ignore.html</guid>
      </item>
      
    
      
      <item>
        <title>Building a Database-Backed API with Serverless Rust on Azure</title>
        
        <description>&lt;p&gt;In my &lt;a href=&quot;https://shinglyu.com/blog/2025/07/26/serverless-rust-on-azure-deploying-a-rust-azure-function.html&quot;&gt;previous post&lt;/a&gt;, we deployed a simple “Hello World” Rust function to Azure. Now we’re ready to build something production-worthy: a database-backed REST API that handles real business logic. We’ll create a cake ordering system for a local bakery, complete with data persistence, input validation, and proper error handling.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/rust-serverless-azure-db/business_case.png&quot; alt=&quot;Business Case&quot; /&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 10 Aug 2025 20:50:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/08/10/building-a-database-backed-api-with-serverless-rust-on-azure.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/08/10/building-a-database-backed-api-with-serverless-rust-on-azure.html</guid>
      </item>
      
    
      
      <item>
        <title>Serverless Rust on Azure: Deploying a Rust Azure Function</title>
        
        <description>&lt;p&gt;This is the first post in my new series on serverless Rust on Azure. We’ll start simple by following the official Azure tutorial, with my notes on the caveats and tweaks I’ve made along the way. Having worked with AWS for the past 6 years, I’ll also highlight key differences from AWS Lambda.&lt;/p&gt;

&lt;p&gt;You can find the complete code on GitHub: &lt;a href=&quot;https://github.com/shinglyu/serverless-rust-on-azure&quot;&gt;https://github.com/shinglyu/serverless-rust-on-azure&lt;/a&gt;.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 26 Jul 2025 19:49:05 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/07/26/serverless-rust-on-azure-deploying-a-rust-azure-function.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/07/26/serverless-rust-on-azure-deploying-a-rust-azure-function.html</guid>
      </item>
      
    
      
      <item>
        <title>Why the % Sign Breaks Your Website (And How to Fix It)</title>
        
        <description>&lt;p&gt;A frontend developer friend recently reached out to me for help. Her React app was mysteriously breaking, and she couldn’t figure out why. After some investigation, we discovered the culprit: a single &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%&lt;/code&gt; character in a URL was causing the entire application to crash.&lt;/p&gt;

&lt;p&gt;When you see a URL (Uniform Resource Locator), it often contains characters like letters, numbers, and some special symbols. However, not all characters are allowed directly inside a URL because some have special meanings, and some fall outside the allowed range of characters. This is where percent-encoding comes into play.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 22 Jul 2025 20:53:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/07/22/why-the-percent-sign-breaks-your-website-and-how-to-fix-it.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/07/22/why-the-percent-sign-breaks-your-website-and-how-to-fix-it.html</guid>
      </item>
      
    
      
      <item>
        <title>How I Wrote a Book with AI</title>
        
        <description>&lt;p&gt;After spending over a year each on my previous two books, I decided to experiment with AI assistance for my latest project: &lt;a href=&quot;https://leanpub.com/learning-to-learn-aws&quot;&gt;Learning to Learn AWS&lt;/a&gt;. The goal wasn’t to generate another AI-filled book flooding Amazon, but to maintain intellectual ownership while dramatically reducing the time investment. Here’s how I completed a quality technical book in just 5 months, working only 1-2 hours per week.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 13 Jul 2025 20:10:13 +0000</pubDate>
        <link>https://shinglyu.com/writing/2025/07/13/how-i-wrote-a-book-with-ai.html</link>
        <guid isPermaLink="true">https://shinglyu.com/writing/2025/07/13/how-i-wrote-a-book-with-ai.html</guid>
      </item>
      
    
      
      <item>
        <title>From DevTools Detective to Automation Hero: My Quest for Dutch Subtitles</title>
        
        <description>&lt;p&gt;I’ve been working on improving my Dutch by watching &lt;a href=&quot;https://www.npostart.nl/nos-journaal-in-makkelijke-taal&quot;&gt;NOS Journaal in Makkelijke Taal&lt;/a&gt; (NOS News in Simple Language). It’s perfect for language learners - the vocabulary is accessible, the pronunciation is clear, and the topics are current and relevant.&lt;/p&gt;

&lt;p&gt;But here’s the thing: while listening helps with comprehension, I wanted to read the subtitles after watching to catch vocabulary I missed during the video. The built-in video player has subtitles, but constantly pausing to point my phone’s Google Translate camera at the screen proved incredibly disruptive. I’d get tired of watching within minutes.&lt;/p&gt;

&lt;p&gt;I already use &lt;a href=&quot;https://readlang.com&quot;&gt;Readlang&lt;/a&gt; extensively for my Dutch studies. It’s a language learning tool where you can import articles, then click on any word or phrase to get AI-powered translations with contextual explanations. The UX is phenomenally smooth, removing most of the friction from reading foreign language content. This would be a great tool to study the subtitles right after I watched the video. However, there is a problem.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 06 Jun 2025 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2025/06/06/from-devtools-detective-to-automation-hero-my-quest-for-dutch-subtitles.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2025/06/06/from-devtools-detective-to-automation-hero-my-quest-for-dutch-subtitles.html</guid>
      </item>
      
    
      
      <item>
        <title>Vibe coding a PII Anonymizer CLI: how gen AI makes me build tools faster than ever</title>
        
        <description>&lt;p&gt;I use AI chatbots and agents extensively in my daily workflow. Sometimes I need to provide them with documents converted to markdown, but I don’t want to give away too much personal information. &lt;a href=&quot;https://github.com/microsoft/markitdown&quot;&gt;Markitdown&lt;/a&gt; is an excellent tool for converting PDFs and Word documents to markdown, but I lacked a CLI tool that could redact PII from the output. There are existing tools out there, and cloud services too, but I wanted something completely offline that wouldn’t raise any IT security team’s eyebrows. Then I stumbled upon &lt;a href=&quot;https://github.com/microsoft/presidio&quot;&gt;Microsoft’s Presidio library&lt;/a&gt;, which can anonymize Personally Identifiable Information (PII) easily. So I decided to flex my vibe coding muscles and code a CLI myself.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 28 May 2025 22:27:17 +0000</pubDate>
        <link>https://shinglyu.com/ai/2025/05/28/vibe-coding-a-pii-anonymizer-cli-how-gen-ai-makes-me-build-tools-faster-than-ever.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2025/05/28/vibe-coding-a-pii-anonymizer-cli-how-gen-ai-makes-me-build-tools-faster-than-ever.html</guid>
      </item>
      
    
      
      <item>
        <title>Agentic Software Installer - A Genius or Terrible Idea?</title>
        
        <description>&lt;p&gt;AI agents like Cline can now install complex software by interpreting documentation and handling environment differences automatically. Is this the future of software installation, or are we creating new problems by delegating these tasks to AI?&lt;/p&gt;

&lt;p&gt;I’m a bit late to the Model Context Protocol (MCP) party. While everyone was enthusiastically exploring the capabilities of MCP months ago, I only recently started diving into this ecosystem. My first experience was with the Logseq MCP, which provides some basic but useful functionality for the note-taking app. Then I tried the Brave Search MCP, which allows AI assistants to perform web searches directly.&lt;/p&gt;

&lt;p&gt;What struck me wasn’t just the functionality these MCPs provided, but rather the installation process. As a developer who’s set up numerous environments and tools over the years, I found myself watching with fascination as Cline, the AI assistant as a VS Code Plugin, took over what would typically be a manual, error-prone process.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 04 Apr 2025 20:24:13 +0000</pubDate>
        <link>https://shinglyu.com/ai/2025/04/04/agentic-software-installer-a-genius-or-terrible-idea.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2025/04/04/agentic-software-installer-a-genius-or-terrible-idea.html</guid>
      </item>
      
    
      
      <item>
        <title>Make AI Draw Architecture Diagrams with AWS Icons</title>
        
        <description>&lt;p&gt;Last year, I wrote about &lt;a href=&quot;/ai/2024/07/12/turning-hand-drawn-architecture-diagrams-into-digital-diagrams-with-generative-ai.html&quot;&gt;turning hand-drawn architecture diagrams into digital diagrams using generative AI&lt;/a&gt;. While that approach worked well for creating editable digital diagrams, the result was quite basic—mostly rectangles and text. But if you’ve ever seen presentations by AWS solution architects, you’ll know that colorful AWS service icons can make architecture diagrams much more visually appealing and easier to understand at a glance.&lt;/p&gt;

&lt;p&gt;I’ve since figured out how to leverage AI to not only create the basic diagram structure but also incorporate those recognizable AWS service icons. In this post, I’ll walk you through the process step by step.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 24 Mar 2025 22:02:39 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/03/24/make-ai-draw-architecture-diagrams-with-aws-icons.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/03/24/make-ai-draw-architecture-diagrams-with-aws-icons.html</guid>
      </item>
      
    
      
      <item>
        <title>Engineering Better Online Meetings: Hardware, Software, and Environment</title>
        
        <description>&lt;p&gt;Since COVID, online meetings have become an indispensable tool for collaboration, communication, and productivity. Whether you’re a seasoned professional or just starting your career, mastering the art of online meetings is crucial for success. Having spent four years in a customer-facing role, I’ve participated in countless online meetings across various time zones, gaining valuable insights into what works and what doesn’t. This blog post shares my experiences and provides practical tips to help you engineer better online meetings by focusing on two key areas: hardware configuration and software optimization. By addressing these elements, you can create a more professional, engaging, and productive online meeting experience for yourself and your participants. Here are some tips for better online meetings.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 20 Mar 2025 22:20:24 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2025/03/20/engineering-better-online-meetings.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2025/03/20/engineering-better-online-meetings.html</guid>
      </item>
      
    
      
      <item>
        <title>Building a Fast and Accurate Transcription Tool on Linux</title>
        
        <description>&lt;p&gt;As a developer, I often find myself needing a tool that can let me type with voice. While macOS boasts a variety of excellent GUI-based transcription tools, the Linux landscape leans more towards command-line utilities. This presented a challenge, but also an opportunity to build a custom solution tailored to my workflow. I kept delaying it, but now I finally got time to build a fast and accurate transcription tool on Linux, leveraging the power of command-line tools and the flexibility of the terminal. I used VSCode, Cline, Gemini 2.0 Flash (in Plan Mode), and Gemini 2.0 Pro (in Act Mode) to help me build this.&lt;/p&gt;

&lt;h2 id=&quot;why-whisper-and-faster-whisper&quot;&gt;Why Whisper and Faster Whisper?&lt;/h2&gt;

&lt;p&gt;When it comes to transcription accuracy, Whisper models from OpenAI consistently outperform many other options. Initially, I experimented with &lt;a href=&quot;https://github.com/ggerganov/whisper.cpp&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;whisper.cpp&lt;/code&gt;&lt;/a&gt;, a C++ implementation of the Whisper architecture. It’s a fantastic project, offering great performance and flexibility, especially on my work Macbook with Apple silicon.&lt;/p&gt;

&lt;p&gt;However, I recently discovered &lt;a href=&quot;https://github.com/SYSTRAN/faster-whisper&quot;&gt;Faster Whisper&lt;/a&gt;, a reimplementation of the Whisper model using CTranslate2. The key advantage? It’s incredibly fast, even on older hardware without dedicated GPUs. On my trusty old laptop with an Intel Core i5-7200U CPU, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;small.en&lt;/code&gt; model loads in about 2 seconds and can transcribe 1-3 sentences in roughly 4 seconds. This makes it perfectly suited for my needs.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/whispernow/whispernow.png&quot; alt=&quot;ALT TEXT&quot; /&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 11 Feb 2025 16:02:52 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/02/11/building-a-fast-and-accurate-transcription-tool-on-linux.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/02/11/building-a-fast-and-accurate-transcription-tool-on-linux.html</guid>
      </item>
      
    
      
      <item>
        <title>My Productivity System for 2025</title>
        
        <description>&lt;pre&gt;&lt;code class=&quot;language-mermaid&quot;&gt;graph TD
    subgraph &quot;Input&quot;
      NEWS[&quot;News from Social media,&amp;lt;br&amp;gt;Podcast,Feedly&quot;] -- Save for later --&amp;gt; POCKET[&quot;Pocket&amp;lt;br&amp;gt;(Read later)&quot;]
      Perplexity --&amp;gt; READ
      POCKET
      TWBOOK[Taiwan Library Books]
      YouTube --&amp;gt; DeepSRT
      Ideas
      Meetings
    end
    subgraph &quot;Logseq&quot;
      JOURNAL[Daily Journal]
      KANBAN_LEARNING[Kanban - Learning]
      JOURNAL--&amp;gt; KANBAN_WRITING[&quot;Kanban - Writing ideas&quot;]
    end
      Meetings --&amp;gt; JOURNAL
      Ideas -- (optional) AI formatter --&amp;gt; JOURNAL

    READ[Read &amp;amp; Digest]
    READ -- learnings --&amp;gt; JOURNAL
    READ -- Topic that needs further research --&amp;gt; KANBAN_LEARNING
    POCKET --&amp;gt; READ
    TWBOOK[Taiwan Library Books] --&amp;gt; READ
    DeepSRT --&amp;gt;READ

    KANBAN_LEARNING --&amp;gt; Research
    KANBAN_WRITING --&amp;gt; Research
    Research --&amp;gt; JOURNAL
    Research --&amp;gt; WRITER[AI writing assistant]

    subgraph &quot;Output&quot;
      WRITER[AI writing assistant] --&amp;gt; Blog
      WRITER --&amp;gt; Buffer --&amp;gt; SOCIAL[Social media post]
      WRITER --&amp;gt; Book
      WRITER --&amp;gt; Talk
      WRITER --&amp;gt; Email
    end

    Meetings -- action item --&amp;gt; BULLET[Bullet journal]
    Ideas --&amp;gt; BULLET
    BULLET --&amp;gt; CALENDAR[Google Calendar&amp;lt;br&amp;gt;Outlook Calendar]
    BULLET --&amp;gt; Research
    CALENDAR --&amp;gt; Research
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is an updated version of my pre-ChatGPT &lt;a href=&quot;https://shinglyu.com/productivity/2022/03/06/my-productivity-system.html&quot;&gt;productivity post&lt;/a&gt;. The landscape of productivity tools has changed dramatically since the AI boom, and my system has evolved accordingly.
The system is shown in the diagram above. Let me explain it in detail.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 27 Jan 2025 22:10:59 +0000</pubDate>
        <link>https://shinglyu.com/web/2025/01/27/my-productivity-system-for-2025.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2025/01/27/my-productivity-system-for-2025.html</guid>
      </item>
      
    
      
      <item>
        <title>Building a temporary camera app with Windsurf</title>
        
        <description>&lt;p&gt;Note: This post is written with the help from Gemini 2.0 Flash. Let me know if you like the style and tone.&lt;/p&gt;

&lt;p&gt;Keeping a pristine photo gallery can be a challenge. I wanted a way to separate my permanent family photos from the everyday snapshots I take—parking spots, receipts, quick notes—things I only need temporarily. I wanted those transient images kept separate, ready for easy cleanup later. I remembered an Android app that did just this, but unfortunately, it’s no longer available on the Play Store, leaving me searching for a new solution.&lt;/p&gt;

&lt;p&gt;TL;DR: Windsurf is cool! And you can try the app I wrote here: &lt;a href=&quot;https://shinglyu.com/TempPhoto/&quot;&gt;https://shinglyu.com/TempPhoto/&lt;/a&gt;.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 28 Dec 2024 03:16:38 +0000</pubDate>
        <link>https://shinglyu.com/web/2024/12/28/building-a-temporary-camera-app-with-windsurf.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2024/12/28/building-a-temporary-camera-app-with-windsurf.html</guid>
      </item>
      
    
      
      <item>
        <title>Beware of scammer who uses my identity</title>
        
        <description>&lt;p&gt;A scammer(s), with the name “Amrw Hoinc”, is trying to use my identity to sign up for multiple websites. Based on the IP and phone number, they is based in Algeria and speaks Arabic and French. They signed up for multiple website builder tool, AI customer service chatbot, form builder, content publisher, and all kinds of AI tool and games. I suspect they are trying to create fake websites with AI-generated content with chatbot and sign-up forms. I have reported this to Algerian police and international cybercrime prevention authorities. Amrw Hoinc, please stop.&lt;/p&gt;

&lt;p&gt;If you came across anything that uses my name or email, please contact me immediately.&lt;/p&gt;

&lt;div dir=&quot;rtl&quot;&gt;
يحاول محتال باسم &quot;عمرو هوينك&quot; استخدام هويتي للتسجيل في مواقع ويب متعددة. استنادًا إلى عنوان IP ورقم الهاتف، فهم يقيمون في الجزائر ويتحدثون العربية والفرنسية. لقد اشتركوا في العديد من أدوات إنشاء مواقع الويب، وبرنامج دردشة لخدمة العملاء بالذكاء الاصطناعي، وبرنامج إنشاء النماذج، وناشر المحتوى، وجميع أنواع أدوات وألعاب الذكاء الاصطناعي. أشك في أنهم يحاولون إنشاء مواقع ويب مزيفة بمحتوى تم إنشاؤه بواسطة الذكاء الاصطناعي باستخدام برنامج دردشة ونماذج تسجيل. لقد أبلغت الشرطة الجزائرية والسلطات الدولية للوقاية من الجرائم الإلكترونية. عمرو هوينك، من فضلك توقف.
&lt;/div&gt;

&lt;p&gt;Un escroc du nom de « Amrw Hoinc » tente d’utiliser mon identité pour m’inscrire sur plusieurs sites Web. D’après l’adresse IP et le numéro de téléphone, il est basé en Algérie et parle arabe et français. Il s’est inscrit à plusieurs outils de création de sites Web, à un chatbot de service client IA, à un générateur de formulaires, à un éditeur de contenu et à toutes sortes d’outils et de jeux IA. Je soupçonne qu’ils essaient de créer de faux sites Web avec du contenu généré par l’IA avec un chatbot et des formulaires d’inscription. J’ai signalé cela à la police algérienne et aux autorités internationales de prévention de la cybercriminalité. Amrw Hoinc, arrêtez s’il vous plaît.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 19 Nov 2024 21:00:18 +0000</pubDate>
        <link>https://shinglyu.com/web/2024/11/19/beware-of-scammer-who-uses-my-identity.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2024/11/19/beware-of-scammer-who-uses-my-identity.html</guid>
      </item>
      
    
      
      <item>
        <title>CDK to Terraform Migration with Gen AI</title>
        
        <description>&lt;p&gt;I recently worked on a project to migrate a CDK project to Terraform, because the client want to standarize on Terrafrom. This could have been a time-consuming job, and it requires expertise on both CDK and Terraform, but with the help from generative AI, especailly Amazon Q Developer and Amazon Bedrock, it becomes quite easy. This article will walk you through how I performed the migration and the lessons learned through the process.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 15 Oct 2024 13:03:36 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/10/15/cdk-to-terraform-migration-with-gen-ai.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/10/15/cdk-to-terraform-migration-with-gen-ai.html</guid>
      </item>
      
    
      
      <item>
        <title>My Wayland adventure</title>
        
        <description>&lt;p&gt;My Linux laptop is running the old Ubuntu 20.04 and is going to go out of support next year. I was planning to switch over to &lt;a href=&quot;https://nixos.org/&quot;&gt;NixOS&lt;/a&gt; but I don’t have time right now to do a fresh reinstall and learn NixOS from scratch. That’s why I decided to simply upgrade to Ubuntu 24.04 and switch to &lt;a href=&quot;https://wayland.freedesktop.org/&quot;&gt;Wayland&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I was using &lt;a href=&quot;https://i3wm.org/&quot;&gt;i3&lt;/a&gt; on X11, so switching to Wayland means I have to change many of my settings and switch to utilities that supports Wayland. This post is a rundonw of all the changes I’ve made to switch to Wayland. Overall, I enjoy the smoothness of Wayalnd (abiet barely noticable), and being able to use newer, more polished utiltity tools.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 17 Sep 2024 21:29:06 +0000</pubDate>
        <link>https://shinglyu.com/web/2024/09/17/my-wayland-adventure.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2024/09/17/my-wayland-adventure.html</guid>
      </item>
      
    
      
      <item>
        <title>Disable pycodestyle Check in SageMaker Notebooks</title>
        
        <description>&lt;p&gt;&lt;em&gt;The solution in this post is originally proposed by &lt;a href=&quot;https://stackoverflow.com/a/77932753&quot;&gt;MattC&lt;/a&gt; and &lt;a href=&quot;https://stackoverflow.com/a/67671347&quot;&gt;krassowski&lt;/a&gt; in this &lt;a href=&quot;https://stackoverflow.com/questions/67669843/jupyterlab-3-0-14-how-to-disable-code-style-highlights-pycodestyle&quot;&gt;StakeOverflow thread&lt;/a&gt;. I just added some screenshots. Thanks to &lt;a href=&quot;https://www.linkedin.com/in/nadhya-polanco/&quot;&gt;Nadhya Polanco&lt;/a&gt; for pointing me to this solution.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(To view a larger version of a screenshot, right-click on the image and select &lt;strong&gt;Open Image in New Tab&lt;/strong&gt;.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;By default, when you use JupyterLab in Amazon SageMaker Studio, you’ll see some Python code being highlighted with pycodestyle syntax check error. This can get distracting if you don’t care about them or have the checks in the CI/CD pipeline already.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/sagemaker-disable-pycodestyle/1.problem.png&quot; alt=&quot;Problem&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Here is how you can disable it:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 19 Aug 2024 09:34:41 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/08/19/disable-pycodestyle-check-in-sagemaker-notebooks.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/08/19/disable-pycodestyle-check-in-sagemaker-notebooks.html</guid>
      </item>
      
    
      
      <item>
        <title>How Many Models Can You Fit into a SageMaker Multi-Model Endpoint?</title>
        
        <description>&lt;p&gt;Recently, I’ve been working on a project that requires running thousands of models simultaneously. To save costs, we decided to run it on a SageMaker Multi-Model endpoint.&lt;/p&gt;

&lt;p&gt;Here is the official definition of Multi-Modal Endpoint from the official &lt;a href=&quot;https://docs.aws.amazon.com/sagemaker/latest/dg/multi-model-endpoints.html&quot;&gt;AWS Documentation&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Multi-model endpoints provide a scalable and cost-effective solution to deploying large numbers of models. They use the same fleet of resources and a shared serving container to host all of your models. This reduces hosting costs by improving endpoint utilization compared with using single-model endpoints. It also reduces deployment overhead because Amazon SageMaker manages loading models in memory and scaling them based on the traffic patterns to your endpoint.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some example use cases include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;House price estimation models for different cities&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Machine anomaly detection algorithms for different machine configurations&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These use cases have many models, with the same model algorithm and framework but trained on different dataset.&lt;/p&gt;

&lt;p&gt;A key questions aries: “How many models can we fit into one instance, and what instance type do we need?”. This post demonstrates my experiment results to answer this quesetion.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 09 Aug 2024 10:04:10 +0000</pubDate>
        <link>https://shinglyu.com/web/2024/08/09/how-many-models-can-you-fit-into-a-sagemaker-multi-model-endpoint.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2024/08/09/how-many-models-can-you-fit-into-a-sagemaker-multi-model-endpoint.html</guid>
      </item>
      
    
      
      <item>
        <title>Demystifying The Options for Triggering AWS CodePipeline with Amazon S3 Events</title>
        
        <description>&lt;p&gt;Triggering AWS code pipeline when new files are uploaded to S3 is a very common use case. For example, when new data is uploaded, you can trigger a CodePipeline that triggers SageMaker model retraining or inference. However, the documentation and services involved in this process have gone through multiple updates, making it confusing for users to understand the current recommended approach. In this post, I will try to untangle the different options and let you know which one is the most up-to-date and recommended approach.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 02 Aug 2024 20:32:31 +0000</pubDate>
        <link>https://shinglyu.com/web/2024/08/02/demystifying-the-options-for-triggering-aws-codepipeline-with-amazon-s3-events.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2024/08/02/demystifying-the-options-for-triggering-aws-codepipeline-with-amazon-s3-events.html</guid>
      </item>
      
    
      
      <item>
        <title>Turning Hand-Drawn Architecture Diagrams into Digital Diagrams with Generative AI</title>
        
        <description>&lt;h2 id=&quot;background&quot;&gt;Background&lt;/h2&gt;

&lt;p&gt;As an architect, whiteboarding is an essential part of the design and problem-solving process. However, once the whiteboard session is over, it can be challenging to translate those hand-drawn diagrams into a digital format that can be easily shared and collaborated on. Traditionally, this process involved manually recreating the diagrams using diagramming tools, which can be time-consuming and prone to errors.&lt;/p&gt;

&lt;h2 id=&quot;my-approach-with-generative-ai&quot;&gt;My Approach with Generative AI&lt;/h2&gt;

&lt;p&gt;To streamline this process, I’ve adopted a new approach that leverages the power of generative AI. By combining a multi-model large language model (LLM) from Amazon Bedrock with the versatile diagramming tool draw.io, I can effortlessly convert hand-drawn architecture diagrams into digital diagrams.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 12 Jul 2024 10:26:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/07/12/turning-hand-drawn-architecture-diagrams-into-digital-diagrams-with-generative-ai.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/07/12/turning-hand-drawn-architecture-diagrams-into-digital-diagrams-with-generative-ai.html</guid>
      </item>
      
    
      
      <item>
        <title>Streamline my local transcription command for Raycast</title>
        
        <description>&lt;p&gt;In my previous &lt;a href=&quot;/ai/2024/05/25/transcribe-voice-to-text-locally-with-whisper-cpp-and-raycast.html&quot;&gt;blog&lt;/a&gt;, I asked Raycast to create an iTerm2 terminal to run the transcription script. This was because I needed to press CTRL+C to stop the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sox&lt;/code&gt; recording. However, I found that launching iTerm2 and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;zsh&lt;/code&gt; took a significant amount of time, sometimes up to 5 to 10 seconds, which was too slow for quickly jotting down thoughts.&lt;/p&gt;

&lt;p&gt;To address this issue, I discovered a way to stop the sox recording without opening the iTerm terminal. Instead of using CTRL+C, I can send a kill signal to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sox&lt;/code&gt; process. To achieve this, I utilize some shell script tricks to save the PID (Process ID) of sox and display a macOS pop-up. When I press the pop-up button, it sends a kill signal to the sox process, effectively stopping the recording.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 10 Jun 2024 14:00:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/06/10/streamline-my-local-transcription-command-for-raycast.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/06/10/streamline-my-local-transcription-command-for-raycast.html</guid>
      </item>
      
    
      
      <item>
        <title>Transcribe voice to text locally with Whisper.cpp and Raycast</title>
        
        <description>&lt;h2 id=&quot;why-local-transcription&quot;&gt;Why local transcription?&lt;/h2&gt;

&lt;p&gt;In today’s world, many of us rely on cloud-based services for tasks like speech-to-text transcription. While these services are convenient, they come with drawbacks like high latency due to network transfers and potential privacy concerns as our audio data is sent to the cloud.&lt;/p&gt;

&lt;p&gt;Local transcription addresses these issues by performing the speech recognition process entirely on your device, ensuring low latency and keeping your audio data private. This is where whisper.cpp comes in.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 25 May 2024 19:34:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/05/25/transcribe-voice-to-text-locally-with-whisper-cpp-and-raycast.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/05/25/transcribe-voice-to-text-locally-with-whisper-cpp-and-raycast.html</guid>
      </item>
      
    
      
      <item>
        <title>Understanding SageMaker Project Template Internals</title>
        
        <description>&lt;p&gt;Authors: &lt;a href=&quot;https://www.linkedin.com/in/brajendrasingh/&quot;&gt;Brajendra Singh&lt;/a&gt;, Shing Lyu&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The blog post is derived from a workshop I built with &lt;a href=&quot;https://www.linkedin.com/in/brajendrasingh/&quot;&gt;Brajendra Singh&lt;/a&gt;, which was never published. I’m extracting the content to make a blog post. You will learn how to deploy the SageMaker provided MLOps template for model deployment and how the template works internally. If the screenshot is too small, right-click on the image and select &lt;strong&gt;Open Image in New Tab&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;MLOps is the one of the hottest topic in the field right now. Organizations are looking for ways to productionize their ML models, and MLOps is the key to repeatable results. Amazon SageMaker Projects is a feature that allows you to create a full MLOps pipeline in just a few clicks. You are going to create the MLOps pipeline using the SageMaker-provided MLOps template. This template creates the deployment pipeline, and creates a trigger to monitor if new models are approved in the SageMaker model registry, and use that as a signal to deploy it.&lt;/p&gt;

&lt;h2 id=&quot;why-do-you-need-a-mlops-pipeline&quot;&gt;Why do you need a MLOps pipeline?&lt;/h2&gt;

&lt;p&gt;The MLOps pipeline you are going to deploy will help you build a robust foundation for your machine learning experiments. It automates the model deployment and testing processing so there is less room for human error. Once the model is approved in the model registry the model is deployed automatically to the staging endpoint, and an automated test is run against the staging endpoint. This help you catch problems with the model early and prevents you from deploying faulty model to production. You remain in control on what should be deployed to production, thanks to the manual approval step in the pipeline. All the pipeline configuration, CloudFormation templates and test script are managed as code in a CodeCommit repository, so you have repeatable deployment of the pipeline itself. By managing the pipeline as code, you also have better visibility on when and how the pipeline has changed. You can easily rollback any bad configuration. All these benefits gives your data scientists more confidence in experimenting fast and fail fast, because they know that they can easily rollback any failed experiments.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 28 Jan 2024 16:00:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/01/28/understanding-sagemaker-project-template-internals.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/01/28/understanding-sagemaker-project-template-internals.html</guid>
      </item>
      
    
      
      <item>
        <title>Using LLM to get cleaner voice transcriptions</title>
        
        <description>&lt;p&gt;Transcribing natural speech is a challenging task for voice-to-text services. When using traditional transcription tools, speakers are expected to talk slowly and clearly, avoiding fillers like “um” and “uh” as much as possible. However, this puts a huge cognitive load on the speaker to monitor every word before it’s spoken. Suddenly, having a normal conversation becomes an artificial performance.&lt;/p&gt;

&lt;p&gt;Recent advances in natural language processing have enabled a better approach - transcribing first, then cleaning up the transcript afterward using a language model. The key insight is that language models can leverage contextual information and an understanding of language semantics to automatically fix many common mistakes and disfluencies in a transcript.&lt;/p&gt;

&lt;p&gt;For example, say I’m giving an informal presentation and say:&lt;/p&gt;

&lt;p&gt;“The, uh, model, uh no, algorithm, um, is able to…correct itself, uh, when it makes erroneous, uh, predictions…”&lt;/p&gt;

&lt;p&gt;A language model could process this rough transcript and output:&lt;/p&gt;

&lt;p&gt;“The algorithm is able to correct itself when it makes erroneous predictions.”&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 17 Jan 2024 21:20:00 +0000</pubDate>
        <link>https://shinglyu.com/ai/2024/01/17/using-llm-to-get-cleaner-voice-transcriptions.html</link>
        <guid isPermaLink="true">https://shinglyu.com/ai/2024/01/17/using-llm-to-get-cleaner-voice-transcriptions.html</guid>
      </item>
      
    
      
      <item>
        <title>Summarize Text Quickly with Raycast and Amazon Bedrock</title>
        
        <description>&lt;p&gt;&lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; has become an indispensable tool in my workflow. The ability to quickly automate tasks and create custom integrations boosts my productivity daily. One common need I have is getting key summaries from long blocks of text. For example, summarize a long blog article I’m too lazy to read. Or quickly understand what is going on based on a long email thread. While there are pre-built Raycast AI extensions, I prefer to use &lt;a href=&quot;https://aws.amazon.com/bedrock/&quot;&gt;Amazon Bedrock&lt;/a&gt; for privacy and security.&lt;/p&gt;

&lt;p&gt;In the past, I used to copy the text and paste it into an AI chatbot, but this context switching was cumbersome and interrupted my flow. Raycast is a more natural way to summarize a piece of text I just copied.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 20 Oct 2023 19:47:37 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/10/20/summarize-text-quickly-with-raycast-and-amazon-bedrock.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/10/20/summarize-text-quickly-with-raycast-and-amazon-bedrock.html</guid>
      </item>
      
    
      
      <item>
        <title>How to link to external files in Joplin</title>
        
        <description>&lt;p&gt;I have been using Joplin for work for two years now, and I love it. Joplin is a free and open source note-taking app that lets you create notes in Markdown format, sync them across devices, and encrypt them for privacy. Joplin is also very flexible and customizable, allowing you to use plugins, themes, templates, and more to suit your needs.&lt;/p&gt;

&lt;p&gt;One of the features that I recently discovered in Joplin is linking to local files and folders on my computer. This allows me to access my work documents without storing them in Joplin’s database, which can get too large and slow down the app. It also allows me to organize my files and folders in my own way, and take advantage of file sync services like Dropbox or Amazon WorkDocs. In this blog post, I will show you how to link to local files and folders in Joplin, and how to quickly copy the full file path from your file explorer.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 14 Sep 2023 20:14:49 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/09/14/how-to-link-to-external-files-in-joplin.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/09/14/how-to-link-to-external-files-in-joplin.html</guid>
      </item>
      
    
      
      <item>
        <title>Introducing the llm-chain-mock Driver for Cost-Effective LLM Testing</title>
        
        <description>&lt;p&gt;&lt;a href=&quot;https://github.com/sobelio/llm-chain&quot;&gt;Llm-chain&lt;/a&gt; is a Rust crate that help you create advanced LLM applications such as chatbots, agents, and more. It supports various drivers, such as &lt;a href=&quot;https://github.com/sobelio/llm-chain/tree/main/crates/llm-chain-openai&quot;&gt;OpenAI&lt;/a&gt;, &lt;a href=&quot;https://github.com/sobelio/llm-chain/tree/main/crates/llm-chain-llama&quot;&gt;llama.cpp&lt;/a&gt;, and &lt;a href=&quot;https://github.com/sobelio/llm-chain/tree/main/crates/llm-chain-local&quot;&gt;llm&lt;/a&gt;, that can connect to different APIs or run models locally. llm-chain allows you to easily switch between different drivers and options without a complete rewrite of your code.&lt;/p&gt;

&lt;p&gt;One of the challenges of using llm-chain is the cost associated with invoking the LLMs. Depending on the driver you use, you may incur either an API fee or a compute resource cost for running your own model. The local models usually requires pretty powerful machines, and the setup process might be a little complicated.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 15 Aug 2023 20:51:15 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/08/15/introducing-the-llm-chain-mock-driver-for-cost-effective-llm-testing.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/08/15/introducing-the-llm-chain-mock-driver-for-cost-effective-llm-testing.html</guid>
      </item>
      
    
      
      <item>
        <title>My New Book: Practical Rust Projects, 2nd Edition</title>
        
        <description>&lt;p&gt;Hi, everyone! I hope you are all doing well and enjoying Rust as much as I do. I have some exciting news to share with you today: I have just published my new book, Practical Rust Projects, 2nd Edition.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/rust-book-2nd.jpeg&quot; alt=&quot;Photo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I would like to acknowledge the contribution of my co-author, Andrew Rzeznik, who took over the project after I had to stop for personal circumstances. He did a fantastic job in finishing the book and making it even better than I could have imagined. I am very happy with the final outcome of our collaboration, and I hope you will find our book useful and enjoyable. Thank you, Andrew Rzeznik, for your hard work and dedication!&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 04 Aug 2023 20:05:15 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/08/04/my-new-book-practical-rust-projects-2nd-edition.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/08/04/my-new-book-practical-rust-projects-2nd-edition.html</guid>
      </item>
      
    
      
      <item>
        <title>Getting Started with Rust llm-chain using the LLaMa driver</title>
        
        <description>&lt;p&gt;Recently I’ve been contributing to &lt;a href=&quot;https://github.com/sobelio/llm-chain&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llm-chain&lt;/code&gt;&lt;/a&gt;, a Rust library for working with large language models (LLMs). It’s similar to Python’s &lt;a href=&quot;https://docs.langchain.com/docs/&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;LangChain&lt;/code&gt;&lt;/a&gt;. I contributed this tutorial to the official website for setting up a simple llm-chain using LLaMA models running locally using the &lt;a href=&quot;https://github.com/ggerganov/llama.cpp&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;llama.cpp&lt;/code&gt;&lt;/a&gt; project. I’m also publishing the same tutorial in this blog for archiving.&lt;/p&gt;

&lt;hr /&gt;

&lt;h2 id=&quot;tutorial-getting-started-using-the-llama-driver&quot;&gt;Tutorial: Getting Started using the LLAMA driver&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will learn how to set up an llm-project using the LLAMA drive. If you wish to use the other drivers you can skip this part of the tutorial.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 02 Aug 2023 20:10:09 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/08/02/getting-started-with-rust-llm-chain-using-the-llama-driver.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/08/02/getting-started-with-rust-llm-chain-using-the-llama-driver.html</guid>
      </item>
      
    
      
      <item>
        <title>Using sepia theme in Brave&apos;s SpeedReader</title>
        
        <description>&lt;p&gt;I like Brave’s &lt;a href=&quot;https://brave.com/research/speedreader-reader-mode-made-fasst-and-private/&quot;&gt;SpeedReader&lt;/a&gt; feature. It is a new approach to reader modes that removes unnecessary elements from pages it recognizes as articles and displays them in a simplified format as part of the rendering pipeline. Because it’s done during rendering, not after the page have rendered (as most reader mode extensions does), it delivers performance gain and reduce the network bandwidth required.&lt;/p&gt;

&lt;p&gt;However, there is one thing that bothers me about SpeedReader. It follows the browser theme, so if you choose dark theme the SpeedReader theme is always white text on black, which is hard to read for me. I prefer a sepia theme for reading articles, as it is more soothing for my eyes. Unfortunately, there is no UI for changing the SpeedReader theme. However, I found this &lt;a href=&quot;https://github.com/brave/brave-browser/issues/23447&quot;&gt;github issue&lt;/a&gt;. It shows that the theme has actually been implemented, but there is no way to access it from the browser settings. If you set the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;data-theme&lt;/code&gt; attribute on &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;document.documentElement&lt;/code&gt; using JavaScript, you can toggle between dark, light and sepia themes.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 18 Jul 2023 20:10:54 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/07/18/using-sepia-theme-in-brave-s-speedreader.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/07/18/using-sepia-theme-in-brave-s-speedreader.html</guid>
      </item>
      
    
      
      <item>
        <title>How to create your own private LLM using only AWS CLI</title>
        
        <description>&lt;p&gt;In this blog post, I will show you how to use AWS CLI and SageMaker JumpStart to create your own private large language model (LLM) on Amazon SageMaker. You will learn how to deploy a pretrained model from the Hugging Face Transformers library, and how to use it to generate text with custom instructions using AWS CLI.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 03 Jul 2023 19:45:51 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/07/03/how-to-create-your-own-private-llm-using-only-aws-cli.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/07/03/how-to-create-your-own-private-llm-using-only-aws-cli.html</guid>
      </item>
      
    
      
      <item>
        <title>Disabling the Link Lost alarm on iTag BLE tracker</title>
        
        <description>&lt;p&gt;In this blog post, I will share my experience of using an iTag BLE tracker to find my lost TV remote and how I disabled the annoying link lost alarm feature.&lt;/p&gt;

&lt;h1 id=&quot;what-is-an-itag-ble-tracker&quot;&gt;What is an iTag BLE tracker?&lt;/h1&gt;
&lt;p&gt;An iTag BLE tracker is a small device that can be attached to any object and paired with a smartphone via Bluetooth Low Energy (BLE). It can be used as a key finder, anti-lost alarm, remote shutter, or voice recorder. It has a button that can trigger various actions on the smartphone, such as ringing, taking a photo, or recording a voice memo. It also has a built-in speaker that can beep when the Bluetooth connection is lost or when the button is pressed.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/itag/itag.jpeg&quot; alt=&quot;itag&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I bought an iTag BLE tracker because I often lose my TV remote in the house, most of the time hidden somewhere by my toddler son. I wanted to use it as a simple device that can help me locate my remote by making a sound when I press the button on my smartphone. I thought it would be a cheap and easy solution for my problem.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 03 Jun 2023 14:42:08 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/06/03/disabling-the-link-lost-alarm-on-itag-ble-tracker.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/06/03/disabling-the-link-lost-alarm-on-itag-ble-tracker.html</guid>
      </item>
      
    
      
      <item>
        <title>Conferences are not about sessions</title>
        
        <description>&lt;p&gt;A few weeks ago, I attended KubeCon + CloudNativeCon 2023, one of the largest and most popular conferences for cloud native technologies. It was an amazing experience, with thousands of attendees, hundreds of sessions, and dozens of exhibitors. I learned a lot from the speakers, the exhibitors, and the fellow attendees.&lt;/p&gt;

&lt;p&gt;But there was one thing you might find surprising: I listen to very few sessions.&lt;/p&gt;

&lt;p&gt;That’s right. I skipped most the sessions and focused on other aspects of the conference. Why? Because I realized that listening to sessions is not the most important thing to do at a conference.&lt;/p&gt;

&lt;p&gt;Don’t get me wrong. Sessions can be very informative and useful. But sessions are not the only way to learn at a conference, especially when you are attending it physcially. Why? Because sessions often cover knowledge or topics that can be easily found online, such as on YouTube or blogs. And because sessions take a lot of time and effort to attend, they can take away from other valuable opportunities at the conference.&lt;/p&gt;

&lt;p&gt;So what should you do instead of listening to sessions? In this article, I will share with you two things that I think are more important than listening to sessions at a conference: watching out for trends and networking. These two things can help you stay ahead of the curve in your industry and create new opportunities for yourself and your business.&lt;/p&gt;

&lt;p&gt;Let’s dive in.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 02 May 2023 20:09:53 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/05/02/conferences-are-not-about-sessions.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/05/02/conferences-are-not-about-sessions.html</guid>
      </item>
      
    
      
      <item>
        <title>Why Both Knowledge and Experience Are Critical for a Software Developer&apos;s Career</title>
        
        <description>&lt;p&gt;There is an age-old debate about whether theoretical knowledge or hands-on experience is more important for a successful software developer career. However, the reality is that both knowledge and experience are equally important and complementary to each other. When I was a student (a long time ago…), I was proud of my education and the knowledge and skills that I have acquired throughout my academic journey. However, I couldn’t help but feel frustrated that despite my academic achievements, I was still struggling to find a job due to a lack of experience. Many companies seem to be looking for candidates who have already worked in the industry, leaving fresh graduates like myself feeling left out in the job market. It’s a catch-22 situation: how can I gain experience if no one is willing to give me a chance? In this blog post, I want to share my thoughts and experiences on how to overcome this challenge and land a job despite not having any prior work experience.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 08 Apr 2023 20:42:51 +0000</pubDate>
        <link>https://shinglyu.com/web/2023/04/08/why-both-knowledge-and-experience-are-critical-for-a-software-developer-s-career.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2023/04/08/why-both-knowledge-and-experience-are-critical-for-a-software-developer-s-career.html</guid>
      </item>
      
    
      
      <item>
        <title>How to learn an AWS service quickly</title>
        
        <description>&lt;p&gt;In my day job, I have to consult customers on AWS services and design architectures on AWS. That means I have to have a basic understanding of almost every AWS service and be ready to dive deep into any of them on short notice. For that, I have a method for learning an AWS service in the most efficient way possible.&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Read the product page.&lt;/li&gt;
  &lt;li&gt;Read the product FAQ.&lt;/li&gt;
  &lt;li&gt;Read the concept section(s) of the documentation.&lt;/li&gt;
  &lt;li&gt;Ask yourself key questions about this service.&lt;/li&gt;
  &lt;li&gt;Watch YouTube videos.&lt;/li&gt;
  &lt;li&gt;Follow a hands-on workshop.&lt;/li&gt;
  &lt;li&gt;Dive deeper.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let’s assume that you need to learn AWS Lambda quickly, here is how you would do it:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 22 Jul 2022 21:52:56 +0000</pubDate>
        <link>https://shinglyu.com/aws/2022/07/22/how-to-learn-an-aws-service-quickly.html</link>
        <guid isPermaLink="true">https://shinglyu.com/aws/2022/07/22/how-to-learn-an-aws-service-quickly.html</guid>
      </item>
      
    
      
      <item>
        <title>My Productivity System</title>
        
        <description>&lt;p&gt;&lt;img src=&quot;/blog_assets/productivity/productivity_method.svg&quot; alt=&quot;my productivity system diagram&quot; /&gt;
(Right-click on the picture and select &lt;em&gt;Open image in new tab&lt;/em&gt; to see the diagram in full size.)&lt;/p&gt;

&lt;p&gt;After some recent discussion with a friend on note-taking methods, I decided to document my current productivity system for future reference. It is a combination of note-taking, time management, TODO list, project management, and writing combined. It has evolved over the years so I find it interesting to take a snapshot and look back a few years later.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 06 Mar 2022 11:10:03 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2022/03/06/my-productivity-system.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2022/03/06/my-productivity-system.html</guid>
      </item>
      
    
      
      <item>
        <title>Consistent Hashing and why it might not be the correct answer to your system design interview</title>
        
        <description>&lt;p&gt;I’ve conducted many system design interviews in the past. Whenever I brought up the topic of database sharding, the candidates almost always shout out “Yes, yes I know! Consistent hashing!”. If you probe them further, they will draw this classic ring diagram on the whiteboard.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/7/71/Consistent_Hashing_Sample_Illustration.png&quot; alt=&quot;Consistent Hashing Diagram&quot; /&gt;
&lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Consistent_Hashing_Sample_Illustration.png&quot;&gt;WikiLinuz&lt;/a&gt;, &lt;a href=&quot;https://creativecommons.org/licenses/by-sa/4.0&quot;&gt;CC BY-SA 4.0&lt;/a&gt;, via Wikimedia Commons&lt;/p&gt;

&lt;p&gt;But if you have read Martin Kleppmann’s great book &lt;a href=&quot;https://dataintensive.net/&quot;&gt;&lt;em&gt;Designing Data-Intensive Applications&lt;/em&gt;&lt;/a&gt;, you might notice a sidenote:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;…, this particular approach (Consistent hashing, as defined by Karger et al.) actually doesn’t work very well for databases, so it’s rarely used in practice (the documentation of some databases still refers to consistent hashing, but it is often inaccurate).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then why is every system design interview study guide tell you otherwise? Let’s dive into this topic in this post.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 11 Feb 2022 09:44:44 +0000</pubDate>
        <link>https://shinglyu.com/web/2022/02/11/consistent-hashing-and-why-it-might-not-be-the-correct-answer-to-your-system-design-interview.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2022/02/11/consistent-hashing-and-why-it-might-not-be-the-correct-answer-to-your-system-design-interview.html</guid>
      </item>
      
    
      
      <item>
        <title>Generating a notification sound in command-line</title>
        
        <description>&lt;p&gt;You want to play a notification sound in a Linux shell script, but don’t want to download any sound files (e.g. MP3, WAV, MIDI). Here is a script that generates the sound on-the-fly:&lt;/p&gt;

&lt;p&gt;First install &lt;a href=&quot;http://sox.sourceforge.net/&quot;&gt;SoX&lt;/a&gt;, &lt;em&gt;the Swiss Army knife of sound processing programs&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;apt-get &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;sox
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;play &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt; synth 0.3 pluck A3 vol &lt;span class=&quot;nt&quot;&gt;-20dB&lt;/span&gt; repeat 2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;play&lt;/code&gt;: the player command from SoX.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-n&lt;/code&gt;: Play a “null file”.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;synth 0.3 pluck A3&lt;/code&gt;: Play the A3 (220.00 Hz) sound for 0.3 seconds, with a waveform that simulates a guitar string pluck.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;vol -20dB&lt;/code&gt;: The default is too loud, reduce the volume by -20dB.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;repeat 2&lt;/code&gt;: Repeat twice (i.e., total 3 times).&lt;/li&gt;
&lt;/ul&gt;

 (more...)</description>
        
        <pubDate>Sat, 04 Jul 2020 13:05:16 +0000</pubDate>
        <link>https://shinglyu.com/micro/2020/07/04/generating-a-notification-sound-in-command-line.html</link>
        <guid isPermaLink="true">https://shinglyu.com/micro/2020/07/04/generating-a-notification-sound-in-command-line.html</guid>
      </item>
      
    
      
      <item>
        <title>How to import serde&apos;s custom derive macors properly?</title>
        
        <description>&lt;p&gt;&lt;strong&gt;TL;DR Follow the &lt;a href=&quot;https://serde.rs/derive.html&quot;&gt;official documentation&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 24 Jun 2020 21:05:05 +0000</pubDate>
        <link>https://shinglyu.com/micro/2020/06/24/how-to-import-serde-s-derive-macors-properly.html</link>
        <guid isPermaLink="true">https://shinglyu.com/micro/2020/06/24/how-to-import-serde-s-derive-macors-properly.html</guid>
      </item>
      
    
      
      <item>
        <title>Caveats in Terraforming WAF V2 for CloudFront</title>
        
        <description>&lt;p&gt;If you want to add a WAF V2 (&lt;a href=&quot;https://www.terraform.io/docs/providers/aws/r/wafv2_web_acl.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws_wafv2_web_acl&lt;/code&gt;&lt;/a&gt;) to a CloudFront distribution (&lt;a href=&quot;https://www.terraform.io/docs/providers/aws/r/cloudfront_distribution.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws_cloudfront_distribution&lt;/code&gt;&lt;/a&gt;) using Terraform, there are a few caveats:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 23 Jun 2020 18:55:16 +0000</pubDate>
        <link>https://shinglyu.com/micro/2020/06/23/caveats-in-terraforming-waf-v2-for-cloudfront.html</link>
        <guid isPermaLink="true">https://shinglyu.com/micro/2020/06/23/caveats-in-terraforming-waf-v2-for-cloudfront.html</guid>
      </item>
      
    
      
      <item>
        <title>Check MongoDB index usage statistics</title>
        
        <description>&lt;p&gt;Run this command to get the usage of each index:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 10 Jun 2020 16:57:50 +0000</pubDate>
        <link>https://shinglyu.com/micro/2020/06/10/check-mongodb-index-usage-statistics.html</link>
        <guid isPermaLink="true">https://shinglyu.com/micro/2020/06/10/check-mongodb-index-usage-statistics.html</guid>
      </item>
      
    
      
      <item>
        <title>RFC2616 is dead, read RFC723X</title>
        
        <description>&lt;p&gt;While looking for the definition of HTTP Status Codes, I realize that &lt;a href=&quot;https://tools.ietf.org/html/rfc2616&quot;&gt;RFC2616&lt;/a&gt; is deprecated. You should look for &lt;a href=&quot;https://tools.ietf.org/html/rfc7231&quot;&gt;RFC7231&lt;/a&gt; instead.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 10 Jun 2020 16:32:27 +0000</pubDate>
        <link>https://shinglyu.com/micro/2020/06/10/rfc2616-is-dead-read-rfc723x.html</link>
        <guid isPermaLink="true">https://shinglyu.com/micro/2020/06/10/rfc2616-is-dead-read-rfc723x.html</guid>
      </item>
      
    
      
      <item>
        <title>Lessons learned in writing my first book</title>
        
        <description>&lt;p&gt;&lt;img src=&quot;/blog_assets/book_cover.jpg&quot; alt=&quot;book cover&quot; /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;You might have noticed that I didn’t update this blog frequently in the past year. It’s not because I’m lazy, but I focused all my creative energy on writing this book: &lt;a href=&quot;https://www.apress.com/gp/book/9781484255988&quot;&gt;Practical Rust Projects&lt;/a&gt;. The book is now available on &lt;a href=&quot;https://www.apress.com/gp/book/9781484255988&quot;&gt;Apress&lt;/a&gt;, &lt;a href=&quot;https://www.amazon.com/Practical-Rust-Projects-Computing-Applications/dp/1484255984&quot;&gt;Amazon&lt;/a&gt; and &lt;a href=&quot;https://learning.oreilly.com/library/view/practical-rust-projects/9781484255995/&quot;&gt;O’Reilly&lt;/a&gt;. In this post, I’ll share some of the lessons I learned in writing this book.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 05 Apr 2020 08:42:16 +0000</pubDate>
        <link>https://shinglyu.com/web/2020/04/05/lessons-learned-in-writing-my-first-book.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2020/04/05/lessons-learned-in-writing-my-first-book.html</guid>
      </item>
      
    
      
      <item>
        <title>Update AWS Security Groups with Terraform</title>
        
        <description>&lt;p&gt;In theory, Terraform is capable of figuring out the dependency between AWS resources and make updates in the correct order. However, AWS security groups often become a source of trouble if you don’t understand how Terraform handles it. If you are having issues modifying the security group because they are used by other resources, here are some ways you can mitigate that.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 06 Feb 2020 15:40:58 +0000</pubDate>
        <link>https://shinglyu.com/web/2020/02/06/update-aws-security-groups-with-terraform.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2020/02/06/update-aws-security-groups-with-terraform.html</guid>
      </item>
      
    
      
      <item>
        <title>Moving AWS Service across accounts using Terraform</title>
        
        <description>&lt;p&gt;Recently I was assigned the task to move our REST API hosted on AWS to a new account. The organization I worked for is moving to a one-account-per-team (or a few closely related teams) approach, as opposed to one account shared by all teams. Having one account per team helps reduce the clutter in the accounts because you only see your resources. It also helps the platform/SRE team to control the cost in a more fine-grain manner. Since we have everything in AWS, it also reduces the chance that we hit AWS resource limits.&lt;/p&gt;

&lt;p&gt;The service we built is all provisioned using Terraform. They are tested and deployed with Drone CI tool. I’ll discuss key points to considerations when migrating accounts across accounts.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 30 Sep 2019 12:39:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2019/09/30/moving-aws-service-across-accounts-using-terraform.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2019/09/30/moving-aws-service-across-accounts-using-terraform.html</guid>
      </item>
      
    
      
      <item>
        <title>Switching Between Multiple Local Backends in Terraform</title>
        
        <description>&lt;p&gt;Terraform has many &lt;a href=&quot;https://www.terraform.io/docs/backends/&quot;&gt;backend&lt;/a&gt; types. The &lt;a href=&quot;https://www.terraform.io/docs/backends/types/local.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;local&lt;/code&gt; backend&lt;/a&gt; stores the state on the local filesystem, so it’s ideal for quick local testing. By it’s not very obvious how to have multiple local backend and state, and how to easily switch between them. One use case for this is when you deploy the same set of resources to multiple AWS regions. Let’s say we want to create two API gateways and their corresponding DNS records to two regions. We use the &lt;a href=&quot;https://www.terraform.io/docs/providers/aws/r/route53_record.html&quot;&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;aws_route53_record&lt;/code&gt;&lt;/a&gt; resource to deploy them:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;resource &quot;aws_route53_record&quot; &quot;api&quot; {
  name    = &quot;${var.api_url}&quot;
  type    = &quot;A&quot;
  # the rest are omitted
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And we want to set &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var.api_url&lt;/code&gt; to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api-eu.example.com&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api-us.example.com&lt;/code&gt; for Europe and US regions in two separate &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;tfvars&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Then if you try to apply them sequentially like so:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;terraform init
terraform apply -var-file=eu.tfvars
terraform apply -var-file=us.tfvars
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;You’ll notice that the second apply will try to destroy your &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api-eu.example.com&lt;/code&gt; record, and replace it with an &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;api-us-example.com&lt;/code&gt; record. This is because the states are the same, and the resource name is the same between two apply attempts, so terraform think you want to destroy the existing record and create a new one. There is also a problem when you try to destroy resources. Because the resources have the same name, so if you destroy them in one region, you won’t be able to destroy then in the other one. Because terraform assumes everything is already gone.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 06 Apr 2019 18:39:24 +0000</pubDate>
        <link>https://shinglyu.com/web/2019/04/06/switching-between-multiple-local-backend-in-terraform.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2019/04/06/switching-between-multiple-local-backend-in-terraform.html</guid>
      </item>
      
    
      
      <item>
        <title>Simplify Your CI Pipeline Configuration with Jsonnet</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This post is also featured on the &lt;a href=&quot;https://medium.com/dazn-tech/simplify-your-ci-pipeline-configuration-with-jsonnet-5a96cd9ccc51&quot;&gt;DAZN Engineering Blog&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of the CI/CD (Continuous Integration/Continuous Delivery) tools nowadays supports some form of configuration file so you can properly version control them. For example &lt;a href=&quot;https://docs.travis-ci.com/user/tutorial/&quot;&gt;Travis CI&lt;/a&gt;, &lt;a href=&quot;https://docs.gitlab.com/ee/ci/yaml/&quot;&gt;Gitlab CI&lt;/a&gt;, &lt;a href=&quot;https://circleci.com/docs/2.0/config-intro/&quot;&gt;Circle CI&lt;/a&gt; and &lt;a href=&quot;https://docs.drone.io/user-guide/pipeline/steps/&quot;&gt;Drone CI&lt;/a&gt; uses YAML file. &lt;a href=&quot;https://jenkins.io/doc/pipeline/tour/hello-world/&quot;&gt;Jenkins&lt;/a&gt; uses its own DSL. These YAML-based configuration files are easy to read and edit, but they don’t scale very well when the file grows big. This problem can be solved by using a nice data templating language called Jsonnet. In this post we’ll be demonstrating Drone CI v1.0 configuration file format, but the idea can be easily applied to other CI tool.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 28 Feb 2019 13:45:00 +0000</pubDate>
        <link>https://shinglyu.com/devops/2019/02/28/simplify-your-ci-pipeline-configuration-with-jsonnet.html</link>
        <guid isPermaLink="true">https://shinglyu.com/devops/2019/02/28/simplify-your-ci-pipeline-configuration-with-jsonnet.html</guid>
      </item>
      
    
      
      <item>
        <title>Download JavaScript Data as Files on the Client Side</title>
        
        <description>&lt;p&gt;When building websites or web apps, creating a “Download as file” link is quite useful. For example if you want to allow user to export some data as JSON, CSV or plain text files so they can open them in external programs or load them back later. Usually this requires a web server to format the file and serve it. But actually you can export arbitrary JavaScript variable to file entirely on the client side. I have implemented that function in one of my project, MozApoy, and here I’ll explain how I did that.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 09 Feb 2019 09:28:39 +0000</pubDate>
        <link>https://shinglyu.com/web/2019/02/09/js_download_as_file.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2019/02/09/js_download_as_file.html</guid>
      </item>
      
    
      
      <item>
        <title>AWS Route 53 Load Balancing with Terraform</title>
        
        <description>&lt;p&gt;Terraform has some great &lt;a href=&quot;https://www.terraform.io/docs/providers/aws/r/route53_record.html&quot;&gt;documentation&lt;/a&gt; on Route 53, but it’s a little bit hard to understand how all the resources works together. So to demonstrate, we are going to build an REST API that is deployed to multiple AWS regions, which has one public-facing URL, which is load balanced through Route 53. There are some additional requirements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;API is done using API Gateway + Lambda&lt;/li&gt;
  &lt;li&gt;The same API is deployed to multiple AWS regions. To demonstrate this we’ll deploy to EU Frankfurt (eu-central-1) and N.Virginia, US (us-east-1).&lt;/li&gt;
  &lt;li&gt;The API in each region will get a public facing URL for easy debugging. So there will be &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api-eu.example.com&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api-us.example.com&lt;/code&gt; pointing to the API gateway in each region.&lt;/li&gt;
  &lt;li&gt;There will be a global URL, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api.example.com&lt;/code&gt; which points to the underlying &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api-eu.example.com&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://api-us.example.com&lt;/code&gt; endpoints.&lt;/li&gt;
  &lt;li&gt;The global URL will do a 50%-50% active-active load balancing to each region. In other words 50% of the traffic will go to each region.&lt;/li&gt;
  &lt;li&gt;The health of the regional APIs are monitored, if one of it goes down, all the traffic will be routed to the other alive one.&lt;/li&gt;
  &lt;li&gt;Everything is deployed with Terraform&lt;/li&gt;
&lt;/ul&gt;

 (more...)</description>
        
        <pubDate>Tue, 29 Jan 2019 13:55:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2019/01/29/multi-region-domain-names-and-load-balancing-with-aws-route53.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2019/01/29/multi-region-domain-names-and-load-balancing-with-aws-route53.html</guid>
      </item>
      
    
      
      <item>
        <title>Counting your contribution to a git repository</title>
        
        <description>&lt;p&gt;Sometimes you may wonder, how many commits or lines of code did I contributed to a git repository? Here are some easy one liners to help you count that.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 25 Dec 2018 11:00:27 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/12/25/counting-your-contribution-to-a-git-repository.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/12/25/counting-your-contribution-to-a-git-repository.html</guid>
      </item>
      
    
      
      <item>
        <title>New Rust Course - Building Reuseable Code with Rust</title>
        
        <description>&lt;p&gt;My first ever video course is now live on &lt;a href=&quot;https://www.udemy.com/building-reusable-code-with-rust/&quot;&gt;Udemy&lt;/a&gt;, &lt;a href=&quot;https://www.oreilly.com/library/view/building-reusable-code/9781788399524/&quot;&gt;Safari Books&lt;/a&gt; and &lt;a href=&quot;https://www.packtpub.com/application-development/building-reusable-code-rust-video&quot;&gt;Packt&lt;/a&gt;. It really took me a long time and I’d love to share with you what I’ve prepared for you.&lt;/p&gt;

&lt;h1 id=&quot;whats-this-course-about&quot;&gt;What’s this course about?&lt;/h1&gt;
&lt;p&gt;This course is about the &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;Rust&lt;/a&gt; programming language, but it’s not those general introductory course on basic Rust syntax. This course focus on the code reuse aspect of the Rust language. So we won’t be touch every language feature, but we’ll help you understand how a selected set of features will help you achieve code reuse.&lt;/p&gt;

&lt;h1 id=&quot;whats-so-special-about-it&quot;&gt;What’s so special about it?&lt;/h1&gt;

&lt;p&gt;Since these course is not a general introduction course, it is structured in a way that is bottom-up and help you learn how the features are actually used out in the wild.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 16 Nov 2018 21:12:18 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/11/16/new-rust-course-building-reuseable-code-with-rust.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/11/16/new-rust-course-building-reuseable-code-with-rust.html</guid>
      </item>
      
    
      
      <item>
        <title>Chatting with your website visitors through Chatra</title>
        
        <description>&lt;p&gt;&lt;strong&gt;Update (May 31, 2025):&lt;/strong&gt; &lt;em&gt;I’ve removed the Chatra chat widget from my website today. While it was a useful tool, I found that many users mistakenly thought it was AI-powered and would be quite rude when interacting with what they assumed was a chatbot. If you need to reach out, please feel free to contact me via email listed at the bottom of this website instead.&lt;/em&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;When I started the blog, I didn’t add a message board below each article because I don’t have the time to deal with spam. Due to &lt;a href=&quot;https://en.wikipedia.org/wiki/Broken_windows_theory&quot;&gt;broken windows theory&lt;/a&gt;, if I leave the spam unattended my blog will soon become a landfill for spammers. But nowadays many e-commerce site or brand sites have a live chatting box, which will solve my problem because I can simply ignore spam, while interested readers can ask questions and provide feedbacks easily. That’s why when my sponsor, &lt;a href=&quot;https://chatra.io/?partnerId=3Leg7HgLErPj4Fy6v&quot;&gt;Chatra.io&lt;/a&gt;, approached me with their great tool, I fell in love with it right away and must share it with everyone.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 13 Aug 2018 18:59:29 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/08/13/chatting-with-your-website-visitors-through-chatra.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/08/13/chatting-with-your-website-visitors-through-chatra.html</guid>
      </item>
      
    
      
      <item>
        <title>How to Unit Test WebExtensions</title>
        
        <description>&lt;p&gt;We all know that unit-testing is a good software engineering practice, but sometimes the hassle of setting up the testing environment will keep us from doing it in the first place. After Firefox 57, WebExtension has become the new standard for writing add-ons for Firefox. How do you set up everything to start testing your WebExtension-based add-ons?&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 24 Jun 2018 19:44:13 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/06/24/how-to-unit-test-webextensions.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/06/24/how-to-unit-test-webextensions.html</guid>
      </item>
      
    
      
      <item>
        <title>如何貢獻開源專案？</title>
        
        <description>&lt;p&gt;貢獻開源專案是一個提高自己技能的好機會，同時也能提昇自己在軟體界的能見度與溝通技巧。以下是我貢獻 Mozilla 的 &lt;a href=&quot;https://servo.org/&quot;&gt;Servo&lt;/a&gt; 瀏覽器引擎的一些心得，提供想要一探開源的新手一些方向。&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 12 May 2018 15:55:42 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/05/12/how-to-contribute-to-open-source.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/05/12/how-to-contribute-to-open-source.html</guid>
      </item>
      
    
      
      <item>
        <title>Merge Pull Requests without Merge Commits</title>
        
        <description>&lt;p&gt;By default, GitHub’s pull request (or GitLab’s merge request) will merge with a merge commit. That means your feature branch will be merged into the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;master&lt;/code&gt; by creating a new commit, and both the feature and master branch will be kept.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 25 Mar 2018 21:46:36 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/03/25/merge-pull-requests-without-merge-commits.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/03/25/merge-pull-requests-without-merge-commits.html</guid>
      </item>
      
    
      
      <item>
        <title>Minimal React.js Without A Build Step (Updated)</title>
        
        <description>&lt;p&gt;Back in 2016, I wrote a &lt;a href=&quot;/web/2016/04/06/minimal_react.html&quot;&gt;post&lt;/a&gt; about how to write a React.js page without a build step. If I remember correctly, at that time the official React.js site have very little information about running React.js without [Webpack][webpack], [in-browser Babel transpiler][babel] is not very stable and they are deprecating &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;JSXTransformer.js&lt;/code&gt;. After the post my focus turned to browser backend projects and I haven’t touch React.js for a while. Now after 1.5 years, when I try to update one of [my React.js project][itinerary-viewer], I notice that the official site now has a clearer instruction on how to use React.js without a build step. So I’m going to write an update the post here.&lt;/p&gt;

&lt;p&gt;You can find the example code on &lt;a href=&quot;https://github.com/shinglyu/minimal-react&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 08 Feb 2018 21:39:06 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/02/08/minimal-react-js-without-a-build-step-updated.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/02/08/minimal-react-js-without-a-build-step-updated.html</guid>
      </item>
      
    
      
      <item>
        <title>Taking notes with MkDocs</title>
        
        <description>&lt;p&gt;I’ve been using &lt;a href=&quot;https://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt; for note-taking for a few years. I use them to keep track of my technical notes and checklists. &lt;a href=&quot;https://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt; is a brilliant piece of software. It is a single HTML file with a note-taking interface, where the notes you take are stored directly in the HTML file itself, so you can easily carry (copy) the file around and easily deploy it online for sharing. However, most modern browsers don’t allow web pages to access the filesystem, so in order to let &lt;a href=&quot;https://tiddlywiki.com/&quot;&gt;TiddlyWiki&lt;/a&gt; save the notes, you need to rely on &lt;a href=&quot;https://tiddlywiki.com/#%22savetiddlers%22%20Extension%20for%20Chrome%20and%20Firefox%20by%20buggyj&quot;&gt;browser extensions&lt;/a&gt; or Dropbox integration service like &lt;a href=&quot;https://github.com/Jermolene/TiddlyWiki-in-the-Sky&quot;&gt;TiddlyWiki in the Sky&lt;/a&gt;. But they still have some frictions.&lt;/p&gt;

&lt;p&gt;So recently I started to look for other alternatives for note-taking.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 02 Jan 2018 20:14:58 +0000</pubDate>
        <link>https://shinglyu.com/web/2018/01/02/taking-notes-with-mkdocs.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2018/01/02/taking-notes-with-mkdocs.html</guid>
      </item>
      
    
      
      <item>
        <title>Make LastPass Work Across App and Website</title>
        
        <description>&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;: My stock broker outsourced their Android app to a third-party company, so LastPass treat the desktop website and Android app as different sites. Although I can save them separately in LassPass, their password won’t synchronize with each other.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 16 Oct 2017 18:59:46 +0000</pubDate>
        <link>https://shinglyu.com/web/2017/10/16/make-lastpass-work-across-app-and-website.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2017/10/16/make-lastpass-work-across-app-and-website.html</guid>
      </item>
      
    
      
      <item>
        <title>Porting Chrome Extension to Firefox</title>
        
        <description>&lt;p&gt;Three years ago, I wrote the &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/focusblocker/?src=userprofile&quot;&gt;FocusBlocker&lt;/a&gt; to help me focus on my master thesis. It’s basically a website blocker that stops me from checking Facebook every five minute. But is different from other blockers like &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/leechblock/&quot;&gt;LeechBlock&lt;/a&gt; that requires you to set a fixed schedule. FocusBlocker lets you set a quota, e.g. I can browse 10 minutes of Facebook then block it for 50 minutes. So as long as you have remaining quota, you can check Facebook anytime. I’m glad that other people find it useful, and I even got my first donation through AMO because of happy users.&lt;/p&gt;

&lt;p&gt;Since this extension serves my need, I’m not actively maintaining it or adding new features. But I was aware of Firefox’s &lt;a href=&quot;https://blog.mozilla.org/addons/2015/08/21/the-future-of-developing-firefox-add-ons/&quot;&gt;transition from the legacy Add-on SDK to WebExtension API&lt;/a&gt;. So before WebExtension API is fully available, I started to migrate it to Chrome’s extension format. But I didn’t got the time to actually migrate it back to Firefox, until a user emails me asking for a WebExtension version. I looked into the statistics, the daily active user count drops from ~1000 to ~300. That’s when I rolled up my sleeve and actually migrated it in one day. (Although later I found out that the drop is not entirely due to users upgrading to newer Firefox, is because of &lt;a href=&quot;https://blog.mozilla.org/addons/2017/06/21/upcoming-changes-usage-statistics/&quot;&gt;this change&lt;/a&gt;.) Here is how I did it and what I’ve learned from the process.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 07 Aug 2017 06:37:22 +0000</pubDate>
        <link>https://shinglyu.com/web/2017/08/07/porting-chrome-extension-to-firefox.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2017/08/07/porting-chrome-extension-to-firefox.html</guid>
      </item>
      
    
      
      <item>
        <title>退役了如何註銷護照上的出境管制章</title>
        
        <description>&lt;p&gt;祝大家退役愉快。護照上如果有退役前的「持照人出國應經核准，尚未履行兵役義務」章，雖然還是可以出國，但是據說海關要查比較久，而且可能會要求出示退役證明，所以還是去註銷比較方便。我是 2017 七月去辦的，最新規定請直接詢問外交部 (&lt;a href=&quot;https://www.boca.gov.tw/ct.asp?xItem=2763&amp;amp;ctNode=706&amp;amp;mp=1&quot;&gt;聯絡方式與營業時間&lt;/a&gt;)。另外以下是研發替代役的規定，其他兵種不確定，但應該差不多。&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Thu, 13 Jul 2017 05:39:40 +0000</pubDate>
        <link>https://shinglyu.com/misc/2017/07/13/rdss-passport-deregister.html</link>
        <guid isPermaLink="true">https://shinglyu.com/misc/2017/07/13/rdss-passport-deregister.html</guid>
      </item>
      
    
      
      <item>
        <title>Install Ubuntu 16.04 on ThinkPad 13 (2nd Gen)</title>
        
        <description>&lt;p&gt;&lt;em&gt;It has been a while since my last post. I’ve been busy for the first half of this year but now I got more free time. Hopefully I can get back to my usual pace of one post per months.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My old laptop (Inhon Carbonbook, discontinued) had a swollen battery. I kept using it for a few months but then the battery squeezed my keyboard so I can no longer type correctly. After some research I decided to buy the ThinkPad 13 model because it provides descent hardware for its price, and the weight (~1.5 kg) is acceptable.
Every time I got a new computer the first thing is to get Linux up and running. So here are my notes on how to install Ubuntu Linux on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Everything works out of the box. Just remember to turn off secure boot and shrink the disk in Windows before you install.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 11 Jul 2017 07:48:30 +0000</pubDate>
        <link>https://shinglyu.com/web/2017/07/11/install-ubuntu-16-04-on-thinkpad-13-2nd-gen.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2017/07/11/install-ubuntu-16-04-on-thinkpad-13-2nd-gen.html</guid>
      </item>
      
    
      
      <item>
        <title>An Overview of Asia Tech Conferences in 2017</title>
        
        <description>&lt;p&gt;I’ve been attending and even talking at tech conferences for some time. One of the challenge is to keep track of when those conference will take place. Also there is no single list of all conferences I’m interested. There are &lt;a href=&quot;http://lanyrd.com/&quot;&gt;some website&lt;/a&gt; that collects them, but they often missed some community-organized events in Asia. Or there are some community-maintained &lt;a href=&quot;https://wordpress.lokidea.com/blog/1531/&quot;&gt;list of open source conferences&lt;/a&gt; (Thanks Barney!), but they don’t include for-profit conferences.&lt;/p&gt;

&lt;p&gt;Therefore I build a simple website that collects all conferences I know in Asia, focusing on open source software, web, and startup:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://asia-confs.github.io/asia-tech-confs/en/&quot;&gt;https://asia-confs.github.io/asia-tech-confs/&lt;/a&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 21 Jan 2017 08:22:34 +0000</pubDate>
        <link>https://shinglyu.com/web/2017/01/21/an-overview-of-asia-tech-conferences-in-2017.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2017/01/21/an-overview-of-asia-tech-conferences-in-2017.html</guid>
      </item>
      
    
      
      <item>
        <title>Vim QuickFix for Rust and Servo</title>
        
        <description>&lt;p&gt;While working on a compiled language like Rust, a typical workflow is compile -&amp;gt; find the errors in the compiler message -&amp;gt; find the file containing the error -&amp;gt; edit -&amp;gt; re-compile. But usually there are lots of errors scattered around the compiler log, and to identify the filename and line number, and manually open the file to the correct line in an editor is a tedious job. Vim’s &lt;a href=&quot;http://vimdoc.sourceforge.net/htmldoc/quickfix.html&quot;&gt;quickfix&lt;/a&gt; streamline the process by collecting the errors into the split panel in vim, and allow you to navigate through the errors using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:cnext&lt;/code&gt; (next error) and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:cprev&lt;/code&gt; (previous command). While you navigate to an error, the corresponding source file will be opened in the main vim window and jump directly to the line where the error is.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/quickfix-rust/quickfix-1.png&quot; alt=&quot;quickfix-1.png&quot; /&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 25 Dec 2016 13:00:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/12/25/vim-quickfix-for-rust-and-servo.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/12/25/vim-quickfix-for-rust-and-servo.html</guid>
      </item>
      
    
      
      <item>
        <title>Beginner&apos;s guide to git rebasing and squashing</title>
        
        <description>&lt;p&gt;I wrote this post on the &lt;a href=&quot;https://github.com/servo/servo/wiki/Beginner&apos;s-guide-to-rebasing-and-squashing&quot;&gt;Servo wiki&lt;/a&gt; to help beginners getting started with rebasing and squashing, two of the most terrifying operations you’ll face if you are not familiar with git. I’m cross posting this here for people working on other projects.&lt;/p&gt;

&lt;p&gt;Big thanks to &lt;a href=&quot;https://github.com/Wafflespeanut&quot;&gt;Wafflespeanut&lt;/a&gt; who proofread the post, any error you found here is my own.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Suppose you’ve created a pull request following the &lt;a href=&quot;https://github.com/servo/servo/blob/master/CONTRIBUTING.md&quot;&gt;checklist&lt;/a&gt;, but the reviewer asks you to fix something, do a rebase or squash your commits, how exactly do you do that? If you have some experience with git, you might want to check the &lt;a href=&quot;https://github.com/servo/servo/wiki/Github-workflow&quot;&gt;GitHub workflow&lt;/a&gt; for a quick overview. But if you are not familiar with git enough, we’ll teach you how to do these common operations in detail.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 08 Nov 2016 06:29:17 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/11/08/servo-rebase-and-squash-guide.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/11/08/servo-rebase-and-squash-guide.html</guid>
      </item>
      
    
      
      <item>
        <title>Mutation Testing in JavaScript Using Stryker</title>
        
        <description>&lt;p&gt;Earlier this year, I wrote a &lt;a href=&quot;http://shinglyu.github.io/testing/2016/02/15/Mutation_Testing_in_JavaScript_Using_Grunt_Mutation_Testing.html&quot;&gt;blog post&lt;/a&gt; introducing Mutation Testing in JavaScript using the &lt;a href=&quot;https://www.npmjs.com/package/grunt-mutation-testing&quot;&gt;Grunt Mutation Testing framework&lt;/a&gt;. But as their NPM README said,&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;We will be working on (gradually) migrating the majority of the code base to the &lt;a href=&quot;https://www.npmjs.com/package/stryker&quot;&gt;Stryker&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I’ll update my post to use the latest Stryker framework. The following will be the updated post with all the code example migrated to the Stryker framework:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Tue, 11 Oct 2016 01:00:00 +0000</pubDate>
        <link>https://shinglyu.com/testing/2016/10/11/Mutation_Testing_in_JavaScript_Using_Stryker.html</link>
        <guid isPermaLink="true">https://shinglyu.com/testing/2016/10/11/Mutation_Testing_in_JavaScript_Using_Stryker.html</guid>
      </item>
      
    
      
      <item>
        <title>2016 COSCUP, Modern Web and Taiwan Code Sprint</title>
        
        <description>&lt;p&gt;August was quite a busy month for me. I went to two conferences and one workshop to promote Servo and Rust. Here are what I’ve observed in those events.&lt;/p&gt;

&lt;h2 id=&quot;coscup&quot;&gt;COSCUP&lt;/h2&gt;

&lt;p&gt;COSCUP is one of the largest volunteer-organized conference on open source software in Taiwan. When I was a student I tried to attend all the sessions, wishing to learn from the talks. But in recent years I realize that it’s really not about the talks, but more about meeting people. Half of the talks are about introducing people to new tools or libraries. You can learn them by yourself more efficiently by reading tutorial articles online. The most rewarding part is actually socializing with people. Because most of the open source participants will attended this conference, you can easily meet a lot of new friends through mutual friends. So this year I spend most of my time at social events, for example the speaker dinner party, Mozilla BoF (bird of a feather), and chatting with my friend’s friends.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sun, 04 Sep 2016 12:40:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/09/04/2016-conferences.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/09/04/2016-conferences.html</guid>
      </item>
      
    
      
      <item>
        <title>Identify Performance Regression in Servo</title>
        
        <description>&lt;p&gt;Performance has always been a key focus for the Servo browser engine project. But just measure the performance through profilers and benchmarks is not enough. The first impression to a real user is the page load time. Although many internal, non-visible optimizations are important, we still want to make sure our page load time is doing well.&lt;/p&gt;

&lt;p&gt;Back in April, I opened this bug &lt;a href=&quot;https://github.com/servo/servo/issues/10452&quot;&gt;#10452&lt;/a&gt; to start planning the page load test. With the kind advice from the Servo community and the Treeherder people, we finally settled for a test design similar to the Talos test suite, and decided to use Perfherder for visualization.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 18 Jul 2016 02:00:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/07/18/identify-performance_regression-in-servo.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/07/18/identify-performance_regression-in-servo.html</guid>
      </item>
      
    
      
      <item>
        <title>Show Firefox Bookmark Toolbar in Fullscreen Mode</title>
        
        <description>&lt;p&gt;By default, the bookmark toolbar is hidden when Firefox goes into fullscreen mode. It’s quite annoying because I use the bookmark toolbar a lot. And since I use &lt;a href=&quot;https://i3wm.org&quot;&gt;i3 window manager&lt;/a&gt;, I also use the fullscreen mode very often to avoid resizing the window. After some googling I found this &lt;a href=&quot;https://support.mozilla.org/zh-TW/questions/1039009&quot;&gt;quick solution&lt;/a&gt; on SUMO (Firefox commuity is awesome!).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/bookmark_bar/before.png&quot; alt=&quot;before&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The idea is that the Firefox &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Chrome&quot;&gt;chrome&lt;/a&gt; (not to be confused with the Google Chrome browser) is defined using &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL&quot;&gt;XUL&lt;/a&gt;. You can adjust its styling using CSS. The user defined chrome CSS is located in your &lt;a href=&quot;https://support.mozilla.org/en-US/kb/profiles-where-firefox-stores-user-data&quot;&gt;Firefox profile&lt;/a&gt;. Here is how you do it:&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 20 Jun 2016 11:05:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/06/20/firefox_bookmark_toolbar_in_fullscreen.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/06/20/firefox_bookmark_toolbar_in_fullscreen.html</guid>
      </item>
      
    
      
      <item>
        <title>驚爆！報稅軟體的低級錯誤</title>
        
        <description>&lt;p&gt;&lt;strong&gt;更新&lt;/strong&gt;：經過我向客服中心反映，並透過朋友的幫助轉給了廠商，今天（5/23）早上國稅局客服中心打電話來確認說修復完成了，我實際檢查也確認修復了。辛苦了週末加班的工程師！&lt;/p&gt;

&lt;p&gt;別誤會，我不是要教你什麼逃漏稅的方法，只是分享一下政府的報稅軟體是怎麼樣的低品質又缺乏測試。
過去幾年都我一直用 Windows VM 安裝桌面版的報稅軟體，今年發現網頁版功能也完善了（主要是可以成功的匯入所得資料），於是想改用網頁版直接在 Linux Mint 上面用 Firefox 報稅，沒想到竟然是悲劇的開始。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/tax_bug/online_tax.png&quot; alt=&quot;online_tax_screenshot&quot; /&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 21 May 2016 14:20:00 +0000</pubDate>
        <link>https://shinglyu.com/testing/2016/05/21/bug_in_gov_tax_software.html</link>
        <guid isPermaLink="true">https://shinglyu.com/testing/2016/05/21/bug_in_gov_tax_software.html</guid>
      </item>
      
    
      
      <item>
        <title>Rust Code Completion with YouCompleteMe</title>
        
        <description>&lt;p&gt;Every programmer knows that code completion can give you a productivity boost. Without code completion, you’ll have to read the documentation (or StackOverflow?) every time you forget what to type next. Since I’m a vim user and I worked with &lt;a href=&quot;https://www.rust-lang.org/&quot;&gt;Rust&lt;/a&gt; very often, I’m glad to know &lt;a href=&quot;http://valloric.github.io/YouCompleteMe/&quot;&gt;YouCompleteMe&lt;/a&gt; (YCM), a powerful code completion plug-in for vim, officially supports Rust code completion (see this &lt;a href=&quot;http://blog.jwilm.io/youcompleteme-rust/&quot;&gt;blog post&lt;/a&gt;). I’ll walk you through the process of installing YCM on Ubuntu/Linux Mint in this post.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Fri, 13 May 2016 15:00:00 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2016/05/13/rust-completion_with_ycm.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2016/05/13/rust-completion_with_ycm.html</guid>
      </item>
      
    
      
      <item>
        <title>Visualizing Performance Data on Perfherder</title>
        
        <description>&lt;p&gt;At Mozilla, we use &lt;a href=&quot;https://treeherder.mozilla.org/perf.html#/graphs?series=[mozilla-inbound,954c0eef0296505ed478961111939345b4e83960,1]&quot;&gt;Perfherder&lt;/a&gt; to visualize our performance testing data. Perfherder is a dashboard for monitoring and analyzing performance metrics, which can include page load time, JavaScript benchmark score, build time, installer size, etc. Perfherder allow you to visualize the data as a line chart, compare performance metrics between versions and automatically create &lt;a href=&quot;https://treeherder.mozilla.org/perf.html#/alerts&quot;&gt;alerts&lt;/a&gt; for sudden change in performance metrics.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 07 May 2016 13:20:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/05/07/visualizing_performance_data_on_perfherder.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/05/07/visualizing_performance_data_on_perfherder.html</guid>
      </item>
      
    
      
      <item>
        <title>Minimal React.js Without A Build Step</title>
        
        <description>&lt;p&gt;&lt;strong&gt;Update: There is an updated post &lt;a href=&quot;/web/2018/02/08/minimal-react-js-without-a-build-step-updated.html&quot;&gt;here&lt;/a&gt;. Check it out! It has more up-to-date data and more information about how to use 3rd-party libraries.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nowadays, starting a frontend project means setting up a complex build system with preprocessors, transpliers, compressors, packagers, and many more. Don’t you missed the day when you can just write &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;script src=”./jquery.js”/&amp;gt;&lt;/code&gt; and start coding? I love to build prototype or small tools using HTML and React.js, but the build system thing is killing me (the &lt;a href=&quot;https://facebook.github.io/react/docs/getting-started.html&quot;&gt;official documentation&lt;/a&gt; suggest you use browserify and babel). So I’m going to show you how to build a minimal react page without any of those distractions.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Wed, 06 Apr 2016 13:55:00 +0000</pubDate>
        <link>https://shinglyu.com/web/2016/04/06/minimal_react.html</link>
        <guid isPermaLink="true">https://shinglyu.com/web/2016/04/06/minimal_react.html</guid>
      </item>
      
    
      
      <item>
        <title>How AlphaGo Can Teach Us About Software Testing</title>
        
        <description>&lt;p&gt;After Lee Se-dol lose his first match against AlphaGo, some memes appeared on the Internet calling Lee the “Senior QA engineer at Google”. I am both happy and sad about this meme. I’m sad because people still think QA is a less descent job than a Go champion. But I’m happy to see that Lee Se-dol demonstrated many good characteristics of a good software tester, and we can learn a lot from him. Here I will show you how this epic Go match can be related to software QA.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/lee_qa.jpeg&quot; alt=&quot;lee_qa_meme&quot; /&gt;&lt;/p&gt;

&lt;p&gt;(The Chinese line translates to “Google Senior Softare QA Engineer, Lee Se-dol”)&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 19 Mar 2016 15:00:00 +0000</pubDate>
        <link>https://shinglyu.com/testing/2016/03/19/how_alphago_can_teach_us_about_qa.html</link>
        <guid isPermaLink="true">https://shinglyu.com/testing/2016/03/19/how_alphago_can_teach_us_about_qa.html</guid>
      </item>
      
    
      
      <item>
        <title>Dotfiles: Manage Your Development Environment Configuration in GitHub</title>
        
        <description>&lt;p&gt;Linux is my major development platform. Most of the tool I use (vim, zsh, i3 window manager) use configuration files located in your home directory (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.zshrc&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.i3/config&lt;/code&gt;). It is pretty hard to keep them in sync between your machines. And sometimes if you mess up with the configuration file it’s pretty hard to revert your changes.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Sat, 12 Mar 2016 15:00:00 +0000</pubDate>
        <link>https://shinglyu.com/productivity/2016/03/12/dotfiles.html</link>
        <guid isPermaLink="true">https://shinglyu.com/productivity/2016/03/12/dotfiles.html</guid>
      </item>
      
    
      
      <item>
        <title>From 3D scanner to VR -- Introduction</title>
        
        <description>&lt;p&gt;Recently I’ve been invoved in a project called FoxEye. Our goal is to unleash the power of Computer Vision (CV)  on the Web. But before we jump in and start writing JavaScript, I need to understand how all the algorithm works. Therefore I started to hack a simple small object scanner using the Point Cloud Library (PCL), which is written in C++.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/blog_assets/foxeye/input.png&quot; alt=&quot;input&quot; /&gt;
&lt;img src=&quot;/blog_assets/foxeye/colored_mesh_smooth.png&quot; alt=&quot;output&quot; /&gt;&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 22 Feb 2016 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/cv/2016/02/22/3d_scanner_to_vr-intro.html</link>
        <guid isPermaLink="true">https://shinglyu.com/cv/2016/02/22/3d_scanner_to_vr-intro.html</guid>
      </item>
      
    
      
      <item>
        <title>Mutation Testing in JavaScript Using Grunt Mutation Testing</title>
        
        <description>&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;: Since the development on grunt-mutation-testing has &lt;a href=&quot;https://www.npmjs.com/package/grunt-mutation-testing&quot;&gt;moved to Stryker&lt;/a&gt;, I’ve rewritten this post using the new Stryker framework. Please checkout the updated post &lt;a href=&quot;https://shinglyu.github.io/testing/2016/10/11/Mutation_Testing_in_JavaScript_Using_Stryker.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

 (more...)</description>
        
        <pubDate>Mon, 15 Feb 2016 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/testing/2016/02/15/Mutation_Testing_in_JavaScript_Using_Grunt_Mutation_Testing.html</link>
        <guid isPermaLink="true">https://shinglyu.com/testing/2016/02/15/Mutation_Testing_in_JavaScript_Using_Grunt_Mutation_Testing.html</guid>
      </item>
      
    
      
      <item>
        <title>[HOWTO] Check MBR Infomation Under Linux</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Tue, 19 Jun 2012 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2012/06/19/howto-check-mbr-information-under-linux.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2012/06/19/howto-check-mbr-information-under-linux.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學] Atheros AR2425/AR5007EG無線網卡驅動</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Sat, 01 Nov 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/11/01/ubuntu-atheros-ar2425ar5007eg.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/11/01/ubuntu-atheros-ar2425ar5007eg.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學] 用Ubuntu 寫C++</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Wed, 24 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/24/ubuntu-cpp-programming.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/24/ubuntu-cpp-programming.html</guid>
      </item>
      
    
      
      <item>
        <title>UNIX好！</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Mon, 22 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/22/unix-good.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/22/unix-good.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學] 如何讓pidgin 的MSN有個人狀態</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Sun, 14 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/14/ubuntu-pidgin-msn.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/14/ubuntu-pidgin-msn.html</guid>
      </item>
      
    
      
      <item>
        <title>[blogger] 如何製作最新回應欄位</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Fri, 12 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/12/blogger-latest-comments.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/12/blogger-latest-comments.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學]如何設定ThinkPad的指紋辨識</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Sat, 06 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/06/ubuntu-thinkpad-fingerprint.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/06/ubuntu-thinkpad-fingerprint.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學] Matrix樣式的終端機</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Sat, 06 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/06/ubuntu-matrix-terminal.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/06/ubuntu-matrix-terminal.html</guid>
      </item>
      
    
      
      <item>
        <title>[Ubuntu教學]消失的解析度</title>
        
        <description>&lt;blockquote&gt;
  &lt;p&gt;This was an early technical blog I’ve written on another blogging platform. The content is probably outdated and my writing style was cringey. But I copied it here anyway for archival purposes.&lt;/p&gt;
&lt;/blockquote&gt;

 (more...)</description>
        
        <pubDate>Fri, 05 Sep 2008 00:00:00 +0000</pubDate>
        <link>https://shinglyu.com/tech/2008/09/05/ubuntu-missing-resolution.html</link>
        <guid isPermaLink="true">https://shinglyu.com/tech/2008/09/05/ubuntu-missing-resolution.html</guid>
      </item>
      
    
  </channel>
</rss>
