Posts

Showing posts from 2026

A New Collection of Thoughtful Learning Apps — Now Available on iOS & Android

Image
I’m excited to share a set of mobile apps I’ve recently completed and published on both the Google Play Store and the Apple App Store. These apps are designed with a simple goal in mind: to make meaningful, structured content more accessible, whether you’re studying theology or improving your English vocabulary. 📱 Now Available on Both Platforms All apps are live and available for download: Google Play Developer Page: https://play.google.com/store/apps/dev?id=5835943159853189043 Apple App Store Developer Page: https://apps.apple.com/ca/developer/q-z-l-corp/id1888794100 📖 Theology & Confession Study Apps For those interested in Reformed theology and classical Christian teachings, I’ve developed a series of apps that present foundational texts in a clean, focused reading format: The Belgic Confession Canons of Dort Heidelberg Catechism Westminster Shorter Catechism Each app is designed to provide a distraction-free experience, making it easier to read, reflect, and revisit these im...

2026 July 12th - Afternoon Sermon Reflection:Walking the Path of Faith: Why Following Jesus Is a Lifelong Journey

Image
Walking the Path of Faith: Why Following Jesus Is a Lifelong Journey Scripture: Colossians 2:6–8 Some moments in life feel like finishing lines. Graduation. A wedding. A new career. A baptism or profession of faith. Yet many of these moments are not endings at all—they are beginnings. That is exactly how the Apostle Paul speaks to believers in Colossians 2. "Therefore, as you received Christ Jesus the Lord, so walk in Him." (Colossians 2:6) The Christian life is often described as a journey, a race, or a pilgrimage. Paul chooses another familiar image—a walk. A walk is not completed in one step. It is made up of thousands of ordinary steps taken day after day. That simple picture reminds us that Christianity is not merely about making one important decision. It is about continuing to follow Jesus throughout the whole of life. Every Journey Has a Beginning Anyone who enjoys hiking knows that starting on the wrong trail can lead to hours of fr...

2026 July 19th - Afternoon Sermon Reflection:From Ruined to Restored: The Gospel Hope of God's Image in Us

Image
From Ruined to Restored: The Gospel Hope of God's Image in Us Scripture: John 3:1–15 | Lord's Day 3 Few ideas are more popular today than the belief that people are naturally good. We hear phrases like "follow your heart," "believe in yourself," or "people are basically good." While these ideas may sound hopeful, they raise an important question: If humanity is naturally good, why is our world filled with so much brokenness? Wars continue despite our education. Families break apart despite our technology. Loneliness grows despite unprecedented connectivity. Even our own hearts often desire things we know are harmful. The Bible does not ignore these realities. Instead, it gives an honest diagnosis that is surprisingly hopeful. Lord's Day 3 of the Heidelberg Catechism asks a difficult question: "Are we so corrupt that we are totally unable to do any good?" The answer leads us first into humanity's ruin—but ultimately...

2026 July 19th - Morning Sermon Reflection:Leaving the Mountain, Carrying the Blessing

Image
Leaving the Mountain, Carrying the Blessing Scripture: Psalm 134 Some of the most meaningful conversations in life happen just before people leave. A family gathers after Christmas dinner. Friends embrace before boarding a plane. Parents hug their children before they leave for college. Weddings end with blessings. Funerals conclude with words of hope. There is something powerful about parting words because they often reveal what matters most. Psalm 134 is exactly that. It is the final Song of Ascents, the closing hymn of Israel's pilgrimage to Jerusalem. The festivals are over. Worship has ended. The crowds are preparing to return home. Before everyone departs, two blessings are exchanged—one from the pilgrims to the temple servants, and another from the priests back to the people. It is a remarkably short psalm, yet it leaves us with one unforgettable truth: Worship does not end when God's people leave His house. The End of Worship—or the Beginning? Ma...

2026 July 12th - Morning Sermon Reflection:Behold, How Good and Pleasant It Is — Rediscovering the Gift of Christian Community

Image
Behold, How Good and Pleasant It Is — Rediscovering the Gift of Christian Community Scripture: Psalm 133 In today's world, we have never been more connected, yet many people have never felt more alone. Social media gives us followers but not always friendships. We work remotely, worship online, and communicate through screens, yet deep Christian fellowship often becomes optional rather than essential. Psalm 133 reminds us that God never intended His people to journey through life alone. "Behold, how good and pleasant it is when brothers dwell in unity!" (Psalm 133:1) David begins with one simple word: "Behold." It means, "Stop. Look. Don't miss this." What is so important that David commands us to notice it? Not a great king. Not a military victory. Not the beauty of Jerusalem. Instead, he points us toward something that many Christians easily overlook: Brothers and sisters living together in unity. Unity Is More Th...

