Crafting a Custom Volleyball Play Editor | December 23 2025, 21:39

Tomorrow is the flight to Costa Rica, and here I am creating (or created) a volleyball playbook editor for Nadya. As a coach, she prepares for her sessions and leaves behind hundreds of pages of text with diagrams on each page. The text is handwritten, and theoretically, it’s simple to convert to a digital format, but converting the diagrams into high-quality vector format is exhaustive—there are so many. So, I decided to make the software yesterday. And today, the first version is ready to use. This is a diagram editor, somewhat remotely similar to a diagram editor. Also got to dig into the fabric framework.

The process looks like this. Gemini/ChatGPT through an API can convert hand-drawn diagrams into a structure that my program understands. Then we open this file in the program, and tweak a bit if necessary. Or maybe even redraw from scratch – for simple diagrams, it’s even easier. There are four types of objects – player, cone, target, text. Any can be connected with arrows, solid or dashed, labeled with text or numbers or not, in any chosen color, straight or curved. If you touch an object with the mouse, all connected arrows will follow.

The result can be saved in a file. You can open a template and based on it create something new. You can generate a Python script – yesterday it was still relevant, today generally not needed anymore – high-resolution SVG/PNGs are made directly from this app (yesterday they were made separately in Python).

It’s clear why you wouldn’t just ask Gemini/ChatGPT to do something for ready-made vector editors: firstly, they are too flexible and limiting LLM’s imagination is quite difficult. As a result, you get stylized, unusable images. Here, instead, there is a framework consisting of four objects and that’s all, LLM knows about it and only generates what can be represented with them. Secondly, this framework operates with objects, not elementary vector primitives.

Overall, this is the first step towards my idea of an automatic diagramming system based on descriptions. Where you give an LLM a diagram description, and it consistently generates what is written in the description, and if you make any corrections, they will be taken into account during regeneration.

The Uncertain Future of Automation and Employment Disparities | December 21 2025, 15:27

Everyone is waiting for a cyberpunk future where each cafe table is served by an android. But it seems that it will never happen. The automation of the service sector is stagnating and will continue to do so for one simple reason: maintaining a human is becoming cheaper than servicing an industrial robot.

Food and clothing are rapidly depreciating. Production volumes are such that feeding and clothing a “bag of skin” today costs pennies. Now compare this with the cost of developing, software, and maintenance of a complex robot waiter or cleaner. A human is a self-regulating system that fuels and updates itself. And if worn out, easily replaced. Pure economy!

In the “First World,” the motivation to labor hard will disappear. Why go to a hard, boring job if basic needs are met with minimal effort, and everything else is done by others who really need to? People in developed countries will work only where there is thrill and pleasure. Eventually, we will face a shortage of hands where it is “not cool,” but there won’t be robots there either – too expensive.

Poor countries will be stuck in the past. Their populations are growing like yeast. Choosing a job there is a luxury available only to a few. An excess of labor makes work almost free.

I think the world is facing a harsh imbalance. Developed countries will likely permanently close their borders to avoid diluting their comfort, and all industries that are still difficult or expensive to automate will simply move to poor regions. Perhaps, developed countries will become less likely to conflict with one another, as there will be too many resources to make every resident happy.

But it will be harder with poor countries. Why invent a complex robot if you can relocate a factory where thousands are ready to work for food, which becomes cheaper every year? This has long been happening and will most likely continue for a long time.

Conventional programmers in the USA won’t be replaced by AI, but by programmers from Southeast Asia and South America. Several layers of AI for quality control and one manager approving AI conclusions and automatic layoffs and hiring will oversee them. And those programmers who remain in developed countries will focus more on orchestration than on coding. This role requires even more intelligence, and only one in ten current individuals will be capable. Only, the reason for such a crisis will not be AI.

Also, I think that the borders of the future world may close in one direction. It will become increasingly difficult to enter developed countries from developing and poor ones, but the opposite will be facilitated by authorities. Africa is growing so fast that it will surely become a problem if people there are not already prepared for life beyond their villages.

The future is not about the uprising of machines. It’s when some work for pleasure, and others because they are cheaper than electricity and gears.

Do you agree, or am I exaggerating too much?

Rediscovering Gorodki: A Glimpse into a Traditional Russian Sport | December 20 2025, 05:29

Suddenly today, the word “gorodki” popped into my head. When I was a little boy, in Baku, Azerbaijan, we used to play two games in the courtyard – gorodki and knives.

