<?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>Writing on Asadbek Kurbonov</title><link>/posts/</link><description>Recent content in Writing on Asadbek Kurbonov</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 20 Sep 2026 19:45:00 +0200</lastBuildDate><atom:link href="/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>ursus: A Dataframe Library for Go, and What It Is Honestly Worth</title><link>/posts/ursus-dataframes-in-go/</link><pubDate>Sun, 20 Sep 2026 19:45:00 +0200</pubDate><guid>/posts/ursus-dataframes-in-go/</guid><description>&lt;p>I have spent the last weeks building &lt;a href="https://github.com/advenn/ursus">ursus&lt;/a> — a dataframe library for Go modelled
on Polars. Lazy execution with a query optimizer, Arrow memory layout, SIMD kernels, and streaming execution that spills
to disk instead of falling over.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">df&lt;/span>, &lt;span style="color:#a6e22e">err&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">ScanParquet&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;events.parquet&amp;#34;&lt;/span>).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Filter&lt;/span>(&lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Col&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;price&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">Gt&lt;/span>(&lt;span style="color:#ae81ff">5&lt;/span>)).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">GroupBy&lt;/span>(&lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Col&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;region&amp;#34;&lt;/span>)).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Agg&lt;/span>(
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Col&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;price&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">Sum&lt;/span>().&lt;span style="color:#a6e22e">Alias&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;revenue&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Col&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;qty&amp;#34;&lt;/span>).&lt;span style="color:#a6e22e">Mean&lt;/span>().&lt;span style="color:#a6e22e">Alias&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;avg_qty&amp;#34;&lt;/span>),
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Sort&lt;/span>(&lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Desc&lt;/span>(&lt;span style="color:#a6e22e">ursus&lt;/span>.&lt;span style="color:#a6e22e">Col&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;revenue&amp;#34;&lt;/span>))).
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Collect&lt;/span>(&lt;span style="color:#a6e22e">ctx&lt;/span>)
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The projection reaches the Parquet reader, the filter becomes a row-group predicate, and the group-by runs on every
core. None of that shows up in the query.&lt;/p></description></item><item><title>Outsource everything to cloud providers and suffer</title><link>/posts/github-down/</link><pubDate>Thu, 06 Aug 2026 19:24:18 +0200</pubDate><guid>/posts/github-down/</guid><description>&lt;p>Use modern cloud based solutions they said. it is the best solution they said)&lt;/p>
&lt;p>I am not against it, but it makes you dependant to some provider. and if it goes dark, you go dark.&lt;/p>
&lt;p>&lt;img alt="img.png" loading="lazy" src="../photos/github-actions-down.png">&lt;/p></description></item><item><title>Ownership of ai generated code</title><link>/posts/ownership/</link><pubDate>Sat, 25 Jul 2026 22:27:59 +0200</pubDate><guid>/posts/ownership/</guid><description>&lt;h2 id="ownership-of-code-in-the-age-of-ai-coding">Ownership of code in the age of ai coding&lt;/h2>
&lt;p>people say i created this project, i created that project, someone claims to have rewritten postgresql in rust, someone
says i rewrote X tool in another language&amp;hellip; i see a lot of such posts on LinkedIn.&lt;/p>
&lt;p>please stop, you haven&amp;rsquo;t written them bro, you asked ai to write it. when you generate an image with gemini or chatgpt,
you don&amp;rsquo;t say that you drew that image, or that you are a painter or a graphic designer.&lt;/p></description></item><item><title>Facebook Loaded Itself to Death and Almost Took My Machine With It</title><link>/posts/facebook-crash-meta-ai-rush/</link><pubDate>Wed, 15 Jul 2026 13:45:00 +0200</pubDate><guid>/posts/facebook-crash-meta-ai-rush/</guid><description>&lt;p>I almost don&amp;rsquo;t use facebook, but recently, for its marketplace I had to.&lt;/p>
&lt;p>It happened several times that, the landing page silently leaked memory, and at the end killed by earlyoom.&lt;/p>
&lt;p>The tab opened &lt;code>facebook.com/?_rdr&lt;/code> and then just&amp;hellip; sat there. The little logo kept spinning, and spinning, till the underlying process was killed.&lt;/p>
&lt;p>&lt;img alt="Facebook stuck on its loading logo" loading="lazy" src="../photos/fb-loading.png">&lt;/p>
&lt;p>I pulled up the system monitor. 15.3 GB of 16 GB of RAM is occupied. Swap half full.&lt;/p></description></item><item><title>Polars vs Pandas, PyO3 vs Cython: Rust Is Rewriting Python's Fast Path</title><link>/posts/rust-under-python/</link><pubDate>Wed, 08 Jul 2026 12:30:00 +0200</pubDate><guid>/posts/rust-under-python/</guid><description>&lt;p>If you list the tools that made Python feel fast lately, a pattern jumps out. The dataframe library everyone is switching to, &lt;a href="https://pola.rs/">Polars&lt;/a>, is written in Rust. The linter that replaced flake8, &lt;a href="https://docs.astral.sh/ruff/">Ruff&lt;/a>, is Rust. The packaging tool eating pip and virtualenv, &lt;a href="https://docs.astral.sh/uv/">uv&lt;/a>, is Rust. Pydantic v2 rewrote its core in Rust; Hugging Face&amp;rsquo;s &lt;code>tokenizers&lt;/code> is Rust; &lt;code>orjson&lt;/code> is Rust; even &lt;code>cryptography&lt;/code> moved its guts to Rust years ago.&lt;/p>
&lt;p>Python isn&amp;rsquo;t going anywhere — it&amp;rsquo;s still the interface. But the &lt;em>engine&lt;/em> underneath the performance-critical parts is quietly being rewritten in Rust. This post looks at that shift from two angles I&amp;rsquo;ve actually measured: &lt;strong>Polars vs Pandas&lt;/strong> (the library you use) and &lt;strong>PyO3 vs Cython&lt;/strong> (how you&amp;rsquo;d build such a library yourself). All numbers below I ran on one 8-core Linux x86-64 box.&lt;/p></description></item><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>