2026 July 5th - Morning Sermon Reflection:When I Can't See Glory, I Can Still Have Hope

Image
When I Can't See Glory, I Can Still Have Hope There are seasons when it feels like God is quiet. Our prayers seem unanswered. The burdens of work continue to grow. Family responsibilities become overwhelming. News headlines remind us that the world is still broken. Even as Christians, we can quietly ask ourselves, "Where is God's glory in all of this?" That was the question I found myself reflecting on after hearing a sermon from Psalm 132. Interestingly, the word "hope" never appears in the psalm. Yet hope fills every verse. The people of Israel looked around and saw no visible glory. The temple had been destroyed. David's royal line appeared to have failed. Everything God had promised seemed hidden beneath disappointment. Instead of pretending everything was fine, they prayed a simple prayer: "Remember, O LORD..." At first, I wondered why they would ask an all-knowing God to remember. Surely God doesn't forget. But th...

2026 June 28th - Morning Sermon Reflection:Only God Gives Certainty

Image
Only God Gives Certainty We live in an age overflowing with information but starving for certainty. Every day we are surrounded by countless opinions through social media, news outlets, podcasts, and online discussions. Everyone seems to have a perspective, yet very few are willing to say, "This is true." As Christians, we are not immune to this cultural shift. Even Bible studies can slowly become discussions about what each person thinks instead of seeking what God has already spoken. This sermon on Proverbs 3:5-6 challenged me to ask a simple but profound question: Where does my certainty come from? Trust Is More Than Agreement When Proverbs tells us to "Trust in the Lord with all your heart," it is not simply asking us to agree with God's existence. Biblical trust means placing the full weight of our lives upon Him. It is like the person trapped in a burning building who jumps into the firefighters' rescue net. There is complete dependence. Ther...

2026 June 21st - Afternoon Sermon Reflection:Christ Has Already Won

Image
  Looking Ahead with Confidence: Christ Has Already Won "Lead us not into temptation, but deliver us from the evil one." — Matthew 6:13 Celebrating fifty years as a church is more than commemorating a milestone. It is celebrating fifty years of God's unwavering faithfulness to His bride. While anniversaries naturally invite us to look back with gratitude, this sermon challenged us to do something equally important—to look ahead with confidence. As Christians living in Canada, it is easy to feel concerned about the future. Biblical values are increasingly unpopular, churches face growing cultural pressure, and many parents and grandparents worry about the spiritual future of their children. These concerns are real, but they are not the whole story. The Heidelberg Catechism reminds us that every Christian lives in the middle of a spiritual war. The Battle We Often Forget When we hear the words, "Lead us not into temptation," we often think about avoiding bad habit...

2026 June 21st - Morning Sermon Reflection:Truth Is the Church's Greatest Responsibility

Image
The Church's Greatest Challenge: Remaining Faithful to the Truth Celebrating fifty years of a local church is a wonderful milestone. Over five decades, countless lives have been touched through baptisms, weddings, funerals, professions of faith, missionary work, and faithful worship. Behind every ministry, every answered prayer, and every transformed life stands one unchanging reality—God's faithfulness. As we look back with gratitude, we should also look forward with wisdom. Buildings may age, leadership may change, cultures may shift, but one challenge remains constant for every generation of Christians: Will we remain faithful to the truth of God's Word? The Church Does Not Belong to Us It is tempting during anniversary celebrations to focus on human accomplishments. We thank faithful pastors, elders, deacons, volunteers, and members. Their service certainly deserves appreciation. Yet Scripture reminds us that Christ is the One who builds His church. Ev...

ParallelStream vs Virtual Threads in Java 21: What Actually Works for Database Workloads

Image
ParallelStream vs Virtual Threads in Java 21: What Actually Works for Database Workloads Java offers multiple ways to parallelize work, but not all concurrency models are suitable for database-heavy workloads. In modern systems, especially with large batch processing (e.g., 10,000–50,000 IDs), choosing the right model can drastically change performance. This article compares ParallelStream and Virtual Threads (Java 21) using a real-world scenario: batch database queries in Oracle. 🧠 The Problem: Large Batch Database Queries A common backend scenario is fetching data using large ID lists: Example: - 40,000 transaction IDs - Chunked into 1,000 per query - ~40 database queries executed The key question becomes: how do we execute these 40 queries efficiently? ⚙️ Approach 1: ParallelStream IntStream.range(0, batchCount) .parallel() .mapToObj(i -> repository.query(batch)) How it works Uses ForkJoin common pool Thread count ≈ number of CP...