I Google it. The internet tells me that in Russia there is a Russian Federation of Gorodki Sport. It has a president, a first vice-president, and a vice-president. All in blazers. There is a presidium, and it has a chairman of the commission on international relations. There is a whole apparatus for the president of gorodki sport with three advisers and a responsible secretary. They hold conferences, at least in 2018 and 2020. There is a march of gorodki players, music by A. Roshchin, lyrics by V. Avdeev, I. Vinogradsky.

The website has a section “Anti-Doping”. Can you imagine doping in gorodki sport? It has a subsection “methodological recommendations”.

In 2024, there was a World Championship of Gorodki Sport. And it had a Grand Closing. Besides Belarus, athletes from Germany and Kazakhstan participated in the world championship. From Germany, besides Sergey, Vitaly, and Konstantin, there was Schlein Eugen, or rather, Zhenya.

Masters of sport. To be admitted to international competitions, one must come with a certificate, oh, a certificate of having undergone anti-doping education from an institution, whatever that means.

In general, it’s all very serious.

But I did not find a federation for the game of knives.

Exploring Aescape: A Robotic Massage Experience | December 19 2025, 21:26

Nadia and I tried out the Aescape robot massage. Well, I was interested to see the technical side of it all. Overall, it’s quite interesting, but driving 45 minutes instead of 15 to get a robot, even if it’s slightly cheaper… not sure it makes sense to go there regularly. It’s a different story if you’re already at the gym and want a massage right now, without an appointment – it’s like a deluxe massage chair. Yes, in that case, it’s exactly what you need.

The system scans the body with four cameras on the ceiling, creates a 3D model, and then on the whole, the robot arms do a pretty good job of kneading the muscles just right, stronger in some places, gentler in others – considering the overall anatomy, and the specific person on the table. Some might wonder, won’t they accidentally maim someone due to some bug, but we drove there and back on Tesla’s autopilot, and if the cars were going to kill us, they’d have had an easier chance.

From Freezer to Fridge: A DIY Cooling Hack | December 19 2025, 00:56

Today I sold a refrigerator. It has a story. The essence of it is that it’s not a refrigerator, although it looks like one. It’s a freezer. And it freezes on average to minus 18 degrees. I bought it second-hand, thinking it was a refrigerator. The buyer also came today thinking it was a refrigerator.

And here I realize that minus 18 degrees is not at all what I need.

Well, I am a Solution Architect. I didn’t want to dig into it, I just drove to Lowe’s and bought a simple blinker. It turns on and off according to schedule whatever is plugged into it. I stuck a radio thermometer inside (I had one) and adjusted the blinking frequency (20 minutes) so that the internal temperature was on average +4 degrees Celsius. The radio thermometer showed that the temperature fluctuations were very small – nominally plus or minus 0.5 degrees from +4, even less. And so it worked for me for some months until I realized that I just didn’t need it.

Sold it today with the adapter. It’s gone to the people.

Exploring the “Christmas Tree” in Oil & Gas | December 18 2025, 18:34

Oh, how many wonderful discoveries the spirit of enlightenment brings…

it turns out, Christmas tree in the oil & gas industry is a wellhead equipment. I am testing this search for work

Decoding the Beast: Migrating from Excel to Code | December 17 2025, 18:56

We’ve all encountered it — the “Main Excel Spreadsheet Managing the Business.” The very one B2B companies use to calculate million dollar quotes. It has 12 tabs, 1000+ nested formulas, and zero documentation. For ten years, it had “quick fixes” slapped on and constants hidden away. It’s no longer just a file, but a living organism that no one fully understands except for the guy who quit years ago. That’s how puzzled I was. Moreover, there was uncertainty whether even half of the formulas were needed, or if they were vestiges of the past.

Typical cell:

=IF($D11=$D10,””, IF(ISNUMBER( INDEX(Data!$T$10:$U$17,

MATCH(TabCalc!$F11,Data!$T$10:$T$17,0),2)),

INDEX(Data!$T$10:$U$17, MATCH(TabCalc!$F11,Data!$T$10:$T$17,0),2),

INDEX(TabProd!$C$8:$U$112,TabCalc!$D11,I$1)))

I was tasked with transferring this logic into code so that it was all computed by software. The Excel file seemed to have everything it needed, but in reality — it was a complicated black box. 1069 formulas.

The challenge was in how to translate a thousand interdependent formulas into clean code without losing any edge cases.

Here’s what I ended up doing.

Instead of rewriting everything from scratch at once with uncertain prospects of bug proliferation, I used a strategy of lazy computations and mocks.

I built a structure on Groovy that mimicked Excel’s behavior. Each computation (from a cell) I defined as a function that executed only when it was called. And the functions were a multidimensional dictionary.

