<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Asadbek Kurbonov</title><link>/</link><description>Recent content on Asadbek Kurbonov</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Jul 2026 00:10:00 +0200</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><item><title>Why Nothing Has Replaced CPython: A 2026 Tour of Python Runtimes</title><link>/posts/why-nothing-replaces-cpython/</link><pubDate>Wed, 08 Jul 2026 00:10:00 +0200</pubDate><guid>/posts/why-nothing-replaces-cpython/</guid><description>&lt;p>Python is the most popular programming language in the world, and one of the slowest in wide production use. That combination should be catnip for anyone building a faster runtime — and for fifteen years, people have. There is a version of Python with a tracing JIT that is genuinely several times faster. There are compilers that turn it into native code. There are ports to the JVM and the .NET CLR. Big companies have funded forks. And after all of it, the interpreter almost everyone actually runs is still plain CPython.&lt;/p></description></item><item><title>pon: A Compiled Python Built in a Week, Measured Against Its Claims</title><link>/posts/inside-pon-compiled-python/</link><pubDate>Tue, 07 Jul 2026 20:00:00 +0200</pubDate><guid>/posts/inside-pon-compiled-python/</guid><description>&lt;p>I came across &lt;a href="https://github.com/can1357/pon">pon&lt;/a>, a project that sets out to be &amp;ldquo;the bun/v8 of Python&amp;rdquo;: a from-scratch native compiler and runtime for Python 3.14, written in Rust, with no interpreter and no bytecode. The pitch is ambitious enough to be worth taking seriously — and the repository is unusual in another way. It was built in about a week: 475 commits from a single author between June 30 and July 7, with an &lt;code>AGENTS.md&lt;/code> file and conventional-commit discipline that make it fairly clear the bulk was produced with AI coding agents.&lt;/p></description></item><item><title>When You Can't Find the Bug: Architecting Around Production Issues</title><link>/posts/go-python-architecture/</link><pubDate>Mon, 24 Nov 2025 22:00:00 +0100</pubDate><guid>/posts/go-python-architecture/</guid><description>&lt;p>&lt;em>This is Part 2 of a series. Read &lt;a href="../pandas-vs-polars-in-production/">Part 1: Pandas vs Polars in Production - Performance Comparison&lt;/a> for the background on the Polars migration.&lt;/em>&lt;/p>
&lt;hr>
&lt;p>After migrating from Pandas to Polars, CPU performance improved dramatically—but a memory problem persisted. Despite extensive debugging, I couldn&amp;rsquo;t identify the root cause. So I made a pragmatic decision: architect around it.&lt;/p>
&lt;p>This is the story of splitting a monolithic Python application into a Go orchestration service with Python workers, not because I fully understood the problem, but because I needed production to be stable.&lt;/p></description></item><item><title>Pandas vs Polars in Production: Performance Comparison</title><link>/posts/pandas-vs-polars-in-production/</link><pubDate>Sun, 23 Nov 2025 23:02:39 +0100</pubDate><guid>/posts/pandas-vs-polars-in-production/</guid><description>&lt;p>When performance bottlenecks started affecting my production data pipeline, I decided to test whether Polars could deliver on its performance promises. This is what I learned from migrating a real production workload from Pandas to Polars.&lt;/p>
&lt;h2 id="the-workload">The Workload&lt;/h2>
&lt;p>The application was a data aggregation service running as a Kubernetes pod with the following constraints:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Resources&lt;/strong>: 2 CPUs, 3 GB RAM&lt;/li>
&lt;li>&lt;strong>Execution frequency&lt;/strong>: Every 2-2.5 minutes&lt;/li>
&lt;li>&lt;strong>Data volume&lt;/strong>: 5,000-7,000 rows × 100-150 columns per run&lt;/li>
&lt;li>&lt;strong>Operations&lt;/strong>: Multiple database calls, API requests, DataFrame merges, arithmetic operations (additions, multiplications), and group-by aggregations&lt;/li>
&lt;li>&lt;strong>Web server&lt;/strong>: FastAPI with Uvicorn handling production traffic&lt;/li>
&lt;/ul>
&lt;p>All operations were properly vectorized — no row-by-row iteration. The pipeline combined data from various sources into a single DataFrame, transformed it, and output the results.&lt;/p></description></item><item><title>Converting Wide Excel Tables to Single-Page PDFs with LibreOffice</title><link>/posts/convert-to-pdf-with-libreoffice/</link><pubDate>Fri, 21 Nov 2025 23:42:51 +0100</pubDate><guid>/posts/convert-to-pdf-with-libreoffice/</guid><description>&lt;h2 id="the-problem">The Problem&lt;/h2>
&lt;p>While working on a freelance project, I needed to generate PDF reports from Excel files. The challenge? The Excel files were wide and long. Here we see a sample Excel file around 15 columns containing employee data like ID, name, email, department, job title, hire date, salary, and more.&lt;/p>
&lt;p>I used LibreOffice&amp;rsquo;s CLI utility &lt;code>convert-to&lt;/code> in headless mode to convert the files. The conversion worked, but the result was unusable:&lt;/p></description></item><item><title>Setting Up a Telegram Bot on Google Apps Script</title><link>/posts/setting-up-telegram-bot-on-apps-script/</link><pubDate>Tue, 22 Jul 2025 23:24:14 +0500</pubDate><guid>/posts/setting-up-telegram-bot-on-apps-script/</guid><description>&lt;p>This is the technical companion to &lt;a href="./posts/apps-script/">Automating Business Reports with Google Apps Script and Telegram&lt;/a>, which covers the project this code came from. Here I&amp;rsquo;ll walk through running a Telegram bot on Apps Script: handling updates, routing messages, and managing the webhook.&lt;/p>
&lt;h2 id="receiving-updates">Receiving updates&lt;/h2>
&lt;p>Telegram delivers updates to your webhook as HTTP &lt;code>POST&lt;/code> requests. In Apps Script, a &lt;code>POST&lt;/code> to a deployed web app invokes the &lt;code>doPost(e)&lt;/code> function, so that&amp;rsquo;s where the bot starts:&lt;/p></description></item><item><title>Automating Business Reports with Google Apps Script and Telegram</title><link>/posts/apps-script/</link><pubDate>Tue, 22 Jul 2025 22:39:19 +0500</pubDate><guid>/posts/apps-script/</guid><description>&lt;p>Google Apps Script is easy to dismiss as a toy. Over two freelance projects it turned out to be a genuinely capable serverless platform for automation work built around Google Sheets and Telegram. This post covers the second of those projects — a reporting system for a US-market logistics business — and how I got there.&lt;/p>
&lt;h2 id="first-encounter">First encounter&lt;/h2>
&lt;p>I came across Apps Script on an earlier freelance job. A consulting firm needed a Telegram bot that generated templated Word contracts. They had started the work themselves in Apps Script but hadn&amp;rsquo;t finished it, so I picked it up and rebuilt the bot in Python with &lt;a href="https://docs.aiogram.dev/">aiogram&lt;/a>, rendering &lt;code>.docx&lt;/code> files from templates using &lt;a href="https://docxtpl.readthedocs.io/">docxtpl&lt;/a> and passing files around as base64. Apps Script was only incidental to that project, but it was my first look at the platform.&lt;/p></description></item></channel></rss>