How to Optimize a Slow JPA Query Processing 40K+ IDs (Real Performance Tuning Guide)

Image
How to Optimize a Slow JPA Query Processing 40K+ IDs (Real Performance Tuning Guide) Handling large datasets efficiently is one of the most common challenges in backend engineering. In this post, I’ll walk through how a query processing 40,000+ IDs went from ~24 seconds down to a few seconds using practical optimization techniques. All domain-specific details have been intentionally removed to focus purely on reusable engineering patterns. 📉 The Problem A service fetches data using a JPA query with a large IN clause and joins between tables: SELECT new SomeDto( A.primaryId, A.field1, A.field2, B.field3, C.metric1, C.metric2 ) FROM EntityA A LEFT JOIN A.relatedEntity B LEFT JOIN EntityC C ON C.refId = A.primaryId WHERE A.primaryId IN :ids Even with chunking (~900 IDs per query), total execution time was around 24 seconds . 🚨 Root Causes Unoptimized JOIN conditions Missing database indexes Sequential query execution ORM (JPA) over...

How We Made a Spring Boot Pagination Query 36× Faster (1.8 Minutes → 3 Seconds)

Image
How We Optimized a Spring Boot Pagination Query by 36× (From 1.8 Minutes to 3 Seconds) In high-traffic backend systems, slow database queries are often the hidden bottleneck that quietly kills performance. In our case, a paginated query powering a reporting API was taking 1.8 minutes to respond under load. After optimization, we reduced it to ~3 seconds . 36× faster ~97.2% less execution time ~3500% performance improvement Here’s how we did it — and the key lessons you can apply immediately. 🧱 The Problem: Slow Pagination Query We had a Spring Data JPA query backing a paginated API. It involved multiple filters, joins, and was returning a large dataset. Original issues: Full entity loading Heavy object graph hydration Unnecessary columns fetched Inefficient filtering logic Expensive pagination count The database schema (simplified and anonymized) looked like this: TABLE txn_line ( line_id BIGINT, order_id BIGINT, product_code ...

Sprint Design Notes: LDAP (OUD vs AD) and SQL Lookup Optimization

Image
Sprint Design Notes: LDAP (OUD vs AD) and SQL Lookup Optimization Today was a light but productive design session focused on aligning the team on upcoming sprint stories. While the implementation itself is not overly complex, the discussion surfaced two important architectural considerations: How we handle large identifier lookups in SQL queries How we manage LDAP-based authentication and group access control (OUD vs AD) This post documents both topics for future reference and knowledge sharing. SQL Lookup Design: Handling Large Identifier Lists One of the stories requires supporting lookup by identifier list, where the input may contain a comma-separated list of values. The Problem Directly passing a large list of identifiers into SQL introduces several risks: SQL query length limitations (database dependent) Overly large IN (...) clauses Performance degradation on large parameter sets SELECT * FROM orders WHERE identifier IN (...very long list...

Three More Real-World Auto-Fill Bugs We Found While Building a Chrome Extension

Image
  Three More Real-World Auto-Fill Bugs We Found While Building a Chrome Extension Yesterday we fixed an issue where our auto-fill engine was targeting invisible input elements instead of the actual visible fields. After deploying that fix, we continued testing across multiple vendor websites and discovered three additional issues. None of them were particularly complicated, but all three caused auto-fill failures in real-world scenarios. This is a good reminder that browser automation is often less about complex algorithms and more about handling the countless variations of web forms. Background We are building a Chrome extension that automatically fills customer information such as: First Name Last Name Email Address Phone Number Address Province Postal Code The extension works across multiple vendor websites, each built with different technologies and UI frameworks. During testing, we discovered the following issues. Issue #1: document.querySelector Only Returns the First Match I...

Why My Chrome Extension Filled Input Values but Nothing Appeared on Screen

Image
Extension auto-fill works on most vendor sites, but fails on Angular-based page (ng-pristine vs ng-dirty issue) Problem Background We are building a browser extension that auto-fills customer information (first name, last name, email, phone number, address, etc.) into different vendor websites. Each vendor site has different page structures, and our content script is responsible for detecting input fields and filling data automatically. Issue Symptom Most vendor sites work correctly. However, on one specific vendor site, auto-fill does not work: Our logs show values are being filled No visible changes appear in the UI Input fields remain empty from user perspective Filling input: firstName = John Filling input: email = test@example.com But UI still shows no updated values. Environment Extension: Chrome Extension (content script) Language: JavaScript Target site: Vendor web application Framework (discovered later): Angular Debugging Process W...