I started from the end of the computation graph: from results to inputs. If a formula depended on something I hadn’t yet written, I “mocked” it in the code, simply substituting the value from the Excel sheet.

Bit by bit I replaced these mocks with real logic. Comparing the output of my code to the Excel at each step, I could clearly see where my logic diverged.

In other words, I moved from the result to the input data. At each step, it was clear which mocks needed to be turned into code, and I could compare version +1 with version -1 — the result had to match. As soon as all mocks were replaced with calls — the task was done.

The real “secret ingredient” was the dynamic nature of Groovy for creating a multidimensional map of functions. Instead of static variables, I used a deeply nested structure, where each “leaf” was a closure. This allowed access to any part of the table — be it an input parameter, a config constant, or a complex intermediate result — through a simple, unified syntax, and some components were dynamic.

Here’s an example:

conf[“group”] = { x -> [“a”, “b”, “c”] }

conf[“group”]().each {

calculate[“Group”][“Subgroup”][it][“TotalQuantity”] =

{

x -> calculate[“Group”][“Subgroup”][it][“Someparameter”]() * conf[“someConstant”]()

}

}

Using dynamic keys and closures, I could iterate through product groups or data sets. Since these were dynamic functions, not stored values, the entire system worked like a living graph of dependencies.

Testing was possible right from the start of transferring the formulas. The charm was that you were kind of addressing a cell through syntax like calculate[“Totals”][“A”](), but in reality, you were launching an entire tree of calculations at that moment. And this was incredibly convenient for debugging.

In two weeks, the “Black Box” was transformed into a transparent, modular library with clear logic, which produced exactly the same result as the original table.

P.S. Of course, all the data in all the screenshots are thoroughly obfuscated, or rather, written from scratch for this text.

Decoding Complex Queries: A Transformative Approach to Search Functionality | December 17 2025, 03:25

Oh, I just solved a really cool problem. It’s tricky to explain though. But I’ll try.

So, the client has 10 search websites. They all use one index but throw different queries at it. To what the user enters, a very long and complex query is added, generated by a module on Sitecore. It includes template and page IDs that need to be included or excluded. Ultimately, it’s impossible to understand what’s going on there. There could be ten opening brackets and some randomly closing ones, but it worked with Coveo. Reformatting helped, but not much.

And each site has its own version of this. Meanwhile, the same IDs appear periodically. I first tried to manually figure this out, but it was a nightmare. Nothing helped. There are also nested conditions. For example, “exclude this template” not globally, but only if that field equals one.

Here’s what I did:

I wrote a script that parses this textual “mess” into an abstract syntax tree (AST). This allowed to turn an unreadable string into a structured JSON object, where it’s clear: here’s AND, there’s OR, and here — a specific condition.

Then I turned these conditions into Boolean algebra formulas. Using the SymPy library, I “fed” these formulas to simplification algorithms. Mathematics itself eliminated duplicates, collapsed excessive nesting, and removed conditions that are logically absorbed by others. As a result, the “trees” became flat and understandable.

In the attachment — the original tree and the simplified one.

To be sure that I didn’t break anything during simplification, I wrote a test generator. It takes the simplified logic, puts it back into a working curl, and checks whether the number of found documents (totalCount) matches the original request. The numbers matched — meaning, the logic is preserved 100%.

Having simplified and standardized structures for each site in hand, I built a comparison matrix. The script analyzed them and highlighted Common Core — conditions that are guaranteed to be required (or prohibited) on all sites without exception, and Specifics — unique “tails” that distinguish one site from another.

In the attached screenshot: REQ means that the condition is guaranteed to be met for any document that goes through this request. NOT — definitely not met. OPT — the condition is present in the request, but it’s not strict by itself. It only works in conjunction with something else. “.” — the condition is not mentioned in the request at all.

For 3 sites it responds instantly, for 10 it takes about 30 minutes.

And of course, all data in all screenshots are thoroughly obfuscated.

Decoding Dog Signals: What Does the Ironing Board Mean? | December 17 2025, 01:55

Help decode the signal being sent into the universe by a dog. The same gesture towards the refrigerator means wants treats, to the door – open it (outside or inside), to the knee – pet me, to the cat – a complex indecipherable set of emotions. Question – what could it mean towards an ironing board?

I have tried everything. Gave food. Poured water. Took for walks. Opened the backyard. Played with a ball with him. Definitely petted him. Only thing that worked was leaving the room. But then when you come back – he returns to playing at the foot of the ironing board. You turn around – he looks and waits for something.

Apparently, he concluded that to get everything at once, he needs to do it with an ironing board